summaryrefslogtreecommitdiffstats
path: root/rubbos/app/tomcat-connectors-1.2.32-src/native
diff options
context:
space:
mode:
Diffstat (limited to 'rubbos/app/tomcat-connectors-1.2.32-src/native')
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/BUILDING.txt179
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/CHANGES1162
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/Makefile702
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/Makefile.am37
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/Makefile.in702
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/NEWS638
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/README.txt45
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/STATUS.txt67
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/TODO.txt371
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/aclocal.m46945
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/Makefile114
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/Makefile.apxs42
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/Makefile.apxs.in42
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/Makefile.in114
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/Makefile.libdir4
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/Makefile.netware287
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/Makefile.tmpl53
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/Makefile.vc256
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/NWGNUmakefile44
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/NWGNUmakefile.mak313
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/libjk.module5
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/mod_jk.c3338
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/mod_jk.dsp295
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/mod_jk.exp1
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/.libs/mod_jk.abin0 -> 2614540 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/.libs/mod_jk.la35
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/.libs/mod_jk.lai35
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/.libs/mod_jk.obin0 -> 323776 bytes
-rwxr-xr-xrubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/.libs/mod_jk.sobin0 -> 1377048 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/Makefile99
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/Makefile.apxs45
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/Makefile.apxs.in45
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/Makefile.in99
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/Makefile.vc293
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/NWGNUmakefile332
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/bldjk.qclsrc291
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/bldjk54.qclsrc313
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/config.m434
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/mod_jk.abin0 -> 2614540 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/mod_jk.c3748
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/mod_jk.dsp355
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/mod_jk.la35
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/mod_jk.lo12
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/mod_jk.obin0 -> 316024 bytes
-rwxr-xr-xrubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/mod_jk.sobin0 -> 1377048 bytes
-rwxr-xr-xrubbos/app/tomcat-connectors-1.2.32-src/native/buildconf.sh36
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/.indent.pro18
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp12_worker.obin0 -> 72992 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp13.obin0 -> 11264 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp13_worker.obin0 -> 35280 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp14.obin0 -> 74416 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp14_worker.obin0 -> 70736 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp_common.obin0 -> 291472 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_connect.obin0 -> 84960 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_context.obin0 -> 19080 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_jni_worker.obin0 -> 16128 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_lb_worker.obin0 -> 172368 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_map.obin0 -> 83792 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_md5.obin0 -> 20208 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_msg_buff.obin0 -> 23520 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_pool.obin0 -> 13048 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_shm.obin0 -> 60272 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_sockbuf.obin0 -> 13680 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_status.obin0 -> 828736 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_uri_worker_map.obin0 -> 126944 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_url.obin0 -> 9312 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_util.obin0 -> 244016 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_worker.obin0 -> 55776 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/Makefile49
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/Makefile.in49
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/ap_snprintf.c1178
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/ap_snprintf.h150
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/config.h110
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/config.h.in109
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk.rc74
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp12_worker.c682
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp12_worker.h45
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp12_worker.lo12
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp12_worker.obin0 -> 71160 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13.c50
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13.h126
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13.lo12
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13.obin0 -> 11104 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13_worker.c94
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13_worker.h50
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13_worker.lo12
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13_worker.obin0 -> 35184 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14.c695
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14.h307
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14.lo12
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14.obin0 -> 73016 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14_worker.c404
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14_worker.h52
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14_worker.lo12
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14_worker.obin0 -> 69632 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp_common.c3383
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp_common.h467
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp_common.lo12
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp_common.obin0 -> 283648 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_connect.c1190
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_connect.h78
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_connect.lo12
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_connect.obin0 -> 83736 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.c296
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.h138
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.lo12
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.obin0 -> 19176 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_global.h405
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_jni_worker.c1267
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_jni_worker.h45
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_jni_worker.lo12
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_jni_worker.obin0 -> 15984 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_lb_worker.c1823
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_lb_worker.h222
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_lb_worker.lo12
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_lb_worker.obin0 -> 170152 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_logger.h139
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_map.c889
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_map.h95
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_map.lo12
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_map.obin0 -> 90080 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_md5.c475
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_md5.h84
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_md5.lo12
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_md5.obin0 -> 20768 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_msg_buff.c382
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_msg_buff.h154
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_msg_buff.lo12
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_msg_buff.obin0 -> 24304 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_mt.h150
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_nwmain.c103
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_pool.c165
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_pool.h126
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_pool.lo12
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_pool.obin0 -> 12968 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_service.h546
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_shm.c812
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_shm.h258
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_shm.lo12
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_shm.obin0 -> 59384 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_sockbuf.c195
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_sockbuf.h45
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_sockbuf.lo12
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_sockbuf.obin0 -> 13624 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_status.c5200
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_status.h44
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_status.lo12
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_status.obin0 -> 806096 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_types.h69
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_types.h.in69
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_uri_worker_map.c1191
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_uri_worker_map.h208
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_uri_worker_map.lo12
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_uri_worker_map.obin0 -> 124368 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_url.c124
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_url.h44
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_url.lo12
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_url.obin0 -> 9200 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_util.c2253
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_util.h269
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_util.lo12
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_util.obin0 -> 243024 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_version.h96
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker.c351
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker.h55
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker.lo12
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker.obin0 -> 54176 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker_list.h98
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/list.mk27
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/list.mk.in27
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/common/stamp-h11
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/config.log1840
-rwxr-xr-xrubbos/app/tomcat-connectors-1.2.32-src/native/config.nice9
-rwxr-xr-xrubbos/app/tomcat-connectors-1.2.32-src/native/config.status1277
-rwxr-xr-xrubbos/app/tomcat-connectors-1.2.32-src/native/configure25887
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/configure.in852
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/docs/api/README.txt18
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/Makefile.amd64310
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/Makefile.ia64310
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/Makefile.x86304
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/README43
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/LICENSE.TXT201
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/License.rtf72
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/bin/README1
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/conf/rewrite.properties28
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/conf/uriworkermap.properties39
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/conf/workers.properties.minimal45
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/iisfilter.vbs120
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/isapi-redirector-win32-msi.ism4773
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/log/README1
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/tomcat.icobin0 -> 21630 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/isapi.def24
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/isapi.dsp307
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/isapi.dsw59
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/isapi_install.vbs224
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/isapi_redirect.reg7
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/jk_isapi_plugin.c3495
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/AUTHORS6
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/COPYING45
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/ChangeLog1650
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/INSTALL185
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/LICENCE45
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/Makefile.in20
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/NEWS201
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/NON-UNIX-USE244
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/NWGNUmakefile267
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/README427
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/RunTest.in192
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/config.hw107
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/config.in107
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/configure.in185
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/dftables.c173
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/dftables.dsp165
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/dftables.x86109
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/dll.mk60
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/doc/README_httpd6
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/get.c357
-rwxr-xr-xrubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/install-sh251
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/internal.h752
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/libpcre.def34
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/libpcre.pc.in12
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/libpcreposix.def39
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/maketables.c146
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/makevp.bat25
-rwxr-xr-xrubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/mkinstalldirs40
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcre-config.in66
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcre.amd64146
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcre.c9207
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcre.def22
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcre.dsp193
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcre.hw239
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcre.ia64147
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcre.in239
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcre.x86154
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcredemo.c324
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcregrep.c673
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcreposix.c316
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcreposix.dsp154
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcreposix.h99
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcretest.c1786
-rwxr-xr-xrubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/perltest211
-rwxr-xr-xrubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/perltest8208
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pgrep.c225
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/printint.c471
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/study.c484
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testinput13841
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testinput21396
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testinput365
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testinput4513
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testinput5263
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testinput6517
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testoutput16274
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testoutput25607
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testoutput3115
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testoutput4903
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testoutput51075
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testoutput61013
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/ucp.c151
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/ucp.h58
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/ucpinternal.h91
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/ucptable.c15105
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/ucptypetable.c93
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/jni/.libs/jk_jnicb.abin0 -> 365752 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/jni/.libs/jk_jnicb.la35
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/jni/.libs/jk_jnicb.lai35
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/jni/.libs/jk_jnicb.obin0 -> 16048 bytes
-rwxr-xr-xrubbos/app/tomcat-connectors-1.2.32-src/native/jni/.libs/jk_jnicb.sobin0 -> 251337 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/jni/Makefile45
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/jni/Makefile.in45
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/jni/Makefile.linux46
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/jni/Makefile.netware266
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/jni/Makefile.solaris45
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/jni/jk_jnicb.abin0 -> 365752 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/jni/jk_jnicb.c495
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/jni/jk_jnicb.exp7
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/jni/jk_jnicb.h61
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/jni/jk_jnicb.la35
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/jni/jk_jnicb.lo12
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/jni/jk_jnicb.obin0 -> 15784 bytes
-rwxr-xr-xrubbos/app/tomcat-connectors-1.2.32-src/native/jni/jk_jnicb.sobin0 -> 251337 bytes
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/jni/jni_connect.dsp151
-rwxr-xr-xrubbos/app/tomcat-connectors-1.2.32-src/native/libtool7065
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/netscape/Makefile.linux59
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/netscape/Makefile.netware277
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/netscape/Makefile.solaris85
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/netscape/Makefile.vc287
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/netscape/README31
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/netscape/jk_nsapi_plugin.c634
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/netscape/nsapi.dsp283
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/nt_service/jk_nt_service.c1233
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/nt_service/nt_service.dsp199
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/config_vars.mk17
-rwxr-xr-xrubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/instdso.sh91
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/jk_common.m4160
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/rules.mk43
-rwxr-xr-xrubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/config.guess1447
-rwxr-xr-xrubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/config.sub1555
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/dummy0
-rwxr-xr-xrubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/install-sh322
-rw-r--r--rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/ltmain.sh6426
-rwxr-xr-xrubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/missing353
301 files changed, 170500 insertions, 0 deletions
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/BUILDING.txt b/rubbos/app/tomcat-connectors-1.2.32-src/native/BUILDING.txt
new file mode 100644
index 00000000..1e14e898
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/BUILDING.txt
@@ -0,0 +1,179 @@
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+
+ Building from the subversion tree: (for developers only).
+ -----------------------------------
+ When using a subversion tree buildconf.sh must be run before configure.
+ The today version of buildconf.sh build the following files:
+ libtool files in scripts/build/unix (should copy them?).
+ Makefile.in from Makefile.am
+ aclocal.m4 from different m4 files located in the local machine.
+ configure from configure.in and aclocal.m4.
+ If you see error message from automake, don't care about them.
+
+
+ Building using configure
+ ------------------------
+
+ It is possible to use autoconf for configuration and installation.
+ To create tomcat-connectors's autoconf script, you will need libtool
+ 1.5.2, automake 1.10 and autoconf 2.59 or newer. The use of more recent
+ versions is strongly encouraged, e.g. for reliable detection of the
+ features of recent version of operating systems (e.g. AIX 6.1).
+
+ Those tools will not be required if you are just
+ using a package downloaded from apache.org, they are only required for
+ developers.
+
+ To configure tomcat-connectors run the following commands.
+
+ ./buildconf.sh (not required unless you are a developer)
+ ./configure [autoconf arguments] [tomcat-connectors arguments]
+ make
+
+ It is possible to set CFLAGS and LDFLAGS to add some platform specifics:
+ LDFLAGS=-lc \
+ ./configure -with-apxs=/home2/local/apache/bin/apxs
+
+
+ Build for both Apache HTTP Server 1.3 and 2.0
+ ---------------------------------------------
+
+ If you want to build mod_jk for Apache HTTP Server
+ 1.3 and 2.0, you should :
+
+ use configure and indicate Apache HTTP Server 1.3
+ apxs location (--with-apxs)
+ use make
+ copy the mod_jk binary to the apache modules location
+
+ make clean (to remove all previously compiled modules)
+ use configure and indicate Apache HTTP Server 2.0
+ apxs location,
+ then make.
+
+ ./configure --with-apxs=/usr/sbin/apxs
+ make
+ cp ./apache-1.3/mod_jk.so /usr/lib/apache
+ make clean
+ ./configure --with-apxs=/usr/sbin/apxs2
+ make
+ cp ./apache-2.0/mod_jk.so /usr/lib/apache2
+
+
+ Examples
+ --------
+
+ Apache HTTP Server 2.0:
+
+ ./configure --with-apxs=/opt/apache2/bin/apxs
+
+ Apache HTTP Server 1.3:
+
+ ./configure --with-apxs=/usr/sbin/apxs
+
+ tomcat-connectors arguments
+ -----------------------------------
+ JVM related parameters:
+ --with-java-home=DIR
+ DIR is the patch to the JDK root directory. Something like: /opt/java/jdk12
+ --with-os-type[=SUBDIR]
+ SUBDIR is the os-type subdirectory, normaly configure should guess it
+ correctly.
+ --with-arch-type[=SUBDIR]
+ SUBDIR is the arch subdirectory, normaly configure should guess it correctly.
+ --with-java-platform=VAL
+ VAL is the Java platform 1 is 1.1.x and 2 is 1.2.x. It is guessed correctly.
+
+ Apache related parameters:
+ --with-apxs[=FILE]
+ FILE is the location of the apxs tool. Default is finding apxs in PATH.
+ It builds a shared Apache module. It detects automaticly the Apache version.
+ (2.0 and 1.3)
+* --with-apache=DIR
+ DIR is the path where apache sources are located.
+ The apache sources should have been configured before configuring mod_jk.
+ DIR is something like: /home/apache/apache_1.3.19
+ It builds a static Apache module.
+ --enable-EAPI
+ This parameter is needed when using Apache-1.3 and mod_ssl, otherwise you
+ will get the error message: "this module might crash under EAPI!" when
+ loading libjk.so in httpd.
+
+ JNI support:
+ --enable-jni
+ Build the jni_connect.so and the JNI worker.
+ Note that JNI support has been discontinued
+
+* Static build need more tests, and we strongly recommand dynamic build
+ using DSO/APXS.
+
+
+ Installation
+ ------------
+
+ The mod_jk binary will be in :
+
+ ./apache-1.3/mod_jk.so if you select to build mod_jk for apache 1.3
+
+ ./apache-2.0/mod_jk.so if you select to build mod_jk for apache 2.0
+
+
+
+ Building for Netscape/iPlanet/SunONE WebServer
+ ----------------------------------------------
+ make clean (to remove all previously compiled modules)
+ use configure and indicate that you will be building the
+ netscape nsapi redirector, then make the redirector plugin:
+
+ ./configure --enable-netscape
+ cd netscape
+ make -f Makefile.solaris
+
+ This assumes that SUITSPOT_HOME is defined and points to
+ your SunONE install path (eg: /opt/SUNWwbsvr/plugins)
+ and that JAVA_HOME is defined (eg: /opt/SUNWwbsvr/bin/https/jdk).
+
+ Misc notes
+ ----------
+
+ HP-UX build notes :
+
+ If you plan to use GCC on HP-UX to build mod_jk, be sure to
+ have -DHPUX11GCC defined (usually by setting CLAGS before configure)
+
+ Reports are that the stripped down cc version that ships with
+ HP-UX won't be able to works, you should habe the HP add-on ANSI C
+ Compiler package.
+
+ A good repository for HP-UX gnu tools is :
+
+ http://gatekeep.cs.utah.edu/
+
+
+ Solaris build notes :
+
+ the build should works with the GNU gcc compiler, on both
+ SPARC and x86 architecture systems.
+
+ A good repository for Solaris gnu tools is :
+
+ http://www.sunfreeware.com/
+
+ Be carefull when mixing native compiler and gnu compiler, and
+ ensure that apache and mod_jk will be compiled and linked with
+ the same tools (ie full Solaris or full GNU)
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/CHANGES b/rubbos/app/tomcat-connectors-1.2.32-src/native/CHANGES
new file mode 100644
index 00000000..40b53723
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/CHANGES
@@ -0,0 +1,1162 @@
+ Apache TomcatApache Logo
+ ---------------------------------------------------------------------------
+ The Apache Tomcat Connector - Miscellaneous Documentation
+
+ Changelog
+
+ Preface
+ This is the Changelog for Tomcat Connectors. This changelog does not
+ contain all updates and fixes to the Tomcat connectors (yet). It should
+ contain fixes made only after November 10th 2004, when the new
+ documentation project for JK was started.
+
+ Changes between 1.2.31 and 1.2.32
+ Native
+ fix 51417: Fix worker busy detection by querying the worker
+ endpoint. Abandoned connections can leave a worker in busy
+ state without decrementing busy counter. (mturk)
+ fix 50339: Fix whitespace trimming when parsing attribute lists.
+ (rjung)
+ fix 41263: Support Servlet API getRemotePort(). Works for Tomcat
+ 5.5.28, 6.0.20 and 7.0.0 and Apache and ISAPI plugins. (rjung)
+ fix 41923: AJP: Close AJP connection to Tomcat on client write
+ error when recovery_options 4 is specified, aborting the
+ response write on the Tomcat side. (timw)
+ update AJP: Cap the lingering bytes that will be read when shutting
+ down an AJP socket at 32k to prevent CPU spikes in the web
+ server when a client aborts on a large response body. Also
+ reduce total linger time to 2s. (timw)
+ fix 50839: AJP: Fix 30sec CPU spike due to incorrect counting of
+ lingering bytes causing a busy loop when a client aborts
+ connection during a response write. Fixes regression in
+ 1.2.31. (timw)
+ add LB: Forward worker activation state as request attribute
+ "JK_LB_ACTIVATION". Possible values are "ACT" (active), "DIS"
+ (disabled) and "STP" (stopped). (rjung)
+ fix HTTPD: Forward WWW-Authenticate from backend when status is
+ 401 and server generated error pages are used. (rjung)
+ fix 50363: IIS: Prevent chunk encoding of empty message bodies for
+ 204, 205 and 304 responses. (timw)
+ fix 50975: IIS: Fix hanging of Transfer-Encoding: chunked requests
+ when Content-Length header is present in request as well. Also
+ addresses situation where IIS appears to create a
+ Content-Length header for a small chunk encoded request when
+ none was present in the original request. (timw)
+ fix 47679: IIS: stop truncation of request headers when ISAPI
+ redirector used as an extension without the corresponding
+ filter installed. (timw)
+ fix NSAPI: Use lower case header names for responses. Otherwise
+ the web server might add chunked transfer encoding header in
+ addition to our content length header.
+ update Docs: Improve load balancer documentation. (rjung)
+
+ Changes between 1.2.30 and 1.2.31
+ Native
+ fix 49413: AJP13: Drop flush packets send by the backend after the
+ response has been finished. (rjung)
+ update AJP: Log the local and remote socket address. (mturk)
+ update Watchdog: Move the maintain workers outside the critical
+ section allowing other threads to use the connection pool
+ during maintenance. (mturk)
+ update Common: Add svn revision to init log message. (rjung)
+ fix Common: Don't destroy errno during trace logging. (rjung)
+ update Apache: Add support for Apache 2.3/2.4. (rjung)
+ update Apache: Added version number resource for mod_jk.so on
+ Windows. (timw)
+ update 48501: IIS: Added rotatelogs style log rotation to ISAPI
+ Redirector. (timw)
+ fix 38895: IIS: Use RAW headers instead of CGI headers by default
+ to prevent conversion of underscores '_' to hyphens '-' in
+ header names. Old behaviour can be enabled by defining
+ USE_CGI_HEADERS. (timw)
+ fix 49511: IIS: Do not override IIS log information when
+ subsequent requests on a keep-alive connection are not mapped
+ into the ISAPI Redirector. (timw)
+ fix Docs: Document SSLOptions needed for SSL information
+ forwarding. (rjung)
+ update Docs: Grammar and style improvements and clarification about
+ serving static content by IIS. Patch provided by André
+ Warnier. (rjung)
+ fix Docs: Update subversion paths used in docs. (rjung)
+
+ Changes between 1.2.28 and 1.2.30
+ Native
+ update Apache: Improve compatibility with Apache 2.3. (rjung)
+ fix 46632: Apache: Do not register child cleanup for our pools.
+ (mturk)
+ fix 46893: Apache: Log warning only if JkShmSize was actually set
+ in the configuration. (mturk)
+ update IIS: Include optional chunking support. Off by default.
+ (mturk)
+ fix 48763: IIS: Do not send Content-Length when using chunked
+ encoding or length larger 4GB. (mturk)
+ fix 48223: IIS: Propagate correct backend error code to IIS.
+ (rjung)
+ fix 47867: IIS: crash during startup, when compiled with VS2008
+ and workers.properties contains unsupported properties. Patch
+ provided by Indrek Juhani (rjung)
+ fix 47628: IIS: Fix deadlock when restarting the Application Pool
+ caused by not releasing the critical section lock. Patch
+ provided by Bret Prucha. (mturk)
+ fix IIS/NSAPI: Correct log file flushing after each line. (mturk)
+ add NSAPI: Add Microsoft Visual C++ Makefile. (mturk)
+ update AJP: Improve socket shutdown handling. (mturk)
+ update AJP: Ensure we never reuse a non reusable socket. (mturk)
+ update AJP: Tolerate a single excess packet when waiting for cpong.
+ (mturk)
+ update AJP: Check protocol correctness more strictly. (mturk)
+ update 48410: AJP: Use poll instead select so we can work with more
+ then 1024 sockets. (mturk)
+ fix 46503: AJP/Status: Garbage data in worker domain and route.
+ (mturk)
+ fix 48276: AJP: When worker contact cannot be resolved mark the
+ worker as disabled instead failing to start the server.
+ (mturk)
+ fix 48169: AJP: Improve CGI interoperability by closing all
+ sockets during EXEC. (mturk)
+ add Status: Add number of open backend connections to status
+ worker. This feature is experimental, the displayed value
+ might not be accurate. (mturk)
+ update 47224: Status: When address gets changed invalidate all opened
+ sockets in the endpoint cache. This will cause new backend
+ connections to get opened using new address. (mturk)
+ fix 48305: Status: Do not show "secret" property when doing dump.
+ (mturk)
+ fix 45610: Status: Don't accept requests with empty value for sub
+ worker parameter. (rjung)
+ fix 45610: Status: Fix erroneous unsetting of sticky_session and
+ sticky_session_force when updating other load balancer
+ attributes via the status worker. (rjung)
+ fix 47222: Status: Add ping_timeout to the shared memory and allow
+ dynamic configuration. (mturk)
+ fix Status: Remove duplicate "errors" line in property view of
+ AJP13 workers that are part of a load balancer. (rjung)
+ fix LB: Fix route logging. (rjung)
+ update Logging: Automatically detect size of thread id for logging.
+ (rjung)
+ update Logging: Add optional log file locking for Windows when
+ defining JK_LOG_LOCKING. (mturk)
+ update Configuration: Update example configuration. (rjung)
+ update Docs: Update information about tools needed to create a
+ release. (rjung)
+ fix 47983: Docs: Fix typo in example config which breaks startup.
+ (rjung)
+ update Build: Force copy of automake files. (rjung)
+ update Build: Tomcat code repository structure cleanup reflected in
+ documentation and build script. (rjung, mturk)
+
+ Changes between 1.2.27 and 1.2.28
+ Native
+ add Apache: Add more environment variables to overwrite request
+ information. Useful in case a proxy is in front of Apache and
+ sends us original request information e.g. via custom headers.
+ (rjung)
+ update Apache: No longer preallocate entries for JK request log.
+ (rjung)
+ fix 46352: Apache: Fix crash when using SetHandler jakarta-servlet
+ in VHost without any JkMount. Crash due to incorrect
+ initialization of mount extensions. (rjung)
+ fix Apache: JkWatchdogInterval had wrong interval calculation
+ causing a 10 times higher watchdog interval then configured.
+ (mturk)
+ fix Apache: Activate forwarding of SSL key size by default.
+ (rjung)
+ fix 46169: Apache 1.3: Backport use_server_errors mount extension.
+ (rjung)
+ fix 46763: Apache 2.0: Survive the log mutex during graceful
+ restart. Patch provided by Eiji Takahashi. (mturk)
+ fix 46416: Apache 2.0 on Windows: Include mstcipip.h even if the
+ apr doesn't include it. (mturk)
+ update IIS: Update uriworkermap.properties file on a regular
+ interval. This requires both worker_mount_reload and
+ watchdog_interval to be defined. (mturk)
+ update IIS: Remove obsolete entries from registry file. (mturk)
+ fix 46579: IIS: Use local environment table instead environment
+ variables for setting the JKISAPI_PATH and JKISAPI_NAME.
+ (mturk)
+ update LB: Add new property error_escalation_time to fine tune
+ escalation of local errors to global errors. (rjung)
+ update LB: If the sticky session affinity mark contains a dot, treat
+ the part before the dot as the domain name. This allows to
+ have full node session affinity with domain failover. (mturk)
+ fix LB: make forced recovery work with local error states. (rjung)
+ fix LB: Only update error state and error time, if we actually
+ have a new state. (rjung)
+ fix LB: Set global worker state to error when we reach
+ max_reply_timeouts, or fail_on_status triggered hard error.
+ (rjung)
+ update AJP: Add a new error type JK_AJP_PROTOCOL_ERROR. (mturk)
+ update AJP: Allow worker ports lower or equal to 1024. (rjung)
+ update AJP: Improve some AJP error log messages. (mturk)
+ update Status: Allow changing worker address and port of AJP workers.
+ The address is resolved on next request for that worker.
+ (mturk)
+ update Status: Allow update actions to show error messages in the
+ result page. (rjung)
+ update Status: Refactor update actions. (rjung)
+ update Status: Do not redirect to the show or list page, if an error
+ occured during an action. (rjung)
+ update Status: Include error time in display. (rjung)
+ update Status: Remove redundant port information from worker display.
+ Rename address column and remove its explanation from the
+ legend. (rjung)
+ update Status: Optimize forced uriworkermap.properties reload.
+ (mturk)
+ fix Status: Fix crash in text display. (rjung)
+ fix Status: Show - Edit - Show always ends in single lb member
+ show, even when started from all members lb show. (rjung)
+ fix Status: Wildcards in sub worker names were broken for update
+ actions. (rjung)
+ fix Status: Add use_server_errors to map display. (rjung)
+ update SHM: Move locking into the data pull and push methods. (rjung)
+ update JNI: Deprecate JNI workers. (rjung)
+ fix Netware: Missing define for MAX_PATH. Patch by Guenter Knauf.
+ (rjung)
+ update Docs: Add a new HowTo page about reverse proxies. (rjung)
+ update Docs: Add an explanation of local error states to the timeouts
+ documentation. (rjung)
+ update Docs: Clarify relation between socket_timeout and
+ socket_connect_timeout. (rjung)
+ update Docs: Clarify IIS URL rewrite feature. (rjung)
+ fix 46834,46734: Docs: Fix a couple of missing or broken links.
+ (markt,rjung)
+ fix Docs: Add 2008 news to main page and menues. (mturk, rjung)
+
+ Changes between 1.2.26 and 1.2.27
+ Native
+ fix 46109: Decay reply_timeouts even when lb method is busyness.
+ Also reset reply_timeouts during forced recovery. (rjung)
+ update AJP13: Recycle connection if previous request didn't complete.
+ (mturk)
+ update Maintain should not run multiple times in parallel. (mturk)
+ fix Apache: Fix small memory leak during restart. (mturk)
+ update Improve signal handling during socket shutdown. (mturk)
+ add URI Map: Add debug dump function for uri worker map. (rjung)
+ update Add revision number to version info for non-release builds.
+ (rjung)
+ add IIS: Optionally allow chunked encoding for responses. At the
+ moment only usable, if build with ISAPI_ALLOW_CHUNKING
+ defined. Based on patch by Tim Whittington. (rjung)
+ update IIS: Optionally use raw headers instead of CGI headers. Fixes
+ problem "underscore=dash" problem in header names. At the
+ moment only available, if build with USE_RAW_HEADERS defined.
+ (rjung)
+ update IIS: Optionally improve IIS 5.1 compatibility. At the moment
+ only available, if build with AUTOMATIC_AUTH_NOTIFICATION
+ defined. Based on patch by Tim Whittington. (rjung)
+ fix IIS: Fix memory corruption due to parallel initialization by
+ multiple threads. (rjung)
+ update Windows: Use non-default socket keepalive interval. (mturk)
+ add IIS: Add environment variables JKISAPI_PATH and JKISAPI_NAME.
+ (mturk)
+ add Added socket_connect_timeout directive for setting the connect
+ timeout for the socket. This enables to have low connection
+ timeout but higher operational timeouts. (mturk)
+ fix AJP13: [CVE-2008-5519] Always send initial POST packet even if
+ the client disconnected after sending request but before
+ providing POST data. In that case or in case the client broke
+ the connection in a middle of read send an zero size packet
+ informing container about broken client connection. (mturk)
+ add AJP13: Added connection_acquire_timeout directive for setting
+ the absolute timeout the worker will wait for a free endpoint.
+ (mturk)
+ update Apache: Allow to set path parameter used when doing
+ JkStripSession. (mturk)
+ update Refactor retries implementation and change semantics of
+ retries attributes. (mturk)
+ update Status: Allow showing only a single member for a load
+ balancer. (rjung)
+ update Status: Add display of seconds since last statistics reset and
+ access and transfer rates. (rjung)
+ add AJP13: Add a configurable retry_interval time. (rjung)
+ update Documentation: Enhance description of connection_pool_size.
+ (rjung)
+ update IIS: Refactor error page generation. (mturk)
+ fix IIS: SERVER_NAME variable can be the same for multiple
+ different server instances if requests are handled according
+ to the ip:port combination. Use INSTANCE_ID variable to which
+ the request belongs instead. (mturk)
+ add Allow forwarding server error pages. This can be done on
+ per-uri basis using new use_server_errors extension. (mturk)
+ add Added session_cookie and session_path for configuring default
+ session identifiers. (mturk)
+ update Use max_packet_size also as TCP send and receive buffer size.
+ (mturk)
+ update Apache: Do not allow Apache to start in multi-threaded mode if
+ mod_jk was only build for single threaded server (prefork).
+ (mturk)
+ fix 45812: Add done() service method that causes sending EOS
+ bucket for Apache httpd 2.x. This allows filter chain to work
+ properly. (mturk)
+ add Added connection_ping_interval, ping_timeout and ping_mode
+ directives. (mturk)
+ fix Apache: Use correct ld flags provided by apxs when building
+ module. Prevents some crashes on AIX for httpd 1.3 module.
+ (rjung)
+ fix Documentation: "val" attribute numbering in status worker
+ needs to start with 0 instead of 1. (rjung)
+ update Documentation: Remove JNI parameters from sample configuration
+ in the workers generic howto. (rjung)
+ fix 45026: For Apache httpd 2.x add "Unknown Reason" as the reason
+ phrase, if we get an empty one from the backend. Otherwise
+ httpd 2.x returns status 500. (rjung)
+ fix Build: Fix Cygwin build. (rjung)
+ update Documentation: Add info to docs, that variables sent via
+ JkEnvVar are not listed in request.getAttributeNames().
+ (rjung)
+ add Add watchdog background thread for Apache 2.x and IIS doing
+ internal maintenance (idle connection checks, backend
+ probing). See JkWatchdogInternal (Apache) and
+ watchdog_interval (IIS). (mturk)
+ update Change log level of some messages from error to info. (mturk)
+ fix Documentation: Fix docs for worker attribute "secret". (rjung)
+ update Detect correct plugin name for various web servers via
+ additional preprocessor defines. (rjung)
+ fix LB: Do not put loadbalancer node in error state if there is
+ opened channel. This fixes the bug when new connection fails
+ due to busyness, causing opened connections fail stickyness.
+ This brings back per-node busy counter and private state array
+ for each request. We can mark the state as error for failover
+ to work while still operating and reporting node as OK if
+ there are opened working connections. (mturk)
+ fix 44738: Fix merging of JkOption ForwardURI* between virtual
+ hosts. Patch contributed by Toshihiro Sasajima. (rjung)
+ add URI Map: Add extension attributes to uri worker map. Allowed
+ are reply_timeout, active/disabled/stopped and fail_on_status.
+ Usage currently only implemented for httpd and IIS.
+ (rjung+mturk)
+ fix URI Map: Make dynamic reloading atomic and free memory not
+ needed any longer. (rjung)
+ add Configure: Don't use post httpd 2.2.0 API functions when
+ building with new --enable-api-compatibility configure switch.
+ (rjung)
+ fix Apache: JkAutoAlias does not work in combination with
+ JkMountCopy if there are no JkMount in virtual host. (rjung)
+ update LB: Optimize state macros to improve performance. (rjung)
+ add Apache: Allow dynamic setting of reply timeout using the
+ environment variable JK_REPLY_TIMEOUT. (rjung)
+ add Status: Add manageability for ajp parameters of ajp workers
+ and ajp lb members. (rjung)
+ update Status: Change parameter names of update action to make them
+ more easily distinguishable from other parameters. (rjung)
+ add Status: Add ajp worker statistics also for workers, that are
+ not lb members. (rjung)
+ update AJP: Refactor factories, move ajp13/ajp14 common parts into
+ ajp_factory. (rjung)
+ update Status: Only sync shm worker config values of the workers for
+ which we changed values. (rjung)
+ fix Status: Set lb_factor instead of distance. (rjung)
+ update Status: Minor layout changes, use drop down instead of
+ multiple text links. (rjung)
+ update SHM: Use local copies of read mostly attributes of lb sub
+ workers in lb and status worker. (rjung)
+ update Status: Add "dump" action to dump our initial configuration.
+ (rjung)
+ update Status: Use property table to decide which cmd action uses
+ which output elements. (rjung)
+ update Common: Include original configuration map in worker_env to
+ make it available for workers, e.g. the status worker. (rjung)
+ update LB: Refactor "route" return for httpd note. Don't use a member
+ of the worker_record, because that's not thread safe. (rjung)
+ update Common: Refactor "retries", remove from service and jk_worker,
+ move into ajp worker instead. (rjung)
+ update SHM: Use distinct structs for lb and ajp13 in shm. Improves
+ type safety and saves a few bytes. (rjung)
+ update SHM: Remove unused attributes. (rjung)
+ update SHM: Automatically determine shm size for all web servers.
+ (rjung)
+ update SHM: Make open/attach logging consistent for all web servers.
+ (rjung)
+ update Status: Include server local time in output. (rjung)
+ fix 44116: Fix handling of multiple JSESSIONID cookies. (rjung)
+ fix 37850: Use thread safe localtime_r where appropriate. (rjung)
+ fix Use thread safe strtok_r on more platforms, especially AIX.
+ (rjung)
+ update Status: Improve XSS hardening. (rjung)
+ update 35303: Move initialization of service members with defaults
+ from web server specific code to our generic
+ jk_init_ws_service() function. (rjung)
+ fix 36385: Add missing prepost CPing/CPong directly after connect
+ in case prepost CPing is used, but no connect CPing. (rjung)
+ update 37322: Apache: Enhance robustness of message formating in
+ jk_error_exit(). (rjung)
+ fix 44147: Multiple load balancing workers problem. (rjung)
+
+ Changes between 1.2.25 and 1.2.26
+ Native
+ fix 42003: Allocate memory instead using fixed size from the
+ stack. (mturk)
+ fix 43229: Load balancer does not do fail over after reply
+ timeouts. (rjung)
+ fix JKStatus: Repair detailed Apache httpd version display. This
+ was broken for httpd version 2.2.4+. (rjung)
+ update LB/AJP: Refactoring of jk_connect.c, jk_ajp_common.c,
+ jk_lb_worker.c (rjung)
+ fix Configure: Repair broken apxs auto-detection. (rjung)
+ update Configure: Remove trace logging from compiled code via new
+ --disable-trace configure switch. (rjung)
+ update Common: Maintain idle connections in decreasing (LRU) slot
+ order. (rjung)
+ update Apache: Create JK_WORKER_ROUTE and JK_REQUEST_DURATION notes
+ for access log even if no JkRequestLogFormat is set. (rjung)
+ update JKStatus: Enhance URI to worker map listing for Apache httpd.
+ We now list maps for all virtual servers and not only the one,
+ in which JKStatus itself was called. (rjung)
+ update JKStatus: Enhance URI to worker map listing. Update stale
+ uriworkermap.properties immediately. (rjung)
+ fix 43873: Fix small memory leak occuring during httpd restart.
+ (rjung)
+ update Common: Allow '*' for the worker name in exclusion rules
+ (resp. JkUnMount) which will override all workers. (rjung)
+ fix 42038: Correct overlay of mounts and unmounts for IIS. (rjung)
+ fix 43684: Replace JkMountFile by JkMountFileReload in
+ uriworkermap.properties docs. (rjung)
+ update Apache: Add new value "All" for JkMountCopy. (rjung)
+ fix 43516: Memory leak for Apache httpd module of size 8KB for
+ every virtual host without JK directive after each restart.
+ (rjung)
+ update Apache: Cleanup init and destroy of server configuration.
+ (rjung)
+ update Apache: Remove global configuration items from per server
+ configuration. (rjung)
+ update Apache: Remove unused attributes secret_key and
+ automount/JkAutoMount. (rjung)
+ update Cleanup of jk_uri_worker_map. (rjung)
+ update Documentation: Small additions to JkShmFile documentation.
+ Contributed by Gerhardus Geldenhuis. (rjung)
+ fix AJP13: Ignore flush packets before we received the response
+ headers. (rjung)
+ fix Fix crash during startup when using worker configuration
+ inheritance (attribute "reference") and log level debug.
+ (rjung)
+ fix AJP13: Match header names exactly against pre defined
+ constants. Avoid possible confusion with custom header names
+ using a standard header name as a prefix. (rjung)
+ fix jkstatus: Fix correct parameter validation at
+ JkStatusUpdateTask and JkStatusUpdateLoadbalancerTask ant
+ tasks. Reported by Christian Mittendorf. (pero)
+
+ Changes between 1.2.24 and 1.2.25
+ Native
+ update IIS: Fix shm shutdown behaviour. (rjung)
+ update General: fail_on_status used in a load balancer can optionally
+ do fail over without putting the failed worker in error state.
+ (rjung)
+ update NSAPI: Improve build description for Unix. (rjung)
+ update NSAPI: Add initialization startup message containing JK
+ version. (rjung)
+ fix General: Declare static functions as static. (jim)
+ update Documentation: Clarify fail_on_status behaviour. (rjung)
+ fix General: Do fail_on_status before returning the response
+ headers. (rjung)
+ update NSAPI: Fix shm shutdown behaviour. (rjung)
+ update NSAPI: Set return status even if request ended with an error.
+ (rjung)
+ update NSAPI: Allow using without shm_file on WIN32 and Netware.
+ (rjung)
+ fix NSAPI: Fix Crash of nsapi for log level debug and unset
+ refect_unsafe. (rjung)
+ update NSAPI: Improve Solaris and Linux Makefiles for nsapi build.
+ (rjung)
+ fix Build: Improve pid_t type detection during configure on
+ Solaris. (rjung)
+ update Build: Experimental build support for gcc on WIN32 and
+ Netware. (fuankg)
+ update Build: Makefile optimizations for Apache httpd 1.3/Netware .
+ (fuankg)
+ fix General: Fix missing flush bug introduced in 1.2.24. (rjung)
+
+ Changes between 1.2.23 and 1.2.24
+ Native
+ update Documentation: Improved workers.properties description in the
+ reference guide. (rjung)
+ update Documentation: Add a HowTo about the various timeouts. rjung)
+ update Logging: add milliseconds to the default timestamp format, if
+ we have gettimeofday(). (rjung)
+ update Apache: add milliseconds (%Q) and microseconds (%q) as
+ possible JkLogStampFormat conversion specifiers. This does not
+ use strftime(), but needs gettimeofday(). (rjung)
+ update IIS & Sun: Log service failures also, if return code is
+ negative. (rjung)
+ fix 42849: Abort startup of Apache httpd 1.3 in case mod_jk
+ initialization failed. We already do the same for Apache httpd
+ 2.x. (rjung)
+ fix 42849: Refuse to operate with IIS in case the initialization
+ failed. Instead requesting isapi_redirect.dll 500 will be
+ returned to the user. This is as closest as it can get to
+ Apache Httpd where we refuse to start the server in case of
+ fatal initialization errors. (mturk)
+ fix Load Balancer: Fix a deadlock in lb worker, which was exposed
+ on Solaris for threaded Apache MPMs. (rjung)
+ update Logging: handle LWP IDs as 32 Bit unsigned. Try to make it
+ work, although pthread IDs are opaque. (rjung)
+ update JkStatus: Added manipulation of max_reply_timeouts. (rjung)
+ update LB, Status: Add feature max_reply_timeouts, to make lb
+ tolerant against occasional long running requests. (rjung)
+ update JkStatus: Added OK/IDLE as the successor of N/A. (rjung)
+ update Status worker: Renamed runtime states. All states have a major
+ state (OK or ERR) and a substate. Changed the name N/A to
+ OK/IDLE. Added docs about the meaning of the states to the
+ status worker page in the reference guide. No new states have
+ been added to code. (rjung)
+ update Common: Add recovery options for recovering idempotent http
+ methods HEAD and GET. (rjung)
+ fix Correct documentation for worker attributes retries and
+ recovery_options. (rjung)
+ fix Make writing log lines and line endings more atomic. (rjung)
+ update Common: Refactored and unified jk_map_read_prop* and
+ jk_map_load_prop* for all use cases. (rjung)
+ update Common/Apache/IIS/Netscape: Add an option to check decoded
+ URLs for potentially malicious constructions. (rjung)
+ update IIS: Document auth_complete and uri_select. (rjung)
+ update Apache/IIS/Netscape: Change the default forwarding encoding to
+ the new proxy method. (jfclere, rjung)
+ update Common: Optionally reencode URIs before forwarding to the
+ backend. Based on the URI reencoding done bei httpd mod_proxy.
+ (jfclere, rjung)
+ update Common: auto-detect correct print format for pid_t. This fixes
+ at least compiler warnings on Solaris. (rjung)
+ fix 42608: Handle Content-length as unsigned 64Bit to allow for
+ huge up- and downloads. (rjung)
+ update Apache: Add forwarding uri to debug log. (rjung)
+ update Docs: Clarify relation between worker names and jvmRoute for
+ load balancing. (rjung)
+ fix Use initial zero timeout for jk_is_socket_connected. The
+ resulting detection is the same but offers a huge performance
+ increase with mod_jk. In most cases the Operating System does
+ not favor the 1 microsecond timeout, but it rather rounds that
+ up to much higher value (frequency of interrupt timer which on
+ most systems defaults to 100Hz). Patch provided by David
+ McLaughlin. (mturk)
+ update NSAPI: Check correct log file and shm file configuration
+ during startup. (rjung)
+ fix NSAPI: Add support for the general options concerning retries,
+ flushing and connection persistance. (rjung)
+ fix NSAPI: fix crashes due to use of mount attribute in
+ workers.properties. Changed initialization order. (rjung)
+ fix Improved handling of libtool and discrepancies between CC env
+ variable and CC used during apache build by configure script.
+ (rjung)
+ fix Always build with thread support, unless flag --enable-prefork
+ is set during for configure. (rjung)
+ update Use snprintf/vsnprintf from ap_snprintf.c for platforms other
+ than Windows, which might lack snprintf/vsnprintf
+ implementations when NOT build for Apache httpd 2.x/APR (e.g.
+ Sub Web Server) or without using configure. (fuankg)
+ update Imported ap_snprintf() from Apache 1.3. (fuankg)
+ fix Fix incorrect log object cleanup during statup, leading to
+ crashes at least on iSeries. (rjung)
+ update Add jk_stat() and jk_file_exists() as wrapper functions. i5/OS
+ V5R4 expects filename in ASCII for fopen but requires them in
+ EBCDIC for stat(). (hgomez)
+ update i5/OS (AS/400) V5R4 port where Apache 2.0 modules should now
+ use UTF8. (hgomez)
+ update Docs: Add comments on i5/OS build for V5R4 and previous
+ releases. (hgomez)
+
+ Changes between 1.2.22 and 1.2.23
+ Native
+ update [CVE-2007-0450] and [CVE-2007-1860]: Change the default value
+ of JkOptions to ForwardURICompatUnparsed. The old default
+ value was ForwardURICompat. This should make URL
+ interpretation between Apache httpd and Tomcat consistent
+ (prevent double decoding problems). (rjung)
+
+ Changes between 1.2.21 and 1.2.22
+ Native
+ fix Refactor line endings logging to make it correct for all
+ platforms and webservers. (mturk)
+ update Added command line windows make files. (mturk)
+ update Allow fail_on_status directive to be multi line. (mturk)
+ fix 42076: Fix name of new option from ForwardCertChain to
+ ForwardSSLCertChain as documented. (rjung)
+ fix Docs: Fix a couple of typos, change format of a few tables,
+ fix links to news pages. (rjung)
+ fix Fix correct URL for TC 6 examples in new IIS
+ rewrite.properties configuration example file. (rjung)
+ fix Add svn properties to several files. (rjung)
+ update Add TC 6 examples to uriworkermap.properties in config
+ examples. (rjung)
+ update Allow multiple status codes for fail_on_status directive. The
+ status codes can be delimited by space or comma characters.
+ (mturk)
+ update IIS. Added pcre like regular expressions for url rewrite
+ rules. (mturk)
+ fix 41922: Apache 1.3. Enable JkEnvVar. (mturk)
+ update Apache. Add --enable-flock configure parameter for explicit
+ compilation of faster flock() system calls for OS supporting
+ those calls. By default the fcntl system call for locking will
+ be used that is a little bit slower but it can work on NFS
+ mounted volumes as well. (mturk)
+ fix 41562: Add Debug logging for read from client in ISAPI
+ Redirector. Contributed by Tim Whittington. (mturk)
+ update Apache. Add ForwardSSLCertChain JkOption. Contributed by
+ Patrik Schnellmann. (mturk)
+ fix IIS. Do not forbid access to web-inf or meta-inf if there is
+ no mapped worker. This allows to have resource with those
+ names that are outside mapped contexts. (mturk)
+ update Apache. Use process id for creating shared memory name and
+ delete shared memory and shared memory lock files on exit.
+ (mturk)
+ fix IIS. Fix Keep-Alive regression introduced in 1.2.21. (mturk)
+ update Delete unused check for empty init_map during startup. (rjung)
+ fix 41770: Fix startup error if no JkWorkersFile is used. (rjung)
+ update Use JK_TRUE/JK_FALSE instead of OK/!OK as return values in
+ init_jk(). (rjung)
+ update Minor adjustments to apache startup log messages (when to use
+ STDERR, remove deprecated NOERRNO flag, shm warning and
+ warnings for usage of default files). (rjung)
+ update Replace APR precompiler directive by httpd mpm_query to detect
+ MPM threading. Add a debug log message about auto-detected
+ pool size. (rjung)
+ fix Make MMN check easier to understand and a little more precise
+ (for new ap_get_server_banner()/ap_get_server_description()).
+ We use the new API only for Apache httpd 2.3. This way our
+ binaries are not tightly coupled to a minor 2.0 version, and
+ we don't use ap_get_server_banner() any way. (rjung)
+ fix Use the full description string ap_get_server_description()
+ instead of the truncated info from ap_get_server_banner(),
+ because this info gets used internally (status worker display
+ and ajp14 backend communication) and is not send back to the
+ normal user. (rjung)
+ fix 41757: Document the "--enable-prefork" flag of configure.
+ (rjung)
+ update Enhance log messages for failures when parsing attribute maps.
+ (rjung)
+ fix Correct log message during worker initialization, in case
+ remote host could not be resolved. We logged the default host
+ name "localhost" instead of the configured one. (rjung)
+ fix 41770: Fix the second part of the bug: local_worker and
+ local_worker_only is missing from the list of deprecated
+ attributes (and not supported either), so prevents the web
+ server from startup. (rjung)
+
+ Changes between 1.2.20 and 1.2.21
+ Native
+ fix [CVE-2007-0774]: A denial of service and critical remote code
+ execution vulnerability. Caused by buffer overflow in
+ map_uri_to_worker() when URL were longer that 4095 bytes.
+ Reported by ZDI (www.zerodayintiative.com). Please note this
+ issue only affected versions 1.2.19 and 1.2.20 of the Apache
+ Tomcat JK Web Server Connector and not previous versions. Tomcat
+ 5.5.20 and Tomcat 4.1.34 included a vulnerable version in their
+ source packages. Other versions of Tomcat were not affected.
+ add Check the worker. parameters and don't start if the parameter is
+ not a valid one. (jfclere)
+ add 41439: Allow session IDs to get stripped off URLs of static
+ content in Apache by adding JkStripSession directive
+ (configurable per vhost). (mturk)
+ add Change semantics of empty defaults for JkEnvVar variables. Until
+ 1.2.19: not allowed. In 1.2.20: send variables as empty strings,
+ if neither set to non empty in config, nor during runtime.
+ Starting with 1.2.21: If config has no second argument only send
+ variable if set (even when set to empty string) during runtime.
+ Allows good combination with condition attribute in tomcat access
+ log. (rjung)
+ fix 41610: Fix incorrect detection of missing Content-Length header
+ leading to duplicate headers. Contributed by Boris Maras. (rjung)
+ fix Better build support for SunONE (Netscape/iPlanet) webservers.
+ (jim)
+ add Add warning if duplicate map keys are read and are not allowed,
+ e.g. when parsing uriworkermap.properties. (rjung)
+ fix Don't concat worker names, if uriworkermap.properties has a
+ duplicate pattern, instead overwrite the worker. (rjung)
+ fix Log deprecation message even in duplication case. (rjung)
+ fix uriworkermap.properties: Fix off-by-one problem when deleting URL
+ mapping during reloading of uriworkermap.properties. (rjung)
+ add 41439: Allow session IDs to get stripped off URLs of static
+ content in IIS (configurable). (rjung)
+ add 41333: Refactoring isapi_plugin configuration reading. (rjung)
+ add 41332: Add some more errno logging and unify the format. (rjung)
+ add JkStatus: Improved logging by adding status worker name to
+ messages. Added messages to the recover worker action. (rjung)
+ add JkStatus: Refactoring searching for workers and sub workers.
+ (rjung)
+ add 41318: Add configuration to make status worker user name checks
+ case insensitive. (rjung)
+ add JkStatus: Add estimated time until next global maintenance to
+ other mime types and adopt jkstatus ant task. (rjung)
+ add JkStatus: Show estimated time until next global maintenance.
+ Change displayed time until next recovery to a min/max pair.
+ (rjung)
+ add JkStatus: Allow a user of a read/write status worker to switch it
+ to and from read_only mode temporarily. (rjung)
+ fix JkStatus: Do not show read/write commands in a read_only status
+ worker. (rjung)
+ add JkStatus: Allow lb sub workers in error state to be marked for
+ recovery administratively from the status worker. (rjung)
+ add Load Balancer: Do not try to recover multiple times in parallel.
+ Use additional runtime states "PROBE" and "FORCED". (rjung)
+ fix JkStatus: Improve data synchronization between different
+ processes. (rjung)
+ fix 41381: Fix segfault in feature fail_on_status (wrong order of log
+ arguments). Patch by Juri Haberland. (rjung)
+ fix Use correct windows line endings for log file on WIN32 platform.
+ (rjung)
+
+ Changes between 1.2.19 and 1.2.20
+ Native
+ add JkStatus Ant Task documentation page. (pero/rjung)
+ add JkStatus Ant Tasks: Add new tasks for update and reset. (pero)
+ update JkStatus Ant Tasks: Update for new xml status format. (pero)
+ update Allow integer and string values when setting
+ enumeration/boolean attributes via status worker update
+ action. (rjung)
+ add Docs: New reference guide page for status worker. (rjung)
+ update Docs: Renaming the config dir to reference and using the title
+ Reference Guide in the docs. (rjung)
+ update Added retry_on_status for workers directive. (mturk)
+ update Status Worker: Add directive to make property prefix and
+ good/bad rule configurable. (rjung)
+ update Status Worker: Omit lb members when att=nosw. (rjung)
+ update Status Worker: New command cmd=version for a short version
+ output. (rjung)
+ update Status Worker: New output stype mime=prop produces property
+ lists. (rjung)
+ fix Apache: Fix incorrect handling of JkEnvVar when Vars are set
+ multiple times. (rjung)
+ update Renamed jvm_route to route. Deprecated jvm_route, but still
+ use it as fallback when parsing the worker configuration.
+ (rjung)
+ update IIS: Make uriworkermap file reload check interval
+ configurable. (mturk)
+ update Apache: Make uriworkermap file reload check interval
+ configurable. (rjung)
+ update Status Worker: Add directives for customizing the XML output
+ (ns, xmlns, doctype). (mturk)
+ add Docs: New page with description of uriworkermap. (rjung)
+ update Docs: Added short description of max_packet_size to worker
+ reference. (rjung)
+ update Status Worker: All functions accessible also for xml and txt
+ mime types (list, show, update, reset). (rjung)
+ update Status Worker: New global health indicators for load balancers
+ named bad (error, recovering or stopped), degraded (busy or
+ disabled) and good (the rest, active and OK or N/A). (rjung)
+ update Status Worker: New edit page, to change one attribute for all
+ members of a load balancer. (rjung)
+ update Status Worker: Standard logging for status worker. (rjung)
+ update Status Worker: code refactoring. (rjung)
+ update Status Worker: New attribute user (list) denies access, if the
+ request user in the sense of remote_user is not in this list.
+ Empty list = no deny (rjung)
+ update Status Worker: New attribute read_only disables the parts of
+ the status worker, that change states and configurations.
+ (rjung)
+ fix 36121: Don't change main uri when mod_jk serves included uri.
+ (markt)
+ update Apache VHosts: Merge JkOptions +base - -base + +vhost -
+ -vhost. (rjung)
+ update Apache Docs: Adding requirements, context information, default
+ values and inheritance rules to the Apache config
+ documentation. (rjung)
+ update Status Worker: Add source type to status worker, remove the
+ redundant "context" column in the map listing (context=uri).
+ (rjung)
+ update uriworkermap: On reload of the file, all old entries from the
+ previous file version get deleted, before the new ones are
+ being read. (rjung)
+ fix Keep normal maps and exclusion maps internally separate. Don't
+ treat them as the same when adding a rule. (rjung)
+ update Status Worker: Display mapping rules also for non-lb workers
+ and in global view. (rjung)
+ update Apache VHosts: Use the vhost log files instead of the main
+ log. (rjung)
+ update Apache VHosts: Allow individual timestamp formats by
+ refactoring the formatting method. (rjung)
+ update Apache VHosts: Adding all missing config items to the virtual
+ host level. Don't overwrite the settings from the global
+ server, but inherit them in case they are not set in the
+ virtual host. (rjung)
+ update Apache: remove unnecessary function names from log messages.
+ (rjung)
+ update Apache: add a default log file location and a message, if the
+ default gets used. (rjung)
+ update Apache: add missing JK_IS_DEBUG_LEVEL() (rjung)
+ update Apache VHosts: Allow JkWorkersFile, JKWorkerProperty,
+ JkShmFile and JkShmFileSize only in global virtual server.
+ (rjung)
+ update Add some more jk_close_socket() and reduce log level for some
+ info messages. (rjung)
+ update Load Balancer: Added the Sessions strategy. Contributed by
+ Takayuki Kaneko. (rjung)
+ update Docs: Minor enhancements and syncing with more recent
+ versions. (rjung)
+ fix 40997: Separate uri mappings from their '!' counterpart when
+ checking for duplicates in uriworkermap reloading. (rjung)
+ fix 40877: Make sure the shared memory is reset on attach for
+ multiple web server child processes. (mturk)
+ update IIS: Added shm_size property to be able to deal with over 64
+ workers configurations. (mturk)
+ update IIS: Increase default thread count to 250, so its the same as
+ Apache Httpd default configuration. (mturk)
+ fix 40966: Fix socket descriptor checks on windows. (mturk)
+ fix 40965: Initialize missing service parameters. (mturk)
+ fix 40938: Fix releasing of rewrite map. Thanks to Chris Adams for
+ spotting that. (mturk)
+ update Apache: Added +FlushHeader JkOptions. (mturk)
+ update Added explicit flush when AJP body packet size is zero.
+ (mturk)
+ fix 40856: Fixing case sensitivity bug in URL mapping. (rjung)
+ fix 40793: Documentation: Improvements to Apache HowTo provided by
+ Paul Charles Leddy. (markt)
+ fix 40774: Fixing wrong recursion termination. This one restricted
+ the "reference" feature unintentionally to 20 workers. (rjung)
+ fix 40716: Adding "reference" feature to IIS and Netscape. (rjung)
+ fix Documentation: Corrected SetEnvIf syntax in JK_WORKER_NAME
+ example. (rjung)
+ fix Documentation: Added forgotten STATE and ACTIVATION notes for
+ load balancer logging in Apache. (rjung)
+ update Apache: Use instdso.sh instead libtool: libtool does not work
+ on HP-UX for example. (jfclere)
+
+ Changes between 1.2.18 and 1.2.19
+ Native
+ update Docs: Add SetHandler and new env var to Apache config docs.
+ (rjung)
+ update Apache 1.3: Backport "no-jk" feature. (rjung)
+ update Apache: Add an environment variable to make SetHandler
+ "jakarta-servlet" more useful. The variable is JK_WORKER_NAME,
+ but can be changed by the new directive JkWorkerIndicator.
+ (rjung)
+ fix LB: Don't use single worker shortcut, if the single worker is
+ being diabled. (rjung)
+ fix Status worker: Add short explanation of activation and error
+ states to legend. (rjung)
+ fix Docs: Add meaning of zero timeout values for various timeouts
+ in workers.properties. (rjung)
+ fix LB: Cleanup of Mladens forced recovery. (rjung)
+ fix LB: Do not change lb_value for recovering workers to max, if
+ we are using BUSYNESS method. (rjung)
+ fix Apache: Since 1.2.14 mod_jk failed to detect client abort.
+ (rjung)
+ fix Docs: Corrected description of JkEnvVar. (rjung)
+ fix Solaris: Detect filio.h in configure to make the new
+ connection detection build on solaris (r432825). (rjung)
+ update Add feature to force the recovery of workers that are member
+ of loadbalancer if all the members are in error state. This
+ fixes the time gap where 503 was returned caused by
+ recovery_timeout although the backend was ready to handle the
+ requests. (mturk)
+ update Docs: Seperate deprecated directives in their own table.
+ (rjung)
+ update Docs: Allow "-" and "_" in worker names. (rjung)
+ update Allow multiple lines with attributes "balance_workers" and
+ "mount". (rjung)
+ fix Make jk_is_some_property match more precisely. (rjung)
+ update JkStatus: Make refresh interval changeable. (rjung)
+ fix JkStatus: Adjust display of recover time wrt. global
+ maintenance. (rjung)
+ update LB: Resetting worker state from OK to NA, if worker has been
+ idle too long. (rjung)
+ fix Avoid compiler warnings concerning the use of lb_*_type
+ arrays. Use functions instead. (rjung)
+ update Added %R JkRequestLogFormat option for Apache 1 and Apache 2.
+ (mturk)
+ update Allow changing jvm Route from status manager. (mturk)
+ fix Do not retun 400 if Tomcat fails in the midle of the post
+ request. Return 500 insted. (mturk)
+ update LB: Combine ok/error/recovering/busy runtime states into a
+ single scalar. (rjung)
+ update LB: Combine active/disabled/stopped configuration states into
+ a single scalar. (rjung)
+ update LB: Add several Apache notes to enable standard logging for
+ load balancer results. (rjung)
+ update LB: Reorganisation of the main load balancer service loop.
+ (rjung)
+ update Implement hierarchical worker configuration via attribute
+ "reference". (rjung)
+ update Log deprecated properties. (rjung)
+ fix IIS: Fix simple_rewrite for the cases where the rewritten url
+ is larger then the original one. (mturk)
+ update New JkOption "DisableReuse" to disable connection persistence.
+ (jim)
+ update LB: Move sessionid retrieval out of get_most_suitable_worker
+ into service. (rjung)
+ update Code cleanup for all service methods (use TRACE,
+ JK_LOG_NULL_PARAMS, null pointer checks). (rjung)
+ update JKSTATUS: add refresh link. No refresh for updates. Redirect
+ to list view after update. (rjung)
+ update Add new hook add_log_items into servers. (rjung)
+ update APACHE httpd: Rename apache logging notes. (rjung)
+ update LB: Rename lock and method constants. Add constants for
+ defaults. (rjung)
+ fix Default log level should be INFO and not DEBUG. Default log
+ level should be the same for all server types. (rjung)
+ fix Make rewrite_rule_map and log_level as non mandatory
+ directives for isapi_redirect. (mturk)
+ fix 40107: Rewrite is_socket_connected function. Non blocking
+ socket is not used any more. (mturk)
+ update Allow building with VS2005 without too many warnings. (mturk)
+ fix Decide by MMN, which piped log API we should use. mod_jk
+ 1.2.18 broke compilation with Apache 1.3 pre 1.3.28. (rjung)
+
+ Changes between 1.2.17 and 1.2.18
+ Native
+ fix Using socklen_t in getsockopt. Also introducing jk_sock_t.
+ (mturk)
+ update Allow recovery wait time below 60 seconds (new minimum is 1
+ second). (mturk)
+
+ Changes between 1.2.16 and JK 1.2.17
+ Native
+ fix Fix hanging jk status worker when certain attributes are being
+ updated due to double locking. (rjung)
+ update Allow JkMount to behave like uriworkermap.properties by
+ parsing pipe symbol as two directive marker. (mturk)
+
+ Changes between 1.2.15 and JK 1.2.16
+ Native
+ update Added simple rewrite capability for IIS. Although simple it
+ will fulfill most needs. (mturk)
+ update Added RECOVER_ABORT_IF_CLIENTERROR recovery_option that closes
+ the connection if client connection is broken during the
+ request. (mturk)
+ update Renamed cache_timeout directive to connection_pool_timeout.
+ (mturk)
+ update Added connection_pool_minsize directive. (mturk)
+ update Deprecate recycle_timeout directive. (mturk)
+ update Corrected some HTML syntax bugs in output of status worker.
+ (rjung)
+ update Added the refresh=n parameter to the status worker. It will
+ update the display every n seconds. (rjung)
+ update Balancer: Add attribute distance to balanced workers to
+ express preferences between workers. (rjung)
+ update Balancer: Add attribute jvm_route to balanced workers to be
+ able to use the same target in different balancers. (rjung)
+ update Status: Add lb_mult to status. (rjung)
+ update Balancer: Make different balancing strategies work in a
+ similar way (use lb_value, use decay during global
+ maintenance, use integer factors for weights. (rjung)
+ update Balancer: Improve locking. (rjung)
+ update Balancer: Workers start slower after recovering. (rjung)
+ update Balancer: Make different balancing strategies work in a
+ similar way (use lb_value, use decay during global
+ maintenance, use integer factors lb_mult for weights). (rjung)
+ update Balancer: Move recovery check to global maintenance. (rjung)
+ update Balancer: Add global maintenance method, that is called in
+ only one process. (rjung)
+ update Extend our use of autoconf to find a 32Bit and a 64Bit
+ unsigned type and their printf formats. (rjung)
+ update Logging: piped loggers for JkLogFile and Apache 1.3. (rjung)
+ update Logging: Add PID to log lines for each log level apart from
+ REQUEST. (rjung)
+ update Logging: flush buffered logs to keep lines in correct order.
+ Output final newline together with log message. (rjung)
+ update Reducing shm size. (rjung)
+ update Only log removing of old worker, when we actually do it.
+ (rjung)
+ fix 37469: Fix shared memory close for forked childs. The shared
+ memory will be closed by the parent process. (mturk)
+ fix 37332: Fix potential misuse of buffer length with snprintf
+ functions. (mturk)
+ fix 38859: [CVE-2006-7197] Protect mod_jk against buggy or
+ malicious AJP servers in the backend. Patch provided by
+ Ruediger Pluem. (mturk)
+ fix 38889: Use worker map sorting depending on the path elements,
+ to comply with Servlet spec. Patch provided by Steve Revilak.
+ (mturk)
+ update 36138: Added Busyness lb method. Patch provided by Chris
+ Lamprecht. (mturk)
+ fix Fix pessimistic locking mode. The patch correctly handles the
+ burst load, by syncing the access to the shared memory data.
+ (mturk)
+ fix 38806: Reclycle worker even if it is disabled. This fixes
+ hot-standby workers in error state. (mturk)
+ fix 37167: Allow building with BSD-ish like make. (mturk)
+ fix ISAPI plugin (isapi_redirect.dll) did not provide correct
+ request data for IIS to include in the IIS log. (markt)
+
+ Changes between 1.2.14 and 1.2.15
+ Native
+ fix Fix AJP13 Cookie2 parsing. Cookie2 was always send as Cookie.
+ Patch provided by Andre Gebers. (mturk)
+ fix 35862: NSAPI plugin attempts to read freed memory and attempts to
+ dereference a null pointer. Patch provided by Brian Kavanagh.
+ (markt)
+
+ Changes between 1.2.13 and 1.2.14
+ Native
+ fix Fix lb for worker mpm's with cachesize set to lower number then
+ ThreadsPerChild is. If retries is set to value larger then 3
+ sleep for 100 ms on each attempt. This enables to tune the
+ connection cache, and serialize incoming connections instead
+ returning busy if connection count is larger then cachesize.
+ (mturk)
+ fix 36525: Solaris core dump. (mturk)
+ fix 36102: Worker actions do not persist. (mturk)
+ fix 35864: Status worker doesn't list workers. Patch provided by
+ Martin Goldhahn. (mturk)
+ fix 35809: JkMountCopy don't work for Apache 2.0 Patch provided by
+ Christophe Dubach. (mturk)
+ fix 35298: Multiple JK/ISAPI redirectors on a single IIS site are not
+ supported Patch provided by Tim Whittington. (mturk)
+
+ Changes between 1.2.12 and 1.2.13
+ Native
+ fix 34397: Emergency was handled as Error. (jfclere)
+ fix 34474: // in URL were not handled correctly with Apache-1.3.
+ (jfclere)
+ fix Use 64 bits int for transferred/read bytes.
+ update Added JkOptions +FlushPackets used to optimize memory usage
+ when sending large data. (mturk)
+ update Added lock directive for load balancer that allows more
+ acurate load balancing in case of burst load. (mturk)
+ update Added worker.maintain directive to allow customizing default
+ 10 second timeout. On busy servers this value needs to be set
+ on higher value. (mturk)
+ fix Fix for NetWare compiler to deal with different types between
+ AP13 and AP2 SDKs. (fuankg)
+ update Emit much more legible user.dmp crash analysis output for
+ WIN32. (wrowe)
+ fix 34558: Fix first failover request. (mturk)
+
+ Changes between 1.2.11 and 1.2.12
+ Native
+ update Added ForwardLocallAddres JkOptions flag for passing local
+ instead remote address. Useful for remote addr valve. (mturk)
+ fix Fix that worker not used, when stopped flag is true. (pero)
+ update Add loadbalance default worker secret attribute to the
+ documentation (pero)
+
+ Changes between 1.2.10 and 1.2.11
+ Native
+ fix Backport SC_M_JK_STORED from JK2 for passing arbitrary methods
+ instead failing the request. (mturk)
+ fix Added missing SEARCH and ACL http methods. (mturk)
+ update Add worker secret attribute to the documentation (pero)
+ update Add a stopped flag to worker configuration. Set flag True and
+ complete traffic to worker is stopped. Also update the Ant
+ JkStatusUpdateTask at Tomcat 5.5.10 release. Only usefull in a
+ replicated session cluster.(pero)
+ update Added worker maintain function that will maintain all the
+ workers instead just the current one. This enables to recycle
+ the connections on all workers. (mturk)
+ update Use shutdown when recycling connections instead hard breaking
+ the socket. (mturk)
+ update Add unique directives checking. The directives if unique are
+ now overwritten instead concatenated. (mturk)
+ update Allow multiple worker.list directives. (mturk)
+ fix 34577: For IIS log original request instead loging the request
+ for ISAPI extension. (mturk)
+ fix 34558: Make sure the returned status codes are the same for
+ ajp and lb workers. (mturk)
+ fix 34423: Use APR_USE_FLOCK_SERIALIZE for setting log lock on
+ platforms like FreeBSD. Patch provided by Allan Saddi. (mturk)
+ fix 33843: Fix obtaining LDFLAGS that were used for building
+ Apache HTTPD. Patch provided by Beat Kneubuehl. (mturk)
+ fix 34358: Enable load balancer method configuration. (glenn)
+ fix 34357: In some situations Apache 2 mod_jk could segfault when
+ the JkAutoAlias directive is used. (glenn)
+ update Add --enable-prefork to the documentation (pero)
+
+ Changes between 1.2.9 and 1.2.10
+ Native
+ update Set default shared memory to 64K instead 1M. (mturk)
+ fix Do not mark the worker in error state if headers are larger
+ then AJP13 limit. (mturk)
+ update On Series you should use the latest PTF for Apache 2.0 (which
+ is now 2.0.52) and ad minima SI17402/SI17061 or cumulative
+ including them. (hgomez)
+ update Change the xml status format to xml attribute syntax (pero)
+ fix 33248: Fix builds where apxs defines multiple directories for
+ APR includes. (mturk)
+ fix 32696: Return 404 instead 403 when WEB-INF is requested to
+ comply with Servlet spec. (mturk)
+ update Added ANT task for managing jkstatus. (pero)
+ update If socket_timeout is set, check if socket is alive before
+ sending any request to Tomcat. (mturk)
+ update Added JkMountFile for Apache web servers. This file can
+ contain uri mappings in the form (/url=worker), and is checked
+ for updates at regular 60 second interval. (mturk)
+ update Added status worker for managing worker runtime data using web
+ page. (mturk)
+ update Added load balancer method directive that is used for setting
+ the algorithm used for balancing workers. Method can be either
+ Request (default) or Traffic. (mturk)
+ update Added shared memory to allow dynamic configuration. Shared
+ memory is needed only for unix platform and web servers having
+ multiple child processes. For Apache web server two new
+ directives has been added (JkShmFile and JkShmSize). (mturk)
+ update Added textupdate mode to status worker to handle remote
+ updates from ant tasks.(pero)
+ fix 33562: Fix Reply_timeout when recovery_options is larger than
+ 1. Patch provided by Takashi Satou. (mturk)
+ fix 33308: Fix segfaults when ForwardDirectories is enabled with
+ Apache 1.3
+
+ Changes between 1.2.7 and 1.2.8
+ Native
+ update Allow anyone to debug and diagnose stack dumps using windbg or
+ any other debugging tool, and (if they add the .pdb files to
+ their installation) to make sense of dr watson logs. Patch
+ provided by William A. Rowe (wrowe)
+ fix Fix in_addr_t usage by using the real struct ignoring typedef.
+ Patch provided by William A. Rowe (wrowe)
+ fix Fix url rewriting by restoring the in place uri from which the
+ jsessionid was removed. (mturk)
+ update Make load balancer algorithm thread safe by introducing mutex
+ to the load balancer worker. (mturk)
+ fix Fix sending error pages for IIS to client by adding
+ Content-Type header using correct api function call. (mturk)
+ fix 32696: Prevent IIS from crushing when web-inf url was
+ requested. (mturk)
+ update Use default cachesize for servers that support discovering the
+ number of threads per child process. (mturk).
+ fix Fix Apache content-length header parsing using case
+ insensitive compare. (billbarker)
+ fix Fix parsing AJP headers using case insensitive compare.
+ (mturk)
+ fix Use infinite socket timeout if socket_timeout is set to zero
+ or less then zero. (mturk)
+ update Change balanced_workers to balance_workers but keep backward
+ compatibility preserving the old directive. (mturk).
+ fix Fix ajp initialization for workers with cache_size set to
+ zero. (mturk)
+ update 32317: Making mod_jk replication aware (Clustering Support).
+ Patch provided by Rainer Jung. (mturk).
+ fix 31132: Core dump when JkLogFile is missing from conf. (mturk)
+
+ Changes between 1.2.6 and 1.2.7
+ Native
+ update Added new property named recover_time that can be used to
+ change the default 60 second recover time. (mturk)
+ update Added custom retries for worker, so we don't depend on default
+ setting. If set to a number grater then 3, it will sleep for
+ 100ms on retry greater then 3 and then try again. (mturk)
+ update Added JkWorkerProperty directive that enables omiting
+ workers.properties file. For example: JkWorkerProperty
+ worker.ajp13a.port=8009. (mturk)
+ fix Check all JSESSIONID cookies for a valid jvmRoute. If you have
+ multiple Tomcats with overlapping domains, then you can get
+ multiple cookies without a defined order. This will route
+ correctly as long as the different domains don't have any
+ Tomcats in common. (billbarker)
+ update Added JkUnMount directive for negative mappings that works as
+ opposite to JkMount directives. It is used for blocking of
+ particular URL or content type. (mturk)
+ update Added wildchar match uri mappings. One can now use JkMount to
+ map /app/*/servlet/* or /app?/*/*.jsp. (mturk)
+ update Rewrite the logging by adding Trace options. (mturk)
+ update Added socket_timeout property that sets the timeout for the
+ socket itself. (mturk)
+ fix Changed socket_timeout property to recycle_timeout. This
+ better explains what the directive actually does. (mturk)
+ fix Changed the load balancer algorithm. The idea behind this new
+ scheduler is the following: lbfactor is how much we expect
+ this worker to work, or the worker's work quota. lbstatus is
+ how urgent this worker has to work to fulfill its quota of
+ work. We distribute each worker's work quota to the worker,
+ and then look which of them needs to work most urgently
+ (biggest lbstatus). This worker is then selected for work, and
+ its lbstatus reduced by the total work quota we distributed to
+ all workers. Thus the sum of all lbstatus does not change.(*)
+ If some workers are disabled, the others will still be
+ scheduled correctly. (mturk)
+
+ JK 2
+ JK2 has been put in maintainer mode and no further development will
+ take place. The reason for shutting down JK2 development was the lack
+ of developers interest. Other reason was lack of users interest in
+ adopting JK2, caused by configuration complexity when compared to JK.
+ ---------------------------------------------------------------------------
+ Copyright © 1999-2011, Apache Software Foundation
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/Makefile b/rubbos/app/tomcat-connectors-1.2.32-src/native/Makefile
new file mode 100644
index 00000000..70c855da
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/Makefile
@@ -0,0 +1,702 @@
+# Makefile.in generated by automake 1.9.2 from Makefile.am.
+# Makefile. Generated from Makefile.in by configure.
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+srcdir = .
+top_srcdir = .
+
+pkgdatadir = $(datadir)/mod_jk
+pkglibdir = $(libdir)/mod_jk
+pkgincludedir = $(includedir)/mod_jk
+top_builddir = .
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = /usr/bin/install -c
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = x86_64-unknown-linux-gnu
+host_triplet = x86_64-unknown-linux-gnu
+target_triplet = x86_64-unknown-linux-gnu
+DIST_COMMON = $(am__configure_deps) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in \
+ $(top_srcdir)/apache-1.3/Makefile.apxs.in \
+ $(top_srcdir)/apache-1.3/Makefile.in \
+ $(top_srcdir)/apache-2.0/Makefile.apxs.in \
+ $(top_srcdir)/apache-2.0/Makefile.in \
+ $(top_srcdir)/common/Makefile.in \
+ $(top_srcdir)/common/config.h.in \
+ $(top_srcdir)/common/jk_types.h.in \
+ $(top_srcdir)/common/list.mk.in $(top_srcdir)/configure \
+ $(top_srcdir)/jni/Makefile.in NEWS \
+ scripts/build/unix/config.guess scripts/build/unix/config.sub \
+ scripts/build/unix/install-sh scripts/build/unix/ltmain.sh \
+ scripts/build/unix/missing
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/scripts/build/jk_common.m4 \
+ $(top_srcdir)/../support/os_apache.m4 \
+ $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno configure.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/common/config.h
+CONFIG_CLEAN_FILES = apache-1.3/Makefile apache-1.3/Makefile.apxs \
+ apache-2.0/Makefile apache-2.0/Makefile.apxs common/Makefile \
+ common/list.mk common/jk_types.h jni/Makefile
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+ html-recursive info-recursive install-data-recursive \
+ install-exec-recursive install-info-recursive \
+ install-recursive installcheck-recursive installdirs-recursive \
+ pdf-recursive ps-recursive uninstall-info-recursive \
+ uninstall-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+ { test ! -d $(distdir) \
+ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
+ && rm -fr $(distdir); }; }
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = ${SHELL} /bottlenecks/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/missing --run aclocal-1.9
+AMDEP_FALSE = #
+AMDEP_TRUE =
+AMTAR = ${SHELL} /bottlenecks/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/missing --run tar
+APACHE20_OEXT = .c
+APACHE_CONFIG_VARS = /bottlenecks/rubbos/app/apache2/build/config_vars.mk
+APACHE_DIR = /bottlenecks/rubbos/app/apache2
+APXS = /bottlenecks/rubbos/app/apache2/bin/apxs
+APXSCFLAGS = -g -O2 -pthread -DHAVE_APR -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include -DHAVE_CONFIG_H -DHAVE_JNI
+APXSCPPFLAGS = -D_REENTRANT -D_GNU_SOURCE
+APXSLDFLAGS =
+AR = ar
+AUTOCONF = ${SHELL} /bottlenecks/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/missing --run autoconf
+AUTOHEADER = ${SHELL} /bottlenecks/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/missing --run autoheader
+AUTOMAKE = ${SHELL} /bottlenecks/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/missing --run automake-1.9
+AWK = gawk
+CC = gcc
+CCDEPMODE = depmode=none
+CFLAGS = -DHAVE_CONFIG_H -DHAVE_JNI
+CP = /bin/cp
+CPP = gcc -E
+CPPFLAGS =
+CXX = g++
+CXXCPP = g++ -E
+CXXDEPMODE = depmode=none
+CXXFLAGS = -g -O2
+CYGPATH_W = echo
+DEFS = -DHAVE_CONFIG_H
+DEPDIR = .deps
+ECHO = /bin/echo
+ECHO_C =
+ECHO_N = -n
+ECHO_T =
+EGREP = grep -E
+EXEEXT =
+F77 =
+FFLAGS =
+GREP = /bin/grep
+INSTALL_DATA = ${INSTALL} -m 644
+INSTALL_PROGRAM = ${INSTALL}
+INSTALL_SCRIPT = ${INSTALL}
+INSTALL_STRIP_PROGRAM = ${SHELL} $(install_sh) -c -s
+INSTALL_TYPE = install_dynamic
+JAVA_HOME = /bottlenecks/rubbos/app/jdk1.6.0_27
+JK_JNI_WORKER = ${JK}jk_jni_worker${OEXT}
+LDFLAGS =
+LIBOBJS =
+LIBS =
+LIBTOOL = /bin/bash /bottlenecks/rubbos/app/apache2/build/libtool --silent
+LIB_JK_TYPE = mod_jk.so
+LN_S = ln -s
+LTLIBOBJS =
+MAKEINFO = ${SHELL} /bottlenecks/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/missing --run makeinfo
+MAKE_DYNAMIC_APACHE_FALSE = #
+MAKE_DYNAMIC_APACHE_TRUE =
+MKDIR = /bin/mkdir
+OBJEXT = o
+OS = linux
+PACKAGE = mod_jk
+PACKAGE_BUGREPORT =
+PACKAGE_NAME =
+PACKAGE_STRING =
+PACKAGE_TARNAME =
+PACKAGE_VERSION =
+PATH_SEPARATOR = :
+PERL = /usr/bin/perl
+RANLIB = ranlib
+RM = /bin/rm
+SED = /bin/sed
+SET_MAKE =
+SHELL = /bin/bash
+STRIP = strip
+TEST = /usr/bin/test
+VERSION = 1.2.32
+WEBSERVER = common jni apache-2.0
+ac_ct_AR = ar
+ac_ct_CC = gcc
+ac_ct_CXX = g++
+ac_ct_F77 =
+ac_ct_RANLIB = ranlib
+ac_ct_STRIP = strip
+am__fastdepCC_FALSE =
+am__fastdepCC_TRUE = #
+am__fastdepCXX_FALSE =
+am__fastdepCXX_TRUE = #
+am__include = include
+am__leading_dot = .
+am__quote =
+am__tar = ${AMTAR} chof - "$$tardir"
+am__untar = ${AMTAR} xf -
+apache_include = -I/bottlenecks/rubbos/app/apache2/include
+bindir = ${exec_prefix}/bin
+build = x86_64-unknown-linux-gnu
+build_alias =
+build_cpu = x86_64
+build_os = linux-gnu
+build_vendor = unknown
+datadir = ${prefix}/share
+exec_prefix = ${prefix}
+host = x86_64-unknown-linux-gnu
+host_alias =
+host_cpu = x86_64
+host_os = linux-gnu
+host_vendor = unknown
+includedir = ${prefix}/include
+infodir = ${prefix}/info
+install_sh = /bottlenecks/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/install-sh
+int32_t_fmt = #define JK_INT32_T_FMT "d"
+int32_value = int
+int64_t_fmt = #define JK_INT64_T_FMT "ld"
+int64_value = long
+libdir = ${exec_prefix}/lib
+libexecdir = ${exec_prefix}/libexec
+localstatedir = ${prefix}/var
+mandir = ${prefix}/man
+mkdir_p = mkdir -p --
+oldincludedir = /usr/include
+pid_t_fmt = #define JK_PID_T_FMT "d"
+prefix = /usr/local
+program_transform_name = s,x,x,
+pthread_t_fmt = #define JK_PTHREAD_T_FMT "lu"
+pthread_t_value = long
+sbindir = ${exec_prefix}/sbin
+sharedstatedir = ${prefix}/com
+sysconfdir = ${prefix}/etc
+target = x86_64-unknown-linux-gnu
+target_alias =
+target_cpu = x86_64
+target_os = linux-gnu
+target_vendor = unknown
+uint32_t_fmt = #define JK_UINT32_T_FMT "u"
+uint32_t_hex_fmt = #define JK_UINT32_T_HEX_FMT "x"
+uint64_t_fmt = #define JK_UINT64_T_FMT "lu"
+uint64_t_hex_fmt = #define JK_UINT64_T_HEX_FMT "lx"
+
+#
+# Tell automake what it should do
+AUTOMAKE_OPTIONS = foreign
+MAINTAINERCLEANFILES = config.cache config.status config.log \
+config.nice Makefile.in configure common/config.h.in \
+common/config.h aclocal.m4
+
+SUBDIRS = common jni apache-2.0
+all: all-recursive
+
+.SUFFIXES:
+am--refresh:
+ @:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \
+ cd $(srcdir) && $(AUTOMAKE) --foreign \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --foreign Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ echo ' $(SHELL) ./config.status'; \
+ $(SHELL) ./config.status;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ $(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+
+common/config.h: common/stamp-h1
+ @if test ! -f $@; then \
+ rm -f common/stamp-h1; \
+ $(MAKE) common/stamp-h1; \
+ else :; fi
+
+common/stamp-h1: $(top_srcdir)/common/config.h.in $(top_builddir)/config.status
+ @rm -f common/stamp-h1
+ cd $(top_builddir) && $(SHELL) ./config.status common/config.h
+$(top_srcdir)/common/config.h.in: $(am__configure_deps)
+ cd $(top_srcdir) && $(AUTOHEADER)
+ rm -f common/stamp-h1
+ touch $@
+
+distclean-hdr:
+ -rm -f common/config.h common/stamp-h1
+apache-1.3/Makefile: $(top_builddir)/config.status $(top_srcdir)/apache-1.3/Makefile.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+apache-1.3/Makefile.apxs: $(top_builddir)/config.status $(top_srcdir)/apache-1.3/Makefile.apxs.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+apache-2.0/Makefile: $(top_builddir)/config.status $(top_srcdir)/apache-2.0/Makefile.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+apache-2.0/Makefile.apxs: $(top_builddir)/config.status $(top_srcdir)/apache-2.0/Makefile.apxs.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+common/Makefile: $(top_builddir)/config.status $(top_srcdir)/common/Makefile.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+common/list.mk: $(top_builddir)/config.status $(top_srcdir)/common/list.mk.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+common/jk_types.h: $(top_builddir)/config.status $(top_srcdir)/common/jk_types.h.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+jni/Makefile: $(top_builddir)/config.status $(top_srcdir)/jni/Makefile.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+# (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+ @set fnord $$MAKEFLAGS; amf=$$2; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+ @set fnord $$MAKEFLAGS; amf=$$2; \
+ dot_seen=no; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ rev=''; for subdir in $$list; do \
+ if test "$$subdir" = "."; then :; else \
+ rev="$$subdir $$rev"; \
+ fi; \
+ done; \
+ rev="$$rev ."; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+ctags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ $(am__remove_distdir)
+ mkdir $(distdir)
+ $(mkdir_p) $(distdir)/../support $(distdir)/apache-1.3 $(distdir)/apache-2.0 $(distdir)/common $(distdir)/jni $(distdir)/scripts/build $(distdir)/scripts/build/unix
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+ list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -d "$(distdir)/$$subdir" \
+ || $(mkdir_p) "$(distdir)/$$subdir" \
+ || exit 1; \
+ distdir=`$(am__cd) $(distdir) && pwd`; \
+ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+ (cd $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$top_distdir" \
+ distdir="$$distdir/$$subdir" \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+ -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
+ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \
+ || chmod -R a+r $(distdir)
+dist-gzip: distdir
+ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ $(am__remove_distdir)
+
+dist-bzip2: distdir
+ tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+ $(am__remove_distdir)
+
+dist-tarZ: distdir
+ tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+ $(am__remove_distdir)
+
+dist-shar: distdir
+ shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+ $(am__remove_distdir)
+
+dist-zip: distdir
+ -rm -f $(distdir).zip
+ zip -rq $(distdir).zip $(distdir)
+ $(am__remove_distdir)
+
+dist dist-all: distdir
+ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ $(am__remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration. Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+ case '$(DIST_ARCHIVES)' in \
+ *.tar.gz*) \
+ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
+ *.tar.bz2*) \
+ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
+ *.tar.Z*) \
+ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+ *.shar.gz*) \
+ GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
+ *.zip*) \
+ unzip $(distdir).zip ;;\
+ esac
+ chmod -R a-w $(distdir); chmod a+w $(distdir)
+ mkdir $(distdir)/_build
+ mkdir $(distdir)/_inst
+ chmod a-w $(distdir)
+ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+ && cd $(distdir)/_build \
+ && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+ $(DISTCHECK_CONFIGURE_FLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) dvi \
+ && $(MAKE) $(AM_MAKEFLAGS) check \
+ && $(MAKE) $(AM_MAKEFLAGS) install \
+ && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+ && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+ distuninstallcheck \
+ && chmod -R a-w "$$dc_install_base" \
+ && ({ \
+ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+ } || { rm -rf "$$dc_destdir"; exit 1; }) \
+ && rm -rf "$$dc_destdir" \
+ && $(MAKE) $(AM_MAKEFLAGS) dist \
+ && rm -rf $(DIST_ARCHIVES) \
+ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck
+ $(am__remove_distdir)
+ @(echo "$(distdir) archives ready for distribution: "; \
+ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+ sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}'
+distuninstallcheck:
+ @cd $(distuninstallcheck_dir) \
+ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+ || { echo "ERROR: files left after uninstall:" ; \
+ if test -n "$(DESTDIR)"; then \
+ echo " (check DESTDIR support)"; \
+ fi ; \
+ $(distuninstallcheck_listfiles) ; \
+ exit 1; } >&2
+distcleancheck: distclean
+ @if test '$(srcdir)' = . ; then \
+ echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+ exit 1 ; \
+ fi
+ @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left in build directory after distclean:" ; \
+ $(distcleancheck_listfiles) ; \
+ exit 1; } >&2
+check-am: all-am
+check: check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+ -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-hdr \
+ distclean-libtool distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-recursive
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -rf $(top_srcdir)/autom4te.cache
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \
+ check-am clean clean-generic clean-libtool clean-recursive \
+ ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \
+ dist-shar dist-tarZ dist-zip distcheck distclean \
+ distclean-generic distclean-hdr distclean-libtool \
+ distclean-recursive distclean-tags distcleancheck distdir \
+ distuninstallcheck dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-exec \
+ install-exec-am install-info install-info-am install-man \
+ install-strip installcheck installcheck-am installdirs \
+ installdirs-am maintainer-clean maintainer-clean-generic \
+ maintainer-clean-recursive mostlyclean mostlyclean-generic \
+ mostlyclean-libtool mostlyclean-recursive pdf pdf-am ps ps-am \
+ tags tags-recursive uninstall uninstall-am uninstall-info-am
+
+
+all:
+ target="all"; \
+ list='$(SUBDIRS)'; \
+ for i in $$list; do \
+ echo "Making $$target in $$i"; \
+ if test "$$i" != "."; then \
+ (cd $$i && $(MAKE) $$target) || exit 1; \
+ fi; \
+ done;
+
+apidocs: common/*.h
+ ../../scandoc/scandoc.pl -i ../../scandoc/template.pl -p \
+ ./docs/api/ -dproject="mod_jk Library" common/*.h common/*.c
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/Makefile.am b/rubbos/app/tomcat-connectors-1.2.32-src/native/Makefile.am
new file mode 100644
index 00000000..392283e6
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/Makefile.am
@@ -0,0 +1,37 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#
+# Tell automake what it should do
+AUTOMAKE_OPTIONS = foreign
+MAINTAINERCLEANFILES=config.cache config.status config.log \
+config.nice Makefile.in configure common/config.h.in \
+common/config.h aclocal.m4
+
+SUBDIRS = @WEBSERVER@
+
+all:
+ target="all"; \
+ list='$(SUBDIRS)'; \
+ for i in $$list; do \
+ echo "Making $$target in $$i"; \
+ if test "$$i" != "."; then \
+ (cd $$i && $(MAKE) $$target) || exit 1; \
+ fi; \
+ done;
+
+apidocs: common/*.h
+ ../../scandoc/scandoc.pl -i ../../scandoc/template.pl -p \
+ ./docs/api/ -dproject="mod_jk Library" common/*.h common/*.c
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/Makefile.in b/rubbos/app/tomcat-connectors-1.2.32-src/native/Makefile.in
new file mode 100644
index 00000000..03226c63
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/Makefile.in
@@ -0,0 +1,702 @@
+# Makefile.in generated by automake 1.9.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = .
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+DIST_COMMON = $(am__configure_deps) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in \
+ $(top_srcdir)/apache-1.3/Makefile.apxs.in \
+ $(top_srcdir)/apache-1.3/Makefile.in \
+ $(top_srcdir)/apache-2.0/Makefile.apxs.in \
+ $(top_srcdir)/apache-2.0/Makefile.in \
+ $(top_srcdir)/common/Makefile.in \
+ $(top_srcdir)/common/config.h.in \
+ $(top_srcdir)/common/jk_types.h.in \
+ $(top_srcdir)/common/list.mk.in $(top_srcdir)/configure \
+ $(top_srcdir)/jni/Makefile.in NEWS \
+ scripts/build/unix/config.guess scripts/build/unix/config.sub \
+ scripts/build/unix/install-sh scripts/build/unix/ltmain.sh \
+ scripts/build/unix/missing
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/scripts/build/jk_common.m4 \
+ $(top_srcdir)/../support/os_apache.m4 \
+ $(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno configure.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/common/config.h
+CONFIG_CLEAN_FILES = apache-1.3/Makefile apache-1.3/Makefile.apxs \
+ apache-2.0/Makefile apache-2.0/Makefile.apxs common/Makefile \
+ common/list.mk common/jk_types.h jni/Makefile
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+ html-recursive info-recursive install-data-recursive \
+ install-exec-recursive install-info-recursive \
+ install-recursive installcheck-recursive installdirs-recursive \
+ pdf-recursive ps-recursive uninstall-info-recursive \
+ uninstall-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+ { test ! -d $(distdir) \
+ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
+ && rm -fr $(distdir); }; }
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+APACHE20_OEXT = @APACHE20_OEXT@
+APACHE_CONFIG_VARS = @APACHE_CONFIG_VARS@
+APACHE_DIR = @APACHE_DIR@
+APXS = @APXS@
+APXSCFLAGS = @APXSCFLAGS@
+APXSCPPFLAGS = @APXSCPPFLAGS@
+APXSLDFLAGS = @APXSLDFLAGS@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CP = @CP@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GREP = @GREP@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTALL_TYPE = @INSTALL_TYPE@
+JAVA_HOME = @JAVA_HOME@
+JK_JNI_WORKER = @JK_JNI_WORKER@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIB_JK_TYPE = @LIB_JK_TYPE@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MAKE_DYNAMIC_APACHE_FALSE = @MAKE_DYNAMIC_APACHE_FALSE@
+MAKE_DYNAMIC_APACHE_TRUE = @MAKE_DYNAMIC_APACHE_TRUE@
+MKDIR = @MKDIR@
+OBJEXT = @OBJEXT@
+OS = @OS@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+RANLIB = @RANLIB@
+RM = @RM@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TEST = @TEST@
+VERSION = @VERSION@
+WEBSERVER = @WEBSERVER@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+apache_include = @apache_include@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+int32_t_fmt = @int32_t_fmt@
+int32_value = @int32_value@
+int64_t_fmt = @int64_t_fmt@
+int64_value = @int64_value@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pid_t_fmt = @pid_t_fmt@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+pthread_t_fmt = @pthread_t_fmt@
+pthread_t_value = @pthread_t_value@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+uint32_t_fmt = @uint32_t_fmt@
+uint32_t_hex_fmt = @uint32_t_hex_fmt@
+uint64_t_fmt = @uint64_t_fmt@
+uint64_t_hex_fmt = @uint64_t_hex_fmt@
+
+#
+# Tell automake what it should do
+AUTOMAKE_OPTIONS = foreign
+MAINTAINERCLEANFILES = config.cache config.status config.log \
+config.nice Makefile.in configure common/config.h.in \
+common/config.h aclocal.m4
+
+SUBDIRS = @WEBSERVER@
+all: all-recursive
+
+.SUFFIXES:
+am--refresh:
+ @:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \
+ cd $(srcdir) && $(AUTOMAKE) --foreign \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --foreign Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ echo ' $(SHELL) ./config.status'; \
+ $(SHELL) ./config.status;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ $(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+
+common/config.h: common/stamp-h1
+ @if test ! -f $@; then \
+ rm -f common/stamp-h1; \
+ $(MAKE) common/stamp-h1; \
+ else :; fi
+
+common/stamp-h1: $(top_srcdir)/common/config.h.in $(top_builddir)/config.status
+ @rm -f common/stamp-h1
+ cd $(top_builddir) && $(SHELL) ./config.status common/config.h
+$(top_srcdir)/common/config.h.in: $(am__configure_deps)
+ cd $(top_srcdir) && $(AUTOHEADER)
+ rm -f common/stamp-h1
+ touch $@
+
+distclean-hdr:
+ -rm -f common/config.h common/stamp-h1
+apache-1.3/Makefile: $(top_builddir)/config.status $(top_srcdir)/apache-1.3/Makefile.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+apache-1.3/Makefile.apxs: $(top_builddir)/config.status $(top_srcdir)/apache-1.3/Makefile.apxs.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+apache-2.0/Makefile: $(top_builddir)/config.status $(top_srcdir)/apache-2.0/Makefile.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+apache-2.0/Makefile.apxs: $(top_builddir)/config.status $(top_srcdir)/apache-2.0/Makefile.apxs.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+common/Makefile: $(top_builddir)/config.status $(top_srcdir)/common/Makefile.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+common/list.mk: $(top_builddir)/config.status $(top_srcdir)/common/list.mk.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+common/jk_types.h: $(top_builddir)/config.status $(top_srcdir)/common/jk_types.h.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+jni/Makefile: $(top_builddir)/config.status $(top_srcdir)/jni/Makefile.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+# (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+ @set fnord $$MAKEFLAGS; amf=$$2; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+ @set fnord $$MAKEFLAGS; amf=$$2; \
+ dot_seen=no; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ rev=''; for subdir in $$list; do \
+ if test "$$subdir" = "."; then :; else \
+ rev="$$subdir $$rev"; \
+ fi; \
+ done; \
+ rev="$$rev ."; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+ctags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ $(am__remove_distdir)
+ mkdir $(distdir)
+ $(mkdir_p) $(distdir)/../support $(distdir)/apache-1.3 $(distdir)/apache-2.0 $(distdir)/common $(distdir)/jni $(distdir)/scripts/build $(distdir)/scripts/build/unix
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+ list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -d "$(distdir)/$$subdir" \
+ || $(mkdir_p) "$(distdir)/$$subdir" \
+ || exit 1; \
+ distdir=`$(am__cd) $(distdir) && pwd`; \
+ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+ (cd $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$top_distdir" \
+ distdir="$$distdir/$$subdir" \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+ -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
+ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \
+ || chmod -R a+r $(distdir)
+dist-gzip: distdir
+ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ $(am__remove_distdir)
+
+dist-bzip2: distdir
+ tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+ $(am__remove_distdir)
+
+dist-tarZ: distdir
+ tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+ $(am__remove_distdir)
+
+dist-shar: distdir
+ shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+ $(am__remove_distdir)
+
+dist-zip: distdir
+ -rm -f $(distdir).zip
+ zip -rq $(distdir).zip $(distdir)
+ $(am__remove_distdir)
+
+dist dist-all: distdir
+ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ $(am__remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration. Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+ case '$(DIST_ARCHIVES)' in \
+ *.tar.gz*) \
+ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
+ *.tar.bz2*) \
+ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
+ *.tar.Z*) \
+ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+ *.shar.gz*) \
+ GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
+ *.zip*) \
+ unzip $(distdir).zip ;;\
+ esac
+ chmod -R a-w $(distdir); chmod a+w $(distdir)
+ mkdir $(distdir)/_build
+ mkdir $(distdir)/_inst
+ chmod a-w $(distdir)
+ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+ && cd $(distdir)/_build \
+ && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+ $(DISTCHECK_CONFIGURE_FLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) dvi \
+ && $(MAKE) $(AM_MAKEFLAGS) check \
+ && $(MAKE) $(AM_MAKEFLAGS) install \
+ && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+ && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+ distuninstallcheck \
+ && chmod -R a-w "$$dc_install_base" \
+ && ({ \
+ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+ } || { rm -rf "$$dc_destdir"; exit 1; }) \
+ && rm -rf "$$dc_destdir" \
+ && $(MAKE) $(AM_MAKEFLAGS) dist \
+ && rm -rf $(DIST_ARCHIVES) \
+ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck
+ $(am__remove_distdir)
+ @(echo "$(distdir) archives ready for distribution: "; \
+ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+ sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}'
+distuninstallcheck:
+ @cd $(distuninstallcheck_dir) \
+ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+ || { echo "ERROR: files left after uninstall:" ; \
+ if test -n "$(DESTDIR)"; then \
+ echo " (check DESTDIR support)"; \
+ fi ; \
+ $(distuninstallcheck_listfiles) ; \
+ exit 1; } >&2
+distcleancheck: distclean
+ @if test '$(srcdir)' = . ; then \
+ echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+ exit 1 ; \
+ fi
+ @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left in build directory after distclean:" ; \
+ $(distcleancheck_listfiles) ; \
+ exit 1; } >&2
+check-am: all-am
+check: check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+ -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-hdr \
+ distclean-libtool distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-recursive
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -rf $(top_srcdir)/autom4te.cache
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \
+ check-am clean clean-generic clean-libtool clean-recursive \
+ ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \
+ dist-shar dist-tarZ dist-zip distcheck distclean \
+ distclean-generic distclean-hdr distclean-libtool \
+ distclean-recursive distclean-tags distcleancheck distdir \
+ distuninstallcheck dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-exec \
+ install-exec-am install-info install-info-am install-man \
+ install-strip installcheck installcheck-am installdirs \
+ installdirs-am maintainer-clean maintainer-clean-generic \
+ maintainer-clean-recursive mostlyclean mostlyclean-generic \
+ mostlyclean-libtool mostlyclean-recursive pdf pdf-am ps ps-am \
+ tags tags-recursive uninstall uninstall-am uninstall-info-am
+
+
+all:
+ target="all"; \
+ list='$(SUBDIRS)'; \
+ for i in $$list; do \
+ echo "Making $$target in $$i"; \
+ if test "$$i" != "."; then \
+ (cd $$i && $(MAKE) $$target) || exit 1; \
+ fi; \
+ done;
+
+apidocs: common/*.h
+ ../../scandoc/scandoc.pl -i ../../scandoc/template.pl -p \
+ ./docs/api/ -dproject="mod_jk Library" common/*.h common/*.c
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/NEWS b/rubbos/app/tomcat-connectors-1.2.32-src/native/NEWS
new file mode 100644
index 00000000..cdb19ca4
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/NEWS
@@ -0,0 +1,638 @@
+ Apache TomcatApache Logo
+ ---------------------------------------------------------------------------
+ The Apache Tomcat Connector - News
+
+ 2011 News and Status
+
+ 2011 News & Status
+ 8 July - JK-1.2.32 released
+ The Apache Tomcat team is proud to announce the immediate
+ availability of Tomcat Connectors 1.2.32. This is a stable release
+ concentrating mainly on some bug fixes.
+
+ Please see the ChangeLog for a full list of changes.
+
+ If you find any bugs while using this release, please fill in the
+ Bugzilla Bug Report.
+ ---------------------------------------------------------------------------
+ Copyright © 1999-2011, Apache Software Foundation
+ Apache TomcatApache Logo
+ ---------------------------------------------------------------------------
+ The Apache Tomcat Connector - News
+
+ 2010 News and Status
+
+ 2010 News & Status
+ 1 November - JK-1.2.31 released
+ The Apache Tomcat team is proud to announce the immediate
+ availability of Tomcat Connectors 1.2.31. This is a stable release
+ concentrating mainly on some bug fixes.
+
+ Please see the ChangeLog for a full list of changes.
+
+ If you find any bugs while using this release, please fill in the
+ Bugzilla Bug Report.
+
+ 1 March - JK-1.2.30 released
+ The Apache Tomcat team is proud to announce the immediate
+ availability of Tomcat Connectors 1.2.30. This is a stable release
+ concentrating mainly on some bug fixes.
+
+ Please see the ChangeLog for a full list of changes.
+
+ If you find any bugs while using this release, please fill in the
+ Bugzilla Bug Report.
+
+ 1 March - JK-1.2.29 withdrawn
+ Tomcat Connectors 1.2.29 has been withdrawn because of regression
+ inside Microsoft IIS connector.
+
+ 26 February - JK-1.2.29 released
+ The Apache Tomcat team is proud to announce the immediate
+ availability of Tomcat Connectors 1.2.29. This is a stable release
+ concentrating mainly on some bug fixes.
+
+ Please see the ChangeLog for a full list of changes.
+
+ If you find any bugs while using this release, please fill in the
+ Bugzilla Bug Report.
+ ---------------------------------------------------------------------------
+ Copyright © 1999-2011, Apache Software Foundation
+ Apache TomcatApache Logo
+ ---------------------------------------------------------------------------
+ The Apache Tomcat Connector - News
+
+ 2009 News and Status
+
+ 2009 News & Status
+ 22 March - JK-1.2.28 released
+ The Apache Tomcat team is proud to announce the immediate
+ availability of Tomcat Connectors 1.2.28. This is a stable release
+ concentrating mainly on some bug fixes.
+
+ Please see the ChangeLog for a full list of changes.
+
+ If you find any bugs while using this release, please fill in the
+ Bugzilla Bug Report.
+
+ The most important new features in this version are:
+
+ Better Error Detection for Load Balancer Workers
+
+ Local and global error states have been improved. You can fine tune
+ the behaviour with the new "error_escalation_time" attribute (see the
+ timeouts documentation).
+
+ Dynamic Address and Port Change Using the Status Worker
+
+ The status worker now allows you to change the address and the port
+ of an AJP13 worker on the fly. You can e.g. provision dummy workers
+ with a port equal to "0", which will be automatically put into
+ stopped mode during startup. Later, when you want to actually use
+ thse workers, you set their address and port to the final values.
+
+ Note that already existing connections will go on using the old
+ address and port. This will be improved in future versions.
+
+ New Data in Status Worker Display
+
+ The status worker display now also contains the timestamp of the last
+ worker errors.
+
+ Improved Proxy Flexibility
+
+ You can now overwrite more request metadata before the request gets
+ send to the backend. This is helpful in case there are other reverse
+ proxies in front of your web server. A new documentation page
+ explains this in detail.
+
+ Improved IIS Support
+
+ IIS support has been improved especially when using mutltiple
+ application pools. Furthermore you can now configure the ISAPI plugin
+ to update the uriworkermap.properies file on a regular interval using
+ the watchdog thread.
+
+ JNI Worker Deprecation
+
+ Workers of type jni are broken since a long time. Since there is no
+ more use for them, they have been deprecated now, and will be removed
+ in a future release.
+ ---------------------------------------------------------------------------
+ Copyright © 1999-2011, Apache Software Foundation
+ Apache TomcatApache Logo
+ ---------------------------------------------------------------------------
+ The Apache Tomcat Connector - News
+
+ 2008 News and Status
+
+ 2008 News & Status
+ 28 October - JK-1.2.27 released
+ The Apache Tomcat team is proud to announce the immediate
+ availability of Tomcat Connectors 1.2.27. This is a stable release
+ adding lots of new features and some bug fixes.
+
+ Please see the ChangeLog for a full list of changes.
+
+ If you find any bugs while using this release, please fill in the
+ Bugzilla Bug Report.
+
+ The most important new features in this version are:
+
+ Watchdog Thread for Periodic Tasks
+
+ The connector has to run some periodic tasks independant of request
+ processing. Examples are probing or closing down idle backend
+ connections, adjusting load numbers and recovering workers from error
+ state.
+
+ Before version 1.2.27 these tasks were done inside the request
+ processing loop. When a new request came in and the task was due, the
+ thread handling the request first executed the internal task and then
+ handled the request. If there were no requests coming in, the tasks
+ would not run. If any of the tasks took unexpectedly long, the
+ response time of the request waiting for the finishing of the task
+ went up.
+
+ Starting with this release you can configure a separate watchdog
+ thread inside the web server to run all those tasks independantly of
+ request processing. This new feature is avaliable for the connector
+ when used with Apache httpd 2.x or with Microsoft IIS. To keep the
+ behaviour of the new version consistent with previous releases, this
+ feature is turned off by default. You can activate the watchdog
+ thread via JkWatchdogInterval for Apache or watchdog_interval for
+ IIS.
+
+ Connection Probing
+
+ In previous releases connection probing (checking whether connections
+ still work) could only be done immediately after a new connection was
+ established and directly before sending each request. Since we now
+ have the watchdog thread available, we also added a periodic probing
+ option, which you can activate with the worker attribute ping_mode.
+ This will also be useful as a protection against the infamous
+ firewall idle connection drop.
+
+ The older attributes connect_timeout and prepost_timeout still exist
+ and work the same way they did in previous releases. Since there are
+ now three different probing options, we recommend to migrate your
+ configuration to the newer attributes ping_mode, ping_timeout and
+ connection_ping_interval.
+
+ Mount Extensions
+
+ Usually one defines workers and mounts for the connector. A worker
+ defines a backend we want to talk to and the configuration parameters
+ of the communication, connection pools etc. The mounts define which
+ URIs we want to forward to which worker (so we also call a mount an
+ URI map rule). In version 1.2.27 you can overwrite certain worker
+ parameter per mount.
+
+ One easy to understand example is reply timeouts. Until this release
+ you had to specify a reply timeout for the whole worker. But reply
+ times depend a lot on the type of request. So normally you want to
+ define a general reply timeout and for some special URLs you need to
+ relax the reply timeout, because you know those URLs take much longer
+ to process (like e.g. reporting or other compute intensive tasks).
+
+ Another possible case is the activation status. You might use a load
+ balancer worker to forward requests to certain webapps in a farm of
+ Tomcat nodes. If you wanted to update some webapp on one node, you
+ previously had to stop forwarding requests for all webapps on this
+ Tomcat node. What was not possible until now, was stopping forwarding
+ requests restricted to the webapp and the node you wanted to update.
+
+ Starting with this release, you can add so-called rule extensions to
+ your uriworkermap file to influence worker parameters per mount. This
+ will work for all Apache versions and for IIS. Remember, that the
+ uriworkermap file automatically gets reloaded after changes without
+ web server restart.
+
+ Improved IIS support
+
+ We improved IIS support im various ways. It is now possible to use
+ multiple IIS 6 application pools with the ISAPI redirector.
+
+ Furthermore some improvements were added as compile time features.
+ The most notable one is chunked encoding support, which was a major
+ refactoring and is therefore still considered experimental. You can
+ download binaries with and without chunked encoding support. In
+ future versions, chunked encoding will likely be availabe in all
+ builds.
+
+ Another new feature is an elegant way of configuring error page
+ redirects. All new features are documented on the documentation page
+ about configuring IIS.
+
+ Enhanced Status Worker
+
+ The status worker now can also manage and show statistics for AJP
+ workers that are not part of a load balancer. Other improvements are
+ the new dump action, the integration of the new configuration
+ attributes, showing average request and transfer rates since the last
+ statistics reset and the ability to display only a single member of a
+ load balancer.
+
+ Unfortunately we had to change some request parameters used for the
+ update action of the status worker.
+
+ Miscellaneous Improvements
+
+ Further enhancements are:
+
+ * Configurable session stickyness indicator: cookie name and URL
+ path parameter name can be freely chosen instead of the servlet
+ spec compliant JSESSIONID and ;jsessionid.
+ * Automatically determining the size of the shared memory segment
+ needed to accommodate all workers.
+ * New connection establishment timeout socket_connect_timeout.
+ * New timeout connection_acquire_timeout for acquiring a free
+ connection from the pool.
+ * Improved retry handling by adjusting the meaning of the attribute
+ retries for AJP workers and for load balancers and by adding the
+ new retry_interval.
+ * Allowing the web server to provide error pages instead of Tomcat.
+ ---------------------------------------------------------------------------
+ Copyright © 1999-2011, Apache Software Foundation
+ Apache TomcatApache Logo
+ ---------------------------------------------------------------------------
+ The Apache Tomcat Connector - News
+
+ 2007 News and Status
+
+ 2007 News & Status
+ 21 December - JK-1.2.26 released
+
+ The Apache Tomcat team is proud to announce the immediate availability
+ of Tomcat Connectors 1.2.26. This is a stable release adding few new
+ features and some bug fixes.
+
+ Please see the ChangeLog for a full list of changes.
+
+ If you find any bugs while using this release, please fill in the
+ Bugzilla Bug Report. When entering bug select Native:JK Component.
+
+ --------------------------------------------------------------------------
+
+ 7 August - JK-1.2.25 released
+
+ The Apache Tomcat team is proud to announce the immediate availability
+ of Tomcat Connectors 1.2.25. This is a stable release adding new
+ features and a few bug fixes.
+
+ Please see the ChangeLog for a full list of changes.
+
+ If you find any bugs while using this release, please fill in the
+ Bugzilla Bug Report. When entering bug select Native:JK Component.
+
+ --------------------------------------------------------------------------
+
+ 27 July - JK-1.2.24 released
+
+ This release has been withdrawn.
+
+ --------------------------------------------------------------------------
+
+ 18 May - JK-1.2.23 released
+
+ The Apache Tomcat team is proud to announce the immediate availability
+ of Tomcat Connectors 1.2.23. This is a stable release adding new
+ features and a few bug fixes to version 1.2.23.
+
+ It fixes an Important vulnerability.
+
+ Please see the ChangeLog for a full list of changes.
+
+ If you find any bugs while using this release, please fill in the
+ Bugzilla Bug Report. When entering bug select Native:JK Component.
+
+ --------------------------------------------------------------------------
+
+ 17 April - JK-1.2.22 released
+
+ The Apache Tomcat team is proud to announce the immediate availability
+ of Tomcat Connectors 1.2.22. This is a stable release adding new
+ features and a few bug fixes to version 1.2.22.
+
+ Please see the ChangeLog for a full list of changes.
+
+ If you find any bugs while using this release, please fill in the
+ Bugzilla Bug Report. When entering bug select Native:JK Component.
+
+ --------------------------------------------------------------------------
+
+ 1 March - JK-1.2.21 released
+
+ The Apache Tomcat team is proud to announce the immediate availability
+ of Tomcat Connectors 1.2.21. This is a stable release adding new
+ features and a few bug fixes to version 1.2.20.
+
+ It fixes a Critical vulnerability introduced in version 1.2.19
+
+ Please see the ChangeLog for a full list of changes.
+
+ If you find any bugs while using this release, please fill in the
+ Bugzilla Bug Report. When entering bug select Native:JK Component.
+
+ --------------------------------------------------------------------------
+ ---------------------------------------------------------------------------
+ Copyright © 1999-2011, Apache Software Foundation
+ Apache TomcatApache Logo
+ ---------------------------------------------------------------------------
+ The Apache Tomcat Connector - News
+
+ 2006 News and Status
+
+ 2006 News & Status
+ 10 December - JK-1.2.20 released
+
+ The Apache Tomcat team is proud to announce the immediate availability
+ of Tomcat Connectors 1.2.20. This is a stable release adding new
+ features and a few bug fixes to version 1.2.19. Furthermore the
+ documentation has been reorganised.
+
+ Please see the ChangeLog for a full list of changes.
+
+ If you find any bugs while using this release, please fill in the
+ Bugzilla Bug Report. When entering bug select Native:JK Component.
+
+ --------------------------------------------------------------------------
+
+ 17 September - JK-1.2.19 released
+
+ The Apache Tomcat team is proud to announce the immediate availability
+ of Tomcat Connectors 1.2.19. This is a stable release adding some
+ features and a few bug fixes to version 1.2.18. Furthermore the
+ non-functional code trees for isapi and domino have been removed.
+
+ Please see the ChangeLog for a full list of changes.
+
+ If you find any bugs while using this release, please fill in the
+ Bugzilla Bug Report. When entering bug select Native:JK Component.
+
+ --------------------------------------------------------------------------
+
+ 13 July - JK-1.2.18 released
+
+ The Apache Tomcat team is proud to announce the immediate availability
+ of Tomcat Connectors 1.2.18. This is a stable release adding a few bug
+ fixes to the not released 1.2.17 version.
+
+ Please see the ChangeLog for a full list of changes.
+
+ If you find any bugs while using this release, please fill in the
+ Bugzilla Bug Report. When entering bug select Native:JK Component.
+
+ --------------------------------------------------------------------------
+
+ JK-1.2.17 not released
+
+ Version 1.2.17 of Tomcat Connectors 1.2.17 has not been released due to
+ a bug in the types chosen for socket arguments.
+
+ Please see the ChangeLog for a full list of changes.
+
+ --------------------------------------------------------------------------
+
+ JK-1.2.16 not released
+
+ Version 1.2.16 of Tomcat Connectors 1.2.16 has not been released due to
+ a bug in the jk status worker. This version adds some features and a
+ few bug fixes to the 1.2.15 version. Furthermore some worker attributes
+ have been deprecated.
+
+ Please see the ChangeLog for a full list of changes.
+
+ --------------------------------------------------------------------------
+ ---------------------------------------------------------------------------
+ Copyright © 1999-2011, Apache Software Foundation
+ Apache TomcatApache Logo
+ ---------------------------------------------------------------------------
+ The Apache Tomcat Connector - News
+
+ 2005 News and Status
+
+ 2005 News & Status
+ 8 November - JK-1.2.15 released
+
+ The Apache Tomcat team is proud to announce the immediate availability
+ of Jakarta Tomcat Connectors 1.2.15. This is Stable release and it
+ contains few bug fixes found in 1.2.14 version.
+
+ Please see the ChangeLog for a full list of changes.
+
+ If you find any bugs while using this release, please fill in the
+ Bugzilla Bug Report. When entering bug select Native:JK Component.
+
+ --------------------------------------------------------------------------
+
+ 13 July - JK-1.2.14 released
+
+ The Apache Tomcat team is proud to announce the immediate availability
+ of Jakarta Tomcat Connectors 1.2.14. This is Stable release and it
+ contains few bug fixes found in 1.2.13 version.
+
+ Please see the ChangeLog for a full list of changes.
+
+ If you find any bugs while using this release, please fill in the
+ Bugzilla Bug Report. When entering bug select Native:JK Component.
+
+ --------------------------------------------------------------------------
+
+ 7 May - JK-1.2.13 released
+
+ The Apache Jakarta Tomcat team is proud to announce the immediate
+ availability of Jakarta Tomcat Connectors 1.2.13. This is development
+ release and contains few bug fixes found in 1.2.12 version.
+
+ Please see the ChangeLog for a full list of changes.
+
+ If you find any bugs while using this release, please fill in the
+ Bugzilla Bug Report. When entering bug select Native:JK Component.
+
+ --------------------------------------------------------------------------
+
+ 7 May - JK-1.2.12 released
+
+ The Apache Jakarta Tomcat team is proud to announce the immediate
+ availability of Jakarta Tomcat Connectors 1.2.12 The release contains a
+ significant number of bug fixes and new features.
+
+ We expect it to be ratified as a Stable release when the vote takes
+ place in the next week.
+
+ Please see the ChangeLog for a full list of changes.
+
+ If you find any bugs while using this release, please fill in the
+ Bugzilla Bug Report. When entering bug select Native:JK Component.
+
+ --------------------------------------------------------------------------
+
+ 29 April - JK-1.2.11 released
+
+ The Apache Jakarta Tomcat team is proud to announce the immediate
+ availability of Jakarta Tomcat Connectors 1.2.11 The release contains a
+ significant number of bug fixes and new features.
+
+ This version has not been released.
+
+ Please see the ChangeLog for a full list of changes.
+
+ If you find any bugs while using this release, please fill in the
+ Bugzilla Bug Report. When entering bug select Native:JK Component.
+
+ --------------------------------------------------------------------------
+
+ 30 March - JK-1.2.10 released
+
+ The Apache Jakarta Tomcat team is proud to announce the immediate
+ availability of Jakarta Tomcat Connectors 1.2.10 The release contains a
+ significant number of bug fixes and new features.
+
+ We expect it to be ratified as a Stable release when the vote takes
+ place in the next two weeks.
+
+ Please see the ChangeLog for a full list of changes.
+
+ Since release 1.2.10 the JkShmFile property has been added for Apache
+ 1.3.x and Apache 2.x web servers on UNIX and LINUX platforms. Load
+ balancer will not work properly if this directive is not present.
+
+ If you find any bugs while using this release, please fill in the
+ Bugzilla Bug Report. When entering bug select Native:JK Component.
+
+ --------------------------------------------------------------------------
+
+ 18 March - JK-1.2.9-beta released
+
+ The Apache Jakarta Tomcat team is proud to announce the immediate
+ availability of Jakarta Tomcat Connectors 1.2.9-beta. The release
+ contains a significant number of bug fixes and new features.
+
+ We expect it to be ratified as a Stable release when the vote takes
+ place in the next two weeks.
+
+ Please see the ChangeLog for a full list of changes.
+
+ Since release 1.2.9 the JkShmFile property has been added for Apache
+ 1.3.x and Apache 2.x web servers on UNIX and LINUX platforms. Load
+ balancer will not work properly if this directive is not present.
+
+ If you find any bugs during testing this release, please fill in the
+ Bugzilla Bug Report. When entering bug select Native:JK Component.
+
+ --------------------------------------------------------------------------
+ ---------------------------------------------------------------------------
+ Copyright © 1999-2011, Apache Software Foundation
+ Apache TomcatApache Logo
+ ---------------------------------------------------------------------------
+ The Apache Tomcat Connector - News
+
+ 2004 News and Status
+
+ 2004 News & Status
+ 17 December - JK-1.2.8 released
+
+ The Apache Jakarta Tomcat team is proud to announce the immediate
+ availability of Jakarta Tomcat Connectors 1.2.8.
+
+ Please see the ChangeLog for a full list of changes.
+
+ If you find any bugs during testing this release, please fill in the
+ Bugzilla Bug Report. When entering bug select Native:JK Component.
+
+ --------------------------------------------------------------------------
+
+ 17 December - JK-1.2.8-rc-1 released
+
+ The Apache Jakarta Tomcat team is proud to announce the immediate
+ availability of Jakarta Tomcat Connectors 1.2.8-rc-1 (Relase Canditate
+ 1).
+
+ We expect it to be ratified as a Stable release when the vote takes
+ place in the next week.
+
+ Please see the ChangeLog for a full list of changes.
+
+ If you find any bugs during testing this release, please fill in the
+ Bugzilla Bug Report. When entering bug select Native:JK Component.
+
+ --------------------------------------------------------------------------
+
+ 13 December - JK-1.2.7-beta-3 released
+
+ The Apache Jakarta Tomcat team is proud to announce the immediate
+ availability of Jakarta Tomcat Connectors 1.2.7-beta-3. The release
+ contains a fix to few configuration problems detected with
+ JK-1.2.7-beta-2 version.
+
+ We expect it to be ratified as a Stable release when the vote takes
+ place in the next week.
+
+ Please see the ChangeLog for a full list of changes.
+
+ If you find any bugs during testing this release, please fill in the
+ Bugzilla Bug Report. When entering bug select Native:JK Component.
+
+ --------------------------------------------------------------------------
+
+ 7 December - JK-1.2.7-beta-2 released
+
+ The Apache Jakarta Tomcat team is proud to announce the immediate
+ availability of Jakarta Tomcat Connectors 1.2.7-beta-2. The release
+ contains a fix to few compilation problems detected with JK-1.2.7-beta
+ version. This release also introduces a new domain concept clustering
+ support. See 32317 for details.
+
+ We expect it to be ratified as a Stable release when the vote takes
+ place in the next two weeks.
+
+ Please see the ChangeLog for a full list of changes.
+
+ If you find any bugs during testing this release, please fill in the
+ Bugzilla Bug Report. When entering bug select Native:JK Component.
+
+ --------------------------------------------------------------------------
+
+ 30 November - JK-1.2.7-beta released
+
+ The Apache Jakarta Tomcat team is proud to announce the immediate
+ availability of Jakarta Tomcat Connectors 1.2.7-beta. The release
+ contains a significant number of bug fixes and new features.
+
+ We expect it to be ratified as a Stable release when the vote takes
+ place in the next two weeks.
+
+ Please see the ChangeLog for a full list of changes.
+
+ Since release 1.2.7 the socket_timeout property has been renamed to
+ recycle_timeout. The socket_timeout now sets the real timeout for
+ socket operations.
+
+ If you find any bugs during testing this release, please fill in the
+ Bugzilla Bug Report. When entering bug select Native:JK Component.
+
+ --------------------------------------------------------------------------
+
+ 15 November - JK2 is officially unsupported
+
+ JK2 has been put in maintainer mode and no further development will
+ take place. The reason for shutting down JK2 development was the lack
+ of developers interest. Other reason was lack of users interest in
+ adopting JK2, caused by configuration complexity when compared to JK.
+
+ The latest official JK2 release is 2.0.4.
+
+ JK2 will have it's successor within core Apache2.1/2.2 distribution. We
+ have developed new proxy_ajp that is an addition to the mod_proxy and
+ uses Tomcat's AJP protocol stack. It is developped in httpd-2.1 and
+ integrated in it. We have also developed a new proxy_balancer module
+ for load balancing http and ajp protocol stacks.
+
+ JK will be fully supported for all other web servers. The next JK
+ release is planned for the end of November. Lots of code from JK2 has
+ been ported to JK
+
+ --------------------------------------------------------------------------
+ ---------------------------------------------------------------------------
+ Copyright © 1999-2011, Apache Software Foundation
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/README.txt b/rubbos/app/tomcat-connectors-1.2.32-src/native/README.txt
new file mode 100644
index 00000000..7ba26d31
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/README.txt
@@ -0,0 +1,45 @@
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+README for tomcat-connector
+
+$Id: README.txt 572120 2007-09-02 19:32:11Z markt $
+
+Please see doc/mod_jk-howto.html for more verbose instructions
+
+* What is tomcat-connector ?
+
+tomcat-connector is a new project to release web-servers connector
+for the Tomcat servlet engine.
+
+This project didn't start from null since it reuse the latest code from
+mod_jk for the native parts and tomcat 3.3 for the java side of the
+force.
+
+From mod_jk we gain :
+
+* A connector (plugin) for many Web Server, including
+ Apache HTTP Server, Netscape/IPLanet NES and Microsoft IIS
+ It also support JNI (and seems to used at least by IBM under
+ AS/400 for Apache/WebSphere connectivity).
+
+* Fault-tolerance and load-balancing. mod_jk use the concept of
+ workers which handle a particular request, and a special worker
+ , the lb worker, is a group (cluster ?) of physical workers.
+
+* Direct access to Tomcat 3.2/3.3/4.0/4.1 servlet engine via ajp13
+ protocol.
+
+* OK, then how do I build web-connector ? Just take a look at BUILDING.txt
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/STATUS.txt b/rubbos/app/tomcat-connectors-1.2.32-src/native/STATUS.txt
new file mode 100644
index 00000000..90fdf36d
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/STATUS.txt
@@ -0,0 +1,67 @@
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+TOMCAT CONNECTORS (JK) STATUS: -*-text-*-
+Last modified at [$Date: 2011-07-02 07:40:54 +0200 (Sat, 02 Jul 2011) $]
+
+Release:
+
+ 1.2.32 : released July 8, 2011
+ 1.2.31 : released November 1, 2010
+ 1.2.30 : released March 1, 2010
+ 1.2.29 : released February 26, 2010, withdrawn February 27, 2010
+ 1.2.28 : released March 22, 2009
+ 1.2.27 : released October 28, 2008
+ 1.2.26 : released December 21, 2007
+ 1.2.25 : released August 7, 2007
+ 1.2.24 : released July 27, 2007, withdrawn August 2, 2007
+ 1.2.23 : released May 18, 2007
+ 1.2.22 : released April 17, 2007
+ 1.2.21 : released March 1, 2007
+ 1.2.20 : released December 10, 2006
+ 1.2.19 : released September 17, 2006
+ 1.2.18 : released July, 2006
+ 1.2.17 : not released
+ 1.2.16 : not released
+ 1.2.15 : released November 8, 2005
+ 1.2.14 : released July 13, 2005
+ 1.2.13 : released May 16, 2005
+ 1.2.12 : released May 7, 2005
+ 1.2.11 : released April 29, 2005
+ 1.2.10 : released March 30, 2005
+ 1.2.9 : not released
+ 1.2.8 : released December 24, 2004
+ 1.2.7 : not released
+ 1.2.6 : released July 23, 2004
+ 1.2.5 : released September 30, 2003
+ 1.2.4 : released May 27, 2003
+ 1.2.3 : released May 16, 2003
+ 1.2.2 : released December 17, 2002
+
+
+
+RELEASE SHOWSTOPPERS:
+
+
+
+
+RELEASE NON-SHOWSTOPPERS BUT WOULD BE REAL NICE TO WRAP THESE UP:
+
+
+
+
+STUFF FOR THE FUTURE:
+
+ * enter mature phase ... ?
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/TODO.txt b/rubbos/app/tomcat-connectors-1.2.32-src/native/TODO.txt
new file mode 100644
index 00000000..73dd13f3
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/TODO.txt
@@ -0,0 +1,371 @@
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+TODO for tomcat-connectors
+
+$Id: TODO.txt 920112 2010-03-07 20:57:35Z timw $
+
+1) Optimize "distance"
+======================
+
+Sorting the list of balanced workers by distance would be nice, but:
+How to combine the sorting with the offset implementation (especially
+useful for strategy BUSYNESS under low load).
+
+Local error states and likely other features will also break in case
+we do naive reordering.
+
+2) Reduce number of string comparisons in most_suitable
+========================================================
+
+a) redirect/domains
+
+It would be easy to improve the redirect string b an integer, giving the
+index of the worker in the lb. Then lb would not need to search for the redirect worker.
+
+The same way, one could add a list with indizes to workers in the same domain.
+Whenever domain names are managed (init and status worker update) one would
+scan the worker list and update the index list.
+
+Finally one could have a list of workers, whose domain is the same as the redirect
+attribute of the worker, because that's also something we consider.
+
+What I'm not sure about, even in the existing code, is the locking between updates
+by the status worker and the process local information about the workers,
+especially in the case, when status updates a redirect or domain attribute.
+
+I would like to keep these attributes and the new index arrays process local,
+and the processes should find out about changes made by status to shm (redirect/domain)
+and then rebuild their data. No need to get these on every request from the shm,
+only the check for up-to-date should be made.
+
+b) exact matches for jvmRoutes
+
+Could we use hashes instead of string comparisons all the time?
+I'm not sure, if a good enough hash takes longer than a string comparison though.
+
+3) Code separation between factory, validate and init in lb
+============================================================
+
+The factory contains:
+
+ private_data->worker.retries = JK_RETRIES;
+ private_data->s->recover_wait_time = WAIT_BEFORE_RECOVER;
+
+I think, this should move to validate() or init().
+It might even be obsolete, because in init, we already have:
+
+ pThis->retries = jk_get_worker_retries(props, p->s->name,
+ p->s->retries = pThis->retries;
+ p->s->recover_wait_time = jk_get_worker_recover_timeout(props, p->s->name, WAIT_BEFORE_RECOVER);
+ if (p->s->recover_wait_time < WAIT_BEFORE_RECOVER)
+ p->s->recover_wait_time = WAIT_BEFORE_RECOVER;
+
+Then: In validate there is
+
+ p->lb_workers[i].s->error_time = 0;
+
+So shouldn't there also be
+
+ p->lb_workers[i].s->maintain_time = time(NULL);
+
+4) Logging
+==========
+
+a) Allow logging of request url or uuid in jk log to ease matching with access log.
+
+b) Implement log rotation for IIS. (done in 1.2.31)
+
+c) Allow adding of log notes for IIS like we do with Apache.
+
+d) Add error type info to access log notes
+
+e) Refactor: Use the same code files for the request logging functions in Apache 1.3 and 2.0.
+
+f) Refactor: Use the same code files for piped logging in Apache 1.3 and 2.0.
+
+5) ajpget
+==========
+
+Combine ajplib and Apache ab to an ajp13 commandline client ajpget.
+
+6) Parsing workers.properties
+=============================
+
+Parsing of workers.properties aditionally to just looking up attributes
+would help users to detect syntax errors in the file. At the moment
+no information will be logged, e.g. when attributes contain typos.
+
+Example: worker.list vs. worker.lists.
+
+7) Persisting workers.properties
+================================
+
+Make workers.properties persist from inside status worker.
+
+Add additional properties file, that contains a journal of property changes done
+via the status worker. When initializing those overwrite the initial workers.properties.
+
+Update actions in the status worker will allow to optionally add a change to this journal.
+We can also add a comment with timestamp etc. to each journal line.
+
+8) Reduce number of uses of time(NULL)
+======================================
+
+We use time(NULL) a lot. Since it only has resolution of a second,
+I'm asking myself, if we could update the actual time in only a few
+places and get time out of some variables when needed. The same does
+not hold true for millisecond time, but in several cases we use the time,
+it's not very critical, that it is exact. These cases are related to:
+
+Some of this is already been done, the remaining parts are:
+
+- last_access for usage against timeout value that is ~minutes
+- error_time for usage against retry timeout that is ~minutes
+- uri_worker_map checked for usage against JK_URIMAP_RELOAD=1 minute
+
+So I think, it would suffice to set an actual time at the beginning of
+the request/response cycle (used by everything before the request is being
+sent over the socket) and maybe after the response shows up/ an error occurs
+(for everything else, if there is).
+
+For which cases would it be OK, to use the time before sending to TC:
+- uri_worker_map "checked" (uri map lookup starts early)
+- setting/testing last_access in
+ - jk_ajp_common.c:ajp_connect_to_endpoint()
+ - jk_ajp_common.c:ajp_get_endpoint()
+ - jk_ajp_common.c:ajp_maintain()
+
+What about the others:
+- setting last_access in init should use the actual time in
+ jk_ajp_common.c:ajp_create_endpoint_cache()
+
+- setting last_access again after the service could also use the
+ actual time in jk_ajp_common.c:ajp_done()
+- setting error_time should better use the actual time
+ jk_lb_worker.c service(): rec->s->error_time = time(NULL);
+
+The last two cases could again use the same time, which then would be needed
+to be generated at the end or directly after service.
+
+9) Access/Modification Time in shm
+==================================
+
+a) [Discussion] What will this generally be used for? At the moment,
+only jk_status "uses" it, but it only sets the values, it never asks for them.
+
+b) [Improvement, minor] jk_shm_set_workers_time() implicitly calls
+jk_shm_sync_access_time(), but jk_status does:
+
+ jk_shm_set_workers_time(time(NULL));
+ /* Since we updated the config no need to reload
+ * on the next request
+ */
+ jk_shm_sync_access_time();
+
+two times. So depending on the idea of the functionality of these calls,
+either set_workers_time and sync_access_time should be independently,
+or the second call in jk_status coulkd be removed.
+
+10) "Destroy" functionality
+===========================
+
+[Hint] Destroy on a worker never seems to free shm,
+but I think that was already a flaw without shm.
+
+11) Locks against shm
+=====================
+
+It might be an interesting experiment to implement an improved locking structure.
+It looks like one would need in fact different types of locks.
+In shm we have as read/write information:
+
+Changed only by status worker:
+- redirect, domain, lb_factor, sticky_session, sticky_session_force,
+ recover_wait_time, retries, status (is_disabled, is_stopped).
+
+These changes need some kind of reconfiguration in the threads after
+change and before the next request/response. Since changes are rare,
+here we would be better of, with a simple detect change and copy from
+shm to process procedure. status updates the data in shm and after that
+the time stamp on the shh. Each process checks the time stamp before
+doing a request, and when the time stamp changed it does a writer CS
+lock and updates it's local copy. All threads always do a reader CS
+lock when doing a request/response cycle. Reader CS locks are concurrent,
+writers are exclusive. So readers are not allowed, when the config data is being updated.
+
+Changed by the threads themselves (and via reset by the status worker):
+- counters needed by routing decisions (lb_value, readed, transferred, busy)
+- timers needed by maintenance functions (error_time, servic_time/maintain_time)
+- status is_busy, in_error_state
+- uncritical data with no influence on routing decisions (max_busy, elected, errors,
+ in_recovering)
+
+Here again we could improve by using reader/writer locks. I have a
+tendency for the PESSIMISTIC side of locking, but I think we could
+shrink the code blocks that should be locked. At the monent they are
+pretty big (most of get_most_suitable_worker).
+
+Read-only: name and id.
+
+By the way: at several places we don't check for errors on getting the lock.
+
+12) Global locks
+================
+
+We might want to make the lock technology choosable, like httpd does.
+E.g. on Solaris the default lock type if fcntl, and we can easily
+get an invalid EDEADLOCK for our jk_log_lock.
+
+The following pthread based non global locks are used:
+
+- one mutex for each AJP worker, synchronizing access to the connection
+pool, which exists per process
+
+- one mutex for each lb worker
+
+- a mutex used during dynamic update of uriworkermap.properties to
+prevent concurrent updates. Updates are done per process.
+
+- a mutex to prevent concurrent execution of the process local internal
+maintenance task
+
+- a mutex for access to the shared memory when changing or reading
+configuration parameters. That might be a little unsafe, because it
+actually should be a global mutex, not a process local, but those config
+changes are only done due to interaction with the status worker, so
+there's very little chance for unwanted concurrency here. All dynamic
+runtime data are already marked as being volatile.
+
+All except the last seem to be safe. The last might need some hybrid model
+using thread local mostly and process global when doing updates.
+
+See also: http://marc.info/?t=123394059800003&r=1&w=2
+
+13) Understand the exact behaviour of shm and restarts
+======================================================
+
+Furthermore: rotatelogs (?) and gzip (mod_mime_magic) seem to close
+the (non-existing) shm file. Maybe a problem on some platforms?
+
+14) What I didn't yet check
+===========================
+
+a) Correctness of is_busy handling
+
+b) Correctness of the reset values after reset by status worker
+
+c) What would be the exact behaviour, if shm does not work (memory case).
+ Will this be a critical failure, or will we only experience a
+ degradation in routing decisions.
+
+d) How complete is mod_proxy_ajp/mod_proxy_balancer.
+ Port changes from mod_jk to them.
+
+15) Status worker
+=================
+
+Allow managing pool and connection parameters. Add flags to
+pool and connections to signal workers and maintenance whether
+existing connections should be closed and renewed.
+
+Check completeness of attribute manageability for AJP workers.
+
+Check completeness of runtime data display, e.g.
+reset_time, recover_time, etc. Maybe also add "last error type".
+
+Work on a global display of process local data, e.g. state of the
+process local connection pools (sizes, num connected/idle).
+
+Rework the GUI:
+
+- Basic overview start page with links to the workers,
+ maybe a checkbox to decide whether you want to see config data too.
+- Detail view (what type of error was last and when etc.), detail view
+ for connection pools.
+
+16) URI mapping
+===============
+
+Add more extensions?
+
+17) Connection Pool
+===================
+
+How would a good global maximum count look like?
+Simply limit busyness? Soft limit (applies only to non-sticky requests)
+and a hard limit (applies to all requests)?
+
+18) IP V6
+=========
+
+There's a Bugzilla with a patch.
+
+19) IIS Chunked Encoding
+========================
+
+Move from alternative build to default.
+
+What about the other ifdef'd features?
+
+20) Add REMORE_PORT as a default JkEnvVar
+=========================================
+
+... and port to IIS to fix the getRemotePort() problem.
+
+21) Rework HowTo docs
+=====================
+
+22) Add better example config
+=============================
+
+23) Remove JNI worker
+=====================
+
+24) Watchdog reload of uriworkermap.properties
+==============================================
+
+Questions about uriworkermap.properties watchdog reload (r745898):
+- shm lock needed?
+- Apache port (need to iterate over vhosts)
+
+25) Watchdog backend probing
+============================
+
+Configurable probe URL to test backend, e.g. to decide about
+recovery instead of using random real requests.
+
+26) Commandline shm
+===================
+
+Commandline tool to read data from shm file.
+
+27) Status worker property format
+=================================
+
+Check whether we return list properties as one line
+(because Java doesn't allow the same property key multiple
+times).
+
+Applies possibly to:
+
+"list",
+BALANCE_WORKERS,
+MOUNT_OF_WORKER,
+USER_OF_WORKER,
+GOOD_RATING_OF_WORKER,
+BAD_RATING_OF_WORKER,
+STATUS_FAIL_OF_WORKER,
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/aclocal.m4 b/rubbos/app/tomcat-connectors-1.2.32-src/native/aclocal.m4
new file mode 100644
index 00000000..8a90c6a1
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/aclocal.m4
@@ -0,0 +1,6945 @@
+# generated automatically by aclocal 1.9.2 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+# Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
+
+# serial 47 AC_PROG_LIBTOOL
+
+
+# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED)
+# -----------------------------------------------------------
+# If this macro is not defined by Autoconf, define it here.
+m4_ifdef([AC_PROVIDE_IFELSE],
+ [],
+ [m4_define([AC_PROVIDE_IFELSE],
+ [m4_ifdef([AC_PROVIDE_$1],
+ [$2], [$3])])])
+
+
+# AC_PROG_LIBTOOL
+# ---------------
+AC_DEFUN([AC_PROG_LIBTOOL],
+[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl
+dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX
+dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX.
+ AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [AC_LIBTOOL_CXX],
+ [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX
+ ])])
+dnl And a similar setup for Fortran 77 support
+ AC_PROVIDE_IFELSE([AC_PROG_F77],
+ [AC_LIBTOOL_F77],
+ [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77
+])])
+
+dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly.
+dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run
+dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both.
+ AC_PROVIDE_IFELSE([AC_PROG_GCJ],
+ [AC_LIBTOOL_GCJ],
+ [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
+ [AC_LIBTOOL_GCJ],
+ [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],
+ [AC_LIBTOOL_GCJ],
+ [ifdef([AC_PROG_GCJ],
+ [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])
+ ifdef([A][M_PROG_GCJ],
+ [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])])
+ ifdef([LT_AC_PROG_GCJ],
+ [define([LT_AC_PROG_GCJ],
+ defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])])
+])])# AC_PROG_LIBTOOL
+
+
+# _AC_PROG_LIBTOOL
+# ----------------
+AC_DEFUN([_AC_PROG_LIBTOOL],
+[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl
+AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl
+AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl
+AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+# Prevent multiple expansion
+define([AC_PROG_LIBTOOL], [])
+])# _AC_PROG_LIBTOOL
+
+
+# AC_LIBTOOL_SETUP
+# ----------------
+AC_DEFUN([AC_LIBTOOL_SETUP],
+[AC_PREREQ(2.50)dnl
+AC_REQUIRE([AC_ENABLE_SHARED])dnl
+AC_REQUIRE([AC_ENABLE_STATIC])dnl
+AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_LD])dnl
+AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl
+AC_REQUIRE([AC_PROG_NM])dnl
+
+AC_REQUIRE([AC_PROG_LN_S])dnl
+AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl
+# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers!
+AC_REQUIRE([AC_OBJEXT])dnl
+AC_REQUIRE([AC_EXEEXT])dnl
+dnl
+
+AC_LIBTOOL_SYS_MAX_CMD_LEN
+AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
+AC_LIBTOOL_OBJDIR
+
+AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
+_LT_AC_PROG_ECHO_BACKSLASH
+
+case $host_os in
+aix3*)
+ # AIX sometimes has problems with the GCC collect2 program. For some
+ # reason, if we set the COLLECT_NAMES environment variable, the problems
+ # vanish in a puff of smoke.
+ if test "X${COLLECT_NAMES+set}" != Xset; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+ fi
+ ;;
+esac
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='sed -e s/^X//'
+[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g']
+
+# Same as above, but do not quote variable references.
+[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g']
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+# Constants:
+rm="rm -f"
+
+# Global variables:
+default_ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except M$VC,
+# which needs '.lib').
+libext=a
+ltmain="$ac_aux_dir/ltmain.sh"
+ofile="$default_ofile"
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+AC_CHECK_TOOL(AR, ar, false)
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+AC_CHECK_TOOL(STRIP, strip, :)
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+test -z "$AS" && AS=as
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+test -z "$LD" && LD=ld
+test -z "$LN_S" && LN_S="ln -s"
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+test -z "$NM" && NM=nm
+test -z "$SED" && SED=sed
+test -z "$OBJDUMP" && OBJDUMP=objdump
+test -z "$RANLIB" && RANLIB=:
+test -z "$STRIP" && STRIP=:
+test -z "$ac_objext" && ac_objext=o
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+ case $host_os in
+ openbsd*)
+ old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds"
+ ;;
+ *)
+ old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds"
+ ;;
+ esac
+ old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
+
+# Only perform the check for file, if the check method requires it
+case $deplibs_check_method in
+file_magic*)
+ if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+ AC_PATH_MAGIC
+ fi
+ ;;
+esac
+
+AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no)
+AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL],
+enable_win32_dll=yes, enable_win32_dll=no)
+
+AC_ARG_ENABLE([libtool-lock],
+ [AC_HELP_STRING([--disable-libtool-lock],
+ [avoid locking (might break parallel builds)])])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+AC_ARG_WITH([pic],
+ [AC_HELP_STRING([--with-pic],
+ [try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
+ [pic_mode="$withval"],
+ [pic_mode=default])
+test -z "$pic_mode" && pic_mode=default
+
+# Use C for the default configuration in the libtool script
+tagname=
+AC_LIBTOOL_LANG_C_CONFIG
+_LT_AC_TAGCONFIG
+])# AC_LIBTOOL_SETUP
+
+
+# _LT_AC_SYS_COMPILER
+# -------------------
+AC_DEFUN([_LT_AC_SYS_COMPILER],
+[AC_REQUIRE([AC_PROG_CC])dnl
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+])# _LT_AC_SYS_COMPILER
+
+
+# _LT_AC_SYS_LIBPATH_AIX
+# ----------------------
+# Links a minimal program and checks the executable
+# for the system default hardcoded library path. In most cases,
+# this is /usr/lib:/lib, but when the MPI compilers are used
+# the location of the communication and MPI libs are included too.
+# If we don't find anything, use the default library path according
+# to the aix ld manual.
+AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX],
+[AC_LINK_IFELSE(AC_LANG_PROGRAM,[
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi],[])
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+])# _LT_AC_SYS_LIBPATH_AIX
+
+
+# _LT_AC_SHELL_INIT(ARG)
+# ----------------------
+AC_DEFUN([_LT_AC_SHELL_INIT],
+[ifdef([AC_DIVERSION_NOTICE],
+ [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],
+ [AC_DIVERT_PUSH(NOTICE)])
+$1
+AC_DIVERT_POP
+])# _LT_AC_SHELL_INIT
+
+
+# _LT_AC_PROG_ECHO_BACKSLASH
+# --------------------------
+# Add some code to the start of the generated configure script which
+# will find an echo command which doesn't interpret backslashes.
+AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH],
+[_LT_AC_SHELL_INIT([
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+case X$ECHO in
+X*--fallback-echo)
+ # Remove one level of quotation (which was required for Make).
+ ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','`
+ ;;
+esac
+
+echo=${ECHO-echo}
+if test "X[$]1" = X--no-reexec; then
+ # Discard the --no-reexec flag, and continue.
+ shift
+elif test "X[$]1" = X--fallback-echo; then
+ # Avoid inline document here, it may be left over
+ :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then
+ # Yippee, $echo works!
+ :
+else
+ # Restart under the correct shell.
+ exec $SHELL "[$]0" --no-reexec ${1+"[$]@"}
+fi
+
+if test "X[$]1" = X--fallback-echo; then
+ # used as fallback echo
+ shift
+ cat <<EOF
+[$]*
+EOF
+ exit 0
+fi
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+if test "X${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi
+
+if test -z "$ECHO"; then
+if test "X${echo_test_string+set}" != Xset; then
+# find a string as large as possible, as long as the shell can cope with it
+ for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do
+ # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+ if (echo_test_string="`eval $cmd`") 2>/dev/null &&
+ echo_test_string="`eval $cmd`" &&
+ (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null
+ then
+ break
+ fi
+ done
+fi
+
+if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ :
+else
+ # The Solaris, AIX, and Digital Unix default echo programs unquote
+ # backslashes. This makes it impossible to quote backslashes using
+ # echo "$something" | sed 's/\\/\\\\/g'
+ #
+ # So, first we look for a working echo in the user's PATH.
+
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for dir in $PATH /usr/ucb; do
+ IFS="$lt_save_ifs"
+ if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+ test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ echo="$dir/echo"
+ break
+ fi
+ done
+ IFS="$lt_save_ifs"
+
+ if test "X$echo" = Xecho; then
+ # We didn't find a better echo, so look for alternatives.
+ if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ # This shell has a builtin print -r that does the trick.
+ echo='print -r'
+ elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
+ test "X$CONFIG_SHELL" != X/bin/ksh; then
+ # If we have ksh, try running configure again with it.
+ ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+ export ORIGINAL_CONFIG_SHELL
+ CONFIG_SHELL=/bin/ksh
+ export CONFIG_SHELL
+ exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"}
+ else
+ # Try using printf.
+ echo='printf %s\n'
+ if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ # Cool, printf works
+ :
+ elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+ test "X$echo_testing_string" = 'X\t' &&
+ echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+ export CONFIG_SHELL
+ SHELL="$CONFIG_SHELL"
+ export SHELL
+ echo="$CONFIG_SHELL [$]0 --fallback-echo"
+ elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+ test "X$echo_testing_string" = 'X\t' &&
+ echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ echo="$CONFIG_SHELL [$]0 --fallback-echo"
+ else
+ # maybe with a smaller string...
+ prev=:
+
+ for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do
+ if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null
+ then
+ break
+ fi
+ prev="$cmd"
+ done
+
+ if test "$prev" != 'sed 50q "[$]0"'; then
+ echo_test_string=`eval $prev`
+ export echo_test_string
+ exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"}
+ else
+ # Oops. We lost completely, so just stick with echo.
+ echo=echo
+ fi
+ fi
+ fi
+ fi
+fi
+fi
+
+# Copy echo and quote the copy suitably for passing to libtool from
+# the Makefile, instead of quoting the original, which is used later.
+ECHO=$echo
+if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then
+ ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo"
+fi
+
+AC_SUBST(ECHO)
+])])# _LT_AC_PROG_ECHO_BACKSLASH
+
+
+# _LT_AC_LOCK
+# -----------
+AC_DEFUN([_LT_AC_LOCK],
+[AC_ARG_ENABLE([libtool-lock],
+ [AC_HELP_STRING([--disable-libtool-lock],
+ [avoid locking (might break parallel builds)])])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+ # Find out which ABI we are using.
+ echo 'int i;' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *ELF-32*)
+ HPUX_IA64_MODE="32"
+ ;;
+ *ELF-64*)
+ HPUX_IA64_MODE="64"
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+*-*-irix6*)
+ # Find out which ABI we are using.
+ echo '[#]line __oline__ "configure"' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ if test "$lt_cv_prog_gnu_ld" = yes; then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -melf32bsmip"
+ ;;
+ *N32*)
+ LD="${LD-ld} -melf32bmipn32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -melf64bmip"
+ ;;
+ esac
+ else
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -32"
+ ;;
+ *N32*)
+ LD="${LD-ld} -n32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -64"
+ ;;
+ esac
+ fi
+ fi
+ rm -rf conftest*
+ ;;
+
+x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*)
+ # Find out which ABI we are using.
+ echo 'int i;' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ case "`/usr/bin/file conftest.o`" in
+ *32-bit*)
+ case $host in
+ x86_64-*linux*)
+ LD="${LD-ld} -m elf_i386"
+ ;;
+ ppc64-*linux*|powerpc64-*linux*)
+ LD="${LD-ld} -m elf32ppclinux"
+ ;;
+ s390x-*linux*)
+ LD="${LD-ld} -m elf_s390"
+ ;;
+ sparc64-*linux*)
+ LD="${LD-ld} -m elf32_sparc"
+ ;;
+ esac
+ ;;
+ *64-bit*)
+ case $host in
+ x86_64-*linux*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ ppc*-*linux*|powerpc*-*linux*)
+ LD="${LD-ld} -m elf64ppc"
+ ;;
+ s390*-*linux*)
+ LD="${LD-ld} -m elf64_s390"
+ ;;
+ sparc*-*linux*)
+ LD="${LD-ld} -m elf64_sparc"
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+*-*-sco3.2v5*)
+ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+ SAVE_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -belf"
+ AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+ [AC_LANG_PUSH(C)
+ AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
+ AC_LANG_POP])
+ if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+ # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+ CFLAGS="$SAVE_CFLAGS"
+ fi
+ ;;
+AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL],
+[*-*-cygwin* | *-*-mingw* | *-*-pw32*)
+ AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+ AC_CHECK_TOOL(AS, as, false)
+ AC_CHECK_TOOL(OBJDUMP, objdump, false)
+ ;;
+ ])
+esac
+
+need_locks="$enable_libtool_lock"
+
+])# _LT_AC_LOCK
+
+
+# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION],
+[AC_REQUIRE([LT_AC_PROG_SED])
+AC_CACHE_CHECK([$1], [$2],
+ [$2=no
+ ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$3"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \
+ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test ! -s conftest.err; then
+ $2=yes
+ fi
+ fi
+ $rm conftest*
+])
+
+if test x"[$]$2" = xyes; then
+ ifelse([$5], , :, [$5])
+else
+ ifelse([$6], , :, [$6])
+fi
+])# AC_LIBTOOL_COMPILER_OPTION
+
+
+# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+# [ACTION-SUCCESS], [ACTION-FAILURE])
+# ------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([AC_LIBTOOL_LINKER_OPTION],
+[AC_CACHE_CHECK([$1], [$2],
+ [$2=no
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $3"
+ printf "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&AS_MESSAGE_LOG_FD
+ else
+ $2=yes
+ fi
+ fi
+ $rm conftest*
+ LDFLAGS="$save_LDFLAGS"
+])
+
+if test x"[$]$2" = xyes; then
+ ifelse([$4], , :, [$4])
+else
+ ifelse([$5], , :, [$5])
+fi
+])# AC_LIBTOOL_LINKER_OPTION
+
+
+# AC_LIBTOOL_SYS_MAX_CMD_LEN
+# --------------------------
+AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN],
+[# find the maximum length of command line arguments
+AC_MSG_CHECKING([the maximum length of command line arguments])
+AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
+ i=0
+ teststring="ABCD"
+
+ case $build_os in
+ msdosdjgpp*)
+ # On DJGPP, this test can blow up pretty badly due to problems in libc
+ # (any single argument exceeding 2000 bytes causes a buffer overrun
+ # during glob expansion). Even if it were fixed, the result of this
+ # check would be larger than it should be.
+ lt_cv_sys_max_cmd_len=12288; # 12K is about right
+ ;;
+
+ gnu*)
+ # Under GNU Hurd, this test is not required because there is
+ # no limit to the length of command line arguments.
+ # Libtool will interpret -1 as no limit whatsoever
+ lt_cv_sys_max_cmd_len=-1;
+ ;;
+
+ cygwin* | mingw*)
+ # On Win9x/ME, this test blows up -- it succeeds, but takes
+ # about 5 minutes as the teststring grows exponentially.
+ # Worse, since 9x/ME are not pre-emptively multitasking,
+ # you end up with a "frozen" computer, even though with patience
+ # the test eventually succeeds (with a max line length of 256k).
+ # Instead, let's just punt: use the minimum linelength reported by
+ # all of the supported platforms: 8192 (on NT/2K/XP).
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ amigaos*)
+ # On AmigaOS with pdksh, this test takes hours, literally.
+ # So we just punt and use a minimum line length of 8192.
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ *)
+ # If test is not a shell built-in, we'll probably end up computing a
+ # maximum length that is only half of the actual maximum length, but
+ # we can't tell.
+ while (test "X"`$CONFIG_SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \
+ = "XX$teststring") >/dev/null 2>&1 &&
+ new_result=`expr "X$teststring" : ".*" 2>&1` &&
+ lt_cv_sys_max_cmd_len=$new_result &&
+ test $i != 17 # 1/2 MB should be enough
+ do
+ i=`expr $i + 1`
+ teststring=$teststring$teststring
+ done
+ teststring=
+ # Add a significant safety factor because C++ compilers can tack on massive
+ # amounts of additional arguments before passing them to the linker.
+ # It appears as though 1/2 is a usable value.
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+ ;;
+ esac
+])
+if test -n $lt_cv_sys_max_cmd_len ; then
+ AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
+else
+ AC_MSG_RESULT(none)
+fi
+])# AC_LIBTOOL_SYS_MAX_CMD_LEN
+
+
+# _LT_AC_CHECK_DLFCN
+# --------------------
+AC_DEFUN([_LT_AC_CHECK_DLFCN],
+[AC_CHECK_HEADERS(dlfcn.h)dnl
+])# _LT_AC_CHECK_DLFCN
+
+
+# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
+# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
+# ------------------------------------------------------------------
+AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF],
+[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl
+if test "$cross_compiling" = yes; then :
+ [$4]
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<EOF
+[#line __oline__ "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ /* dlclose (self); */
+ }
+
+ exit (status);
+}]
+EOF
+ if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
+ (./conftest; exit; ) 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) $1 ;;
+ x$lt_dlneed_uscore) $2 ;;
+ x$lt_unknown|x*) $3 ;;
+ esac
+ else :
+ # compilation failed
+ $3
+ fi
+fi
+rm -fr conftest*
+])# _LT_AC_TRY_DLOPEN_SELF
+
+
+# AC_LIBTOOL_DLOPEN_SELF
+# -------------------
+AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF],
+[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl
+if test "x$enable_dlopen" != xyes; then
+ enable_dlopen=unknown
+ enable_dlopen_self=unknown
+ enable_dlopen_self_static=unknown
+else
+ lt_cv_dlopen=no
+ lt_cv_dlopen_libs=
+
+ case $host_os in
+ beos*)
+ lt_cv_dlopen="load_add_on"
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ;;
+
+ mingw* | pw32*)
+ lt_cv_dlopen="LoadLibrary"
+ lt_cv_dlopen_libs=
+ ;;
+
+ cygwin*)
+ lt_cv_dlopen="dlopen"
+ lt_cv_dlopen_libs=
+ ;;
+
+ darwin*)
+ # if libdl is installed we need to link against it
+ AC_CHECK_LIB([dl], [dlopen],
+ [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
+ lt_cv_dlopen="dyld"
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ])
+ ;;
+
+ *)
+ AC_CHECK_FUNC([shl_load],
+ [lt_cv_dlopen="shl_load"],
+ [AC_CHECK_LIB([dld], [shl_load],
+ [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"],
+ [AC_CHECK_FUNC([dlopen],
+ [lt_cv_dlopen="dlopen"],
+ [AC_CHECK_LIB([dl], [dlopen],
+ [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
+ [AC_CHECK_LIB([svld], [dlopen],
+ [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
+ [AC_CHECK_LIB([dld], [dld_link],
+ [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"])
+ ])
+ ])
+ ])
+ ])
+ ])
+ ;;
+ esac
+
+ if test "x$lt_cv_dlopen" != xno; then
+ enable_dlopen=yes
+ else
+ enable_dlopen=no
+ fi
+
+ case $lt_cv_dlopen in
+ dlopen)
+ save_CPPFLAGS="$CPPFLAGS"
+ test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+ save_LDFLAGS="$LDFLAGS"
+ eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+ save_LIBS="$LIBS"
+ LIBS="$lt_cv_dlopen_libs $LIBS"
+
+ AC_CACHE_CHECK([whether a program can dlopen itself],
+ lt_cv_dlopen_self, [dnl
+ _LT_AC_TRY_DLOPEN_SELF(
+ lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
+ lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
+ ])
+
+ if test "x$lt_cv_dlopen_self" = xyes; then
+ LDFLAGS="$LDFLAGS $link_static_flag"
+ AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
+ lt_cv_dlopen_self_static, [dnl
+ _LT_AC_TRY_DLOPEN_SELF(
+ lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
+ lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross)
+ ])
+ fi
+
+ CPPFLAGS="$save_CPPFLAGS"
+ LDFLAGS="$save_LDFLAGS"
+ LIBS="$save_LIBS"
+ ;;
+ esac
+
+ case $lt_cv_dlopen_self in
+ yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+ *) enable_dlopen_self=unknown ;;
+ esac
+
+ case $lt_cv_dlopen_self_static in
+ yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+ *) enable_dlopen_self_static=unknown ;;
+ esac
+fi
+])# AC_LIBTOOL_DLOPEN_SELF
+
+
+# AC_LIBTOOL_PROG_CC_C_O([TAGNAME])
+# ---------------------------------
+# Check to see if options -c and -o are simultaneously supported by compiler
+AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O],
+[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
+AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
+ [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
+ [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
+ $rm -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \
+ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&AS_MESSAGE_LOG_FD
+ echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test ! -s out/conftest.err; then
+ _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+ fi
+ fi
+ chmod u+w .
+ $rm conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
+ $rm out/* && rmdir out
+ cd ..
+ rmdir conftest
+ $rm conftest*
+])
+])# AC_LIBTOOL_PROG_CC_C_O
+
+
+# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME])
+# -----------------------------------------
+# Check to see if we can do hard links to lock some files if needed
+AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS],
+[AC_REQUIRE([_LT_AC_LOCK])dnl
+
+hard_links="nottested"
+if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
+ # do not overwrite the value of need_locks provided by the user
+ AC_MSG_CHECKING([if we can lock with hard links])
+ hard_links=yes
+ $rm conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ AC_MSG_RESULT([$hard_links])
+ if test "$hard_links" = no; then
+ AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS
+
+
+# AC_LIBTOOL_OBJDIR
+# -----------------
+AC_DEFUN([AC_LIBTOOL_OBJDIR],
+[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
+[rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+ lt_cv_objdir=.libs
+else
+ # MS-DOS does not allow filenames that begin with a dot.
+ lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null])
+objdir=$lt_cv_objdir
+])# AC_LIBTOOL_OBJDIR
+
+
+# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME])
+# ----------------------------------------------
+# Check hardcoding attributes.
+AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH],
+[AC_MSG_CHECKING([how to hardcode library paths into programs])
+_LT_AC_TAGVAR(hardcode_action, $1)=
+if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \
+ test -n "$_LT_AC_TAGVAR(runpath_var $1)" || \
+ test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)"="Xyes" ; then
+
+ # We can hardcode non-existant directories.
+ if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
+ test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then
+ # Linking always hardcodes the temporary library directory.
+ _LT_AC_TAGVAR(hardcode_action, $1)=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ _LT_AC_TAGVAR(hardcode_action, $1)=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ _LT_AC_TAGVAR(hardcode_action, $1)=unsupported
+fi
+AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)])
+
+if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+ test "$enable_shared" = no; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH
+
+
+# AC_LIBTOOL_SYS_LIB_STRIP
+# ------------------------
+AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP],
+[striplib=
+old_striplib=
+AC_MSG_CHECKING([whether stripping libraries is possible])
+if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then
+ test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+ test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+ AC_MSG_RESULT([yes])
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+ case $host_os in
+ darwin*)
+ if test -n "$STRIP" ; then
+ striplib="$STRIP -x"
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+fi
+ ;;
+ *)
+ AC_MSG_RESULT([no])
+ ;;
+ esac
+fi
+])# AC_LIBTOOL_SYS_LIB_STRIP
+
+
+# AC_LIBTOOL_SYS_DYNAMIC_LINKER
+# -----------------------------
+# PORTME Fill in your ld.so characteristics
+AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER],
+[AC_MSG_CHECKING([dynamic linker characteristics])
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
+ # if the path contains ";" then we assume it to be the separator
+ # otherwise default to the standard path separator (i.e. ":") - it is
+ # assumed that no part of a normal pathname contains ";" but that should
+ # okay in the real world where ";" in dirpaths is itself problematic.
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+else
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX 3 has no versioning support, so we append a major version to the name.
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+
+aix4* | aix5*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ hardcode_into_libs=yes
+ if test "$host_cpu" = ia64; then
+ # AIX 5 supports IA64
+ library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line `#! .'. This would cause the generated library to
+ # depend on `.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[[01]] | aix4.[[01]].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ if test "$aix_use_runtimelinking" = yes; then
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ else
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='${libname}${release}.a $libname.a'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ fi
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ ;;
+
+beos*)
+ library_names_spec='${libname}${shared_ext}'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi4*)
+ version_type=linux
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32*)
+ version_type=windows
+ shrext_cmds=".dll"
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$host_os in
+ yes,cygwin* | yes,mingw* | yes,pw32*)
+ library_names_spec='$libname.dll.a'
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \${file}`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $rm \$dlpath'
+ shlibpath_overrides_runpath=yes
+
+ case $host_os in
+ cygwin*)
+ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+ soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+ ;;
+ mingw*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then
+ # It is most probably a Windows format PATH printed by
+ # mingw gcc, but we are running on Cygwin. Gcc prints its search
+ # path with ; separators, and with drive letters. We can handle the
+ # drive letters (cygwin fileutils understands them), so leave them,
+ # especially as we might pass files found there to a mingw objdump,
+ # which wouldn't understand a cygwinified path. Ahh.
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ ;;
+ pw32*)
+ # pw32 DLLs use 'pw' prefix rather than 'lib'
+ library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ ;;
+ esac
+ ;;
+
+ *)
+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+ soname_spec='${libname}${release}${major}$shared_ext'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)'
+ # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
+ if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
+ else
+ sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
+ fi
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+freebsd1*)
+ dynamic_linker=no
+ ;;
+
+kfreebsd*-gnu)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='GNU ld.so'
+ ;;
+
+freebsd*)
+ objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout`
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ freebsd3.[01]* | freebsdelf3.[01]*)
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ *) # from 3.2 on
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+gnu*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ case "$host_cpu" in
+ ia64*)
+ shrext_cmds='.so'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.so"
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ if test "X$HPUX_IA64_MODE" = X32; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ fi
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ hppa*64*)
+ shrext_cmds='.sl'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ *)
+ shrext_cmds='.sl'
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+ esac
+ # HP-UX runs *really* slowly unless shared libraries are mode 555.
+ postinstall_cmds='chmod 555 $lib'
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $host_os in
+ nonstopux*) version_type=nonstopux ;;
+ *)
+ if test "$lt_cv_prog_gnu_ld" = yes; then
+ version_type=linux
+ else
+ version_type=irix
+ fi ;;
+ esac
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+ case $host_os in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+ libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+ libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+ libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+ sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+ hardcode_into_libs=yes
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+ dynamic_linker=no
+ ;;
+
+# This must be Linux ELF.
+linux*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ # find out which ABI we are using
+ libsuff=
+ case "$host_cpu" in
+ x86_64*|s390x*|powerpc64*)
+ echo '[#]line __oline__ "configure"' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *64-bit*)
+ libsuff=64
+ sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}"
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+ esac
+
+ # Append ld.so.conf contents to the search path
+ if test -f /etc/ld.so.conf; then
+ lt_ld_extra=`$SED -e 's/[:,\t]/ /g;s/=[^=]*$//;s/=[^= ]* / /g' /etc/ld.so.conf | tr '\n' ' '`
+ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra"
+ fi
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+knetbsd*-gnu)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='GNU ld.so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+nto-qnx*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+openbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=yes
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ case $host_os in
+ openbsd2.[[89]] | openbsd2.[[89]].*)
+ shlibpath_overrides_runpath=no
+ ;;
+ *)
+ shlibpath_overrides_runpath=yes
+ ;;
+ esac
+ else
+ shlibpath_overrides_runpath=yes
+ fi
+ ;;
+
+os2*)
+ libname_spec='$name'
+ shrext_cmds=".dll"
+ need_lib_prefix=no
+ library_names_spec='$libname${shared_ext} $libname.a'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=LIBPATH
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+ ;;
+
+sco3.2v5*)
+ version_type=osf
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+solaris*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test "$with_gnu_ld" = yes; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ need_lib_prefix=no
+ export_dynamic_flag_spec='${wl}-Blargedynsym'
+ runpath_var=LD_RUN_PATH
+ ;;
+ siemens)
+ need_lib_prefix=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec ;then
+ version_type=linux
+ library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+ soname_spec='$libname${shared_ext}.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+uts4*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+AC_MSG_RESULT([$dynamic_linker])
+test "$dynamic_linker" = no && can_build_shared=no
+])# AC_LIBTOOL_SYS_DYNAMIC_LINKER
+
+
+# _LT_AC_TAGCONFIG
+# ----------------
+AC_DEFUN([_LT_AC_TAGCONFIG],
+[AC_ARG_WITH([tags],
+ [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@],
+ [include additional configurations @<:@automatic@:>@])],
+ [tagnames="$withval"])
+
+if test -f "$ltmain" && test -n "$tagnames"; then
+ if test ! -f "${ofile}"; then
+ AC_MSG_WARN([output file `$ofile' does not exist])
+ fi
+
+ if test -z "$LTCC"; then
+ eval "`$SHELL ${ofile} --config | grep '^LTCC='`"
+ if test -z "$LTCC"; then
+ AC_MSG_WARN([output file `$ofile' does not look like a libtool script])
+ else
+ AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile'])
+ fi
+ fi
+
+ # Extract list of available tagged configurations in $ofile.
+ # Note that this assumes the entire list is on one line.
+ available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'`
+
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for tagname in $tagnames; do
+ IFS="$lt_save_ifs"
+ # Check whether tagname contains only valid characters
+ case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in
+ "") ;;
+ *) AC_MSG_ERROR([invalid tag name: $tagname])
+ ;;
+ esac
+
+ if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null
+ then
+ AC_MSG_ERROR([tag name \"$tagname\" already exists])
+ fi
+
+ # Update the list of available tags.
+ if test -n "$tagname"; then
+ echo appending configuration tag \"$tagname\" to $ofile
+
+ case $tagname in
+ CXX)
+ if test -n "$CXX" && test "X$CXX" != "Xno"; then
+ AC_LIBTOOL_LANG_CXX_CONFIG
+ else
+ tagname=""
+ fi
+ ;;
+
+ F77)
+ if test -n "$F77" && test "X$F77" != "Xno"; then
+ AC_LIBTOOL_LANG_F77_CONFIG
+ else
+ tagname=""
+ fi
+ ;;
+
+ GCJ)
+ if test -n "$GCJ" && test "X$GCJ" != "Xno"; then
+ AC_LIBTOOL_LANG_GCJ_CONFIG
+ else
+ tagname=""
+ fi
+ ;;
+
+ RC)
+ AC_LIBTOOL_LANG_RC_CONFIG
+ ;;
+
+ *)
+ AC_MSG_ERROR([Unsupported tag name: $tagname])
+ ;;
+ esac
+
+ # Append the new tag name to the list of available tags.
+ if test -n "$tagname" ; then
+ available_tags="$available_tags $tagname"
+ fi
+ fi
+ done
+ IFS="$lt_save_ifs"
+
+ # Now substitute the updated list of available tags.
+ if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then
+ mv "${ofile}T" "$ofile"
+ chmod +x "$ofile"
+ else
+ rm -f "${ofile}T"
+ AC_MSG_ERROR([unable to update list of available tagged configurations.])
+ fi
+fi
+])# _LT_AC_TAGCONFIG
+
+
+# AC_LIBTOOL_DLOPEN
+# -----------------
+# enable checks for dlopen support
+AC_DEFUN([AC_LIBTOOL_DLOPEN],
+ [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])
+])# AC_LIBTOOL_DLOPEN
+
+
+# AC_LIBTOOL_WIN32_DLL
+# --------------------
+# declare package support for building win32 dll's
+AC_DEFUN([AC_LIBTOOL_WIN32_DLL],
+[AC_BEFORE([$0], [AC_LIBTOOL_SETUP])
+])# AC_LIBTOOL_WIN32_DLL
+
+
+# AC_ENABLE_SHARED([DEFAULT])
+# ---------------------------
+# implement the --enable-shared flag
+# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
+AC_DEFUN([AC_ENABLE_SHARED],
+[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE([shared],
+ [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
+ [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])],
+ [p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_shared=yes ;;
+ no) enable_shared=no ;;
+ *)
+ enable_shared=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for pkg in $enableval; do
+ IFS="$lt_save_ifs"
+ if test "X$pkg" = "X$p"; then
+ enable_shared=yes
+ fi
+ done
+ IFS="$lt_save_ifs"
+ ;;
+ esac],
+ [enable_shared=]AC_ENABLE_SHARED_DEFAULT)
+])# AC_ENABLE_SHARED
+
+
+# AC_DISABLE_SHARED
+# -----------------
+#- set the default shared flag to --disable-shared
+AC_DEFUN([AC_DISABLE_SHARED],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_SHARED(no)
+])# AC_DISABLE_SHARED
+
+
+# AC_ENABLE_STATIC([DEFAULT])
+# ---------------------------
+# implement the --enable-static flag
+# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
+AC_DEFUN([AC_ENABLE_STATIC],
+[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE([static],
+ [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@],
+ [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])],
+ [p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_static=yes ;;
+ no) enable_static=no ;;
+ *)
+ enable_static=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for pkg in $enableval; do
+ IFS="$lt_save_ifs"
+ if test "X$pkg" = "X$p"; then
+ enable_static=yes
+ fi
+ done
+ IFS="$lt_save_ifs"
+ ;;
+ esac],
+ [enable_static=]AC_ENABLE_STATIC_DEFAULT)
+])# AC_ENABLE_STATIC
+
+
+# AC_DISABLE_STATIC
+# -----------------
+# set the default static flag to --disable-static
+AC_DEFUN([AC_DISABLE_STATIC],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_STATIC(no)
+])# AC_DISABLE_STATIC
+
+
+# AC_ENABLE_FAST_INSTALL([DEFAULT])
+# ---------------------------------
+# implement the --enable-fast-install flag
+# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
+AC_DEFUN([AC_ENABLE_FAST_INSTALL],
+[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE([fast-install],
+ [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
+ [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
+ [p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_fast_install=yes ;;
+ no) enable_fast_install=no ;;
+ *)
+ enable_fast_install=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for pkg in $enableval; do
+ IFS="$lt_save_ifs"
+ if test "X$pkg" = "X$p"; then
+ enable_fast_install=yes
+ fi
+ done
+ IFS="$lt_save_ifs"
+ ;;
+ esac],
+ [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT)
+])# AC_ENABLE_FAST_INSTALL
+
+
+# AC_DISABLE_FAST_INSTALL
+# -----------------------
+# set the default to --disable-fast-install
+AC_DEFUN([AC_DISABLE_FAST_INSTALL],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_FAST_INSTALL(no)
+])# AC_DISABLE_FAST_INSTALL
+
+
+# AC_LIBTOOL_PICMODE([MODE])
+# --------------------------
+# implement the --with-pic flag
+# MODE is either `yes' or `no'. If omitted, it defaults to `both'.
+AC_DEFUN([AC_LIBTOOL_PICMODE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+pic_mode=ifelse($#,1,$1,default)
+])# AC_LIBTOOL_PICMODE
+
+
+# AC_PROG_EGREP
+# -------------
+# This is predefined starting with Autoconf 2.54, so this conditional
+# definition can be removed once we require Autoconf 2.54 or later.
+m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP],
+[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep],
+ [if echo a | (grep -E '(a|b)') >/dev/null 2>&1
+ then ac_cv_prog_egrep='grep -E'
+ else ac_cv_prog_egrep='egrep'
+ fi])
+ EGREP=$ac_cv_prog_egrep
+ AC_SUBST([EGREP])
+])])
+
+
+# AC_PATH_TOOL_PREFIX
+# -------------------
+# find a file program which can recognise shared library
+AC_DEFUN([AC_PATH_TOOL_PREFIX],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_MSG_CHECKING([for $1])
+AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
+[case $MAGIC_CMD in
+[[\\/*] | ?:[\\/]*])
+ lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+ ;;
+*)
+ lt_save_MAGIC_CMD="$MAGIC_CMD"
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+dnl $ac_dummy forces splitting on constant user-supplied paths.
+dnl POSIX.2 word splitting is done only on the output of word expansions,
+dnl not every word. This closes a longstanding sh security hole.
+ ac_dummy="ifelse([$2], , $PATH, [$2])"
+ for ac_dir in $ac_dummy; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$1; then
+ lt_cv_path_MAGIC_CMD="$ac_dir/$1"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`"
+ MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS="$lt_save_ifs"
+ MAGIC_CMD="$lt_save_MAGIC_CMD"
+ ;;
+esac])
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+ AC_MSG_RESULT($MAGIC_CMD)
+else
+ AC_MSG_RESULT(no)
+fi
+])# AC_PATH_TOOL_PREFIX
+
+
+# AC_PATH_MAGIC
+# -------------
+# find a file program which can recognise a shared library
+AC_DEFUN([AC_PATH_MAGIC],
+[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+ if test -n "$ac_tool_prefix"; then
+ AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
+ else
+ MAGIC_CMD=:
+ fi
+fi
+])# AC_PATH_MAGIC
+
+
+# AC_PROG_LD
+# ----------
+# find the pathname to the GNU or non-GNU linker
+AC_DEFUN([AC_PROG_LD],
+[AC_ARG_WITH([gnu-ld],
+ [AC_HELP_STRING([--with-gnu-ld],
+ [assume the C compiler uses GNU ld @<:@default=no@:>@])],
+ [test "$withval" = no || with_gnu_ld=yes],
+ [with_gnu_ld=no])
+AC_REQUIRE([LT_AC_PROG_SED])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+ac_prog=ld
+if test "$GCC" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ AC_MSG_CHECKING([for ld used by $CC])
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [[\\/]]* | ?:[[\\/]]*)
+ re_direlt='/[[^/]][[^/]]*/\.\./'
+ # Canonicalize the pathname of ld
+ ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'`
+ while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ AC_MSG_CHECKING([for GNU ld])
+else
+ AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(lt_cv_path_LD,
+[if test -z "$LD"; then
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ lt_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some GNU ld's only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test "$with_gnu_ld" != no && break
+ ;;
+ *)
+ test "$with_gnu_ld" != yes && break
+ ;;
+ esac
+ fi
+ done
+ IFS="$lt_save_ifs"
+else
+ lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+ AC_MSG_RESULT($LD)
+else
+ AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+AC_PROG_LD_GNU
+])# AC_PROG_LD
+
+
+# AC_PROG_LD_GNU
+# --------------
+AC_DEFUN([AC_PROG_LD_GNU],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ lt_cv_prog_gnu_ld=yes
+ ;;
+*)
+ lt_cv_prog_gnu_ld=no
+ ;;
+esac])
+with_gnu_ld=$lt_cv_prog_gnu_ld
+])# AC_PROG_LD_GNU
+
+
+# AC_PROG_LD_RELOAD_FLAG
+# ----------------------
+# find reload flag for linker
+# -- PORTME Some linkers may need a different reload flag.
+AC_DEFUN([AC_PROG_LD_RELOAD_FLAG],
+[AC_CACHE_CHECK([for $LD option to reload object files],
+ lt_cv_ld_reload_flag,
+ [lt_cv_ld_reload_flag='-r'])
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+])# AC_PROG_LD_RELOAD_FLAG
+
+
+# AC_DEPLIBS_CHECK_METHOD
+# -----------------------
+# how to check for library dependencies
+# -- PORTME fill in with the dynamic library characteristics
+AC_DEFUN([AC_DEPLIBS_CHECK_METHOD],
+[AC_CACHE_CHECK([how to recognise dependent libraries],
+lt_cv_deplibs_check_method,
+[lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix4* | aix5*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+beos*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+bsdi4*)
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
+ lt_cv_file_magic_cmd='/usr/bin/file -L'
+ lt_cv_file_magic_test_file=/shlib/libc.so
+ ;;
+
+cygwin*)
+ # func_win32_libid is a shell function defined in ltmain.sh
+ lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+ lt_cv_file_magic_cmd='func_win32_libid'
+ ;;
+
+mingw* | pw32*)
+ # Base MSYS/MinGW do not provide the 'file' command needed by
+ # func_win32_libid shell function, so use a weaker test based on 'objdump'.
+ lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+ lt_cv_file_magic_cmd='$OBJDUMP -f'
+ ;;
+
+darwin* | rhapsody*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+freebsd* | kfreebsd*-gnu)
+ if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+ case $host_cpu in
+ i*86 )
+ # Not sure whether the presence of OpenBSD here was a mistake.
+ # Let's accept both of them until this is cleared up.
+ lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[[3-9]]86 (compact )?demand paged shared library'
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+ ;;
+ esac
+ else
+ lt_cv_deplibs_check_method=pass_all
+ fi
+ ;;
+
+gnu*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+hpux10.20* | hpux11*)
+ lt_cv_file_magic_cmd=/usr/bin/file
+ case "$host_cpu" in
+ ia64*)
+ lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
+ lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+ ;;
+ hppa*64*)
+ [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]']
+ lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+ ;;
+ *)
+ lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library'
+ lt_cv_file_magic_test_file=/usr/lib/libc.sl
+ ;;
+ esac
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $LD in
+ *-32|*"-32 ") libmagic=32-bit;;
+ *-n32|*"-n32 ") libmagic=N32;;
+ *-64|*"-64 ") libmagic=64-bit;;
+ *) libmagic=never-match;;
+ esac
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+# This must be Linux ELF.
+linux*)
+ case $host_cpu in
+ alpha*|hppa*|i*86|ia64*|m68*|mips*|powerpc*|sparc*|s390*|sh*|x86_64*)
+ lt_cv_deplibs_check_method=pass_all ;;
+ *)
+ # glibc up to 2.1.1 does not perform some relocations on ARM
+ # this will be overridden with pass_all, but let us keep it just in case
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;;
+ esac
+ lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so`
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+ lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
+ fi
+ ;;
+
+newos6*)
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=/usr/lib/libnls.so
+ ;;
+
+nto-qnx*)
+ lt_cv_deplibs_check_method=unknown
+ ;;
+
+openbsd*)
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB shared object'
+ else
+ lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library'
+ fi
+ ;;
+
+osf3* | osf4* | osf5*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+sco3.2v5*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+solaris*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ case $host_vendor in
+ motorola)
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+ ;;
+ ncr)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ sequent)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
+ ;;
+ sni)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
+ lt_cv_file_magic_test_file=/lib/libc.so
+ ;;
+ siemens)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ esac
+ ;;
+
+sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7* | sysv4*uw2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+esac
+])
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+])# AC_DEPLIBS_CHECK_METHOD
+
+
+# AC_PROG_NM
+# ----------
+# find the pathname to a BSD-compatible name lister
+AC_DEFUN([AC_PROG_NM],
+[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM,
+[if test -n "$NM"; then
+ # Let the user override the test.
+ lt_cv_path_NM="$NM"
+else
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ tmp_nm="$ac_dir/${ac_tool_prefix}nm"
+ if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+ # Check to see if the nm accepts a BSD-compat flag.
+ # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+ # nm: unknown option "B" ignored
+ # Tru64's nm complains that /dev/null is an invalid object file
+ case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+ */dev/null* | *'Invalid file or object type'*)
+ lt_cv_path_NM="$tmp_nm -B"
+ break
+ ;;
+ *)
+ case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+ */dev/null*)
+ lt_cv_path_NM="$tmp_nm -p"
+ break
+ ;;
+ *)
+ lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+ continue # so that we can try to find one that supports BSD flags
+ ;;
+ esac
+ esac
+ fi
+ done
+ IFS="$lt_save_ifs"
+ test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm
+fi])
+NM="$lt_cv_path_NM"
+])# AC_PROG_NM
+
+
+# AC_CHECK_LIBM
+# -------------
+# check for math library
+AC_DEFUN([AC_CHECK_LIBM],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*)
+ # These system don't have libm, or don't need it
+ ;;
+*-ncr-sysv4.3*)
+ AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
+ AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
+ ;;
+*)
+ AC_CHECK_LIB(m, cos, LIBM="-lm")
+ ;;
+esac
+])# AC_CHECK_LIBM
+
+
+# AC_LIBLTDL_CONVENIENCE([DIRECTORY])
+# -----------------------------------
+# sets LIBLTDL to the link flags for the libltdl convenience library and
+# LTDLINCL to the include flags for the libltdl header and adds
+# --enable-ltdl-convenience to the configure arguments. Note that LIBLTDL
+# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If
+# DIRECTORY is not provided, it is assumed to be `libltdl'. LIBLTDL will
+# be prefixed with '${top_builddir}/' and LTDLINCL will be prefixed with
+# '${top_srcdir}/' (note the single quotes!). If your package is not
+# flat and you're not using automake, define top_builddir and
+# top_srcdir appropriately in the Makefiles.
+AC_DEFUN([AC_LIBLTDL_CONVENIENCE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+ case $enable_ltdl_convenience in
+ no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;;
+ "") enable_ltdl_convenience=yes
+ ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;;
+ esac
+ LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la
+ LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
+ # For backwards non-gettext consistent compatibility...
+ INCLTDL="$LTDLINCL"
+])# AC_LIBLTDL_CONVENIENCE
+
+
+# AC_LIBLTDL_INSTALLABLE([DIRECTORY])
+# -----------------------------------
+# sets LIBLTDL to the link flags for the libltdl installable library and
+# LTDLINCL to the include flags for the libltdl header and adds
+# --enable-ltdl-install to the configure arguments. Note that LIBLTDL
+# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If
+# DIRECTORY is not provided and an installed libltdl is not found, it is
+# assumed to be `libltdl'. LIBLTDL will be prefixed with '${top_builddir}/'
+# and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single
+# quotes!). If your package is not flat and you're not using automake,
+# define top_builddir and top_srcdir appropriately in the Makefiles.
+# In the future, this macro may have to be called after AC_PROG_LIBTOOL.
+AC_DEFUN([AC_LIBLTDL_INSTALLABLE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+ AC_CHECK_LIB(ltdl, lt_dlinit,
+ [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no],
+ [if test x"$enable_ltdl_install" = xno; then
+ AC_MSG_WARN([libltdl not installed, but installation disabled])
+ else
+ enable_ltdl_install=yes
+ fi
+ ])
+ if test x"$enable_ltdl_install" = x"yes"; then
+ ac_configure_args="$ac_configure_args --enable-ltdl-install"
+ LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la
+ LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
+ else
+ ac_configure_args="$ac_configure_args --enable-ltdl-install=no"
+ LIBLTDL="-lltdl"
+ LTDLINCL=
+ fi
+ # For backwards non-gettext consistent compatibility...
+ INCLTDL="$LTDLINCL"
+])# AC_LIBLTDL_INSTALLABLE
+
+
+# AC_LIBTOOL_CXX
+# --------------
+# enable support for C++ libraries
+AC_DEFUN([AC_LIBTOOL_CXX],
+[AC_REQUIRE([_LT_AC_LANG_CXX])
+])# AC_LIBTOOL_CXX
+
+
+# _LT_AC_LANG_CXX
+# ---------------
+AC_DEFUN([_LT_AC_LANG_CXX],
+[AC_REQUIRE([AC_PROG_CXX])
+AC_REQUIRE([AC_PROG_CXXCPP])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX])
+])# _LT_AC_LANG_CXX
+
+
+# AC_LIBTOOL_F77
+# --------------
+# enable support for Fortran 77 libraries
+AC_DEFUN([AC_LIBTOOL_F77],
+[AC_REQUIRE([_LT_AC_LANG_F77])
+])# AC_LIBTOOL_F77
+
+
+# _LT_AC_LANG_F77
+# ---------------
+AC_DEFUN([_LT_AC_LANG_F77],
+[AC_REQUIRE([AC_PROG_F77])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77])
+])# _LT_AC_LANG_F77
+
+
+# AC_LIBTOOL_GCJ
+# --------------
+# enable support for GCJ libraries
+AC_DEFUN([AC_LIBTOOL_GCJ],
+[AC_REQUIRE([_LT_AC_LANG_GCJ])
+])# AC_LIBTOOL_GCJ
+
+
+# _LT_AC_LANG_GCJ
+# ---------------
+AC_DEFUN([_LT_AC_LANG_GCJ],
+[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[],
+ [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[],
+ [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[],
+ [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])],
+ [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])],
+ [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ])
+])# _LT_AC_LANG_GCJ
+
+
+# AC_LIBTOOL_RC
+# --------------
+# enable support for Windows resource files
+AC_DEFUN([AC_LIBTOOL_RC],
+[AC_REQUIRE([LT_AC_PROG_RC])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC])
+])# AC_LIBTOOL_RC
+
+
+# AC_LIBTOOL_LANG_C_CONFIG
+# ------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined. Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG])
+AC_DEFUN([_LT_AC_LANG_C_CONFIG],
+[lt_save_CC="$CC"
+AC_LANG_PUSH(C)
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}\n'
+
+_LT_AC_SYS_COMPILER
+
+#
+# Check for any special shared library compilation flags.
+#
+_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)=
+if test "$GCC" = no; then
+ case $host_os in
+ sco3.2v5*)
+ _LT_AC_TAGVAR(lt_prog_cc_shlib, $1)='-belf'
+ ;;
+ esac
+fi
+if test -n "$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)"; then
+ AC_MSG_WARN([`$CC' requires `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to build shared libraries])
+ if echo "$old_CC $old_CFLAGS " | grep "[[ ]]$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)[[ ]]" >/dev/null; then :
+ else
+ AC_MSG_WARN([add `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to the CC or CFLAGS env variable and reconfigure])
+ _LT_AC_TAGVAR(lt_cv_prog_cc_can_build_shared, $1)=no
+ fi
+fi
+
+
+#
+# Check to make sure the static flag actually works.
+#
+AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $_LT_AC_TAGVAR(lt_prog_compiler_static, $1) works],
+ _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1),
+ $_LT_AC_TAGVAR(lt_prog_compiler_static, $1),
+ [],
+ [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=])
+
+
+AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1)
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+AC_LIBTOOL_SYS_LIB_STRIP
+AC_LIBTOOL_DLOPEN_SELF($1)
+
+# Report which librarie types wil actually be built
+AC_MSG_CHECKING([if libtool supports shared libraries])
+AC_MSG_RESULT([$can_build_shared])
+
+AC_MSG_CHECKING([whether to build shared libraries])
+test "$can_build_shared" = "no" && enable_shared=no
+
+# On AIX, shared libraries and static libraries use the same namespace, and
+# are all built from PIC.
+case "$host_os" in
+aix3*)
+ test "$enable_shared" = yes && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+
+aix4* | aix5*)
+ if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+ test "$enable_shared" = yes && enable_static=no
+ fi
+ ;;
+ darwin* | rhapsody*)
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ case "$host_os" in
+ rhapsody* | darwin1.[[012]])
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress'
+ ;;
+ *) # Darwin 1.3 on
+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress'
+ else
+ case ${MACOSX_DEPLOYMENT_TARGET} in
+ 10.[[012]])
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress'
+ ;;
+ 10.*)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined dynamic_lookup'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ output_verbose_link_cmd='echo'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring'
+ _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_automatic, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience'
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+esac
+AC_MSG_RESULT([$enable_shared])
+
+AC_MSG_CHECKING([whether to build static libraries])
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+AC_MSG_RESULT([$enable_static])
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_POP
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_C_CONFIG
+
+
+# AC_LIBTOOL_LANG_CXX_CONFIG
+# --------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined. Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)])
+AC_DEFUN([_LT_AC_LANG_CXX_CONFIG],
+[AC_LANG_PUSH(C++)
+AC_REQUIRE([AC_PROG_CXX])
+AC_REQUIRE([AC_PROG_CXXCPP])
+
+_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_AC_TAGVAR(allow_undefined_flag, $1)=
+_LT_AC_TAGVAR(always_export_symbols, $1)=no
+_LT_AC_TAGVAR(archive_expsym_cmds, $1)=
+_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_direct, $1)=no
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_AC_TAGVAR(hardcode_minus_L, $1)=no
+_LT_AC_TAGVAR(hardcode_automatic, $1)=no
+_LT_AC_TAGVAR(module_cmds, $1)=
+_LT_AC_TAGVAR(module_expsym_cmds, $1)=
+_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_AC_TAGVAR(no_undefined_flag, $1)=
+_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Dependencies to place before and after the object being linked:
+_LT_AC_TAGVAR(predep_objects, $1)=
+_LT_AC_TAGVAR(postdep_objects, $1)=
+_LT_AC_TAGVAR(predeps, $1)=
+_LT_AC_TAGVAR(postdeps, $1)=
+_LT_AC_TAGVAR(compiler_lib_search_path, $1)=
+
+# Source file extension for C++ test sources.
+ac_ext=cc
+
+# Object file extension for compiled C++ test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_COMPILER
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_LD=$LD
+lt_save_GCC=$GCC
+GCC=$GXX
+lt_save_with_gnu_ld=$with_gnu_ld
+lt_save_path_LD=$lt_cv_path_LD
+if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+ lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+else
+ unset lt_cv_prog_gnu_ld
+fi
+if test -n "${lt_cv_path_LDCXX+set}"; then
+ lt_cv_path_LD=$lt_cv_path_LDCXX
+else
+ unset lt_cv_path_LD
+fi
+test -z "${LDCXX+set}" || LD=$LDCXX
+CC=${CXX-"c++"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'`
+
+# We don't want -fno-exception wen compiling C++ code, so set the
+# no_builtin_flag separately
+if test "$GXX" = yes; then
+ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+else
+ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+fi
+
+if test "$GXX" = yes; then
+ # Set up default GNU C++ configuration
+
+ AC_PROG_LD
+
+ # Check if GNU C++ uses GNU ld as the underlying linker, since the
+ # archiving commands below assume that GNU ld is being used.
+ if test "$with_gnu_ld" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+ # investigate it a little bit more. (MM)
+ wlarc='${wl}'
+
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if eval "`$CC -print-prog-name=ld` --help 2>&1" | \
+ grep 'no-whole-archive' > /dev/null; then
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+ fi
+ else
+ with_gnu_ld=no
+ wlarc=
+
+ # A generic and very simple default shared library creation
+ # command for GNU C++ for the case where it uses the native
+ # linker, instead of GNU ld. If possible, this setting should
+ # overridden to take advantage of the native linker features on
+ # the platform it is being used on.
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+ fi
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+else
+ GXX=no
+ with_gnu_ld=no
+ wlarc=
+fi
+
+# PORTME: fill in a description of your system's C++ link characteristics
+AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+_LT_AC_TAGVAR(ld_shlibs, $1)=yes
+case $host_os in
+ aix3*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ aix4* | aix5*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=""
+ else
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # need to do runtime linking.
+ case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*)
+ for ld_flag in $LDFLAGS; do
+ case $ld_flag in
+ *-brtl*)
+ aix_use_runtimelinking=yes
+ break
+ ;;
+ esac
+ done
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ _LT_AC_TAGVAR(archive_cmds, $1)=''
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+
+ if test "$GXX" = yes; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" && \
+ strings "$collect2name" | grep resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ else
+ # We have old collect2
+ _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+ fi
+ esac
+ shared_flag='-shared'
+ else
+ # not using gcc
+ if test "$host_cpu" = ia64; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag='${wl}-G'
+ else
+ shared_flag='${wl}-bM:SRE'
+ fi
+ fi
+ fi
+
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to export.
+ _LT_AC_TAGVAR(always_export_symbols, $1)=yes
+ if test "$aix_use_runtimelinking" = yes; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok'
+ # Determine the default libpath from the value encoded in an empty executable.
+ _LT_AC_SYS_LIBPATH_AIX
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ else
+ if test "$host_cpu" = ia64; then
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an empty executable.
+ _LT_AC_SYS_LIBPATH_AIX
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+ # -bexpall does not export symbols beginning with underscore (_)
+ _LT_AC_TAGVAR(always_export_symbols, $1)=yes
+ # Exported symbols can be pulled into shared objects from archives
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' '
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+ # This is similar to how AIX traditionally builds it's shared libraries.
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+ fi
+ fi
+ ;;
+ chorus*)
+ case $cc_basename in
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+ # as there is no search path for DLLs.
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_AC_TAGVAR(always_export_symbols, $1)=no
+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib'
+ # If the export-symbols file already is a .def file (1st line
+ # is EXPORTS), use it as is; otherwise, prepend...
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib'
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ darwin* | rhapsody*)
+ if test "$GXX" = yes; then
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ case "$host_os" in
+ rhapsody* | darwin1.[[012]])
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress'
+ ;;
+ *) # Darwin 1.3 on
+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress'
+ else
+ case ${MACOSX_DEPLOYMENT_TARGET} in
+ 10.[[012]])
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress'
+ ;;
+ 10.*)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined dynamic_lookup'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ lt_int_apple_cc_single_mod=no
+ output_verbose_link_cmd='echo'
+ if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then
+ lt_int_apple_cc_single_mod=yes
+ fi
+ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+ fi
+ _LT_AC_TAGVAR(module_cmds, $1)='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's
+ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ else
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ fi
+ _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_automatic, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience'
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ dgux*)
+ case $cc_basename in
+ ec++)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ ghcx)
+ # Green Hills C++ Compiler
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+ freebsd[12]*)
+ # C++ shared libraries reported to be fairly broken before switch to ELF
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ freebsd-elf*)
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ ;;
+ freebsd* | kfreebsd*-gnu)
+ # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+ # conventions
+ _LT_AC_TAGVAR(ld_shlibs, $1)=yes
+ ;;
+ gnu*)
+ ;;
+ hpux9*)
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+ # but as the default
+ # location of the library.
+
+ case $cc_basename in
+ CC)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ aCC)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ else
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+ hpux10*|hpux11*)
+ if test $with_gnu_ld = no; then
+ case "$host_cpu" in
+ hppa*64*)
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ ;;
+ ia64*)
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ ;;
+ *)
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ ;;
+ esac
+ fi
+ case "$host_cpu" in
+ hppa*64*)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+ ia64*)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+ # but as the default
+ # location of the library.
+ ;;
+ *)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+ # but as the default
+ # location of the library.
+ ;;
+ esac
+
+ case $cc_basename in
+ CC)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ aCC)
+ case "$host_cpu" in
+ hppa*64*|ia64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ esac
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ if test $with_gnu_ld = no; then
+ case "$host_cpu" in
+ ia64*|hppa*64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ esac
+ fi
+ else
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+ irix5* | irix6*)
+ case $cc_basename in
+ CC)
+ # SGI C++
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib'
+
+ # Archives containing C++ object files must be created using
+ # "CC -ar", where "CC" is the IRIX C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ if test "$with_gnu_ld" = no; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib'
+ fi
+ fi
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ ;;
+ esac
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ ;;
+ linux*)
+ case $cc_basename in
+ KCC)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+ # Archives containing C++ object files must be created using
+ # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+ ;;
+ icpc)
+ # Intel C++
+ with_gnu_ld=yes
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+ ;;
+ cxx)
+ # Compaq C++
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+ runpath_var=LD_RUN_PATH
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ esac
+ ;;
+ lynxos*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ m88k*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ mvs*)
+ case $cc_basename in
+ cxx)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+ wlarc=
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ fi
+ # Workaround some broken pre-1.5 toolchains
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+ ;;
+ osf3*)
+ case $cc_basename in
+ KCC)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Archives containing C++ object files must be created using
+ # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+
+ ;;
+ RCC)
+ # Rational C++ 2.4.1
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ cxx)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+ else
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+ osf4* | osf5*)
+ case $cc_basename in
+ KCC)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Archives containing C++ object files must be created using
+ # the KAI C++ compiler.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs'
+ ;;
+ RCC)
+ # Rational C++ 2.4.1
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ cxx)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+ echo "-hidden">> $lib.exp~
+ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~
+ $rm $lib.exp'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+ else
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+ psos*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ sco*)
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ case $cc_basename in
+ CC)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+ sunos4*)
+ case $cc_basename in
+ CC)
+ # Sun C++ 4.x
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ lcc)
+ # Lucid
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+ solaris*)
+ case $cc_basename in
+ CC)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ # The C++ compiler is used as linker so we must use $wl
+ # flag to pass the commands to the underlying system
+ # linker.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+ ;;
+ esac
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[[LR]]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+
+ # Archives containing C++ object files must be created using
+ # "CC -xar", where "CC" is the Sun C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+ ;;
+ gcx)
+ # Green Hills C++ Compiler
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+ # The C++ compiler must be used to create the archive.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+ ;;
+ *)
+ # GNU C++ compiler with Solaris linker
+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+ _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
+ if $CC --version | grep -v '^2\.7' > /dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
+ else
+ # g++ 2.7 appears to require `-G' NOT `-shared' on this
+ # platform.
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
+ fi
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
+ fi
+ ;;
+ esac
+ ;;
+ sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*)
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ ;;
+ tandem*)
+ case $cc_basename in
+ NCC)
+ # NonStop-UX NCC 3.20
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+ vxworks*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+esac
+AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)])
+test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+_LT_AC_TAGVAR(GCC, $1)="$GXX"
+_LT_AC_TAGVAR(LD, $1)="$LD"
+
+AC_LIBTOOL_POSTDEP_PREDEP($1)
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+AC_LIBTOOL_SYS_LIB_STRIP
+AC_LIBTOOL_DLOPEN_SELF($1)
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_POP
+CC=$lt_save_CC
+LDCXX=$LD
+LD=$lt_save_LD
+GCC=$lt_save_GCC
+with_gnu_ldcxx=$with_gnu_ld
+with_gnu_ld=$lt_save_with_gnu_ld
+lt_cv_path_LDCXX=$lt_cv_path_LD
+lt_cv_path_LD=$lt_save_path_LD
+lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+])# AC_LIBTOOL_LANG_CXX_CONFIG
+
+# AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME])
+# ------------------------
+# Figure out "hidden" library dependencies from verbose
+# compiler output when linking a shared library.
+# Parse the compiler output and extract the necessary
+# objects, libraries and library flags.
+AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[
+dnl we can't use the lt_simple_compile_test_code here,
+dnl because it contains code intended for an executable,
+dnl not a library. It's possible we should let each
+dnl tag define a new lt_????_link_test_code variable,
+dnl but it's only used here...
+ifelse([$1],[],[cat > conftest.$ac_ext <<EOF
+int a;
+void foo (void) { a = 0; }
+EOF
+],[$1],[CXX],[cat > conftest.$ac_ext <<EOF
+class Foo
+{
+public:
+ Foo (void) { a = 0; }
+private:
+ int a;
+};
+EOF
+],[$1],[F77],[cat > conftest.$ac_ext <<EOF
+ subroutine foo
+ implicit none
+ integer*4 a
+ a=0
+ return
+ end
+EOF
+],[$1],[GCJ],[cat > conftest.$ac_ext <<EOF
+public class foo {
+ private int a;
+ public void bar (void) {
+ a = 0;
+ }
+};
+EOF
+])
+dnl Parse the compiler output and extract the necessary
+dnl objects, libraries and library flags.
+if AC_TRY_EVAL(ac_compile); then
+ # Parse the compiler output and extract the necessary
+ # objects, libraries and library flags.
+
+ # Sentinel used to keep track of whether or not we are before
+ # the conftest object file.
+ pre_test_object_deps_done=no
+
+ # The `*' in the case matches for architectures that use `case' in
+ # $output_verbose_cmd can trigger glob expansion during the loop
+ # eval without this substitution.
+ output_verbose_link_cmd="`$echo \"X$output_verbose_link_cmd\" | $Xsed -e \"$no_glob_subst\"`"
+
+ for p in `eval $output_verbose_link_cmd`; do
+ case $p in
+
+ -L* | -R* | -l*)
+ # Some compilers place space between "-{L,R}" and the path.
+ # Remove the space.
+ if test $p = "-L" \
+ || test $p = "-R"; then
+ prev=$p
+ continue
+ else
+ prev=
+ fi
+
+ if test "$pre_test_object_deps_done" = no; then
+ case $p in
+ -L* | -R*)
+ # Internal compiler library paths should come after those
+ # provided the user. The postdeps already come after the
+ # user supplied libs so there is no need to process them.
+ if test -z "$_LT_AC_TAGVAR(compiler_lib_search_path, $1)"; then
+ _LT_AC_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
+ else
+ _LT_AC_TAGVAR(compiler_lib_search_path, $1)="${_LT_AC_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
+ fi
+ ;;
+ # The "-l" case would never come before the object being
+ # linked, so don't bother handling this case.
+ esac
+ else
+ if test -z "$_LT_AC_TAGVAR(postdeps, $1)"; then
+ _LT_AC_TAGVAR(postdeps, $1)="${prev}${p}"
+ else
+ _LT_AC_TAGVAR(postdeps, $1)="${_LT_AC_TAGVAR(postdeps, $1)} ${prev}${p}"
+ fi
+ fi
+ ;;
+
+ *.$objext)
+ # This assumes that the test object file only shows up
+ # once in the compiler output.
+ if test "$p" = "conftest.$objext"; then
+ pre_test_object_deps_done=yes
+ continue
+ fi
+
+ if test "$pre_test_object_deps_done" = no; then
+ if test -z "$_LT_AC_TAGVAR(predep_objects, $1)"; then
+ _LT_AC_TAGVAR(predep_objects, $1)="$p"
+ else
+ _LT_AC_TAGVAR(predep_objects, $1)="$_LT_AC_TAGVAR(predep_objects, $1) $p"
+ fi
+ else
+ if test -z "$_LT_AC_TAGVAR(postdep_objects, $1)"; then
+ _LT_AC_TAGVAR(postdep_objects, $1)="$p"
+ else
+ _LT_AC_TAGVAR(postdep_objects, $1)="$_LT_AC_TAGVAR(postdep_objects, $1) $p"
+ fi
+ fi
+ ;;
+
+ *) ;; # Ignore the rest.
+
+ esac
+ done
+
+ # Clean up.
+ rm -f a.out a.exe
+else
+ echo "libtool.m4: error: problem compiling $1 test program"
+fi
+
+$rm -f confest.$objext
+
+case " $_LT_AC_TAGVAR(postdeps, $1) " in
+*" -lc "*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;;
+esac
+])# AC_LIBTOOL_POSTDEP_PREDEP
+
+# AC_LIBTOOL_LANG_F77_CONFIG
+# ------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined. Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG], [_LT_AC_LANG_F77_CONFIG(F77)])
+AC_DEFUN([_LT_AC_LANG_F77_CONFIG],
+[AC_REQUIRE([AC_PROG_F77])
+AC_LANG_PUSH(Fortran 77)
+
+_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_AC_TAGVAR(allow_undefined_flag, $1)=
+_LT_AC_TAGVAR(always_export_symbols, $1)=no
+_LT_AC_TAGVAR(archive_expsym_cmds, $1)=
+_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_direct, $1)=no
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_AC_TAGVAR(hardcode_minus_L, $1)=no
+_LT_AC_TAGVAR(hardcode_automatic, $1)=no
+_LT_AC_TAGVAR(module_cmds, $1)=
+_LT_AC_TAGVAR(module_expsym_cmds, $1)=
+_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_AC_TAGVAR(no_undefined_flag, $1)=
+_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code=" subroutine t\n return\n end\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code=" program t\n end\n"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_COMPILER
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${F77-"f77"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'`
+
+AC_MSG_CHECKING([if libtool supports shared libraries])
+AC_MSG_RESULT([$can_build_shared])
+
+AC_MSG_CHECKING([whether to build shared libraries])
+test "$can_build_shared" = "no" && enable_shared=no
+
+# On AIX, shared libraries and static libraries use the same namespace, and
+# are all built from PIC.
+case "$host_os" in
+aix3*)
+ test "$enable_shared" = yes && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+aix4* | aix5*)
+ test "$enable_shared" = yes && enable_static=no
+ ;;
+esac
+AC_MSG_RESULT([$enable_shared])
+
+AC_MSG_CHECKING([whether to build static libraries])
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+AC_MSG_RESULT([$enable_static])
+
+test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+_LT_AC_TAGVAR(GCC, $1)="$G77"
+_LT_AC_TAGVAR(LD, $1)="$LD"
+
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+AC_LIBTOOL_SYS_LIB_STRIP
+
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_POP
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_F77_CONFIG
+
+
+# AC_LIBTOOL_LANG_GCJ_CONFIG
+# --------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined. Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG], [_LT_AC_LANG_GCJ_CONFIG(GCJ)])
+AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG],
+[AC_LANG_SAVE
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[] argv) {}; }\n'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_COMPILER
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${GCJ-"gcj"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+
+AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1)
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+AC_LIBTOOL_SYS_LIB_STRIP
+AC_LIBTOOL_DLOPEN_SELF($1)
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_RESTORE
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_GCJ_CONFIG
+
+
+# AC_LIBTOOL_LANG_RC_CONFIG
+# --------------------------
+# Ensure that the configuration vars for the Windows resource compiler are
+# suitably defined. Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG], [_LT_AC_LANG_RC_CONFIG(RC)])
+AC_DEFUN([_LT_AC_LANG_RC_CONFIG],
+[AC_LANG_SAVE
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="$lt_simple_compile_test_code"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_COMPILER
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${RC-"windres"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_RESTORE
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_RC_CONFIG
+
+
+# AC_LIBTOOL_CONFIG([TAGNAME])
+# ----------------------------
+# If TAGNAME is not passed, then create an initial libtool script
+# with a default configuration from the untagged config vars. Otherwise
+# add code to config.status for appending the configuration named by
+# TAGNAME from the matching tagged config vars.
+AC_DEFUN([AC_LIBTOOL_CONFIG],
+[# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+ # See if we are running on zsh, and set the options which allow our commands through
+ # without removal of \ escapes.
+ if test -n "${ZSH_VERSION+set}" ; then
+ setopt NO_GLOB_SUBST
+ fi
+ # Now quote all the things that may contain metacharacters while being
+ # careful not to overquote the AC_SUBSTed values. We take copies of the
+ # variables and quote the copies for generation of the libtool script.
+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \
+ SED SHELL STRIP \
+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+ deplibs_check_method reload_flag reload_cmds need_locks \
+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+ lt_cv_sys_global_symbol_to_c_name_address \
+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+ old_postinstall_cmds old_postuninstall_cmds \
+ _LT_AC_TAGVAR(compiler, $1) \
+ _LT_AC_TAGVAR(CC, $1) \
+ _LT_AC_TAGVAR(LD, $1) \
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1) \
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1) \
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1) \
+ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) \
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1) \
+ _LT_AC_TAGVAR(thread_safe_flag_spec, $1) \
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1) \
+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) \
+ _LT_AC_TAGVAR(old_archive_cmds, $1) \
+ _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) \
+ _LT_AC_TAGVAR(predep_objects, $1) \
+ _LT_AC_TAGVAR(postdep_objects, $1) \
+ _LT_AC_TAGVAR(predeps, $1) \
+ _LT_AC_TAGVAR(postdeps, $1) \
+ _LT_AC_TAGVAR(compiler_lib_search_path, $1) \
+ _LT_AC_TAGVAR(archive_cmds, $1) \
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1) \
+ _LT_AC_TAGVAR(postinstall_cmds, $1) \
+ _LT_AC_TAGVAR(postuninstall_cmds, $1) \
+ _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) \
+ _LT_AC_TAGVAR(allow_undefined_flag, $1) \
+ _LT_AC_TAGVAR(no_undefined_flag, $1) \
+ _LT_AC_TAGVAR(export_symbols_cmds, $1) \
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) \
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) \
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1) \
+ _LT_AC_TAGVAR(hardcode_automatic, $1) \
+ _LT_AC_TAGVAR(module_cmds, $1) \
+ _LT_AC_TAGVAR(module_expsym_cmds, $1) \
+ _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) \
+ _LT_AC_TAGVAR(exclude_expsyms, $1) \
+ _LT_AC_TAGVAR(include_expsyms, $1); do
+
+ case $var in
+ _LT_AC_TAGVAR(old_archive_cmds, $1) | \
+ _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) | \
+ _LT_AC_TAGVAR(archive_cmds, $1) | \
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1) | \
+ _LT_AC_TAGVAR(module_cmds, $1) | \
+ _LT_AC_TAGVAR(module_expsym_cmds, $1) | \
+ _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) | \
+ _LT_AC_TAGVAR(export_symbols_cmds, $1) | \
+ extract_expsyms_cmds | reload_cmds | finish_cmds | \
+ postinstall_cmds | postuninstall_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | \
+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+ # Double-quote double-evaled strings.
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+ ;;
+ *)
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+ ;;
+ esac
+ done
+
+ case $lt_echo in
+ *'\[$]0 --fallback-echo"')
+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\[$]0 --fallback-echo"[$]/[$]0 --fallback-echo"/'`
+ ;;
+ esac
+
+ifelse([$1], [],
+ [cfgfile="${ofile}T"
+ trap "$rm \"$cfgfile\"; exit 1" 1 2 15
+ $rm -f "$cfgfile"
+ AC_MSG_NOTICE([creating $ofile])],
+ [cfgfile="$ofile"])
+
+ cat <<__EOF__ >> "$cfgfile"
+ifelse([$1], [],
+[#! $SHELL
+
+# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
+# Free Software Foundation, Inc.
+#
+# This file is part of GNU Libtool:
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# This program 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 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="$SED -e s/^X//"
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi
+
+# The names of the tagged configurations supported by this script.
+available_tags=
+
+# ### BEGIN LIBTOOL CONFIG],
+[# ### BEGIN LIBTOOL TAG CONFIG: $tagname])
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# A language-specific compiler.
+CC=$lt_[]_LT_AC_TAGVAR(compiler, $1)
+
+# Is the compiler the GNU C compiler?
+with_gcc=$_LT_AC_TAGVAR(GCC, $1)
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_[]_LT_AC_TAGVAR(LD, $1)
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)
+
+# Must we lock files when doing compilation ?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1)
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1)
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1)
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1)
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1)
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1)
+archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1)
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1)
+module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1)
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1)
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1)
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1)
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1)
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1)
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1)
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1)
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1)
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1)
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1)
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1)
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1)
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1)
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1)
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1)
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1)
+
+# Symbols that must always be exported.
+include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1)
+
+ifelse([$1],[],
+[# ### END LIBTOOL CONFIG],
+[# ### END LIBTOOL TAG CONFIG: $tagname])
+
+__EOF__
+
+ifelse([$1],[], [
+ case $host_os in
+ aix3*)
+ cat <<\EOF >> "$cfgfile"
+
+# AIX sometimes has problems with the GCC collect2 program. For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+fi
+EOF
+ ;;
+ esac
+
+ # We use sed instead of cat because bash on DJGPP gets confused if
+ # if finds mixed CR/LF and LF-only lines. Since sed operates in
+ # text mode, it properly converts lines to CR/LF. This bash problem
+ # is reportedly fixed, but why not run on old versions too?
+ sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1)
+
+ mv -f "$cfgfile" "$ofile" || \
+ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+ chmod +x "$ofile"
+])
+else
+ # If there is no Makefile yet, we rely on a make rule to execute
+ # `config.status --recheck' to rerun these tests and create the
+ # libtool script then.
+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+ if test -f "$ltmain_in"; then
+ test -f Makefile && make "$ltmain"
+ fi
+fi
+])# AC_LIBTOOL_CONFIG
+
+
+# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME])
+# -------------------------------------------
+AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI],
+[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
+
+_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+
+if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+
+ AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
+ lt_cv_prog_compiler_rtti_exceptions,
+ [-fno-rtti -fno-exceptions], [],
+ [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
+fi
+])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI
+
+
+# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
+# ---------------------------------
+AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE],
+[AC_REQUIRE([AC_CANONICAL_HOST])
+AC_REQUIRE([AC_PROG_NM])
+AC_REQUIRE([AC_OBJEXT])
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output from $compiler object])
+AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
+[
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix. What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[[BCDEGRST]]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
+
+# Transform the above into a raw symbol and a C symbol.
+symxfrm='\1 \2\3 \3'
+
+# Transform an extracted symbol line into a proper C declaration
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+ symcode='[[BCDT]]'
+ ;;
+cygwin* | mingw* | pw32*)
+ symcode='[[ABCDGISTW]]'
+ ;;
+hpux*) # Its linker distinguishes data from code symbols
+ if test "$host_cpu" = ia64; then
+ symcode='[[ABCDEGRST]]'
+ fi
+ lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+ lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+ ;;
+irix* | nonstopux*)
+ symcode='[[BCDEGRST]]'
+ ;;
+osf*)
+ symcode='[[BCDEGQRST]]'
+ ;;
+solaris* | sysv5*)
+ symcode='[[BDRT]]'
+ ;;
+sysv4)
+ symcode='[[DFNSTU]]'
+ ;;
+esac
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+ opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+ ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+ symcode='[[ABCDGIRSTW]]' ;;
+esac
+
+# Try without a prefix undercore, then with it.
+for ac_symprfx in "" "_"; do
+
+ # Write the raw and C identifiers.
+ lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'"
+
+ # Check to see that the pipe works correctly.
+ pipe_works=no
+
+ rm -f conftest*
+ cat > conftest.$ac_ext <<EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+EOF
+
+ if AC_TRY_EVAL(ac_compile); then
+ # Now try to grab the symbols.
+ nlist=conftest.nm
+ if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then
+ # Try sorting and uniquifying the output.
+ if sort "$nlist" | uniq > "$nlist"T; then
+ mv -f "$nlist"T "$nlist"
+ else
+ rm -f "$nlist"T
+ fi
+
+ # Make sure that we snagged all the symbols we need.
+ if grep ' nm_test_var$' "$nlist" >/dev/null; then
+ if grep ' nm_test_func$' "$nlist" >/dev/null; then
+ cat <<EOF > conftest.$ac_ext
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EOF
+ # Now generate the symbol file.
+ eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext'
+
+ cat <<EOF >> conftest.$ac_ext
+#if defined (__STDC__) && __STDC__
+# define lt_ptr_t void *
+#else
+# define lt_ptr_t char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+ const char *name;
+ lt_ptr_t address;
+}
+lt_preloaded_symbols[[]] =
+{
+EOF
+ $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext
+ cat <<\EOF >> conftest.$ac_ext
+ {0, (lt_ptr_t) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif
+EOF
+ # Now try linking the two files.
+ mv conftest.$ac_objext conftstm.$ac_objext
+ lt_save_LIBS="$LIBS"
+ lt_save_CFLAGS="$CFLAGS"
+ LIBS="conftstm.$ac_objext"
+ CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
+ if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
+ pipe_works=yes
+ fi
+ LIBS="$lt_save_LIBS"
+ CFLAGS="$lt_save_CFLAGS"
+ else
+ echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
+ fi
+ else
+ echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
+ fi
+ else
+ echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
+ fi
+ else
+ echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
+ cat conftest.$ac_ext >&5
+ fi
+ rm -f conftest* conftst*
+
+ # Do not use the global_symbol_pipe unless it works.
+ if test "$pipe_works" = yes; then
+ break
+ else
+ lt_cv_sys_global_symbol_pipe=
+ fi
+done
+])
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+ lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+ AC_MSG_RESULT(failed)
+else
+ AC_MSG_RESULT(ok)
+fi
+]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
+
+
+# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME])
+# ---------------------------------------
+AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC],
+[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)=
+_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=
+
+AC_MSG_CHECKING([for $compiler option to produce PIC])
+ ifelse([$1],[CXX],[
+ # C++ specific cases for pic, static, wl, etc.
+ if test "$GXX" = yes; then
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ fi
+ ;;
+ amigaos*)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the `-m68020' flag to GCC prevents building anything better,
+ # like `-m68040'.
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+ ;;
+ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+ mingw* | os2* | pw32*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'
+ ;;
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+ ;;
+ *djgpp*)
+ # DJGPP does not support shared libraries at all
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+ ;;
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+ fi
+ ;;
+ hpux*)
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case "$host_cpu" in
+ hppa*64*|ia64*)
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ esac
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ esac
+ else
+ case $host_os in
+ aix4* | aix5*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ else
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+ chorus*)
+ case $cc_basename in
+ cxch68)
+ # Green Hills C++ Compiler
+ # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+ ;;
+ esac
+ ;;
+ dgux*)
+ case $cc_basename in
+ ec++)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ ;;
+ ghcx)
+ # Green Hills C++ Compiler
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ freebsd* | kfreebsd*-gnu)
+ # FreeBSD uses GNU C++
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ case $cc_basename in
+ CC)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive"
+ if test "$host_cpu" != ia64; then
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+ fi
+ ;;
+ aCC)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive"
+ case "$host_cpu" in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+ ;;
+ esac
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ irix5* | irix6* | nonstopux*)
+ case $cc_basename in
+ CC)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ # CC pic flag -KPIC is the default.
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ linux*)
+ case $cc_basename in
+ KCC)
+ # KAI C++ Compiler
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ icpc)
+ # Intel C++
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ ;;
+ cxx)
+ # Compaq C++
+ # Make sure the PIC flag is empty. It appears that all Alpha
+ # Linux and Compaq Tru64 Unix objects are PIC.
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ lynxos*)
+ ;;
+ m88k*)
+ ;;
+ mvs*)
+ case $cc_basename in
+ cxx)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ netbsd*)
+ ;;
+ osf3* | osf4* | osf5*)
+ case $cc_basename in
+ KCC)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+ ;;
+ RCC)
+ # Rational C++ 2.4.1
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ ;;
+ cxx)
+ # Digital/Compaq C++
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # Make sure the PIC flag is empty. It appears that all Alpha
+ # Linux and Compaq Tru64 Unix objects are PIC.
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ psos*)
+ ;;
+ sco*)
+ case $cc_basename in
+ CC)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ solaris*)
+ case $cc_basename in
+ CC)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+ ;;
+ gcx)
+ # Green Hills C++ Compiler
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ sunos4*)
+ case $cc_basename in
+ CC)
+ # Sun C++ 4.x
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+ lcc)
+ # Lucid
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ tandem*)
+ case $cc_basename in
+ NCC)
+ # NonStop-UX NCC 3.20
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ unixware*)
+ ;;
+ vxworks*)
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+ ;;
+ esac
+ fi
+],
+[
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ fi
+ ;;
+
+ amigaos*)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the `-m68020' flag to GCC prevents building anything better,
+ # like `-m68040'.
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+ ;;
+
+ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+
+ mingw* | pw32* | os2*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+ ;;
+
+ msdosdjgpp*)
+ # Just because we use GCC doesn't mean we suddenly get shared libraries
+ # on systems that don't support them.
+ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+ enable_shared=no
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+ fi
+ ;;
+
+ hpux*)
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case "$host_cpu" in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ esac
+ ;;
+
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ esac
+ else
+ # PORTME Check for flag to pass linker flags through the system compiler.
+ case $host_os in
+ aix*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ else
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+
+ mingw* | pw32* | os2*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case "$host_cpu" in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+ ;;
+ esac
+ # Is there a better lt_prog_compiler_static that works with the bundled CC?
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # PIC (with -KPIC) is the default.
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+
+ newsos6)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ linux*)
+ case $CC in
+ icc* | ecc*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ ;;
+ ccc*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # All Alpha code is PIC.
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+ esac
+ ;;
+
+ osf3* | osf4* | osf5*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # All OSF/1 code is PIC.
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+
+ sco3.2v5*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kpic'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-dn'
+ ;;
+
+ solaris*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ sunos4*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec ;then
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ fi
+ ;;
+
+ uts4*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+ ;;
+ esac
+ fi
+])
+AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)])
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then
+ AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works],
+ _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1),
+ [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [],
+ [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in
+ "" | " "*) ;;
+ *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;;
+ esac],
+ [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
+fi
+case "$host_os" in
+ # For platforms which do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])"
+ ;;
+esac
+])
+
+
+# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME])
+# ------------------------------------
+# See if the linker supports building shared libraries.
+AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS],
+[AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+ifelse([$1],[CXX],[
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ case $host_os in
+ aix4* | aix5*)
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to AIX nm, but means don't demangle with GNU nm
+ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+ else
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+ fi
+ ;;
+ pw32*)
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
+ ;;
+ cygwin* | mingw*)
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols'
+ ;;
+ *)
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ ;;
+ esac
+],[
+ runpath_var=
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=
+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+ _LT_AC_TAGVAR(archive_cmds, $1)=
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)=
+ _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)=
+ _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)=
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+ _LT_AC_TAGVAR(thread_safe_flag_spec, $1)=
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
+ _LT_AC_TAGVAR(hardcode_automatic, $1)=no
+ _LT_AC_TAGVAR(module_cmds, $1)=
+ _LT_AC_TAGVAR(module_expsym_cmds, $1)=
+ _LT_AC_TAGVAR(always_export_symbols, $1)=no
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ # include_expsyms should be a list of space-separated symbols to be *always*
+ # included in the symbol list
+ _LT_AC_TAGVAR(include_expsyms, $1)=
+ # exclude_expsyms can be an extended regexp of symbols to exclude
+ # it will be wrapped by ` (' and `)$', so one must not match beginning or
+ # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+ # as well as any symbol that contains `d'.
+ _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_"
+ # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+ # platforms (ab)use it in PIC code, but their linkers get confused if
+ # the symbol is explicitly referenced. Since portable code cannot
+ # rely on this symbol name, it's probably fine to never include it in
+ # preloaded symbol tables.
+ extract_expsyms_cmds=
+
+ case $host_os in
+ cygwin* | mingw* | pw32*)
+ # FIXME: the MSVC++ port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ if test "$GCC" != yes; then
+ with_gnu_ld=no
+ fi
+ ;;
+ openbsd*)
+ with_gnu_ld=no
+ ;;
+ esac
+
+ _LT_AC_TAGVAR(ld_shlibs, $1)=yes
+ if test "$with_gnu_ld" = yes; then
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ wlarc='${wl}'
+
+ # See if GNU ld supports shared libraries.
+ case $host_os in
+ aix3* | aix4* | aix5*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test "$host_cpu" != ia64; then
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support. If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+ fi
+ ;;
+
+ amigaos*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+
+ # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
+ # that the semantics of dynamic libraries on AmigaOS, at least up
+ # to version 4, is to share data among multiple programs linked
+ # with the same dynamic library. Since this doesn't match the
+ # behavior of shared libraries on other platforms, we can't use
+ # them.
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+ # as there is no search path for DLLs.
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_AC_TAGVAR(always_export_symbols, $1)=no
+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols'
+
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib'
+ # If the export-symbols file already is a .def file (1st line
+ # is EXPORTS), use it as is; otherwise, prepend...
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+ wlarc=
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ fi
+ ;;
+
+ solaris* | sysv5*)
+ if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ cat <<EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+EOF
+ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ sunos4*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ wlarc=
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ linux*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_cmds, $1)="$tmp_archive_cmds"
+ supports_anon_versioning=no
+ case `$LD -v 2>/dev/null` in
+ *\ [01].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
+ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+ *\ 2.11.*) ;; # other 2.11 versions
+ *) supports_anon_versioning=yes ;;
+ esac
+ if test $supports_anon_versioning = yes; then
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~
+cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+$echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+ else
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="$tmp_archive_cmds"
+ fi
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+
+ if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = yes; then
+ runpath_var=LD_RUN_PATH
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+ fi
+ fi
+ else
+ # PORTME fill in a description of your system's linker (not GNU ld)
+ case $host_os in
+ aix3*)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_AC_TAGVAR(always_export_symbols, $1)=yes
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ if test "$GCC" = yes && test -z "$link_static_flag"; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
+ fi
+ ;;
+
+ aix4* | aix5*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=""
+ else
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to AIX nm, but means don't demangle with GNU nm
+ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+ else
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+ fi
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # need to do runtime linking.
+ case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*)
+ for ld_flag in $LDFLAGS; do
+ if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ _LT_AC_TAGVAR(archive_cmds, $1)=''
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+
+ if test "$GCC" = yes; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" && \
+ strings "$collect2name" | grep resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ else
+ # We have old collect2
+ _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+ fi
+ esac
+ shared_flag='-shared'
+ else
+ # not using gcc
+ if test "$host_cpu" = ia64; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag='${wl}-G'
+ else
+ shared_flag='${wl}-bM:SRE'
+ fi
+ fi
+ fi
+
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to export.
+ _LT_AC_TAGVAR(always_export_symbols, $1)=yes
+ if test "$aix_use_runtimelinking" = yes; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok'
+ # Determine the default libpath from the value encoded in an empty executable.
+ _LT_AC_SYS_LIBPATH_AIX
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ else
+ if test "$host_cpu" = ia64; then
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an empty executable.
+ _LT_AC_SYS_LIBPATH_AIX
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+ # -bexpall does not export symbols beginning with underscore (_)
+ _LT_AC_TAGVAR(always_export_symbols, $1)=yes
+ # Exported symbols can be pulled into shared objects from archives
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' '
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+ # This is similar to how AIX traditionally builds it's shared libraries.
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+ fi
+ fi
+ ;;
+
+ amigaos*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ # see comment about different semantics on the GNU ld section
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+
+ bsdi4*)
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=".dll"
+ # FIXME: Setting linknames here is a bad hack.
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true'
+ # FIXME: Should let the user specify the lib program.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs'
+ fix_srcfile_path='`cygpath -w "$srcfile"`'
+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ ;;
+
+ darwin* | rhapsody*)
+ if test "$GXX" = yes ; then
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ case "$host_os" in
+ rhapsody* | darwin1.[[012]])
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress'
+ ;;
+ *) # Darwin 1.3 on
+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress'
+ else
+ case ${MACOSX_DEPLOYMENT_TARGET} in
+ 10.[[012]])
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress'
+ ;;
+ 10.*)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined dynamic_lookup'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ lt_int_apple_cc_single_mod=no
+ output_verbose_link_cmd='echo'
+ if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then
+ lt_int_apple_cc_single_mod=yes
+ fi
+ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+ fi
+ _LT_AC_TAGVAR(module_cmds, $1)='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's
+ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ else
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ fi
+ _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_automatic, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience'
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ dgux*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ freebsd1*)
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+
+ # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+ # support. Future versions do this automatically, but an explicit c++rt0.o
+ # does not break anything, and helps significantly (at the cost of a little
+ # extra space).
+ freebsd2.2*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+ freebsd2*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+ freebsd* | kfreebsd*-gnu)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ hpux9*)
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ ;;
+
+ hpux10* | hpux11*)
+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ case "$host_cpu" in
+ hppa*64*|ia64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ else
+ case "$host_cpu" in
+ hppa*64*|ia64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+ ;;
+ esac
+ fi
+ if test "$with_gnu_ld" = no; then
+ case "$host_cpu" in
+ hppa*64*)
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+ ia64*)
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ ;;
+ *)
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ ;;
+ esac
+ fi
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ newsos6)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ openbsd*)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ else
+ case $host_os in
+ openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ ;;
+ esac
+ fi
+ ;;
+
+ os2*)
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+ _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+ ;;
+
+ osf3*)
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ ;;
+
+ osf4* | osf5*) # as osf3* with the addition of -msym flag
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ else
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
+ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp'
+
+ # Both c and cxx compiler support -rpath directly
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ ;;
+
+ sco3.2v5*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ ;;
+
+ solaris*)
+ _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text'
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ case $host_os in
+ solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+ *) # Supported since Solaris 2.6 (maybe 2.5.1?)
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;;
+ esac
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ ;;
+
+ sunos4*)
+ if test "x$host_vendor" = xsequent; then
+ # Use $CC to link under sequent, because it throws in some extra .o
+ # files that make .init and .fini sections work.
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ sysv4)
+ case $host_vendor in
+ sni)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true???
+ ;;
+ siemens)
+ ## LD is ld it makes a PLAMLIB
+ ## CC just makes a GrossModule.
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ ;;
+ motorola)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ runpath_var='LD_RUN_PATH'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ sysv4.3*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ _LT_AC_TAGVAR(ld_shlibs, $1)=yes
+ fi
+ ;;
+
+ sysv4.2uw2*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ hardcode_runpath_var=yes
+ runpath_var=LD_RUN_PATH
+ ;;
+
+ sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*)
+ _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z ${wl}text'
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ runpath_var='LD_RUN_PATH'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ sysv5*)
+ _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text'
+ # $CC -shared without GNU ld will not create a library from C++
+ # object files and a static libstdc++, better avoid it by now
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ runpath_var='LD_RUN_PATH'
+ ;;
+
+ uts4*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ *)
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ fi
+])
+AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)])
+test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in
+x|xyes)
+ # Assume -lc should be added
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+
+ if test "$enable_shared" = yes && test "$GCC" = yes; then
+ case $_LT_AC_TAGVAR(archive_cmds, $1) in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ AC_MSG_CHECKING([whether -lc should be explicitly linked in])
+ $rm conftest*
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=
+ if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1)
+ then
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ else
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+ fi
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $rm conftest*
+ AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)])
+ ;;
+ esac
+ fi
+ ;;
+esac
+])# AC_LIBTOOL_PROG_LD_SHLIBS
+
+
+# _LT_AC_FILE_LTDLL_C
+# -------------------
+# Be careful that the start marker always follows a newline.
+AC_DEFUN([_LT_AC_FILE_LTDLL_C], [
+# /* ltdll.c starts here */
+# #define WIN32_LEAN_AND_MEAN
+# #include <windows.h>
+# #undef WIN32_LEAN_AND_MEAN
+# #include <stdio.h>
+#
+# #ifndef __CYGWIN__
+# # ifdef __CYGWIN32__
+# # define __CYGWIN__ __CYGWIN32__
+# # endif
+# #endif
+#
+# #ifdef __cplusplus
+# extern "C" {
+# #endif
+# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved);
+# #ifdef __cplusplus
+# }
+# #endif
+#
+# #ifdef __CYGWIN__
+# #include <cygwin/cygwin_dll.h>
+# DECLARE_CYGWIN_DLL( DllMain );
+# #endif
+# HINSTANCE __hDllInstance_base;
+#
+# BOOL APIENTRY
+# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
+# {
+# __hDllInstance_base = hInst;
+# return TRUE;
+# }
+# /* ltdll.c ends here */
+])# _LT_AC_FILE_LTDLL_C
+
+
+# _LT_AC_TAGVAR(VARNAME, [TAGNAME])
+# ---------------------------------
+AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])])
+
+
+# old names
+AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL])
+AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
+AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
+AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+AC_DEFUN([AM_PROG_LD], [AC_PROG_LD])
+AC_DEFUN([AM_PROG_NM], [AC_PROG_NM])
+
+# This is just to silence aclocal about the macro not being used
+ifelse([AC_DISABLE_FAST_INSTALL])
+
+AC_DEFUN([LT_AC_PROG_GCJ],
+[AC_CHECK_TOOL(GCJ, gcj, no)
+ test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
+ AC_SUBST(GCJFLAGS)
+])
+
+AC_DEFUN([LT_AC_PROG_RC],
+[AC_CHECK_TOOL(RC, windres, no)
+])
+
+# NOTE: This macro has been submitted for inclusion into #
+# GNU Autoconf as AC_PROG_SED. When it is available in #
+# a released version of Autoconf we should remove this #
+# macro and use it instead. #
+# LT_AC_PROG_SED
+# --------------
+# Check for a fully-functional sed program, that truncates
+# as few characters as possible. Prefer GNU sed if found.
+AC_DEFUN([LT_AC_PROG_SED],
+[AC_MSG_CHECKING([for a sed that does not truncate output])
+AC_CACHE_VAL(lt_cv_path_SED,
+[# Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for lt_ac_prog in sed gsed; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
+ lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+ fi
+ done
+ done
+done
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+ test ! -f $lt_ac_sed && break
+ cat /dev/null > conftest.in
+ lt_ac_count=0
+ echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+ # Check for GNU sed and select it if it is found.
+ if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+ lt_cv_path_SED=$lt_ac_sed
+ break
+ fi
+ while true; do
+ cat conftest.in conftest.in >conftest.tmp
+ mv conftest.tmp conftest.in
+ cp conftest.in conftest.nl
+ echo >>conftest.nl
+ $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+ cmp -s conftest.out conftest.nl || break
+ # 10000 chars as input seems more than enough
+ test $lt_ac_count -gt 10 && break
+ lt_ac_count=`expr $lt_ac_count + 1`
+ if test $lt_ac_count -gt $lt_ac_max; then
+ lt_ac_max=$lt_ac_count
+ lt_cv_path_SED=$lt_ac_sed
+ fi
+ done
+done
+SED=$lt_cv_path_SED
+])
+AC_MSG_RESULT([$SED])
+])
+
+# -*- Autoconf -*-
+# Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+# Generated from amversion.in; do not edit by hand.
+
+# This program 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, or (at your option)
+# any later version.
+
+# 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., 59 Temple Place - Suite 330, Boston, MA
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION so it can be traced.
+# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+ [AM_AUTOMAKE_VERSION([1.9.2])])
+
+# AM_AUX_DIR_EXPAND
+
+# Copyright (C) 2001, 2003 Free Software Foundation, Inc.
+
+# This program 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, or (at your option)
+# any later version.
+
+# 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., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory. The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run. This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+# fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+# fails if $ac_aux_dir is absolute,
+# fails when called from a subdirectory in a VPATH build with
+# a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir. In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir. That would be:
+# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+# MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH. The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004 Free Software Foundation, Inc.
+
+# This program 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, or (at your option)
+# any later version.
+
+# 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., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 6
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
+ [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])
+AC_SUBST([$1_FALSE])
+if $2; then
+ $1_TRUE=
+ $1_FALSE='#'
+else
+ $1_TRUE='#'
+ $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+ AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# serial 7 -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004
+# Free Software Foundation, Inc.
+
+# This program 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, or (at your option)
+# any later version.
+
+# 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., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery. Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC, [depcc="$CC" am_compiler_list=],
+ [$1], CXX, [depcc="$CXX" am_compiler_list=],
+ [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+ [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
+ [depcc="$$1" am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+ [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named `D' -- because `-MD' means `put the output
+ # in D'.
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_$1_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+ fi
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+ # Solaris 8's {/usr,}/bin/sh.
+ touch sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ case $depmode in
+ nosideeffect)
+ # after this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ none) break ;;
+ esac
+ # We check with `-c' and `-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle `-M -o', and we need to detect this.
+ if depmode=$depmode \
+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_$1_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[ --disable-dependency-tracking speeds up one-time build
+ --enable-dependency-tracking do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])
+])
+
+# Generate code to set up dependency tracking. -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004
+# Free Software Foundation, Inc.
+
+# This program 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, or (at your option)
+# any later version.
+
+# 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., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+#serial 2
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[for mf in $CONFIG_FILES; do
+ # Strip MF so we end up with the name of the file.
+ mf=`echo "$mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile or not.
+ # We used to match only the files named `Makefile.in', but
+ # some people rename them; so instead we look at the file content.
+ # Grep'ing the first line is not enough: some people post-process
+ # each Makefile.in and add a new line on top of each file to say so.
+ # So let's grep whole file.
+ if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+ dirpart=`AS_DIRNAME("$mf")`
+ else
+ continue
+ fi
+ # Extract the definition of DEPDIR, am__include, and am__quote
+ # from the Makefile without running `make'.
+ DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+ test -z "$DEPDIR" && continue
+ am__include=`sed -n 's/^am__include = //p' < "$mf"`
+ test -z "am__include" && continue
+ am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+ # When using ansi2knr, U may be empty or an underscore; expand it
+ U=`sed -n 's/^U = //p' < "$mf"`
+ # Find all dependency output files, they are included files with
+ # $(DEPDIR) in their names. We invoke sed twice because it is the
+ # simplest approach to changing $(DEPDIR) to its actual value in the
+ # expansion.
+ for file in `sed -n "
+ s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+ # Make sure the directory exists.
+ test -f "$dirpart/$file" && continue
+ fdir=`AS_DIRNAME(["$file"])`
+ AS_MKDIR_P([$dirpart/$fdir])
+ # echo "creating $dirpart/$file"
+ echo '# dummy' > "$dirpart/$file"
+ done
+done
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled. FIXME. This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+ [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+ [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Do all the work for Automake. -*- Autoconf -*-
+
+# This macro actually does too much some checks are only needed if
+# your package does certain things. But this isn't really a big deal.
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+# Free Software Foundation, Inc.
+
+# This program 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, or (at your option)
+# any later version.
+
+# 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., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 11
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out. PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition. After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.58])dnl
+dnl Autoconf wants to disallow AM_ names. We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+ test -f $srcdir/config.status; then
+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AM_PROG_INSTALL_SH
+AM_PROG_INSTALL_STRIP
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target. The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+ [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+ [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+ [_AM_DEPENDENCIES(CC)],
+ [define([AC_PROG_CC],
+ defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [_AM_DEPENDENCIES(CXX)],
+ [define([AC_PROG_CXX],
+ defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+])
+])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated. The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $1 | $1:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+
+# Copyright (C) 2001, 2003 Free Software Foundation, Inc.
+
+# This program 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, or (at your option)
+# any later version.
+
+# 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., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+AC_SUBST(install_sh)])
+
+# -*- Autoconf -*-
+# Copyright (C) 2003 Free Software Foundation, Inc.
+
+# This program 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, or (at your option)
+# any later version.
+
+# 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., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 1
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot. For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Check to see how 'make' treats includes. -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
+
+# This program 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, or (at your option)
+# any later version.
+
+# 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., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 2
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+ @echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+ am__include=include
+ am__quote=
+ _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ fi
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# -*- Autoconf -*-
+
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003 Free Software Foundation, Inc.
+
+# This program 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, or (at your option)
+# any later version.
+
+# 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., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 3
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+ am_missing_run="$MISSING --run "
+else
+ am_missing_run=
+ AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise.
+
+# Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+
+# This program 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, or (at your option)
+# any later version.
+
+# 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., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories
+# created by `make install' are always world readable, even if the
+# installer happens to have an overly restrictive umask (e.g. 077).
+# This was a mistake. There are at least two reasons why we must not
+# use `-m 0755':
+# - it causes special bits like SGID to be ignored,
+# - it may be too restrictive (some setups expect 775 directories).
+#
+# Do not use -m 0755 and let people choose whatever they expect by
+# setting umask.
+#
+# We cannot accept any implementation of `mkdir' that recognizes `-p'.
+# Some implementations (such as Solaris 8's) are not thread-safe: if a
+# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c'
+# concurrently, both version can detect that a/ is missing, but only
+# one can create it and the other will error out. Consequently we
+# restrict ourselves to GNU make (using the --version option ensures
+# this.)
+AC_DEFUN([AM_PROG_MKDIR_P],
+[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+ # We used to keeping the `.' as first argument, in order to
+ # allow $(mkdir_p) to be used without argument. As in
+ # $(mkdir_p) $(somedir)
+ # where $(somedir) is conditionally defined. However this is wrong
+ # for two reasons:
+ # 1. if the package is installed by a user who cannot write `.'
+ # make install will fail,
+ # 2. the above comment should most certainly read
+ # $(mkdir_p) $(DESTDIR)$(somedir)
+ # so it does not work when $(somedir) is undefined and
+ # $(DESTDIR) is not.
+ # To support the latter case, we have to write
+ # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+ # so the `.' trick is pointless.
+ mkdir_p='mkdir -p --'
+else
+ # On NextStep and OpenStep, the `mkdir' command does not
+ # recognize any option. It will interpret all options as
+ # directories to create, and then abort because `.' already
+ # exists.
+ for d in ./-p ./--version;
+ do
+ test -d $d && rmdir $d
+ done
+ # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+ if test -f "$ac_aux_dir/mkinstalldirs"; then
+ mkdir_p='$(mkinstalldirs)'
+ else
+ mkdir_p='$(install_sh) -d'
+ fi
+fi
+AC_SUBST([mkdir_p])])
+
+# Helper functions for option handling. -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
+
+# This program 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, or (at your option)
+# any later version.
+
+# 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., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 2
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME. Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+#
+# Check to make sure that the build environment is sane.
+#
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003 Free Software Foundation, Inc.
+
+# This program 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, or (at your option)
+# any later version.
+
+# 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., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 3
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+ if test "$[*]" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftest.file`
+ fi
+ rm -f conftest.file
+ if test "$[*]" != "X $srcdir/configure conftest.file" \
+ && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
+alias in your environment])
+ fi
+
+ test "$[2]" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# AM_PROG_INSTALL_STRIP
+
+# Copyright (C) 2001, 2003 Free Software Foundation, Inc.
+
+# This program 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, or (at your option)
+# any later version.
+
+# 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., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries. This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'. However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+ AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Check how to create a tarball. -*- Autoconf -*-
+
+# Copyright (C) 2004 Free Software Foundation, Inc.
+
+# This program 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, or (at your option)
+# any later version.
+
+# 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., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 1
+
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+# tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+# $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+ [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+ [m4_case([$1], [ustar],, [pax],,
+ [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+ case $_am_tool in
+ gnutar)
+ for _am_tar in tar gnutar gtar;
+ do
+ AM_RUN_LOG([$_am_tar --version]) && break
+ done
+ am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+ am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+ am__untar="$_am_tar -xf -"
+ ;;
+ plaintar)
+ # Must skip GNU tar: if it does not support --format= it doesn't create
+ # ustar tarball either.
+ (tar --version) >/dev/null 2>&1 && continue
+ am__tar='tar chf - "$$tardir"'
+ am__tar_='tar chf - "$tardir"'
+ am__untar='tar xf -'
+ ;;
+ pax)
+ am__tar='pax -L -x $1 -w "$$tardir"'
+ am__tar_='pax -L -x $1 -w "$tardir"'
+ am__untar='pax -r'
+ ;;
+ cpio)
+ am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+ am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+ am__untar='cpio -i -H $1 -d'
+ ;;
+ none)
+ am__tar=false
+ am__tar_=false
+ am__untar=false
+ ;;
+ esac
+
+ # If the value was cached, stop now. We just wanted to have am__tar
+ # and am__untar set.
+ test -n "${am_cv_prog_tar_$1}" && break
+
+ # tar/untar a dummy directory, and stop if the command works
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ echo GrepMe > conftest.dir/file
+ AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+ rm -rf conftest.dir
+ if test -s conftest.tar; then
+ AM_RUN_LOG([$am__untar <conftest.tar])
+ grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+ fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/Makefile b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/Makefile
new file mode 100644
index 00000000..5847e639
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/Makefile
@@ -0,0 +1,114 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+## configure should make the Makefile out of this file.
+
+srcdir=.
+top_srcdir=..
+
+APXS=/bottlenecks/rubbos/app/apache2/bin/apxs
+OS=linux
+JAVA_HOME=/bottlenecks/rubbos/app/jdk1.6.0_27
+CP=/bin/cp
+APACHE_DIR=/bottlenecks/rubbos/app/apache2
+MKDIR=/bin/mkdir
+DESTDIR=/bottlenecks/rubbos/app/apache2
+LIBTOOL=/bin/bash /bottlenecks/rubbos/app/apache2/build/libtool --silent
+CP=/bin/cp
+CC=gcc
+
+top_builddir=..
+
+OEXT=.lo
+libexecdir=${APACHE_DIR}/libexec
+JK_DIR := ..
+BUILD_DIR = ${JK_DIR}/../build/jk/apache13
+
+APACHE_FILES = Makefile.tmpl Makefile.libdir libjk.module
+
+JK=../common/
+JK_INCL=-DUSE_APACHE_MD5 -I ${top_srcdir}/common
+JAVA_INCL=-I ${JAVA_HOME}/include -I ${JAVA_HOME}/include/${OS}
+JAVA_LIB=-L ${JAVA_HOME}/jre/lib/${ARCH} -L ${JAVA_HOME}/lib/${ARCH}/native_threads
+APACHE_CFLAGS=-I/bottlenecks/rubbos/app/apache2/include -g -O2 -pthread -DHAVE_APR -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include -DHAVE_CONFIG_H -DHAVE_JNI -D_REENTRANT -D_GNU_SOURCE -I${top_srcdir}/common
+
+# Compile commands
+JK_CFLAGS = $(JK_INCL) $(JAVA_INCL) $(APACHE_CFLAGS)
+COMPILE = $(CC)
+SH_COMPILE = $(LIBTOOL) --mode=compile $(COMPILE) $(JK_CFLAGS)
+MOD_LINK = $(LIBTOOL) --mode=link $(CC)
+
+include ../common/list.mk
+
+all: mod_jk.so
+
+#
+# install part
+#
+install: install_dynamic
+
+install_static: mod_jk.a
+ @echo ""
+ @echo "Copying files to Apache Modules Directory..."
+ -${MKDIR} ${APACHE_DIR}/src/modules/jk
+ ${LIBTOOL} --mode=install ${CP} $< ${APACHE_DIR}/src/modules/jk/mod_jk.a
+ -${CP} Makefile.tmpl ${APACHE_DIR}/src/modules/jk
+ -${CP} Makefile.libdir ${APACHE_DIR}/src/modules/jk
+ -${CP} mod_jk.c ${APACHE_DIR}/src/modules/jk
+ -${MKDIR} ${APACHE_DIR}/src/modules/jk/include
+ -${CP} ../common/*.h ${APACHE_DIR}/src/modules/jk/include
+ @echo ""
+ @echo "Please be sure to re-compile Apache..."
+ @echo ""
+ @echo "cd ${APACHE_DIR}"
+ @echo "./config.status --activate-module=src/modules/jk/libjk.a \\"
+ @echo " --enable-module=dir \\"
+ @echo " --disable-shared=dir"
+ @echo "make"
+ @echo ""
+install_dynamic: mod_jk.la
+ @echo ""
+ @echo "Copying files to Apache libexec Directory..."
+ ${LIBTOOL} --mode=install ${CP} $< ${libexecdir}/mod_jk.so
+
+#
+# Clean part.
+#
+clean:
+ rm -f *.o *.lo *.a *.la *.so *.so.* *.slo
+ rm -rf .libs
+
+maintainer-clean: clean
+
+#
+# Compile part.
+#
+mod_jk.la: mod_jk.lo $(APACHE_OBJECTS)
+ ${MOD_LINK} -o $@ -module -rpath ${libexecdir} $^
+mod_jk.a: mod_jk.lo $(APACHE_OBJECTS)
+ ${MOD_LINK} -o $@ $^
+
+mod_jk.so: mod_jk.la
+ ../scripts/build/instdso.sh SH_LIBTOOL='$(LIBTOOL)' mod_jk.la `pwd`
+
+#
+# Common part.
+#
+mod_jk.lo: mod_jk.c
+ ${SH_COMPILE} -c mod_jk.c -o $@
+
+.c.lo:
+ ${SH_COMPILE} -c $< -o $@
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/Makefile.apxs b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/Makefile.apxs
new file mode 100644
index 00000000..0d8ab6e0
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/Makefile.apxs
@@ -0,0 +1,42 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+## configure should make the Makefile out of this file.
+
+APXS=/bottlenecks/rubbos/app/apache2/bin/apxs
+OS=linux
+JAVA_HOME=/bottlenecks/rubbos/app/jdk1.6.0_27
+APXSLDFLAGS=
+APXSCFLAGS= -g -O2 -pthread -DHAVE_APR -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include -DHAVE_CONFIG_H -DHAVE_JNI
+
+JK=../common/
+JK_INCL=-DUSE_APACHE_MD5 -I ${JK}
+JAVA_INCL=-I ${JAVA_HOME}/include -I ${JAVA_HOME}/include/${OS}
+JAVA_LIB=-L ${JAVA_HOME}/jre/lib/${ARCH} -L ${JAVA_HOME}/lib/${ARCH}/native_threads
+
+## read the object (.c) from the list file.
+OEXT=.c
+include ../common/list.mk
+
+all: mod_jk.so
+
+mod_jk.so:
+ $(APXS) -c -o $@ -Wc,"${APXSCFLAGS} ${JK_INCL}" ${JAVA_INCL} ${APXSLDFLAGS} mod_jk.c ${APACHE_OBJECTS}
+
+clean:
+ rm -f *.o *.lo *.a *.la *.so *.so.* *.slo
+ rm -rf .libs
+
+maintainer-clean: clean
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/Makefile.apxs.in b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/Makefile.apxs.in
new file mode 100644
index 00000000..3563088e
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/Makefile.apxs.in
@@ -0,0 +1,42 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+## configure should make the Makefile out of this file.
+
+APXS=@APXS@
+OS=@OS@
+JAVA_HOME=@JAVA_HOME@
+APXSLDFLAGS=@APXSLDFLAGS@
+APXSCFLAGS=@APXSCFLAGS@
+
+JK=../common/
+JK_INCL=-DUSE_APACHE_MD5 -I ${JK}
+JAVA_INCL=-I ${JAVA_HOME}/include -I ${JAVA_HOME}/include/${OS}
+JAVA_LIB=-L ${JAVA_HOME}/jre/lib/${ARCH} -L ${JAVA_HOME}/lib/${ARCH}/native_threads
+
+## read the object (.c) from the list file.
+OEXT=.c
+include ../common/list.mk
+
+all: mod_jk.so
+
+mod_jk.so:
+ $(APXS) -c -o $@ -Wc,"${APXSCFLAGS} ${JK_INCL}" ${JAVA_INCL} ${APXSLDFLAGS} mod_jk.c ${APACHE_OBJECTS}
+
+clean:
+ rm -f *.o *.lo *.a *.la *.so *.so.* *.slo
+ rm -rf .libs
+
+maintainer-clean: clean
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/Makefile.in b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/Makefile.in
new file mode 100644
index 00000000..af597e4b
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/Makefile.in
@@ -0,0 +1,114 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+## configure should make the Makefile out of this file.
+
+srcdir=@srcdir@
+top_srcdir=@top_srcdir@
+VPATH=@srcdir@
+APXS=@APXS@
+OS=@OS@
+JAVA_HOME=@JAVA_HOME@
+CP=@CP@
+APACHE_DIR=@APACHE_DIR@
+MKDIR=@MKDIR@
+DESTDIR=@APACHE_DIR@
+LIBTOOL=@LIBTOOL@
+CP=@CP@
+CC=@CC@
+
+top_builddir=..
+
+OEXT=.lo
+libexecdir=${APACHE_DIR}/libexec
+JK_DIR := ..
+BUILD_DIR = ${JK_DIR}/../build/jk/apache13
+
+APACHE_FILES = Makefile.tmpl Makefile.libdir libjk.module
+
+JK=../common/
+JK_INCL=-DUSE_APACHE_MD5 -I ${top_srcdir}/common
+JAVA_INCL=-I ${JAVA_HOME}/include -I ${JAVA_HOME}/include/${OS}
+JAVA_LIB=-L ${JAVA_HOME}/jre/lib/${ARCH} -L ${JAVA_HOME}/lib/${ARCH}/native_threads
+APACHE_CFLAGS=@apache_include@ @APXSCFLAGS@ @APXSCPPFLAGS@ -I${top_srcdir}/common
+
+# Compile commands
+JK_CFLAGS = $(JK_INCL) $(JAVA_INCL) $(APACHE_CFLAGS)
+COMPILE = $(CC)
+SH_COMPILE = $(LIBTOOL) --mode=compile $(COMPILE) $(JK_CFLAGS)
+MOD_LINK = $(LIBTOOL) --mode=link $(CC) @APXSLDFLAGS@
+
+include ../common/list.mk
+
+all: @LIB_JK_TYPE@
+
+#
+# install part
+#
+install: @INSTALL_TYPE@
+
+install_static: mod_jk.a
+ @echo ""
+ @echo "Copying files to Apache Modules Directory..."
+ -${MKDIR} ${APACHE_DIR}/src/modules/jk
+ ${LIBTOOL} --mode=install ${CP} $< ${APACHE_DIR}/src/modules/jk/mod_jk.a
+ -${CP} Makefile.tmpl ${APACHE_DIR}/src/modules/jk
+ -${CP} Makefile.libdir ${APACHE_DIR}/src/modules/jk
+ -${CP} mod_jk.c ${APACHE_DIR}/src/modules/jk
+ -${MKDIR} ${APACHE_DIR}/src/modules/jk/include
+ -${CP} ../common/*.h ${APACHE_DIR}/src/modules/jk/include
+ @echo ""
+ @echo "Please be sure to re-compile Apache..."
+ @echo ""
+ @echo "cd ${APACHE_DIR}"
+ @echo "./config.status --activate-module=src/modules/jk/libjk.a \\"
+ @echo " --enable-module=dir \\"
+ @echo " --disable-shared=dir"
+ @echo "make"
+ @echo ""
+install_dynamic: mod_jk.la
+ @echo ""
+ @echo "Copying files to Apache libexec Directory..."
+ ${LIBTOOL} --mode=install ${CP} $< ${libexecdir}/mod_jk.so
+
+#
+# Clean part.
+#
+clean:
+ rm -f *.o *.lo *.a *.la *.so *.so.* *.slo
+ rm -rf .libs
+
+maintainer-clean: clean
+
+#
+# Compile part.
+#
+mod_jk.la: mod_jk.lo $(APACHE_OBJECTS)
+ ${MOD_LINK} -o $@ -module -rpath ${libexecdir} $^
+mod_jk.a: mod_jk.lo $(APACHE_OBJECTS)
+ ${MOD_LINK} -o $@ $^
+
+mod_jk.so: mod_jk.la
+ ../scripts/build/instdso.sh SH_LIBTOOL='$(LIBTOOL)' mod_jk.la `pwd`
+
+#
+# Common part.
+#
+mod_jk.lo: mod_jk.c
+ ${SH_COMPILE} -c mod_jk.c -o $@
+
+.c.lo:
+ ${SH_COMPILE} -c $< -o $@
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/Makefile.libdir b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/Makefile.libdir
new file mode 100644
index 00000000..7b525401
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/Makefile.libdir
@@ -0,0 +1,4 @@
+This is a place-holder which indicates to Configure that it shouldn't
+provide the default targets when building the Makefile in this directory.
+Instead it'll just prepend all the important variable definitions, and
+copy the Makefile.tmpl onto the end.
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/Makefile.netware b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/Makefile.netware
new file mode 100644
index 00000000..790f5d19
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/Makefile.netware
@@ -0,0 +1,287 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+#
+# Makefile for mod_jk (NetWare version - gnu make)
+# created by Guenter Knauf <fuankg@apache.org>
+#
+
+# Edit the path below to point to the base of your Apache 1.3 includes.
+ifndef AP_HOME
+AP_HOME = c:/projects/cw/apache_1.3.37
+endif
+# Edit the path below to point to the base of your NetWare Java SDK.
+ifndef NW_JDK
+NW_JDK = c:/projects/sdks/java-nw
+endif
+# Edit the path below to point to the base of your Novell NDK.
+ifndef NDKBASE
+NDKBASE = c:/novell
+endif
+INSTDIR = s:/apache/modules
+
+# Edit the vars below to change NLM target settings.
+TARGET = mod_jk
+VERSION = $(JK_VERSION)
+COPYR = Licensed under the Apache License, Version 2.0
+DESCR = Apache $(AP_VERSION_STR) plugin for Tomcat $(JK_VERSION_STR)
+MTSAFE = NO
+STACK = 65536
+#SCREEN = NONE
+EXPORTS = jk_module
+#AP_PRE = YES
+#MODULES =
+
+# Edit the var below to point to your lib architecture.
+ifndef LIBARCH
+LIBARCH = CLIB
+# LIBARCH = LIBC
+endif
+
+# must be equal to DEBUG or NDEBUG
+DB = NDEBUG
+# DB = DEBUG
+# Optimization: -O<n> or debugging: -g
+ifeq ($(DB),NDEBUG)
+ OPT = -O2
+ OBJDIR = release
+else
+ OPT = -g
+ OBJDIR = debug
+endif
+
+# Include the version info retrieved from jk_version.h
+-include $(OBJDIR)/version.inc
+
+# The following line defines your compiler.
+ifdef METROWERKS
+ CC = mwccnlm
+else
+ CC = gcc
+ GCC_ROOT = $(MINGNLM)
+endif
+# RM = rm -f
+#CP = cp -fv
+AWK = awk
+
+# Global flags for all compilers
+CFLAGS = $(OPT) -D$(DB) -DNETWARE -nostdinc
+
+ifeq ($(CC),mwccnlm)
+LD = mwldnlm
+LDFLAGS = -nostdlib $(OBJS) $(PRELUDE) $(LDLIBS) -o $@ -commandfile
+CFLAGS += -gccinc -inline off -opt nointrinsics
+#CFLAGS += -w on
+ifeq ($(LIBARCH),LIBC)
+ PRELUDE = $(SDK_LIBC)/imports/libcpre.o
+ CFLAGS += -align 4 -inst mmx -proc 586
+# CFLAGS += -D__ANSIC__
+else
+# PRELUDE = $(SDK_CLIB)/imports/clibpre.obj
+ PRELUDE = "$(METROWERKS)/Novell Support/libraries/runtime/prelude.obj"
+ LDLIBS = "$(METROWERKS)/Novell Support/libraries/runtime/mwcrtl.lib"
+# CFLAGS += -include "$(METROWERKS)/Novell Support/headers/nlm_prefix.h"
+ CFLAGS += -align 1 -proc 586
+endif
+else
+LD = nlmconv
+LDFLAGS = -T
+CFLAGS += -fno-builtin -fpack-struct -fpcc-struct-return
+CFLAGS += -w
+#CFLAGS += -Wall -Wno-main # -pedantic
+ifeq ($(LIBARCH),LIBC)
+ PRELUDE = $(SDK_LIBC)/imports/libcpre.gcc.o
+# CFLAGS += -D__ANSIC__
+else
+# PRELUDE = $(SDK_CLIB)/imports/clibpre.gcc.o
+ PRELUDE = $(NDK_ROOT)/pre/prelude.o
+ LDLIBS = $(GCC_ROOT)/lib/gcc-lib/i586-netware/3.2.3/libgcc.a
+ CFLAGS += -include $(NDKBASE)/nlmconv/genlm.h
+endif
+endif
+CFLAGS += -include "precomp.h"
+
+ifeq ($(AP_PRE),YES)
+ PRELUDE = $(OBJDIR)/libpre.o
+endif
+
+
+NDK_ROOT = $(NDKBASE)/ndk
+SDK_CLIB = $(NDK_ROOT)/nwsdk
+SDK_LIBC = $(NDK_ROOT)/libc
+JKCOMMON = ../common
+
+INCLUDES = -I$(AP_HOME)/src/include -I$(AP_HOME)/src/os/netware
+INCLUDES += -I$(JKCOMMON) -I$(NW_JDK)/include -I$(NW_JDK)/include/netware
+
+ifeq ($(LIBARCH),LIBC)
+ INCLUDES += -I$(SDK_LIBC)/include
+ INCLUDES += -I$(SDK_LIBC)/include/winsock
+else
+ INCLUDES += -I$(SDK_CLIB)/include/nlm -I$(SDK_CLIB)/include
+ INCLUDES += -I$(NDKBASE)/ws295sdk/include
+ CFLAGS += -DNETDB_USE_INTERNET
+ CFLAGS += -DNO_GETTIMEOFDAY
+ CFLAGS += -DJK_PREFORK
+endif
+CFLAGS += $(INCLUDES)
+
+ifeq ($(MTSAFE),YES)
+ XDCDATA = $(AP_HOME)/src/os/netware/apache.xdc
+endif
+
+ifeq ($(findstring linux,$(OSTYPE)),linux)
+DL = '
+#-include $(NDKBASE)/nlmconv/ncpfs.inc
+endif
+
+OBJS = \
+ $(OBJDIR)/$(TARGET).o \
+ $(OBJDIR)/jk_nwmain.o \
+ $(OBJDIR)/jk_ajp12_worker.o \
+ $(OBJDIR)/jk_ajp13.o \
+ $(OBJDIR)/jk_ajp13_worker.o \
+ $(OBJDIR)/jk_ajp14.o \
+ $(OBJDIR)/jk_ajp14_worker.o \
+ $(OBJDIR)/jk_ajp_common.o \
+ $(OBJDIR)/jk_connect.o \
+ $(OBJDIR)/jk_context.o \
+ $(OBJDIR)/jk_jni_worker.o \
+ $(OBJDIR)/jk_lb_worker.o \
+ $(OBJDIR)/jk_map.o \
+ $(OBJDIR)/jk_md5.o \
+ $(OBJDIR)/jk_msg_buff.o \
+ $(OBJDIR)/jk_pool.o \
+ $(OBJDIR)/jk_shm.o \
+ $(OBJDIR)/jk_sockbuf.o \
+ $(OBJDIR)/jk_status.o \
+ $(OBJDIR)/jk_uri_worker_map.o \
+ $(OBJDIR)/jk_url.o \
+ $(OBJDIR)/jk_util.o \
+ $(OBJDIR)/jk_worker.o
+
+#OBJS += $(OBJDIR)/ap_snprintf.o
+
+vpath %.c . $(JKCOMMON) $(AP_HOME)/src/os/netware
+
+
+all: $(OBJDIR) $(OBJDIR)/version.inc $(OBJDIR)/$(TARGET).nlm
+
+$(OBJDIR)/%.o: %.c
+ @echo Compiling $<
+ @$(CC) $(CFLAGS) -c $< -o $@
+
+$(OBJDIR)/version.inc: $(JKCOMMON)/jk_version.h $(AP_HOME)/src/include/httpd.h $(OBJDIR)
+ @echo Creating $@
+ @$(AWK) -f ../../support/get_ver.awk $< $(AP_HOME)/src/include/httpd.h > $@
+
+dist: all
+ -$(RM) $(OBJDIR)/*.o $(OBJDIR)/$(TARGET).map $(OBJDIR)/$(TARGET).ncv
+ -$(RM) $(OBJDIR)/$(TARGET).def $(OBJDIR)/version.inc
+# -$(CP) ../changes.txt $(OBJDIR)/
+
+install: all
+ @[ -d $(INSTDIR) ] || mkdir $(INSTDIR)
+ @$(CP) $(TARGET).nlm $(INSTDIR)
+
+clean:
+ -$(RM) -r $(OBJDIR)
+
+$(OBJDIR):
+ @mkdir $(OBJDIR)
+
+#$(OBJDIR)/$(TARGET).nlm: $(OBJS) $(OBJDIR)/$(TARGET).def $(XDCDATA) $(PRELUDE)
+$(OBJDIR)/$(TARGET).nlm: $(OBJS) $(OBJDIR)/$(TARGET).def $(XDCDATA)
+ @echo Linking $@
+ @-$(RM) $@
+ @$(LD) $(LDFLAGS) $(OBJDIR)/$(TARGET).def
+
+$(OBJDIR)/%.xdc: Makefile.netware
+ @echo Creating $@
+ @$(MPKXDC) $(XDCOPT) $@
+
+$(OBJDIR)/%.def: Makefile.netware
+ @echo $(DL)# DEF file for linking with $(LD)$(DL) > $@
+ @echo $(DL)# Do not edit this file - it is created by make!$(DL) >> $@
+ @echo $(DL)# All your changes will be lost!!$(DL) >> $@
+ @echo $(DL)#$(DL) >> $@
+ @echo $(DL)copyright "$(COPYR)"$(DL) >> $@
+ @echo $(DL)description "$(DESCR)"$(DL) >> $@
+ @echo $(DL)version $(VERSION)$(DL) >> $@
+ifdef NLMTYPE
+ @echo $(DL)type $(NLMTYPE)$(DL) >> $@
+endif
+ifdef STACK
+ @echo $(DL)stack $(STACK)$(DL) >> $@
+endif
+ifdef SCREEN
+ @echo $(DL)screenname "$(SCREEN)"$(DL) >> $@
+else
+ @echo $(DL)screenname "DEFAULT"$(DL) >> $@
+endif
+ifeq ($(DB),DEBUG)
+ @echo $(DL)debug$(DL) >> $@
+endif
+ @echo $(DL)threadname "$*"$(DL) >> $@
+ifdef XDCDATA
+ @echo $(DL)xdcdata $(XDCDATA)$(DL) >> $@
+endif
+ifeq ($(LIBARCH),CLIB)
+ifeq ($(AP_PRE),YES)
+ @echo $(DL)start _lib_start$(DL) >> $@
+ @echo $(DL)exit _lib_stop$(DL) >> $@
+else
+ @echo $(DL)start _Prelude$(DL) >> $@
+ @echo $(DL)exit _Stop$(DL) >> $@
+endif
+ @echo $(DL)import @$(NDK_ROOT)/nwsdk/imports/clib.imp$(DL) >> $@
+ @echo $(DL)import @$(NDK_ROOT)/nwsdk/imports/threads.imp$(DL) >> $@
+ @echo $(DL)import @$(NDK_ROOT)/nwsdk/imports/nlmlib.imp$(DL) >> $@
+ @echo $(DL)import @$(NDK_ROOT)/nwsdk/imports/socklib.imp$(DL) >> $@
+# @echo $(DL)import @$(NDK_ROOT)/nwsdk/imports/ws2nlm.imp$(DL) >> $@
+ @echo $(DL)import @$(AP_HOME)/src/os/netware/apachecore.imp$(DL) >> $@
+ @echo $(DL)module clib$(DL) >> $@
+else
+ @echo $(DL)flag_on 64$(DL) >> $@
+ @echo $(DL)pseudopreemption$(DL) >> $@
+ @echo $(DL)start _LibCPrelude$(DL) >> $@
+ @echo $(DL)exit _LibCPostlude$(DL) >> $@
+ @echo $(DL)check _LibCCheckUnload$(DL) >> $@
+ @echo $(DL)import @$(NDK_ROOT)/libc/imports/libc.imp$(DL) >> $@
+ @echo $(DL)import @$(NDK_ROOT)/libc/imports/netware.imp$(DL) >> $@
+# @echo $(DL)import @$(NDK_ROOT)/libc/imports/ws2nlm.imp$(DL) >> $@
+ @echo $(DL)import @$(AP_HOME)/src/os/netware/apachecore.imp$(DL) >> $@
+ @echo $(DL)module libc$(DL) >> $@
+endif
+ifdef MODULES
+ @echo $(DL)module $(MODULES)$(DL) >> $@
+endif
+ifdef EXPORTS
+ @echo $(DL)export $(EXPORTS)$(DL) >> $@
+endif
+ifdef IMPORTS
+ @echo $(DL)import $(IMPORTS)$(DL) >> $@
+endif
+ifeq ($(LD),nlmconv)
+ @echo $(DL)input $(OBJS)$(DL) >> $@
+ @echo $(DL)input $(PRELUDE)$(DL) >> $@
+ifdef LDLIBS
+ @echo $(DL)input $(LDLIBS)$(DL) >> $@
+endif
+ @echo $(DL)output $*.nlm$(DL) >> $@
+endif
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/Makefile.tmpl b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/Makefile.tmpl
new file mode 100644
index 00000000..cd84aca1
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/Makefile.tmpl
@@ -0,0 +1,53 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+##
+## Apache 1.3 Makefile template for mod_jk
+##
+LIB=libjk.$(LIBEXT)
+JK_INCLUDES=$(INCLUDES) -I./include
+
+OBJS=mod_jk.o
+OBJS_LIB=mod_jk.a
+
+SHLIB_OBJS=mod_jk.so-o
+SHLIB_OBJS_LIB=mod_jk.a
+
+all: ${LIB}
+
+# build the static library by merging the object files
+libjk.a: $(OBJS) $(OBJS_LIB)
+ cp $(OBJS_LIB) $@
+ ar r $@ $(OBJS)
+ ${RANLIB} $@
+# build the shared object library by linking the object files
+libjk.so: $(SHLIB_OBJS) $(SHLIB_OBJS_LIB)
+ rm -f $@
+ $(LD_SHLIB) $(LDFLAGS_SHLIB) -o $@ $(SHLIB_OBJS) $(SHLIB_OBJS_LIB) $(LIBS)
+
+.SUFFIXES: .o .so-o
+.c.o:
+ $(CC) -c $(JK_INCLUDES) $(CFLAGS) $(CPPFLAGS) $(SPACER) $<
+.c.so-o:
+ $(CC) -c $(JK_INCLUDES) $(CFLAGS) $(CFLAGS_SHLIB) $(CPPFLAGS) $(SPACER) $< && mv $*.o $*.so-o
+
+clean:
+ -rm -f $(OBJS) $(SHLIB_OBJS) $(LIB)
+
+distclean: clean
+ -rm -f Makefile
+
+depend:
+ echo "No depend"
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/Makefile.vc b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/Makefile.vc
new file mode 100644
index 00000000..5b2dc914
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/Makefile.vc
@@ -0,0 +1,256 @@
+!IF "$(OS)" == "Windows_NT"
+NULL=
+!ELSE
+NULL=nul
+!ENDIF
+
+!IFDEF EAPI
+OUTDIR=.\ReleaseSSL
+INTDIR=.\ReleaseSSL
+DEF_EAPI=/D "EAPI"
+!ELSE
+OUTDIR=.\Release
+INTDIR=.\Release
+DEF_EAPI=
+!ENDIF
+
+
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+ALL : "$(OUTDIR)\mod_jk.so"
+
+
+CLEAN :
+ -@erase "$(INTDIR)\jk_ajp12_worker.obj"
+ -@erase "$(INTDIR)\jk_ajp13.obj"
+ -@erase "$(INTDIR)\jk_ajp13_worker.obj"
+ -@erase "$(INTDIR)\jk_ajp14.obj"
+ -@erase "$(INTDIR)\jk_ajp14_worker.obj"
+ -@erase "$(INTDIR)\jk_ajp_common.obj"
+ -@erase "$(INTDIR)\jk_connect.obj"
+ -@erase "$(INTDIR)\jk_context.obj"
+ -@erase "$(INTDIR)\jk_jni_worker.obj"
+ -@erase "$(INTDIR)\jk_lb_worker.obj"
+ -@erase "$(INTDIR)\jk_map.obj"
+ -@erase "$(INTDIR)\jk_md5.obj"
+ -@erase "$(INTDIR)\jk_msg_buff.obj"
+ -@erase "$(INTDIR)\jk_pool.obj"
+ -@erase "$(INTDIR)\jk_shm.obj"
+ -@erase "$(INTDIR)\jk_sockbuf.obj"
+ -@erase "$(INTDIR)\jk_status.obj"
+ -@erase "$(INTDIR)\jk_uri_worker_map.obj"
+ -@erase "$(INTDIR)\jk_url.obj"
+ -@erase "$(INTDIR)\jk_util.obj"
+ -@erase "$(INTDIR)\jk_worker.obj"
+ -@erase "$(INTDIR)\mod_jk.obj"
+ -@erase "$(INTDIR)\mod_jk_src.idb"
+ -@erase "$(INTDIR)\mod_jk_src.pdb"
+ -@erase "$(OUTDIR)\mod_jk.exp"
+ -@erase "$(OUTDIR)\mod_jk.lib"
+ -@erase "$(OUTDIR)\mod_jk.pdb"
+ -@erase "$(OUTDIR)\mod_jk.so"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\mod_jk.bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+LINK32_FLAGS=ApacheCore.lib kernel32.lib user32.lib advapi32.lib ws2_32.lib mswsock.lib $(EXTRA_LIBS) /nologo /base:"0x6A6B0000" /subsystem:windows /dll /incremental:no /pdb:"$(OUTDIR)\mod_jk.pdb" /debug /machine:I386 /out:"$(OUTDIR)\mod_jk.so" /implib:"$(OUTDIR)\mod_jk.lib" /libpath:"$(APACHE1_HOME)\lib" /libpath:"$(APACHE1_HOME)\libexec" /opt:ref
+LINK32_OBJS= \
+ "$(INTDIR)\jk_ajp12_worker.obj" \
+ "$(INTDIR)\jk_ajp13.obj" \
+ "$(INTDIR)\jk_ajp13_worker.obj" \
+ "$(INTDIR)\jk_ajp14.obj" \
+ "$(INTDIR)\jk_ajp14_worker.obj" \
+ "$(INTDIR)\jk_ajp_common.obj" \
+ "$(INTDIR)\jk_connect.obj" \
+ "$(INTDIR)\jk_context.obj" \
+ "$(INTDIR)\jk_jni_worker.obj" \
+ "$(INTDIR)\jk_lb_worker.obj" \
+ "$(INTDIR)\jk_map.obj" \
+ "$(INTDIR)\jk_md5.obj" \
+ "$(INTDIR)\jk_msg_buff.obj" \
+ "$(INTDIR)\jk_pool.obj" \
+ "$(INTDIR)\jk_shm.obj" \
+ "$(INTDIR)\jk_sockbuf.obj" \
+ "$(INTDIR)\jk_status.obj" \
+ "$(INTDIR)\jk_uri_worker_map.obj" \
+ "$(INTDIR)\jk_url.obj" \
+ "$(INTDIR)\jk_util.obj" \
+ "$(INTDIR)\jk_worker.obj" \
+ "$(INTDIR)\mod_jk.obj"
+
+"$(OUTDIR)\mod_jk.so" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+CPP_PROJ=-nologo -MD -W3 -O2 -Ob2 -Oy- -Zi -EHsc /I "..\common" /I "$(APACHE1_HOME)\include" /I "$(JAVA_HOME)\include" /I "$(JAVA_HOME)\include\win32" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" $(DEF_EAPI) /D "MOD_JK_EXPORTS" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\mod_jk_src" /FD /c
+
+.c{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /win32
+
+
+SOURCE=..\common\jk_ajp12_worker.c
+
+"$(INTDIR)\jk_ajp12_worker.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_ajp13.c
+
+"$(INTDIR)\jk_ajp13.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_ajp13_worker.c
+
+"$(INTDIR)\jk_ajp13_worker.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_ajp14.c
+
+"$(INTDIR)\jk_ajp14.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_ajp14_worker.c
+
+"$(INTDIR)\jk_ajp14_worker.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_ajp_common.c
+
+"$(INTDIR)\jk_ajp_common.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_connect.c
+
+"$(INTDIR)\jk_connect.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_context.c
+
+"$(INTDIR)\jk_context.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_jni_worker.c
+
+"$(INTDIR)\jk_jni_worker.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_lb_worker.c
+
+"$(INTDIR)\jk_lb_worker.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_map.c
+
+"$(INTDIR)\jk_map.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_md5.c
+
+"$(INTDIR)\jk_md5.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_msg_buff.c
+
+"$(INTDIR)\jk_msg_buff.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_pool.c
+
+"$(INTDIR)\jk_pool.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_shm.c
+
+"$(INTDIR)\jk_shm.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_sockbuf.c
+
+"$(INTDIR)\jk_sockbuf.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_status.c
+
+"$(INTDIR)\jk_status.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_uri_worker_map.c
+
+"$(INTDIR)\jk_uri_worker_map.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_url.c
+
+"$(INTDIR)\jk_url.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_util.c
+
+"$(INTDIR)\jk_util.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_worker.c
+
+"$(INTDIR)\jk_worker.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=.\mod_jk.c
+
+"$(INTDIR)\mod_jk.obj" : $(SOURCE) "$(INTDIR)"
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/NWGNUmakefile b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/NWGNUmakefile
new file mode 100644
index 00000000..6b4d148f
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/NWGNUmakefile
@@ -0,0 +1,44 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+#
+# Declare the sub-directories to be built here
+#
+
+SUBDIRS = \
+ $(EOLIST)
+
+#
+# Get the 'head' of the build environment. This includes default targets and
+# paths to tools
+#
+
+include $(AP_WORK)\NWGNUhead.inc
+
+#
+# build this level's files
+
+ifeq "$(wildcard NWGNUmakefile.mak)" "NWGNUmakefile.mak"
+include NWGNUmakefile.mak
+endif
+
+#
+# You can use this target if all that is needed is to copy files to the
+# installation area
+#
+install :: nlms FORCE
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/NWGNUmakefile.mak b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/NWGNUmakefile.mak
new file mode 100644
index 00000000..7a59b40d
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/NWGNUmakefile.mak
@@ -0,0 +1,313 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+#
+# NetWare Makefile for mod_jk (uses build system of Apache 1.3.x - gnu make)
+# created by Guenter Knauf <fuankg@apache.org>
+#
+
+#
+# Make sure all needed macro's are defined
+#
+
+ifneq "$(wildcard $(JAVA_HOME)/include/netware/jni_md.h)" "$(JAVA_HOME)/include/netware/jni_md.h"
+$(error JAVA_HOME does not point to a valid NetWare Java SDK!)
+endif
+
+LDLIBS = -l"$(METROWERKS)/Novell Support/libraries/runtime/mwcrtl.lib"
+
+JKCOMMON = ../common
+
+#
+# Get the 'head' of the build environment if necessary. This includes default
+# targets and paths to tools
+#
+
+ifndef EnvironmentDefined
+include $(AP_WORK)\NWGNUhead.inc
+endif
+
+#
+# These directories will be at the beginning of the include list, followed by
+# INCDIRS
+#
+XINCDIRS += \
+ $(JKCOMMON) \
+ $(JAVA_HOME)/include \
+ $(JAVA_HOME)/include/netware \
+ $(SRC)\include \
+ $(NWOS) \
+ $(EOLIST)
+
+#
+# These flags will come after CFLAGS
+#
+XCFLAGS += \
+ -DNO_GETTIMEOFDAY \
+ -DJK_PREFORK \
+ $(EOLIST)
+
+#
+# These defines will come after DEFINES
+#
+XDEFINES += \
+ $(EOLIST)
+
+#
+# These flags will be added to the link.opt file
+#
+XLFLAGS += \
+ $(LDLIBS) \
+ $(EOLIST)
+
+#
+# These values will be appended to the correct variables based on the value of
+# RELEASE
+#
+ifeq "$(RELEASE)" "debug"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+ifeq "$(RELEASE)" "noopt"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+ifeq "$(RELEASE)" "release"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+#
+# These are used by the link target if an NLM is being generated
+# This is used by the link 'name' directive to name the nlm. If left blank
+# TARGET_nlm (see below) will be used.
+#
+NLM_NAME = mod_jk
+
+#
+# This is used by the link '-desc ' directive.
+# If left blank, NLM_NAME will be used.
+#
+NLM_DESCRIPTION = Apache $(AP_VERSION_STR) plugin for Tomcat $(JK_VERSION_STR)
+
+#
+# This is used by the link '-copy ' directive.
+# If left blank, the ASF copyright defined in NWGNUtail.inc will be used.
+#
+NLM_COPYRIGHT = Licensed under the Apache License Version 2.0
+
+#
+# This is used by the '-threadname' directive. If left blank,
+# NLM_NAME Thread will be used.
+#
+NLM_THREAD_NAME = JK Module
+
+#
+# If this is specified, it will override VERSION value in
+# $(AP_WORK)\NWGNUenvironment.inc
+#
+NLM_VERSION = $(JK_VERSION)
+
+#
+# If this is specified, it will override the default of 64K
+#
+NLM_STACK_SIZE = 65536
+
+#
+# If this is specified it will be used by the link '-entry' directive
+#
+NLM_ENTRY_SYM = _lib_start
+#NLM_ENTRY_SYM = _lib_start_ws
+
+#
+# If this is specified it will be used by the link '-exit' directive
+#
+NLM_EXIT_SYM = _lib_stop
+#NLM_EXIT_SYM = _lib_stop_ws
+
+#
+# If this is specified it will be used by the link '-flags' directive
+#
+NLM_FLAGS =
+
+#
+# Declare all target files (you must add your files here)
+#
+
+#
+# If there is an NLM target, put it here
+#
+TARGET_nlm = \
+ $(OBJDIR)/$(NLM_NAME).nlm \
+ $(EOLIST)
+
+#
+# If there is an LIB target, put it here
+#
+TARGET_lib = \
+ $(EOLIST)
+
+#
+# These are the OBJ files needed to create the NLM target above.
+# Paths must all use the '/' character
+#
+FILES_nlm_objs = \
+ $(OBJDIR)/$(NLM_NAME).o \
+ $(OBJDIR)/jk_nwmain.o \
+ $(OBJDIR)/jk_ajp12_worker.o \
+ $(OBJDIR)/jk_ajp13.o \
+ $(OBJDIR)/jk_ajp13_worker.o \
+ $(OBJDIR)/jk_ajp14.o \
+ $(OBJDIR)/jk_ajp14_worker.o \
+ $(OBJDIR)/jk_ajp_common.o \
+ $(OBJDIR)/jk_connect.o \
+ $(OBJDIR)/jk_context.o \
+ $(OBJDIR)/jk_jni_worker.o \
+ $(OBJDIR)/jk_lb_worker.o \
+ $(OBJDIR)/jk_map.o \
+ $(OBJDIR)/jk_md5.o \
+ $(OBJDIR)/jk_msg_buff.o \
+ $(OBJDIR)/jk_pool.o \
+ $(OBJDIR)/jk_shm.o \
+ $(OBJDIR)/jk_sockbuf.o \
+ $(OBJDIR)/jk_status.o \
+ $(OBJDIR)/jk_uri_worker_map.o \
+ $(OBJDIR)/jk_url.o \
+ $(OBJDIR)/jk_util.o \
+ $(OBJDIR)/jk_worker.o \
+ $(EOLIST)
+
+#
+# These are the LIB files needed to create the NLM target above.
+# These will be added as a library command in the link.opt file.
+#
+FILES_nlm_libs = \
+ $(NWOS)/$(OBJDIR)/libpre.o \
+ $(EOLIST)
+
+# $(NWOS)/$(OBJDIR)/libprews.o
+
+#
+# These are the modules that the above NLM target depends on to load.
+# These will be added as a module command in the link.opt file.
+#
+FILES_nlm_modules = \
+ $(EOLIST)
+
+#
+# If the nlm has a msg file, put it's path here
+#
+FILE_nlm_msg =
+
+#
+# If the nlm has a hlp file put it's path here
+#
+FILE_nlm_hlp =
+
+#
+# If this is specified, it will override $(NWOS)\copyright.txt.
+#
+FILE_nlm_copyright =
+
+#
+# Any additional imports go here
+#
+FILES_nlm_Ximports = \
+ @ApacheCore.imp \
+ @threads.imp \
+ @clib.imp \
+ @nlmlib.imp \
+ @socklib.imp \
+ $(EOLIST)
+
+#
+# Any symbols exported to here
+#
+FILES_nlm_exports = \
+ jk_module \
+ $(EOLIST)
+
+#
+# These are the OBJ files needed to create the LIB target above.
+# Paths must all use the '/' character
+#
+FILES_lib_objs = \
+ $(EOLIST)
+
+#
+# implement targets and dependancies (leave this section alone)
+#
+
+libs :: $(OBJDIR) $(TARGET_lib)
+
+nlms :: libs $(TARGET_nlm)
+
+#
+# Updated this target to create necessary directories and copy files to the
+# correct place. (See $(AP_WORK)\NWGNUhead.inc for examples)
+#
+install :: nlms FORCE
+ copy $(OBJDIR)\$(NLM_NAME).nlm $(INSTALL)\Apache\modules
+
+#
+# Any specialized rules here
+#
+vpath %.c . $(JKCOMMON) $(SNPRINTF)
+
+$(OBJDIR)/version.inc: $(JKCOMMON)/jk_version.h $(SRC)/include/httpd.h $(OBJDIR)
+ @echo Creating $@
+ @awk -f ../../support/get_ver.awk $< $(SRC)/include/httpd.h > $@
+
+# Include the version info retrieved from jk_version.h
+-include $(OBJDIR)/version.inc
+
+#
+# Include the 'tail' makefile that has targets that depend on variables defined
+# in this makefile
+#
+
+include $(AP_WORK)/NWGNUtail.inc
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/libjk.module b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/libjk.module
new file mode 100644
index 00000000..54726472
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/libjk.module
@@ -0,0 +1,5 @@
+Name: jk_module
+ConfigStart
+ LIBS="-Lmodules/jk -L../modules/jk -L../../modules/jk -ljk $LIBS"
+ RULE_HIDE=yes
+ConfigEnd
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/mod_jk.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/mod_jk.c
new file mode 100644
index 00000000..2783df2a
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/mod_jk.c
@@ -0,0 +1,3338 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: Apache 1.3 plugin for Tomcat *
+ * See ../common/jk_service.h for general mod_jk info *
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Dan Milstein <danmil@shore.net> *
+ * Henri Gomez <hgomez@apache.org> *
+ * Version: $Revision: 1126561 $ *
+ ***************************************************************************/
+
+/*
+ * mod_jk: keeps all servlet related ramblings together.
+ */
+
+/* #include "ap_config.h" */
+#include "httpd.h"
+#include "http_config.h"
+#include "http_request.h"
+#include "http_core.h"
+#include "http_protocol.h"
+#include "http_main.h"
+#include "http_log.h"
+#include "util_script.h"
+#include "util_date.h"
+#include "http_conf_globals.h"
+
+/*
+ * jk_ include files
+ */
+#ifdef NETWARE
+#define _SYS_TYPES_H_
+#define _NETDB_H_INCLUDED
+#define _IN_
+#define _INET_
+#define _SYS_TIMEVAL_H_
+#define _SYS_SOCKET_H_
+#endif
+#include "jk_global.h"
+#include "jk_util.h"
+#include "jk_map.h"
+#include "jk_pool.h"
+#include "jk_service.h"
+#include "jk_worker.h"
+#include "jk_uri_worker_map.h"
+#include "jk_ajp13.h"
+#include "jk_shm.h"
+#include "jk_url.h"
+
+#define JK_LOG_DEF_FILE ("logs/mod_jk.log")
+#define JK_SHM_DEF_FILE ("logs/jk-runtime-status")
+#define JK_ENV_REMOTE_ADDR ("JK_REMOTE_ADDR")
+#define JK_ENV_REMOTE_PORT ("JK_REMOTE_PORT")
+#define JK_ENV_REMOTE_HOST ("JK_REMOTE_HOST")
+#define JK_ENV_REMOTE_USER ("JK_REMOTE_USER")
+#define JK_ENV_AUTH_TYPE ("JK_AUTH_TYPE")
+#define JK_ENV_LOCAL_NAME ("JK_LOCAL_NAME")
+#define JK_ENV_LOCAL_PORT ("JK_LOCAL_PORT")
+#define JK_ENV_HTTPS ("HTTPS")
+#define JK_ENV_CERTS ("SSL_CLIENT_CERT")
+#define JK_ENV_CIPHER ("SSL_CIPHER")
+#define JK_ENV_SESSION ("SSL_SESSION_ID")
+#define JK_ENV_KEY_SIZE ("SSL_CIPHER_USEKEYSIZE")
+#define JK_ENV_CERTCHAIN_PREFIX ("SSL_CLIENT_CERT_CHAIN_")
+#define JK_ENV_REPLY_TIMEOUT ("JK_REPLY_TIMEOUT")
+#define JK_ENV_WORKER_NAME ("JK_WORKER_NAME")
+#define JK_NOTE_WORKER_NAME ("JK_WORKER_NAME")
+#define JK_NOTE_WORKER_TYPE ("JK_WORKER_TYPE")
+#define JK_NOTE_REQUEST_DURATION ("JK_REQUEST_DURATION")
+#define JK_NOTE_WORKER_ROUTE ("JK_WORKER_ROUTE")
+#define JK_HANDLER ("jakarta-servlet")
+#define JK_MAGIC_TYPE ("application/x-jakarta-servlet")
+#define NULL_FOR_EMPTY(x) ((x && !strlen(x)) ? NULL : x)
+#define STRNULL_FOR_NULL(x) ((x) ? (x) : "(null)")
+
+/*
+ * If you are not using SSL, comment out the following line. It will make
+ * apache run faster.
+ *
+ * Personally, I (DM), think this may be a lie.
+ */
+#define ADD_SSL_INFO
+
+module MODULE_VAR_EXPORT jk_module;
+#ifdef WIN32
+extern __declspec(dllimport) module dir_module;
+#else
+extern module dir_module;
+#endif
+
+static int xfer_flags = (O_WRONLY | O_APPEND | O_CREAT);
+#if defined(OS2) || defined(WIN32) || defined(NETWARE)
+/* OS/2 dosen't support users and groups */
+static mode_t xfer_mode = (S_IREAD | S_IWRITE);
+#else
+static mode_t xfer_mode = (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+#endif
+
+/*
+ * Environment variable forward object
+ */
+typedef struct
+{
+ int has_default;
+ char *name;
+ char *value;
+} envvar_item;
+
+/*
+ * Configuration object for the mod_jk module.
+ */
+typedef struct
+{
+
+ /*
+ * Log stuff
+ */
+ char *log_file;
+ int log_fd;
+ int log_level;
+ jk_logger_t *log;
+
+ /*
+ * Mount stuff
+ */
+ char *mount_file;
+ int mount_file_reload;
+ jk_map_t *uri_to_context;
+
+ int mountcopy;
+
+ jk_uri_worker_map_t *uw_map;
+
+ int was_initialized;
+
+ /*
+ * Automatic context path apache alias
+ */
+ char *alias_dir;
+
+ /*
+ * Request Logging
+ */
+
+ char *stamp_format_string;
+ char *format_string;
+ array_header *format;
+
+ /*
+ * Setting target worker via environment
+ */
+ char *worker_indicator;
+
+ /*
+ * Configurable environment variables to overwrite
+ * request information using meta data send by a
+ * proxy in front of us.
+ */
+ char *remote_addr_indicator;
+ char *remote_port_indicator;
+ char *remote_host_indicator;
+ char *remote_user_indicator;
+ char *auth_type_indicator;
+ char *local_name_indicator;
+ char *local_port_indicator;
+
+ /*
+ * SSL Support
+ */
+ int ssl_enable;
+ char *https_indicator;
+ char *certs_indicator;
+ char *cipher_indicator;
+ char *session_indicator;
+ char *key_size_indicator;
+ char *certchain_prefix; /* Client certificate chain prefix */
+
+ /*
+ * Jk Options
+ */
+ int options;
+ int exclude_options;
+
+ int strip_session;
+ /*
+ * Environment variables support
+ */
+ int envvars_has_own;
+ table *envvars;
+ table *envvars_def;
+ array_header *envvar_items;
+
+ server_rec *s;
+} jk_server_conf_t;
+
+
+/*
+ * The "private", or subclass portion of the web server service class for
+ * Apache 1.3. An instance of this class is created for each request
+ * handled. See jk_service.h for details about the ws_service object in
+ * general.
+ */
+struct apache_private_data
+{
+ /*
+ * For memory management for this request. Aliased to be identical to
+ * the pool in the superclass (jk_ws_service).
+ */
+ jk_pool_t p;
+
+ /* True iff request body data has been read from Apache */
+ int read_body_started;
+
+ /* Apache request structure */
+ request_rec *r;
+};
+typedef struct apache_private_data apache_private_data_t;
+
+typedef struct dir_config_struct
+{
+ array_header *index_names;
+} dir_config_rec;
+
+static server_rec *main_server = NULL;
+static jk_logger_t *main_log = NULL;
+static table *jk_log_fds = NULL;
+static jk_worker_env_t worker_env;
+static char *jk_shm_file = NULL;
+static size_t jk_shm_size = 0;
+/*
+ * Worker stuff
+*/
+static jk_map_t *jk_worker_properties = NULL;
+static char *jk_worker_file = NULL;
+static int jk_mount_copy_all = JK_FALSE;
+
+static int JK_METHOD ws_start_response(jk_ws_service_t *s,
+ int status,
+ const char *reason,
+ const char *const *header_names,
+ const char *const *header_values,
+ unsigned num_of_headers);
+
+static int JK_METHOD ws_read(jk_ws_service_t *s,
+ void *b, unsigned l, unsigned *a);
+
+static int JK_METHOD ws_write(jk_ws_service_t *s, const void *b, unsigned l);
+
+static void JK_METHOD ws_add_log_items(jk_ws_service_t *s,
+ const char *const *log_names,
+ const char *const *log_values,
+ unsigned num_of_log_items);
+
+static void * JK_METHOD ws_next_vhost(void *d);
+
+static void JK_METHOD ws_vhost_to_text(void *d, char *buf, size_t len);
+
+static jk_uri_worker_map_t * JK_METHOD ws_vhost_to_uw_map(void *d);
+
+/* srevilak - new function prototypes */
+static void jk_server_cleanup(void *data);
+static void jk_generic_cleanup(server_rec * s);
+
+
+
+/* ====================================================================== */
+/* JK Service step callbacks */
+/* ====================================================================== */
+
+
+/*
+ * Send the HTTP response headers back to the browser.
+ *
+ * Think of this function as a method of the apache1.3-specific subclass of
+ * the jk_ws_service class. Think of the *s param as a "this" or "self"
+ * pointer.
+ */
+static int JK_METHOD ws_start_response(jk_ws_service_t *s,
+ int status,
+ const char *reason,
+ const char *const *header_names,
+ const char *const *header_values,
+ unsigned num_of_headers)
+{
+ if (s && s->ws_private) {
+ unsigned h;
+
+ /* Obtain a subclass-specific "this" pointer */
+ apache_private_data_t *p = s->ws_private;
+ request_rec *r = p->r;
+
+ /* If we use proxy error pages, still pass
+ * through context headers needed for special status codes.
+ */
+ if (s->extension.use_server_error_pages &&
+ status >= s->extension.use_server_error_pages) {
+ if (status == HTTP_UNAUTHORIZED) {
+ int found = JK_FALSE;
+ for (h = 0; h < num_of_headers; h++) {
+ if (!strcasecmp(header_names[h], "WWW-Authenticate")) {
+ char *tmp = ap_pstrdup(r->pool, header_values[h]);
+ ap_table_set(r->err_headers_out,
+ "WWW-Authenticate", tmp);
+ found = JK_TRUE;
+ }
+ }
+ if (found == JK_FALSE) {
+ jk_server_conf_t *conf = (jk_server_conf_t *)
+ ap_get_module_config(r->server->module_config,
+ &jk_module);
+ jk_log(conf->log, JK_LOG_INFO,
+ "origin server sent 401 without"
+ " WWW-Authenticate header");
+ }
+ }
+ return JK_TRUE;
+ }
+
+ if (!reason) {
+ reason = "";
+ }
+ r->status = status;
+ r->status_line = ap_psprintf(r->pool, "%d %s", status, reason);
+
+ for (h = 0; h < num_of_headers; h++) {
+ if (!strcasecmp(header_names[h], "Content-type")) {
+ char *tmp = ap_pstrdup(r->pool, header_values[h]);
+ ap_content_type_tolower(tmp);
+ r->content_type = tmp;
+ }
+ else if (!strcasecmp(header_names[h], "Location")) {
+ ap_table_set(r->headers_out, header_names[h],
+ header_values[h]);
+ }
+ else if (!strcasecmp(header_names[h], "Content-Length")) {
+ ap_table_set(r->headers_out, header_names[h],
+ header_values[h]);
+ }
+ else if (!strcasecmp(header_names[h], "Transfer-Encoding")) {
+ ap_table_set(r->headers_out, header_names[h],
+ header_values[h]);
+ }
+ else if (!strcasecmp(header_names[h], "Last-Modified")) {
+ /*
+ * If the script gave us a Last-Modified header, we can't just
+ * pass it on blindly because of restrictions on future values.
+ */
+ ap_update_mtime(r, ap_parseHTTPdate(header_values[h]));
+ ap_set_last_modified(r);
+ }
+ else {
+ ap_table_add(r->headers_out, header_names[h],
+ header_values[h]);
+ }
+ }
+
+ ap_send_http_header(r);
+ s->response_started = JK_TRUE;
+
+ return JK_TRUE;
+ }
+ return JK_FALSE;
+}
+
+/*
+ * Read a chunk of the request body into a buffer. Attempt to read len
+ * bytes into the buffer. Write the number of bytes actually read into
+ * actually_read.
+ *
+ * Think of this function as a method of the apache1.3-specific subclass of
+ * the jk_ws_service class. Think of the *s param as a "this" or "self"
+ * pointer.
+ */
+static int JK_METHOD ws_read(jk_ws_service_t *s,
+ void *b, unsigned len, unsigned *actually_read)
+{
+ if (s && s->ws_private && b && actually_read) {
+ apache_private_data_t *p = s->ws_private;
+ if (!p->read_body_started) {
+ if (ap_should_client_block(p->r)) {
+ p->read_body_started = JK_TRUE;
+ }
+ }
+
+ if (p->read_body_started) {
+ long rv;
+ if ((rv = ap_get_client_block(p->r, b, len)) < 0) {
+ *actually_read = 0;
+ }
+ else {
+ *actually_read = (unsigned)rv;
+ }
+ /* reset timeout after successful read */
+ ap_reset_timeout(p->r);
+ return JK_TRUE;
+ }
+ }
+ return JK_FALSE;
+}
+
+static void JK_METHOD ws_flush(jk_ws_service_t *s)
+{
+ if (s && s->ws_private) {
+ apache_private_data_t *p = s->ws_private;
+ BUFF *bf = p->r->connection->client;
+ ap_bflush(bf);
+ }
+}
+
+/*
+ * Write a chunk of response data back to the browser. If the headers
+ * haven't yet been sent over, send over default header values (Status =
+ * 200, basically).
+ *
+ * Write len bytes from buffer b.
+ *
+ * Think of this function as a method of the apache1.3-specific subclass of
+ * the jk_ws_service class. Think of the *s param as a "this" or "self"
+ * pointer.
+ */
+static int JK_METHOD ws_write(jk_ws_service_t *s, const void *b, unsigned len)
+{
+ if (s && s->ws_private && b) {
+ apache_private_data_t *p = s->ws_private;
+
+ if (len) {
+ char *buf = (char *)b;
+ int w = (int)len;
+ int r = 0;
+
+ if (!s->response_started) {
+ if (main_log)
+ jk_log(main_log, JK_LOG_INFO,
+ "Write without start, starting with defaults");
+ if (!s->start_response(s, 200, NULL, NULL, NULL, 0)) {
+ return JK_FALSE;
+ }
+ }
+
+ if (p->r->header_only) {
+ BUFF *bf = p->r->connection->client;
+ ap_bflush(bf);
+ return JK_TRUE;
+ }
+
+ while (len && !p->r->connection->aborted) {
+ w = ap_bwrite(p->r->connection->client, &buf[r], len);
+ if (w > 0) {
+ /* reset timeout after successful write */
+ ap_reset_timeout(p->r);
+ r += w;
+ len -= w;
+ }
+ else if (w < 0) {
+ /* Error writing data -- abort */
+ if (!p->r->connection->aborted) {
+ ap_bsetflag(p->r->connection->client, B_EOUT, 1);
+ p->r->connection->aborted = 1;
+ }
+ return JK_FALSE;
+ }
+
+ }
+ if (len && p->r->connection->aborted) {
+ /* Fail if there is something left to send and
+ * the connection was aborted by the client
+ */
+ return JK_FALSE;
+ }
+ }
+
+ return JK_TRUE;
+ }
+ return JK_FALSE;
+}
+
+static void JK_METHOD ws_add_log_items(jk_ws_service_t *s,
+ const char *const *log_names,
+ const char *const *log_values,
+ unsigned num_of_log_items)
+{
+ unsigned h;
+ apache_private_data_t *p = s->ws_private;
+ request_rec *r = p->r;
+
+ for (h = 0; h < num_of_log_items; h++) {
+ if (log_names[h] && log_values[h]) {
+ ap_table_setn(r->notes, log_names[h], log_values[h]);
+ }
+ }
+}
+
+static void * JK_METHOD ws_next_vhost(void *d)
+{
+ server_rec *s = (server_rec *)d;
+ if (s == NULL)
+ return main_server;
+ return s->next;
+}
+
+static void JK_METHOD ws_vhost_to_text(void *d, char *buf, size_t len)
+{
+ server_rec *s = (server_rec *)d;
+ size_t used = 0;
+
+ if (s->server_hostname)
+ used += strlen(s->server_hostname);
+ if (!s->is_virtual) {
+ if (s->port)
+ used += strlen(":XXXXX");
+ }
+ else if (s->addrs) {
+ used += strlen(" [");
+ if (s->addrs->virthost)
+ used += strlen(s->addrs->virthost);
+ if (s->addrs->host_port)
+ used += strlen(":XXXXX");
+ used += strlen("]");
+ }
+
+ if (len < used && len > strlen("XXX")) {
+ strcpy(buf, "XXX");
+ return;
+ }
+
+ used = 0;
+
+ if (s->server_hostname) {
+ strcpy(buf + used, s->server_hostname);
+ used += strlen(s->server_hostname);
+ }
+ if (!s->is_virtual) {
+ if (s->port) {
+ sprintf(buf + used, ":%hu", s->port);
+ used = strlen(buf);
+ }
+ }
+ else if (s->addrs) {
+ strcpy(buf + used, " [");
+ used += strlen(" [");
+ if (s->addrs->virthost) {
+ strcpy(buf + used, s->addrs->virthost);
+ used += strlen(s->addrs->virthost);
+ }
+ if (s->addrs->host_port) {
+ sprintf(buf + used, ":%hu", s->addrs->host_port);
+ used = strlen(buf);
+ }
+ strcpy(buf + used, "]");
+ used += strlen("]");
+ }
+}
+
+static jk_uri_worker_map_t * JK_METHOD ws_vhost_to_uw_map(void *d)
+{
+ server_rec *s = (server_rec *)d;
+ jk_server_conf_t *conf = NULL;
+ if (s == NULL)
+ return NULL;
+ conf = (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+ return conf->uw_map;
+}
+
+/* ====================================================================== */
+/* Utility functions */
+/* ====================================================================== */
+
+/* Log something to JK log file then exit */
+static void jk_error_exit(const char *file,
+ int line,
+ int level,
+ const server_rec * s,
+ ap_pool * p, const char *fmt, ...)
+{
+ va_list ap;
+ char *res;
+ char *ch;
+
+ va_start(ap, fmt);
+ res = ap_pvsprintf(p, fmt, ap);
+ va_end(ap);
+ /* Replace all format characters in the resulting message */
+ /* because we feed the message to ap_log_error(). */
+ ch = res;
+ while (*ch) {
+ if (*ch == '%') {
+ *ch = '#';
+ }
+ ch++;
+ }
+
+ ap_log_error(file, line, level, s, res);
+ if ( s ) {
+ ap_log_error(file, line, level, NULL, res);
+ }
+
+ /* Exit process */
+ exit(1);
+}
+
+/* Return the content length associated with an Apache request structure */
+static jk_uint64_t get_content_length(request_rec * r)
+{
+ if (r->clength > 0) {
+ return (jk_uint64_t)r->clength;
+ }
+ else {
+ char *lenp = (char *)ap_table_get(r->headers_in, "Content-Length");
+
+ if (lenp) {
+ jk_uint64_t rc = 0;
+ if (sscanf(lenp, "%" JK_UINT64_T_FMT, &rc) > 0 && rc > 0) {
+ return rc;
+ }
+ }
+ }
+
+ return 0;
+}
+
+/* Retrieve string value from env var, use default if env var does not exist. */
+static const char *get_env_string(request_rec *r, const char *def,
+ char *env, int null_for_empty)
+{
+ char *value = (char *)ap_table_get(r->subprocess_env, env);
+ if (value)
+ return null_for_empty ? NULL_FOR_EMPTY(value) : value;
+ return null_for_empty ? NULL_FOR_EMPTY(def) : def;
+}
+
+/* Retrieve integer value from env var, use default if env var does not exist. */
+static int get_env_int(request_rec *r, int def, char *env)
+{
+ char *value = (char *)ap_table_get(r->subprocess_env, env);
+ if (value)
+ return atoi(value);
+ return def;
+}
+
+/*
+ * Set up an instance of a ws_service object for a single request. This
+ * particular instance will be of the Apache 1.3-specific subclass. Copies
+ * all of the important request information from the Apache request object
+ * into the jk_ws_service_t object.
+ *
+ * Params
+ *
+ * private_data: The subclass-specific data structure, already initialized
+ * (with a pointer to the Apache request_rec structure, among other things)
+ *
+ * s: The base class object.
+ *
+ * conf: Configuration information
+ *
+ * Called from jk_handler(). See jk_service.h for explanations of what most
+ * of these fields mean.
+ */
+static int init_ws_service(apache_private_data_t * private_data,
+ jk_ws_service_t *s, jk_server_conf_t * conf)
+{
+ int size;
+ request_rec *r = private_data->r;
+ char *ssl_temp = NULL;
+ const char *reply_timeout = NULL;
+ rule_extension_t *e;
+
+ /* Copy in function pointers (which are really methods) */
+ s->start_response = ws_start_response;
+ s->read = ws_read;
+ s->write = ws_write;
+ s->flush = ws_flush;
+ s->add_log_items = ws_add_log_items;
+ s->next_vhost = ws_next_vhost;
+ s->vhost_to_text = ws_vhost_to_text;
+ s->vhost_to_uw_map = ws_vhost_to_uw_map;
+
+ s->auth_type = get_env_string(r, r->connection->ap_auth_type,
+ conf->auth_type_indicator, 1);
+ s->remote_user = get_env_string(r, r->connection->user,
+ conf->remote_user_indicator, 1);
+
+ s->protocol = r->protocol;
+ s->remote_host =
+ (char *)ap_get_remote_host(r->connection, r->per_dir_config,
+ REMOTE_HOST);
+ s->remote_host = get_env_string(r, s->remote_host,
+ conf->remote_host_indicator, 1);
+
+ if (conf->options & JK_OPT_FWDLOCAL) {
+ s->remote_addr = r->connection->local_ip;
+ /* We don't know the client port of the backend connection. */
+ s->remote_port = "0";
+ }
+ else {
+ s->remote_addr = r->connection->remote_ip;
+ s->remote_port = ap_psprintf(r->pool, "%d",
+ ntohs(r->connection->remote_addr.sin_port));
+ }
+ s->remote_addr = get_env_string(r, s->remote_addr,
+ conf->remote_addr_indicator, 1);
+ s->remote_port = get_env_string(r, s->remote_port,
+ conf->remote_port_indicator, 1);
+
+ if (conf->options & JK_OPT_FLUSHPACKETS)
+ s->flush_packets = 1;
+ if (conf->options & JK_OPT_FLUSHEADER)
+ s->flush_header = 1;
+
+ e = (rule_extension_t *)ap_get_module_config(r->request_config, &jk_module);
+ if (e) {
+ s->extension.reply_timeout = e->reply_timeout;
+ s->extension.use_server_error_pages = e->use_server_error_pages;
+ if (e->activation) {
+ s->extension.activation = ap_palloc(r->pool, e->activation_size * sizeof(int));
+ memcpy(s->extension.activation, e->activation, e->activation_size * sizeof(int));
+ }
+ if (e->fail_on_status_size > 0) {
+ s->extension.fail_on_status_size = e->fail_on_status_size;
+ s->extension.fail_on_status = ap_palloc(r->pool, e->fail_on_status_size * sizeof(int));
+ memcpy(s->extension.fail_on_status, e->fail_on_status, e->fail_on_status_size * sizeof(int));
+ }
+ }
+ reply_timeout = ap_table_get(r->subprocess_env, "JK_REPLY_TIMEOUT");
+ if (reply_timeout) {
+ int r = atoi(reply_timeout);
+ if (r >= 0)
+ s->extension.reply_timeout = r;
+ }
+
+ if (conf->options & JK_OPT_DISABLEREUSE)
+ s->disable_reuse = 1;
+
+ /* get server name */
+ /* s->server_name = (char *)(r->hostname ? r->hostname : r->server->server_hostname); */
+ /* XXX : a la jk2 */
+ s->server_name = get_env_string(r, (char *)ap_get_server_name(r),
+ conf->local_name_indicator, 0);
+
+ /* get the real port (otherwise redirect failed) */
+ /* s->server_port = htons( r->connection->local_addr.sin_port ); */
+ /* XXX : a la jk2 */
+ s->server_port = get_env_int(r, ap_get_server_port(r),
+ conf->local_port_indicator);
+
+ s->server_software = (char *)ap_get_server_version();
+
+ s->method = (char *)r->method;
+ s->content_length = get_content_length(r);
+ s->is_chunked = r->read_chunked;
+ s->no_more_chunks = 0;
+ s->query_string = r->args;
+
+ /*
+ * The 2.2 servlet spec errata says the uri from
+ * HttpServletRequest.getRequestURI() should remain encoded.
+ * [http://java.sun.com/products/servlet/errata_042700.html]
+ *
+ * We use JkOptions to determine which method to be used
+ *
+ * ap_escape_uri is the latest recommanded but require
+ * some java decoding (in TC 3.3 rc2)
+ *
+ * unparsed_uri is used for strict compliance with spec and
+ * old Tomcat (3.2.3 for example)
+ *
+ * uri is use for compatibilty with mod_rewrite with old Tomcats
+ */
+
+ switch (conf->options & JK_OPT_FWDURIMASK) {
+
+ case JK_OPT_FWDURICOMPATUNPARSED:
+ s->req_uri = r->unparsed_uri;
+ if (s->req_uri != NULL) {
+ char *query_str = strchr(s->req_uri, '?');
+ if (query_str != NULL) {
+ *query_str = 0;
+ }
+ }
+
+ break;
+
+ case JK_OPT_FWDURICOMPAT:
+ s->req_uri = r->uri;
+ break;
+
+ case JK_OPT_FWDURIPROXY:
+ size = 3 * strlen(r->uri) + 1;
+ s->req_uri = ap_palloc(r->pool, size);
+ jk_canonenc(r->uri, s->req_uri, size);
+ break;
+
+ case JK_OPT_FWDURIESCAPED:
+ s->req_uri = ap_escape_uri(r->pool, r->uri);
+ break;
+
+ default:
+ return JK_FALSE;
+ }
+
+ if (conf->ssl_enable || conf->envvars) {
+ ap_add_common_vars(r);
+
+ if (conf->ssl_enable) {
+ ssl_temp =
+ (char *)ap_table_get(r->subprocess_env,
+ conf->https_indicator);
+ if (ssl_temp && !strcasecmp(ssl_temp, "on")) {
+ s->is_ssl = JK_TRUE;
+ s->ssl_cert =
+ (char *)ap_table_get(r->subprocess_env,
+ conf->certs_indicator);
+
+ if (conf->options & JK_OPT_FWDCERTCHAIN) {
+ array_header *t = ap_table_elts(r->subprocess_env);
+ if (t && t->nelts) {
+ int i;
+ table_entry *elts = (table_entry *) t->elts;
+ array_header *certs = ap_make_array(r->pool, 1,
+ sizeof(char *));
+ *(const char **)ap_push_array(certs) = s->ssl_cert;
+ for (i = 0; i < t->nelts; i++) {
+ if (!elts[i].key)
+ continue;
+ if (!strncasecmp(elts[i].key,
+ conf->certchain_prefix,
+ strlen(conf->certchain_prefix)))
+ *(const char **)ap_push_array(certs) = elts[i].val;
+ }
+ s->ssl_cert = ap_array_pstrcat(r->pool, certs, '\0');
+ }
+ }
+
+ if (s->ssl_cert) {
+ s->ssl_cert_len = strlen(s->ssl_cert);
+ if (JK_IS_DEBUG_LEVEL(conf->log)) {
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "SSL client certificate (%d bytes): %s",
+ s->ssl_cert_len, s->ssl_cert);
+ }
+ }
+ /* Servlet 2.3 API */
+ s->ssl_cipher =
+ (char *)ap_table_get(r->subprocess_env,
+ conf->cipher_indicator);
+ s->ssl_session =
+ (char *)ap_table_get(r->subprocess_env,
+ conf->session_indicator);
+
+ if (conf->options & JK_OPT_FWDKEYSIZE) {
+ /* Servlet 2.3 API */
+ ssl_temp =
+ (char *)ap_table_get(r->subprocess_env,
+ conf->key_size_indicator);
+ if (ssl_temp)
+ s->ssl_key_size = atoi(ssl_temp);
+ }
+ }
+ }
+
+ if (conf->envvars) {
+ const array_header *t = conf->envvar_items;
+ if (t && t->nelts) {
+ int i;
+ int j = 0;
+ envvar_item *elts = (envvar_item *) t->elts;
+ s->attributes_names =
+ ap_palloc(r->pool, sizeof(char *) * t->nelts);
+ s->attributes_values =
+ ap_palloc(r->pool, sizeof(char *) * t->nelts);
+
+ for (i = 0; i < t->nelts; i++) {
+ s->attributes_names[i - j] = elts[i].name;
+ s->attributes_values[i - j] =
+ (char *)ap_table_get(r->subprocess_env, elts[i].name);
+ if (!s->attributes_values[i - j]) {
+ if (elts[i].has_default) {
+ s->attributes_values[i - j] = elts[i].value;
+ }
+ else {
+ s->attributes_values[i - j] = "";
+ s->attributes_names[i - j] = "";
+ j++;
+ }
+ }
+ }
+
+ s->num_attributes = t->nelts - j;
+ }
+ }
+ }
+
+ if (r->headers_in && ap_table_elts(r->headers_in)) {
+ int need_content_length_header = (!s->is_chunked
+ && s->content_length ==
+ 0) ? JK_TRUE : JK_FALSE;
+ array_header *t = ap_table_elts(r->headers_in);
+ if (t && t->nelts) {
+ int i;
+ table_entry *elts = (table_entry *) t->elts;
+ s->num_headers = t->nelts;
+ /* allocate an extra header slot in case we need to add a content-length header */
+ s->headers_names =
+ ap_palloc(r->pool, sizeof(char *) * (t->nelts + 1));
+ s->headers_values =
+ ap_palloc(r->pool, sizeof(char *) * (t->nelts + 1));
+ if (!s->headers_names || !s->headers_values)
+ return JK_FALSE;
+ for (i = 0; i < t->nelts; i++) {
+ char *hname = ap_pstrdup(r->pool, elts[i].key);
+ s->headers_values[i] = ap_pstrdup(r->pool, elts[i].val);
+ s->headers_names[i] = hname;
+ if (need_content_length_header &&
+ !strcasecmp(s->headers_names[i], "content-length")) {
+ need_content_length_header = JK_FALSE;
+ }
+ }
+ /* Add a content-length = 0 header if needed.
+ * Ajp13 assumes an absent content-length header means an unknown,
+ * but non-zero length body.
+ */
+ if (need_content_length_header) {
+ s->headers_names[s->num_headers] = "content-length";
+ s->headers_values[s->num_headers] = "0";
+ s->num_headers++;
+ }
+ }
+ /* Add a content-length = 0 header if needed. */
+ else if (need_content_length_header) {
+ s->headers_names = ap_palloc(r->pool, sizeof(char *));
+ s->headers_values = ap_palloc(r->pool, sizeof(char *));
+ if (!s->headers_names || !s->headers_values)
+ return JK_FALSE;
+ s->headers_names[0] = "content-length";
+ s->headers_values[0] = "0";
+ s->num_headers++;
+ }
+ }
+ s->uw_map = conf->uw_map;
+
+ /* Dump all connection param so we can trace what's going to
+ * the remote tomcat
+ */
+ if (JK_IS_DEBUG_LEVEL(conf->log)) {
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "Service protocol=%s method=%s ssl=%s host=%s addr=%s name=%s port=%d auth=%s user=%s laddr=%s raddr=%s uri=%s",
+ STRNULL_FOR_NULL(s->protocol),
+ STRNULL_FOR_NULL(s->method),
+ s->is_ssl ? "true" : "false",
+ STRNULL_FOR_NULL(s->remote_host),
+ STRNULL_FOR_NULL(s->remote_addr),
+ STRNULL_FOR_NULL(s->server_name),
+ s->server_port,
+ STRNULL_FOR_NULL(s->auth_type),
+ STRNULL_FOR_NULL(s->remote_user),
+ STRNULL_FOR_NULL(r->connection->local_ip),
+ STRNULL_FOR_NULL(r->connection->remote_ip),
+ STRNULL_FOR_NULL(s->req_uri));
+ }
+
+ return JK_TRUE;
+}
+
+/*
+ * The JK module command processors
+ *
+ * The below are all installed so that Apache calls them while it is
+ * processing its config files. This allows configuration info to be
+ * copied into a jk_server_conf_t object, which is then used for request
+ * filtering/processing.
+ *
+ * See jk_cmds definition below for explanations of these options.
+ */
+
+/*
+ * JkMountCopy directive handling
+ *
+ * JkMountCopy On/Off/All
+ */
+
+static const char *jk_set_mountcopy(cmd_parms * cmd,
+ void *dummy, char *mount_copy)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+ if (! strcasecmp(mount_copy, "all")) {
+ jk_mount_copy_all = JK_TRUE;
+ }
+ else if (strcasecmp(mount_copy, "on") && strcasecmp(mount_copy, "off")) {
+ return "JkMountCopy must be All, On or Off";
+ }
+ else {
+ conf->mountcopy = strcasecmp(mount_copy, "off") ? JK_TRUE : JK_FALSE;
+ }
+
+ return NULL;
+}
+
+/*
+ * JkMount directive handling
+ *
+ * JkMount URI(context) worker
+ */
+
+static const char *jk_mount_context(cmd_parms * cmd,
+ void *dummy,
+ char *context,
+ char *worker)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+ const char *c, *w;
+
+ if (worker != NULL && cmd->path == NULL ) {
+ c = context;
+ w = worker;
+ }
+ else if (worker == NULL && cmd->path != NULL) {
+ c = cmd->path;
+ w = context;
+ }
+ else {
+ if (worker == NULL)
+ return "JkMount needs a path when not defined in a location";
+ else
+ return "JkMount can not have a path when defined in a location";
+ }
+
+ if (c[0] != '/')
+ return "JkMount context should start with /";
+
+ if (!conf->uri_to_context) {
+ if (!jk_map_alloc(&(conf->uri_to_context))) {
+ return "JkMount Memory error";
+ }
+ }
+ /*
+ * Add the new worker to the alias map.
+ */
+ jk_map_put(conf->uri_to_context, c, w, NULL);
+ return NULL;
+}
+
+/*
+ * JkUnMount directive handling
+ *
+ * JkUnMount URI(context) worker
+ */
+
+static const char *jk_unmount_context(cmd_parms * cmd,
+ void *dummy,
+ const char *context,
+ const char *worker)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+ char *uri;
+ const char *c, *w;
+
+ if (worker != NULL && cmd->path == NULL ) {
+ c = context;
+ w = worker;
+ }
+ else if (worker == NULL && cmd->path != NULL) {
+ c = cmd->path;
+ w = context;
+ }
+ else {
+ if (worker == NULL)
+ return "JkUnMount needs a path when not defined in a location";
+ else
+ return "JkUnMount can not have a path when defined in a location";
+ }
+ if (c[0] != '/')
+ return "JkUnMount context should start with /";
+ uri = ap_pstrcat(cmd->temp_pool, "!", c, NULL);
+
+ if (!conf->uri_to_context) {
+ if (!jk_map_alloc(&(conf->uri_to_context))) {
+ return "JkUnMount Memory error";
+ }
+ }
+ /*
+ * Add the new worker to the alias map.
+ */
+ jk_map_put(conf->uri_to_context, uri, w, NULL);
+ return NULL;
+}
+
+/*
+ * JkWorkersFile Directive Handling
+ *
+ * JkWorkersFile file
+ */
+
+static const char *jk_set_worker_file(cmd_parms * cmd,
+ void *dummy, char *worker_file)
+{
+ struct stat statbuf;
+
+ if (jk_worker_file != NULL)
+ return "JkWorkersFile only allowed once";
+
+ /* we need an absolute path */
+ jk_worker_file = ap_server_root_relative(cmd->pool, worker_file);
+
+#ifdef CHROOTED_APACHE
+ ap_server_strip_chroot(jk_worker_file, 0);
+#endif
+
+ if (jk_worker_file == worker_file)
+ jk_worker_file = ap_pstrdup(cmd->pool, worker_file);
+
+ if (jk_worker_file == NULL)
+ return "JkWorkersFile file name invalid";
+
+ if (stat(jk_worker_file, &statbuf) == -1)
+ return "JkWorkersFile: Can't find the workers file specified";
+
+ return NULL;
+}
+
+/*
+ * JkMountFile Directive Handling
+ *
+ * JkMountFile file
+ */
+
+static const char *jk_set_mount_file(cmd_parms * cmd,
+ void *dummy, char *mount_file)
+{
+ server_rec *s = cmd->server;
+ struct stat statbuf;
+
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ /* we need an absolute path (ap_server_root_relative does the ap_pstrdup) */
+ conf->mount_file = ap_server_root_relative(cmd->pool, mount_file);
+
+#ifdef CHROOTED_APACHE
+ ap_server_strip_chroot(conf->mount_file, 0);
+#endif
+
+ if (conf->mount_file == NULL)
+ return "JkMountFile file name invalid";
+
+ if (stat(conf->mount_file, &statbuf) == -1)
+ return "JkMountFile: Can't find the mount file specified";
+
+ if (!conf->uri_to_context) {
+ if (!jk_map_alloc(&(conf->uri_to_context))) {
+ return "JkMountFile Memory error";
+ }
+ }
+
+ return NULL;
+}
+
+/*
+ * JkMountFileReload Directive Handling
+ *
+ * JkMountFileReload seconds
+ */
+
+static const char *jk_set_mount_file_reload(cmd_parms * cmd,
+ void *dummy, char *mount_file_reload)
+{
+ server_rec *s = cmd->server;
+ int interval;
+
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ interval = atoi(mount_file_reload);
+ if (interval < 0) {
+ interval = 0;
+ }
+
+ conf->mount_file_reload = interval;
+
+ return NULL;
+}
+
+/*
+ * JkLogFile Directive Handling
+ *
+ * JkLogFile file
+ */
+
+static const char *jk_set_log_file(cmd_parms * cmd,
+ void *dummy, char *log_file)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ /* we need an absolute path */
+ if (*log_file != '|') {
+ conf->log_file = ap_server_root_relative(cmd->pool, log_file);
+
+#ifdef CHROOTED_APACHE
+ ap_server_strip_chroot(conf->log_file, 0);
+#endif
+
+ }
+ else
+ conf->log_file = ap_pstrdup(cmd->pool, log_file);
+
+ if (conf->log_file == NULL)
+ return "JkLogFile file name invalid";
+
+ return NULL;
+}
+
+/*
+ * JkShmFile Directive Handling
+ *
+ * JkShmFile file
+ */
+
+static const char *jk_set_shm_file(cmd_parms * cmd,
+ void *dummy, char *shm_file)
+{
+
+ /* we need an absolute path */
+ jk_shm_file = ap_server_root_relative(cmd->pool, shm_file);
+
+#ifdef CHROOTED_APACHE
+ ap_server_strip_chroot(jk_shm_file, 0);
+#endif
+
+ if (jk_shm_file == shm_file)
+ jk_shm_file = ap_pstrdup(cmd->pool, shm_file);
+
+ if (jk_shm_file == NULL)
+ return "JkShmFile file name invalid";
+
+ return NULL;
+}
+
+/*
+ * JkShmSize Directive Handling
+ *
+ * JkShmSize size in kilobytes
+ */
+
+static const char *jk_set_shm_size(cmd_parms * cmd,
+ void *dummy, const char *shm_size)
+{
+ int sz = 0;
+ /* we need an absolute path */
+ sz = atoi(shm_size) * 1024;
+ if (sz < JK_SHM_DEF_SIZE)
+ sz = JK_SHM_DEF_SIZE;
+ else
+ sz = JK_SHM_ALIGN(sz);
+ jk_shm_size = (size_t)sz;
+ return NULL;
+}
+
+/*
+ * JkLogLevel Directive Handling
+ *
+ * JkLogLevel debug/info/request/error/emerg
+ */
+
+static const char *jk_set_log_level(cmd_parms * cmd,
+ void *dummy, char *log_level)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ conf->log_level = jk_parse_log_level(log_level);
+
+ return NULL;
+}
+
+/*
+ * JkLogStampFormat Directive Handling
+ *
+ * JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
+ */
+
+static const char *jk_set_log_fmt(cmd_parms * cmd,
+ void *dummy, char *log_format)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ conf->stamp_format_string = ap_pstrdup(cmd->pool, log_format);
+
+ return NULL;
+}
+
+/*
+ * JkAutoAlias Directive Handling
+ *
+ * JkAutoAlias application directory
+ */
+
+static const char *jk_set_auto_alias(cmd_parms * cmd,
+ void *dummy, char *directory)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ conf->alias_dir = directory;
+
+ if (conf->alias_dir == NULL)
+ return "JkAutoAlias directory invalid";
+
+ return NULL;
+}
+
+/*
+ * JkStripSession directive handling
+ *
+ * JkStripSession On/Off
+ */
+
+static const char *jk_set_strip_session(cmd_parms * cmd, void *dummy, int flag)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ /* Set up our value */
+ conf->strip_session = flag ? JK_TRUE : JK_FALSE;
+
+ return NULL;
+}
+
+/*****************************************************************
+ *
+ * Actually logging.
+ */
+
+typedef const char *(*item_key_func) (request_rec *, char *);
+
+typedef struct
+{
+ item_key_func func;
+ char *arg;
+} request_log_format_item;
+
+static const char *process_item(request_rec * r,
+ request_log_format_item * item)
+{
+ const char *cp;
+
+ cp = (*item->func) (r, item->arg);
+ return cp ? cp : "-";
+}
+
+static void request_log_transaction(request_rec * r, jk_server_conf_t * conf)
+{
+ request_log_format_item *items;
+ char *str, *s;
+ int i;
+ int len = 0;
+ const char **strs;
+ int *strl;
+ array_header *format = conf->format;
+
+ strs = ap_palloc(r->pool, sizeof(char *) * (format->nelts));
+ strl = ap_palloc(r->pool, sizeof(int) * (format->nelts));
+ items = (request_log_format_item *) format->elts;
+ for (i = 0; i < format->nelts; ++i) {
+ strs[i] = process_item(r, &items[i]);
+ }
+ for (i = 0; i < format->nelts; ++i) {
+ len += strl[i] = strlen(strs[i]);
+ }
+ str = ap_palloc(r->pool, len + 1);
+ for (i = 0, s = str; i < format->nelts; ++i) {
+ memcpy(s, strs[i], strl[i]);
+ s += strl[i];
+ }
+ *s = 0;
+ jk_log(conf->log, JK_LOG_REQUEST, "%s", str);
+}
+
+/*****************************************************************
+ *
+ * Parsing the log format string
+ */
+
+static char *format_integer(pool * p, int i)
+{
+ return ap_psprintf(p, "%d", i);
+}
+
+static char *pfmt(pool * p, int i)
+{
+ if (i <= 0) {
+ return "-";
+ }
+ else {
+ return format_integer(p, i);
+ }
+}
+
+static const char *constant_item(request_rec * dummy, char *stuff)
+{
+ return stuff;
+}
+
+static const char *log_worker_name(request_rec * r, char *a)
+{
+ return ap_table_get(r->notes, JK_NOTE_WORKER_NAME);
+}
+
+static const char *log_worker_route(request_rec * r, char *a)
+{
+ return ap_table_get(r->notes, JK_NOTE_WORKER_ROUTE);
+}
+
+static const char *log_request_duration(request_rec * r, char *a)
+{
+ return ap_table_get(r->notes, JK_NOTE_REQUEST_DURATION);
+}
+
+static const char *log_request_line(request_rec * r, char *a)
+{
+ /* NOTE: If the original request contained a password, we
+ * re-write the request line here to contain XXXXXX instead:
+ * (note the truncation before the protocol string for HTTP/0.9 requests)
+ * (note also that r->the_request contains the unmodified request)
+ */
+ return (r->parsed_uri.password) ? ap_pstrcat(r->pool, r->method, " ",
+ ap_unparse_uri_components(r->
+ pool,
+ &r->
+ parsed_uri,
+ 0),
+ r->assbackwards ? NULL : " ",
+ r->protocol, NULL)
+ : r->the_request;
+}
+
+/* These next two routines use the canonical name:port so that log
+ * parsers don't need to duplicate all the vhost parsing crud.
+ */
+static const char *log_virtual_host(request_rec * r, char *a)
+{
+ return r->server->server_hostname;
+}
+
+static const char *log_server_port(request_rec * r, char *a)
+{
+ return ap_psprintf(r->pool, "%u",
+ r->server->port ? r->server->
+ port : ap_default_port(r));
+}
+
+/* This respects the setting of UseCanonicalName so that
+ * the dynamic mass virtual hosting trick works better.
+ */
+static const char *log_server_name(request_rec * r, char *a)
+{
+ return ap_get_server_name(r);
+}
+
+static const char *log_request_uri(request_rec * r, char *a)
+{
+ return r->uri;
+}
+static const char *log_request_method(request_rec * r, char *a)
+{
+ return r->method;
+}
+
+static const char *log_request_protocol(request_rec * r, char *a)
+{
+ return r->protocol;
+}
+static const char *log_request_query(request_rec * r, char *a)
+{
+ return (r->args != NULL) ? ap_pstrcat(r->pool, "?", r->args, NULL)
+ : "";
+}
+static const char *log_status(request_rec * r, char *a)
+{
+ return pfmt(r->pool, r->status);
+}
+
+static const char *clf_log_bytes_sent(request_rec * r, char *a)
+{
+ if (!r->sent_bodyct) {
+ return "-";
+ }
+ else {
+ long int bs;
+ ap_bgetopt(r->connection->client, BO_BYTECT, &bs);
+ return ap_psprintf(r->pool, "%ld", bs);
+ }
+}
+
+static const char *log_bytes_sent(request_rec * r, char *a)
+{
+ if (!r->sent_bodyct) {
+ return "0";
+ }
+ else {
+ long int bs;
+ ap_bgetopt(r->connection->client, BO_BYTECT, &bs);
+ return ap_psprintf(r->pool, "%ld", bs);
+ }
+}
+
+static struct log_item_list
+{
+ char ch;
+ item_key_func func;
+} log_item_keys[] = {
+
+ {
+ 'T', log_request_duration}, {
+ 'r', log_request_line}, {
+ 'U', log_request_uri}, {
+ 's', log_status}, {
+ 'b', clf_log_bytes_sent}, {
+ 'B', log_bytes_sent}, {
+ 'V', log_server_name}, {
+ 'v', log_virtual_host}, {
+ 'p', log_server_port}, {
+ 'H', log_request_protocol}, {
+ 'm', log_request_method}, {
+ 'q', log_request_query}, {
+ 'w', log_worker_name}, {
+ 'R', log_worker_route}, {
+ '\0'}
+};
+
+static struct log_item_list *find_log_func(char k)
+{
+ int i;
+
+ for (i = 0; log_item_keys[i].ch; ++i)
+ if (k == log_item_keys[i].ch) {
+ return &log_item_keys[i];
+ }
+
+ return NULL;
+}
+
+static char *parse_request_log_misc_string(pool * p,
+ request_log_format_item * it,
+ const char **sa)
+{
+ const char *s;
+ char *d;
+
+ it->func = constant_item;
+
+ s = *sa;
+ while (*s && *s != '%') {
+ s++;
+ }
+ /*
+ * This might allocate a few chars extra if there's a backslash
+ * escape in the format string.
+ */
+ it->arg = ap_palloc(p, s - *sa + 1);
+
+ d = it->arg;
+ s = *sa;
+ while (*s && *s != '%') {
+ if (*s != '\\') {
+ *d++ = *s++;
+ }
+ else {
+ s++;
+ switch (*s) {
+ case '\\':
+ *d++ = '\\';
+ s++;
+ break;
+ case 'n':
+ *d++ = '\n';
+ s++;
+ break;
+ case 't':
+ *d++ = '\t';
+ s++;
+ break;
+ default:
+ /* copy verbatim */
+ *d++ = '\\';
+ /*
+ * Allow the loop to deal with this *s in the normal
+ * fashion so that it handles end of string etc.
+ * properly.
+ */
+ break;
+ }
+ }
+ }
+ *d = '\0';
+
+ *sa = s;
+ return NULL;
+}
+
+static char *parse_request_log_item(pool * p,
+ request_log_format_item * it,
+ const char **sa)
+{
+ const char *s = *sa;
+ struct log_item_list *l;
+
+ if (*s != '%') {
+ return parse_request_log_misc_string(p, it, sa);
+ }
+
+ ++s;
+ it->arg = ""; /* For safety's sake... */
+
+ l = find_log_func(*s++);
+ if (!l) {
+ char dummy[2];
+
+ dummy[0] = s[-1];
+ dummy[1] = '\0';
+ return ap_pstrcat(p, "Unrecognized JkRequestLogFormat directive %",
+ dummy, NULL);
+ }
+ it->func = l->func;
+ *sa = s;
+ return NULL;
+}
+
+static array_header *parse_request_log_string(pool * p, const char *s,
+ const char **err)
+{
+ array_header *a = ap_make_array(p, 0, sizeof(request_log_format_item));
+ char *res;
+
+ while (*s) {
+ if ((res =
+ parse_request_log_item(p,
+ (request_log_format_item *)
+ ap_push_array(a), &s))) {
+ *err = res;
+ return NULL;
+ }
+ }
+
+ return a;
+}
+
+/*
+ * JkRequestLogFormat Directive Handling
+ *
+ * JkRequestLogFormat format string
+ *
+ * %b - Bytes sent, excluding HTTP headers. In CLF format
+ * %B - Bytes sent, excluding HTTP headers.
+ * %H - The request protocol
+ * %m - The request method
+ * %p - The canonical Port of the server serving the request
+ * %q - The query string (prepended with a ? if a query string exists,
+ * otherwise an empty string)
+ * %r - First line of request
+ * %s - request HTTP status code
+ * %T - Requset duration, elapsed time to handle request in seconds '.' micro seconds
+ * %U - The URL path requested, not including any query string.
+ * %v - The canonical ServerName of the server serving the request.
+ * %V - The server name according to the UseCanonicalName setting.
+ * %w - Tomcat worker name
+ */
+
+static const char *jk_set_request_log_format(cmd_parms * cmd,
+ void *dummy, char *format)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ conf->format_string = ap_pstrdup(cmd->pool, format);
+
+ return NULL;
+}
+
+/*
+ * JkWorkerIndicator Directive Handling
+ *
+ * JkWorkerIndicator JkWorker
+ */
+
+static const char *jk_set_worker_indicator(cmd_parms * cmd,
+ void *dummy, char *indicator)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ conf->worker_indicator = ap_pstrdup(cmd->pool, indicator);
+
+ return NULL;
+}
+
+/*
+ * Directives Handling for setting various environment names
+ * used to overwrite the following request information:
+ * - remote_addr
+ * - remote_port
+ * - remote_host
+ * - remote_user
+ * - auth_type
+ * - server_name
+ * - server_port
+ */
+static const char *jk_set_remote_addr_indicator(cmd_parms * cmd,
+ void *dummy, char *indicator)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config, &jk_module);
+ conf->remote_addr_indicator = ap_pstrdup(cmd->pool, indicator);
+ return NULL;
+}
+
+static const char *jk_set_remote_port_indicator(cmd_parms * cmd,
+ void *dummy, char *indicator)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config, &jk_module);
+ conf->remote_port_indicator = ap_pstrdup(cmd->pool, indicator);
+ return NULL;
+}
+
+static const char *jk_set_remote_host_indicator(cmd_parms * cmd,
+ void *dummy, char *indicator)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config, &jk_module);
+ conf->remote_host_indicator = ap_pstrdup(cmd->pool, indicator);
+ return NULL;
+}
+
+static const char *jk_set_remote_user_indicator(cmd_parms * cmd,
+ void *dummy, char *indicator)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config, &jk_module);
+ conf->remote_user_indicator = ap_pstrdup(cmd->pool, indicator);
+ return NULL;
+}
+
+static const char *jk_set_auth_type_indicator(cmd_parms * cmd,
+ void *dummy, char *indicator)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config, &jk_module);
+ conf->auth_type_indicator = ap_pstrdup(cmd->pool, indicator);
+ return NULL;
+}
+
+static const char *jk_set_local_name_indicator(cmd_parms * cmd,
+ void *dummy, char *indicator)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config, &jk_module);
+ conf->local_name_indicator = ap_pstrdup(cmd->pool, indicator);
+ return NULL;
+}
+
+static const char *jk_set_local_port_indicator(cmd_parms * cmd,
+ void *dummy, char *indicator)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config, &jk_module);
+ conf->local_port_indicator = ap_pstrdup(cmd->pool, indicator);
+ return NULL;
+}
+
+/*
+ * JkExtractSSL Directive Handling
+ *
+ * JkExtractSSL On/Off
+ */
+
+static const char *jk_set_enable_ssl(cmd_parms * cmd, void *dummy, int flag)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ /* Set up our value */
+ conf->ssl_enable = flag ? JK_TRUE : JK_FALSE;
+ return NULL;
+}
+
+/*
+ * JkHTTPSIndicator Directive Handling
+ *
+ * JkHTTPSIndicator HTTPS
+ */
+
+static const char *jk_set_https_indicator(cmd_parms * cmd,
+ void *dummy, char *indicator)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ conf->https_indicator = ap_pstrdup(cmd->pool, indicator);
+ return NULL;
+}
+
+/*
+ * JkCERTSIndicator Directive Handling
+ *
+ * JkCERTSIndicator SSL_CLIENT_CERT
+ */
+
+static const char *jk_set_certs_indicator(cmd_parms * cmd,
+ void *dummy, char *indicator)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ conf->certs_indicator = ap_pstrdup(cmd->pool, indicator);
+ return NULL;
+}
+
+/*
+ * JkCIPHERIndicator Directive Handling
+ *
+ * JkCIPHERIndicator SSL_CIPHER
+ */
+
+static const char *jk_set_cipher_indicator(cmd_parms * cmd,
+ void *dummy, char *indicator)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ conf->cipher_indicator = ap_pstrdup(cmd->pool, indicator);
+ return NULL;
+}
+
+/*
+ * JkCERTCHAINPrefix Directive Handling
+ *
+ * JkCERTCHAINPrefix SSL_CLIENT_CERT_CHAIN_
+ */
+
+static const char *jk_set_certchain_prefix(cmd_parms * cmd,
+ void *dummy, const char *prefix)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ conf->certchain_prefix = ap_pstrdup(cmd->pool, prefix);
+
+ return NULL;
+}
+
+/*
+ * JkSESSIONIndicator Directive Handling
+ *
+ * JkSESSIONIndicator SSL_SESSION_ID
+ */
+
+static const char *jk_set_session_indicator(cmd_parms * cmd,
+ void *dummy, char *indicator)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ conf->session_indicator = ap_pstrdup(cmd->pool, indicator);
+ return NULL;
+}
+
+/*
+ * JkKEYSIZEIndicator Directive Handling
+ *
+ * JkKEYSIZEIndicator SSL_CIPHER_USEKEYSIZE
+ */
+
+static const char *jk_set_key_size_indicator(cmd_parms * cmd,
+ void *dummy, char *indicator)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ conf->key_size_indicator = ap_pstrdup(cmd->pool, indicator);
+ return NULL;
+}
+
+/*
+ * JkOptions Directive Handling
+ *
+ *
+ * +ForwardSSLKeySize => Forward SSL Key Size, to follow 2.3 specs but may broke old TC 3.2
+ * -ForwardSSLKeySize => Don't Forward SSL Key Size, will make mod_jk works with all TC release
+ * ForwardURICompat => Forward URI normally, less spec compliant but mod_rewrite compatible (old TC)
+ * ForwardURICompatUnparsed => Forward URI as unparsed, spec compliant but broke mod_rewrite (old TC)
+ * ForwardURIEscaped => Forward URI escaped and Tomcat (3.3 rc2) stuff will do the decoding part
+ * ForwardDirectories => Forward all directory requests with no index files to Tomcat
+ * +ForwardSSLCertChain => Forward SSL certificate chain
+ * -ForwardSSLCertChain => Don't forward SSL certificate chain
+ */
+
+const char *jk_set_options(cmd_parms * cmd, void *dummy, const char *line)
+{
+ int opt = 0;
+ int mask = 0;
+ char action;
+ char *w;
+
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ while (line[0] != 0) {
+ w = ap_getword_conf(cmd->pool, &line);
+ action = 0;
+
+ if (*w == '+' || *w == '-') {
+ action = *(w++);
+ }
+
+ mask = 0;
+
+ if (action == '-' && !strncasecmp(w, "ForwardURI", strlen("ForwardURI")))
+ return ap_pstrcat(cmd->pool, "JkOptions: Illegal option '-", w,
+ "': ForwardURI* options can not be disabled", NULL);
+
+ if (!strcasecmp(w, "ForwardURICompat")) {
+ opt = JK_OPT_FWDURICOMPAT;
+ mask = JK_OPT_FWDURIMASK;
+ }
+ else if (!strcasecmp(w, "ForwardURICompatUnparsed")) {
+ opt = JK_OPT_FWDURICOMPATUNPARSED;
+ mask = JK_OPT_FWDURIMASK;
+ }
+ else if (!strcasecmp(w, "ForwardURIEscaped")) {
+ opt = JK_OPT_FWDURIESCAPED;
+ mask = JK_OPT_FWDURIMASK;
+ }
+ else if (!strcasecmp(w, "ForwardURIProxy")) {
+ opt = JK_OPT_FWDURIPROXY;
+ mask = JK_OPT_FWDURIMASK;
+ }
+ else if (!strcasecmp(w, "ForwardDirectories")) {
+ opt = JK_OPT_FWDDIRS;
+ }
+ else if (!strcasecmp(w, "ForwardLocalAddress")) {
+ opt = JK_OPT_FWDLOCAL;
+ }
+ else if (!strcasecmp(w, "FlushPackets")) {
+ opt = JK_OPT_FLUSHPACKETS;
+ }
+ else if (!strcasecmp(w, "FlushHeader")) {
+ opt = JK_OPT_FLUSHEADER;
+ }
+ else if (!strcasecmp(w, "DisableReuse")) {
+ opt = JK_OPT_DISABLEREUSE;
+ }
+ else if (!strcasecmp(w, "ForwardSSLCertChain")) {
+ opt = JK_OPT_FWDCERTCHAIN;
+ }
+ else if (!strcasecmp(w, "ForwardKeySize")) {
+ opt = JK_OPT_FWDKEYSIZE;
+ }
+ else if (!strcasecmp(w, "RejectUnsafeURI")) {
+ opt = JK_OPT_REJECTUNSAFE;
+ }
+ else
+ return ap_pstrcat(cmd->pool, "JkOptions: Illegal option '", w,
+ "'", NULL);
+
+ conf->options &= ~mask;
+
+ if (action == '-') {
+ conf->exclude_options |= opt;
+ }
+ else if (action == '+') {
+ conf->options |= opt;
+ }
+ else { /* for now +Opt == Opt */
+ conf->options |= opt;
+ }
+ }
+ return NULL;
+}
+
+/*
+ * JkEnvVar Directive Handling
+ *
+ * JkEnvVar MYOWNDIR
+ */
+
+static const char *jk_add_env_var(cmd_parms * cmd,
+ void *dummy,
+ char *env_name, char *default_value)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ conf->envvars_has_own = JK_TRUE;
+ if (!conf->envvars) {
+ conf->envvars = ap_make_table(cmd->pool, 0);
+ conf->envvars_def = ap_make_table(cmd->pool, 0);
+ conf->envvar_items = ap_make_array(cmd->pool, 0,
+ sizeof(envvar_item));
+ }
+
+ /* env_name is mandatory, default_value is optional.
+ * No value means send the attribute only, if the env var is set during runtime.
+ */
+ ap_table_setn(conf->envvars, env_name, default_value ? default_value : "");
+ ap_table_setn(conf->envvars_def, env_name, default_value ? "1" : "0");
+
+ return NULL;
+}
+
+/*
+ * JkWorkerProperty Directive Handling
+ *
+ * JkWorkerProperty name=value
+ */
+
+static const char *jk_set_worker_property(cmd_parms * cmd,
+ void *dummy,
+ const char *line)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ if (!jk_worker_properties)
+ jk_map_alloc(&jk_worker_properties);
+ if (jk_map_read_property(jk_worker_properties, NULL, line,
+ JK_MAP_HANDLE_DUPLICATES, conf->log) == JK_FALSE)
+ return ap_pstrcat(cmd->temp_pool, "Invalid JkWorkerProperty ", line, NULL);
+
+ return NULL;
+}
+
+static const command_rec jk_cmds[] = {
+ /*
+ * JkWorkersFile specifies a full path to the location of the worker
+ * properties file.
+ *
+ * This file defines the different workers used by apache to redirect
+ * servlet requests.
+ */
+ {"JkWorkersFile", jk_set_worker_file, NULL, RSRC_CONF, TAKE1,
+ "The name of a worker file for the Tomcat servlet containers"},
+
+ /*
+ * JkMountFile specifies a full path to the location of the
+ * uriworker properties file.
+ *
+ * This file defines the different mapping for workers used by apache
+ * to redirect servlet requests.
+ */
+ {"JkMountFile", jk_set_mount_file, NULL, RSRC_CONF, TAKE1,
+ "The name of a mount file for the Tomcat servlet uri mappings"},
+
+ /*
+ * JkMountFileReload specifies the reload check interval for the
+ * uriworker properties file.
+ *
+ * Default value is: JK_URIMAP_DEF_RELOAD
+ */
+ {"JkMountFileReload", jk_set_mount_file_reload, NULL, RSRC_CONF, TAKE1,
+ "The reload check interval of the mount file"},
+
+ /*
+ * JkMount mounts a url prefix to a worker (the worker need to be
+ * defined in the worker properties file.
+ */
+ {"JkMount", jk_mount_context, NULL, RSRC_CONF|ACCESS_CONF, TAKE12,
+ "A mount point from a context to a servlet-engine worker"},
+
+ /*
+ * JkUnMount unmounts a url prefix to a worker (the worker need to be
+ * defined in the worker properties file.
+ */
+ {"JkUnMount", jk_unmount_context, NULL, RSRC_CONF|ACCESS_CONF, TAKE12,
+ "A no mount point from a context to a servlet-engine worker"},
+
+ /*
+ * JkMountCopy specifies if mod_jk should copy the mount points
+ * from the main server to the virtual servers.
+ */
+ {"JkMountCopy", jk_set_mountcopy, NULL, RSRC_CONF, TAKE1,
+ "Should the base server mounts be copied to the virtual server"},
+
+ /*
+ * JkStripSession specifies if mod_jk should strip the ;jsessionid
+ * from the unmapped urls
+ */
+ {"JkStripSession", jk_set_strip_session, NULL, RSRC_CONF, FLAG,
+ "Should the server strip the jsessionid from unmapped URLs"},
+
+ /*
+ * JkLogFile & JkLogLevel specifies to where should the plugin log
+ * its information and how much.
+ * JkLogStampFormat specify the time-stamp to be used on log
+ */
+ {"JkLogFile", jk_set_log_file, NULL, RSRC_CONF, TAKE1,
+ "Full path to the mod_jk module log file"},
+ {"JkShmFile", jk_set_shm_file, NULL, RSRC_CONF, TAKE1,
+ "Full path to the mod_jk module shared memory file"},
+ {"JkShmSize", jk_set_shm_size, NULL, RSRC_CONF, TAKE1,
+ "Size of the shared memory file in KBytes"},
+ {"JkLogLevel", jk_set_log_level, NULL, RSRC_CONF, TAKE1,
+ "The mod_jk module log level, can be debug, info, request, error, or emerg"},
+ {"JkLogStampFormat", jk_set_log_fmt, NULL, RSRC_CONF, TAKE1,
+ "The mod_jk module log format, follow strftime syntax"},
+ {"JkRequestLogFormat", jk_set_request_log_format, NULL, RSRC_CONF, TAKE1,
+ "The mod_jk module request log format string"},
+
+ /*
+ * Automatically Alias webapp context directories into the Apache
+ * document space.
+ */
+ {"JkAutoAlias", jk_set_auto_alias, NULL, RSRC_CONF, TAKE1,
+ "The mod_jk module automatic context apache alias directory"},
+
+ /*
+ * Enable worker name to be set in an environment variable.
+ * This way one can use LocationMatch together with mod_env,
+ * mod_setenvif and mod_rewrite to set the target worker.
+ * Use this in combination with SetHandler jakarta-servlet to
+ * make mod_jk the handler for the request.
+ *
+ */
+ {"JkWorkerIndicator", jk_set_worker_indicator, NULL, RSRC_CONF, TAKE1,
+ "Name of the Apache environment that contains the worker name"},
+
+ /*
+ * Environment variables used to overwrite the following
+ * request information which gets forwarded:
+ * - remote_addr
+ * - remote_port
+ * - remote_host
+ * - remote_user
+ * - auth_type
+ * - server_name
+ * - server_port
+ */
+ {"JkRemoteAddrIndicator", jk_set_remote_addr_indicator, NULL, RSRC_CONF, TAKE1,
+ "Name of the Apache environment that contains the remote address"},
+ {"JkRemotePortIndicator", jk_set_remote_port_indicator, NULL, RSRC_CONF, TAKE1,
+ "Name of the Apache environment that contains the remote port"},
+ {"JkRemoteHostIndicator", jk_set_remote_host_indicator, NULL, RSRC_CONF, TAKE1,
+ "Name of the Apache environment that contains the remote host name"},
+ {"JkRemoteUserIndicator", jk_set_remote_user_indicator, NULL, RSRC_CONF, TAKE1,
+ "Name of the Apache environment that contains the remote user name"},
+ {"JkAuthTypeIndicator", jk_set_auth_type_indicator, NULL, RSRC_CONF, TAKE1,
+ "Name of the Apache environment that contains the type of authentication"},
+ {"JkLocalNameIndicator", jk_set_local_name_indicator, NULL, RSRC_CONF, TAKE1,
+ "Name of the Apache environment that contains the local name"},
+ {"JkLocalPortIndicator", jk_set_local_port_indicator, NULL, RSRC_CONF, TAKE1,
+ "Name of the Apache environment that contains the local port"},
+
+ /*
+ * Apache has multiple SSL modules (for example apache_ssl, stronghold
+ * IHS ...). Each of these can have a different SSL environment names
+ * The following properties let the administrator specify the envoiroment
+ * variables names.
+ *
+ * HTTPS - indication for SSL
+ * CERTS - Base64-Der-encoded client certificates.
+ * CIPHER - A string specifing the ciphers suite in use.
+ * SESSION - A string specifing the current SSL session.
+ * KEYSIZE - Size of Key used in dialogue (#bits are secure)
+ */
+ {"JkHTTPSIndicator", jk_set_https_indicator, NULL, RSRC_CONF, TAKE1,
+ "Name of the Apache environment that contains SSL indication"},
+ {"JkCERTSIndicator", jk_set_certs_indicator, NULL, RSRC_CONF, TAKE1,
+ "Name of the Apache environment that contains SSL client certificates"},
+ {"JkCIPHERIndicator", jk_set_cipher_indicator, NULL, RSRC_CONF, TAKE1,
+ "Name of the Apache environment that contains SSL client cipher"},
+ {"JkCERTCHAINPrefix", jk_set_certchain_prefix, NULL, RSRC_CONF, TAKE1,
+ "Name of the Apache environment (prefix) that contains SSL client chain certificates"},
+ {"JkSESSIONIndicator", jk_set_session_indicator, NULL, RSRC_CONF, TAKE1,
+ "Name of the Apache environment that contains SSL session"},
+ {"JkKEYSIZEIndicator", jk_set_key_size_indicator, NULL, RSRC_CONF, TAKE1,
+ "Name of the Apache environment that contains SSL key size in use"},
+ {"JkExtractSSL", jk_set_enable_ssl, NULL, RSRC_CONF, FLAG,
+ "Turns on SSL processing and information gathering by mod_jk"},
+
+ /*
+ * Options to tune mod_jk configuration
+ * for now we understand :
+ * +ForwardSSLKeySize => Forward SSL Key Size, to follow 2.3 specs but may broke old TC 3.2
+ * -ForwardSSLKeySize => Don't Forward SSL Key Size, will make mod_jk works with all TC release
+ * ForwardURICompat => Forward URI normally, less spec compliant but mod_rewrite compatible (old TC)
+ * ForwardURICompatUnparsed => Forward URI as unparsed, spec compliant but broke mod_rewrite (old TC)
+ * ForwardURIEscaped => Forward URI escaped and Tomcat (3.3 rc2) stuff will do the decoding part
+ * +ForwardSSLCertChain => Forward SSL certificate chain
+ * -ForwardSSLCertChain => Don't forward SSL certificate chain
+ */
+ {"JkOptions", jk_set_options, NULL, RSRC_CONF, RAW_ARGS,
+ "Set one of more options to configure the mod_jk module"},
+
+ /*
+ * JkEnvVar let user defines envs var passed from WebServer to
+ * Servlet Engine
+ */
+ {"JkEnvVar", jk_add_env_var, NULL, RSRC_CONF, TAKE12,
+ "Adds a name of environment variable and an optional value "
+ "that should be sent to servlet-engine"},
+
+ {"JkWorkerProperty", jk_set_worker_property, NULL, RSRC_CONF, RAW_ARGS,
+ "Set workers.properties formated directive"},
+
+ {NULL}
+};
+
+/* ====================================================================== */
+/* The JK module handlers */
+/* ====================================================================== */
+
+/*
+ * Called to handle a single request.
+ */
+static int jk_handler(request_rec * r)
+{
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(r->server->
+ module_config,
+ &jk_module);
+ /* Retrieve the worker name stored by jk_translate() */
+ const char *worker_name = ap_table_get(r->notes, JK_NOTE_WORKER_NAME);
+ int rc;
+
+ JK_TRACE_ENTER(conf->log);
+
+ if (ap_table_get(r->subprocess_env, "no-jk")) {
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "Into handler no-jk env var detected for uri=%s, declined",
+ r->uri);
+ JK_TRACE_EXIT(conf->log);
+ return DECLINED;
+ }
+
+ if (r->proxyreq) {
+ jk_log(conf->log, JK_LOG_ERROR,
+ "Request has proxyreq flag set in mod_jk handler - aborting.");
+ JK_TRACE_EXIT(conf->log);
+ return HTTP_INTERNAL_SERVER_ERROR;
+ }
+
+ /* Set up r->read_chunked flags for chunked encoding, if present */
+ if ((rc = ap_setup_client_block(r, REQUEST_CHUNKED_DECHUNK))) {
+ jk_log(conf->log, JK_LOG_ERROR,
+ "Could not setup client_block for chunked encoding - aborting");
+ JK_TRACE_EXIT(conf->log);
+ return rc;
+ }
+
+ if (worker_name == NULL && r->handler && !strcmp(r->handler, JK_HANDLER)) {
+ /* we may be here because of a manual directive ( that overrides
+ * translate and
+ * sets the handler directly ). We still need to know the worker.
+ */
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "Retrieving environment %s", conf->worker_indicator);
+ worker_name = (char *)ap_table_get(r->subprocess_env, conf->worker_indicator);
+ if (worker_name) {
+ /* The JkWorkerIndicator environment variable has
+ * been used to explicitely set the worker without JkMount.
+ * This is useful in combination with LocationMatch or mod_rewrite.
+ */
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "Retrieved worker (%s) from env %s for %s",
+ worker_name, conf->worker_indicator, r->uri);
+ }
+ else if (worker_env.num_of_workers == 1) {
+ /* We have a single worker ( the common case ).
+ * ( lb is a bit special, it should count as a single worker but
+ * I'm not sure how ). We also have a manual config directive that
+ * explicitely give control to us.
+ */
+ worker_name = worker_env.worker_list[0];
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "Single worker (%s) configuration for %s",
+ worker_name, r->uri);
+ }
+ else if (worker_env.num_of_workers) {
+ worker_name = worker_env.worker_list[0];
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "Using first worker (%s) from %d workers for %s",
+ worker_name, worker_env.num_of_workers, r->uri);
+ }
+ }
+
+ if (worker_name) {
+ jk_worker_t *worker;
+
+ worker = wc_get_worker_for_name(worker_name, conf->log);
+
+ if (worker) {
+#ifndef NO_GETTIMEOFDAY
+ struct timeval tv_begin, tv_end;
+ long micro, seconds;
+ char *duration = NULL;
+#endif
+ int rc = JK_FALSE;
+ int is_error = JK_HTTP_SERVER_ERROR;
+ apache_private_data_t private_data;
+ jk_ws_service_t s;
+ jk_pool_atom_t buf[SMALL_POOL_SIZE];
+ jk_open_pool(&private_data.p, buf, sizeof(buf));
+
+ private_data.read_body_started = JK_FALSE;
+ private_data.r = r;
+
+ wc_maintain(conf->log);
+ jk_init_ws_service(&s);
+
+ s.ws_private = &private_data;
+ s.pool = &private_data.p;
+ ap_table_setn(r->notes, JK_NOTE_WORKER_TYPE,
+ wc_get_name_for_type(worker->type, conf->log));
+#ifndef NO_GETTIMEOFDAY
+ gettimeofday(&tv_begin, NULL);
+#endif
+
+ if (init_ws_service(&private_data, &s, conf)) {
+ jk_endpoint_t *end = NULL;
+ if (worker->get_endpoint(worker, &end, conf->log)) {
+ rc = end->service(end, &s, conf->log, &is_error);
+ end->done(&end, conf->log);
+
+ if (s.content_read < s.content_length ||
+ (s.is_chunked && !s.no_more_chunks)) {
+ /*
+ * If the servlet engine didn't consume all of the
+ * request data, consume and discard all further
+ * characters left to read from client
+ */
+ char *buff = ap_palloc(r->pool, 2048);
+ if (buff != NULL) {
+ int rd;
+ while ((rd =
+ ap_get_client_block(r, buff, 2048)) > 0) {
+ s.content_read += rd;
+ }
+ }
+ }
+ }
+#ifndef NO_GETTIMEOFDAY
+ gettimeofday(&tv_end, NULL);
+ if (tv_end.tv_usec < tv_begin.tv_usec) {
+ tv_end.tv_usec += 1000000;
+ tv_end.tv_sec--;
+ }
+ micro = tv_end.tv_usec - tv_begin.tv_usec;
+ seconds = tv_end.tv_sec - tv_begin.tv_sec;
+ duration =
+ ap_psprintf(r->pool, "%.1ld.%.6ld", seconds, micro);
+ ap_table_setn(r->notes, JK_NOTE_REQUEST_DURATION, duration);
+#endif
+ if (s.route && *s.route)
+ ap_table_setn(r->notes, JK_NOTE_WORKER_ROUTE, s.route);
+ if (conf->format != NULL) {
+ request_log_transaction(r, conf);
+ }
+ }
+ else {
+ jk_log(conf->log, JK_LOG_ERROR, "Could not init service"
+ " for worker=%s",
+ worker_name);
+ jk_close_pool(&private_data.p);
+ JK_TRACE_EXIT(conf->log);
+ return is_error;
+ }
+ jk_close_pool(&private_data.p);
+
+ if (rc > 0) {
+ if (s.extension.use_server_error_pages &&
+ s.http_response_status >= s.extension.use_server_error_pages) {
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG, "Forwarding status=%d"
+ " for worker=%s",
+ s.http_response_status, worker_name);
+ JK_TRACE_EXIT(conf->log);
+ return s.http_response_status;
+ }
+ /* If tomcat returned no body and the status is not OK,
+ let apache handle the error code */
+ if (!r->sent_bodyct && r->status >= HTTP_BAD_REQUEST) {
+ jk_log(conf->log, JK_LOG_INFO, "No body with status=%d"
+ " for worker=%s",
+ r->status, worker_name);
+ JK_TRACE_EXIT(conf->log);
+ return r->status;
+ }
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG, "Service finished"
+ " with status=%d for worker=%s",
+ r->status, worker_name);
+ JK_TRACE_EXIT(conf->log);
+ return OK; /* NOT r->status, even if it has changed. */
+ }
+ else if (rc == JK_CLIENT_ERROR) {
+ if (is_error != HTTP_REQUEST_ENTITY_TOO_LARGE)
+ r->connection->aborted = 1;
+ jk_log(conf->log, JK_LOG_INFO, "Aborting connection"
+ " for worker=%s",
+ worker_name);
+ JK_TRACE_EXIT(conf->log);
+ return is_error;
+ }
+ else {
+ jk_log(conf->log, JK_LOG_INFO, "Service error=%d"
+ " for worker=%s",
+ rc, worker_name);
+ JK_TRACE_EXIT(conf->log);
+ return is_error;
+ }
+ }
+ else {
+ jk_log(conf->log, JK_LOG_ERROR, "Could not init service"
+ " for worker=%s",
+ worker_name);
+ JK_TRACE_EXIT(conf->log);
+ return HTTP_INTERNAL_SERVER_ERROR;
+ }
+ }
+
+ JK_TRACE_EXIT(conf->log);
+ return HTTP_INTERNAL_SERVER_ERROR;
+}
+
+/*
+ * Create a default config object.
+ */
+static void *create_jk_config(ap_pool * p, server_rec * s)
+{
+ jk_server_conf_t *c =
+ (jk_server_conf_t *) ap_pcalloc(p, sizeof(jk_server_conf_t));
+
+ c->log_fd = -1;
+ c->mountcopy = JK_FALSE;
+ c->was_initialized = JK_FALSE;
+
+ if (s->is_virtual) {
+ c->mountcopy = JK_UNSET;
+ c->mount_file_reload = JK_UNSET;
+ c->log_level = JK_UNSET;
+ c->ssl_enable = JK_UNSET;
+ c->strip_session = JK_UNSET;
+ } else {
+ if (!jk_map_alloc(&(c->uri_to_context))) {
+ ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, NULL, "Memory error");
+ }
+ c->mountcopy = JK_FALSE;
+ c->mount_file_reload = JK_URIMAP_DEF_RELOAD;
+ c->log_level = JK_LOG_DEF_LEVEL;
+ c->options = JK_OPT_DEFAULT;
+ c->worker_indicator = JK_ENV_WORKER_NAME;
+
+ /*
+ * Configurable environment variables to overwrite
+ * request information using meta data send by a
+ * proxy in front of us.
+ */
+ c->remote_addr_indicator = JK_ENV_REMOTE_ADDR;
+ c->remote_port_indicator = JK_ENV_REMOTE_PORT;
+ c->remote_host_indicator = JK_ENV_REMOTE_HOST;
+ c->remote_user_indicator = JK_ENV_REMOTE_USER;
+ c->auth_type_indicator = JK_ENV_AUTH_TYPE;
+ c->local_name_indicator = JK_ENV_LOCAL_NAME;
+ c->local_port_indicator = JK_ENV_LOCAL_PORT;
+
+ /*
+ * By default we will try to gather SSL info.
+ * Disable this functionality through JkExtractSSL
+ */
+ c->ssl_enable = JK_TRUE;
+ /*
+ * The defaults ssl indicators match those in mod_ssl (seems
+ * to be in more use).
+ */
+ c->https_indicator = JK_ENV_HTTPS;
+ c->certs_indicator = JK_ENV_CERTS;
+ c->cipher_indicator = JK_ENV_CIPHER;
+ c->certchain_prefix = JK_ENV_CERTCHAIN_PREFIX;
+ c->session_indicator = JK_ENV_SESSION;
+ c->key_size_indicator = JK_ENV_KEY_SIZE;
+ c->strip_session = JK_FALSE;
+ }
+ c->envvars_has_own = JK_FALSE;
+
+ c->s = s;
+
+ return c;
+}
+
+
+/*
+ * Utility - copy items from apr table src to dst,
+ * for keys that exist in src but not in dst.
+ */
+static void merge_apr_table(table *src, table *dst)
+{
+ int i;
+ const array_header *arr;
+ const table_entry *elts;
+
+ arr = ap_table_elts(src);
+ elts = (const table_entry *)arr->elts;
+ for (i = 0; i < arr->nelts; ++i) {
+ if (!ap_table_get(dst, elts[i].key)) {
+ ap_table_setn(dst, elts[i].key, elts[i].val);
+ }
+ }
+}
+
+
+static void *merge_jk_config(ap_pool * p, void *basev, void *overridesv)
+{
+ jk_server_conf_t *base = (jk_server_conf_t *) basev;
+ jk_server_conf_t *overrides = (jk_server_conf_t *) overridesv;
+
+ if (!overrides->log_file)
+ overrides->log_file = base->log_file;
+ if (overrides->log_level == JK_UNSET)
+ overrides->log_level = base->log_level;
+
+ if (!overrides->stamp_format_string)
+ overrides->stamp_format_string = base->stamp_format_string;
+ if (!overrides->format_string)
+ overrides->format_string = base->format_string;
+
+ if (!overrides->worker_indicator)
+ overrides->worker_indicator = base->worker_indicator;
+
+ if (!overrides->remote_addr_indicator)
+ overrides->remote_addr_indicator = base->remote_addr_indicator;
+ if (!overrides->remote_port_indicator)
+ overrides->remote_port_indicator = base->remote_port_indicator;
+ if (!overrides->remote_host_indicator)
+ overrides->remote_host_indicator = base->remote_host_indicator;
+ if (!overrides->remote_user_indicator)
+ overrides->remote_user_indicator = base->remote_user_indicator;
+ if (!overrides->auth_type_indicator)
+ overrides->auth_type_indicator = base->auth_type_indicator;
+ if (!overrides->local_name_indicator)
+ overrides->local_name_indicator = base->local_name_indicator;
+ if (!overrides->local_port_indicator)
+ overrides->local_port_indicator = base->local_port_indicator;
+
+ if (overrides->ssl_enable == JK_UNSET)
+ overrides->ssl_enable = base->ssl_enable;
+ if (!overrides->https_indicator)
+ overrides->https_indicator = base->https_indicator;
+ if (!overrides->certs_indicator)
+ overrides->certs_indicator = base->certs_indicator;
+ if (!overrides->cipher_indicator)
+ overrides->cipher_indicator = base->cipher_indicator;
+ if (!overrides->certchain_prefix)
+ overrides->certchain_prefix = base->certchain_prefix;
+ if (!overrides->session_indicator)
+ overrides->session_indicator = base->session_indicator;
+ if (!overrides->key_size_indicator)
+ overrides->key_size_indicator = base->key_size_indicator;
+
+/* Don't simply accumulate bits in the JK_OPT_FWDURIMASK region, */
+/* because those are multi-bit values. */
+ if (overrides->options & JK_OPT_FWDURIMASK)
+ overrides->options |= (base->options & ~base->exclude_options) & ~JK_OPT_FWDURIMASK;
+ else
+ overrides->options |= (base->options & ~base->exclude_options);
+
+ if (base->envvars) {
+ if (overrides->envvars && overrides->envvars_has_own) {
+/* merge_apr_table() preserves existing entries in overrides table */
+ merge_apr_table(base->envvars, overrides->envvars);
+ merge_apr_table(base->envvars_def, overrides->envvars_def);
+ }
+ else {
+ overrides->envvars = base->envvars;
+ overrides->envvars_def = base->envvars_def;
+ overrides->envvar_items = base->envvar_items;
+ }
+ }
+
+ if (overrides->mountcopy == JK_UNSET && jk_mount_copy_all == JK_TRUE) {
+ overrides->mountcopy = JK_TRUE;
+ }
+ if (overrides->uri_to_context && overrides->mountcopy == JK_TRUE) {
+/* jk_map_copy() preserves existing entries in overrides map */
+ if (jk_map_copy(base->uri_to_context, overrides->uri_to_context) == JK_FALSE) {
+ jk_error_exit(APLOG_MARK, APLOG_EMERG, overrides->s, p, "Memory error");
+ }
+ if (!overrides->mount_file)
+ overrides->mount_file = base->mount_file;
+ }
+ if (overrides->mountcopy == JK_TRUE) {
+ if (!overrides->alias_dir)
+ overrides->alias_dir = base->alias_dir;
+ }
+ if (overrides->mount_file_reload == JK_UNSET)
+ overrides->mount_file_reload = base->mount_file_reload;
+ if (overrides->strip_session == JK_UNSET)
+ overrides->strip_session = base->strip_session;
+
+ return overrides;
+}
+
+static int JK_METHOD jk_log_to_file(jk_logger_t *l, int level,
+ int used, char *what)
+{
+ if (l &&
+ (l->level <= level || level == JK_LOG_REQUEST_LEVEL) &&
+ l->logger_private && what && used > 0) {
+ jk_file_logger_t *flp = l->logger_private;
+ int log_fd = flp->log_fd;
+ if (log_fd >= 0) {
+#if defined(WIN32)
+ what[used++] = '\r';
+#endif
+ what[used++] = '\n';
+ if (write(log_fd, what, used) < 0 ) {
+ ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, NULL,
+ "mod_jk: jk_log_to_file %s failed",
+ what);
+ }
+ }
+
+ return JK_TRUE;
+ }
+
+ return JK_FALSE;
+}
+
+static int log_fd_get(char *key)
+{
+ const char *buf=ap_table_get(jk_log_fds, key);
+ if (buf)
+ return atoi(buf);
+ return 0;
+}
+
+static void log_fd_set(pool *p, char *key, int v)
+{
+ char *buf=(char *)ap_pcalloc(p, 8*sizeof(char));
+ ap_snprintf(buf, 8, "%d", v);
+ ap_table_setn(jk_log_fds, key, buf);
+}
+
+static void open_jk_log(server_rec *s, pool *p)
+{
+ const char *fname;
+ int jklogfd;
+ piped_log *pl;
+ jk_logger_t *jkl;
+ jk_file_logger_t *flp;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ if (!s->is_virtual && !conf->log_file) {
+ conf->log_file = ap_server_root_relative(p, JK_LOG_DEF_FILE);
+ if (conf->log_file)
+ ap_log_error(APLOG_MARK, APLOG_WARNING | APLOG_NOERRNO, s,
+ "No JkLogFile defined in httpd.conf. "
+ "Using default %s", conf->log_file);
+ }
+
+ if (s->is_virtual && conf->log_file == NULL) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, s,
+ "mod_jk: Invalid JkLogFile NULL");
+ conf->log = main_log;
+ return;
+ }
+ if (s->is_virtual && *(conf->log_file) == '\0') {
+ ap_log_error(APLOG_MARK, APLOG_ERR, s,
+ "mod_jk: Invalid JkLogFile EMPTY");
+ conf->log = main_log;
+ return;
+ }
+
+#ifdef CHROOTED_APACHE
+ ap_server_strip_chroot(conf->log_file, 0);
+#endif
+
+ jklogfd = log_fd_get(conf->log_file);
+ if (!jklogfd) {
+ if (*conf->log_file == '|') {
+ if ((pl = ap_open_piped_log(p, conf->log_file + 1)) == NULL) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, s,
+ "mod_jk: could not open reliable pipe "
+ "to jk log %s", conf->log_file + 1);
+ exit(1);
+ }
+ jklogfd = ap_piped_log_write_fd(pl);
+ }
+ else {
+ fname = ap_server_root_relative(p, conf->log_file);
+ if (!fname) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, s,
+ "mod_jk: Invalid JkLog " "path %s", conf->log_file);
+ exit(1);
+ }
+#if AP_MODULE_MAGIC_AT_LEAST(19990320,14)
+ if ((jklogfd = ap_popenf_ex(p, fname, xfer_flags, xfer_mode, 1))
+ < 0) {
+#else
+ if ((jklogfd = ap_popenf(p, fname, xfer_flags, xfer_mode))
+ < 0) {
+#endif
+ ap_log_error(APLOG_MARK, APLOG_ERR, s,
+ "mod_jk: could not open JkLog " "file %s", fname);
+ exit(1);
+ }
+ }
+ log_fd_set(p, conf->log_file, jklogfd);
+ }
+ conf->log_fd = jklogfd;
+ jkl = (jk_logger_t *)ap_palloc(p, sizeof(jk_logger_t));
+ flp = (jk_file_logger_t *)ap_palloc(p, sizeof(jk_file_logger_t));
+ if (jkl && flp) {
+ jkl->log = jk_log_to_file;
+ jkl->level = conf->log_level;
+ jkl->logger_private = flp;
+ flp->log_fd = conf->log_fd;
+ conf->log = jkl;
+ jk_set_time_fmt(conf->log, conf->stamp_format_string);
+ if (main_log == NULL)
+ main_log = conf->log;
+ return;
+ }
+
+ return;
+}
+
+static void jk_init(server_rec * s, ap_pool * p)
+{
+ int rc;
+ server_rec *srv = s;
+ const char *err_string = NULL;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+ if (!jk_worker_properties)
+ jk_map_alloc(&jk_worker_properties);
+ jk_map_put(jk_worker_properties, "ServerRoot", ap_server_root, NULL);
+
+ main_server = s;
+ jk_log_fds = ap_make_table(p, 0);
+
+ /* step through the servers and open each jk logfile
+ * and do additional post config initialization.
+ */
+ for (; srv; srv = srv->next) {
+ jk_server_conf_t *sconf = (jk_server_conf_t *)ap_get_module_config(srv->module_config,
+ &jk_module);
+
+/*
+ * If a virtual server contains no JK directive, httpd shares
+ * the config structure. But we don't want to share some settings
+ * by default, especially the JkMount rules.
+ * Therefore we check, if this config structure really belongs to this
+ * vhost, otherwise we create a new one and merge.
+ */
+ if (sconf && sconf->s != srv) {
+ jk_server_conf_t *srvconf = (jk_server_conf_t *)create_jk_config(p, srv);
+ sconf = (jk_server_conf_t *)merge_jk_config(p, sconf, srvconf);
+ ap_set_module_config(srv->module_config, &jk_module, sconf);
+
+ }
+
+ if (sconf && sconf->was_initialized == JK_FALSE) {
+ sconf->was_initialized = JK_TRUE;
+ open_jk_log(srv, p);
+ sconf->options &= ~sconf->exclude_options;
+ if (sconf->uri_to_context) {
+ if (!uri_worker_map_alloc(&(sconf->uw_map),
+ sconf->uri_to_context, sconf->log))
+ jk_error_exit(APLOG_MARK, APLOG_EMERG, srv,
+ p, "Memory error");
+ if (sconf->options & JK_OPT_REJECTUNSAFE)
+ sconf->uw_map->reject_unsafe = 1;
+ else
+ sconf->uw_map->reject_unsafe = 0;
+ if (sconf->mount_file) {
+ sconf->uw_map->fname = sconf->mount_file;
+ sconf->uw_map->reload = sconf->mount_file_reload;
+ uri_worker_map_switch(sconf->uw_map, sconf->log);
+ uri_worker_map_load(sconf->uw_map, sconf->log);
+ }
+ }
+ else {
+ if (sconf->mountcopy == JK_TRUE) {
+ sconf->uw_map = conf->uw_map;
+ }
+ }
+ if (sconf->format_string) {
+ sconf->format =
+ parse_request_log_string(p, sconf->format_string, &err_string);
+ if (sconf->format == NULL)
+ ap_log_error(APLOG_MARK, APLOG_ERR, srv,
+ "JkRequestLogFormat format array NULL");
+ }
+ if (sconf->envvars && sconf->envvars_has_own) {
+ int i;
+ const array_header *arr;
+ const table_entry *elts;
+ envvar_item *item;
+ const char *envvar_def;
+
+ arr = ap_table_elts(sconf->envvars);
+ if (arr) {
+ elts = (const table_entry *)arr->elts;
+ for (i = 0; i < arr->nelts; ++i) {
+ item = (envvar_item *)ap_push_array(sconf->envvar_items);
+ if (!item)
+ jk_error_exit(APLOG_MARK, APLOG_EMERG, srv,
+ p, "Memory error");
+ item->name = elts[i].key;
+ envvar_def = ap_table_get(sconf->envvars_def, elts[i].key);
+ if (envvar_def && !strcmp("1", envvar_def) ) {
+ item->value = elts[i].val;
+ item->has_default = 1;
+ }
+ else {
+ item->value = "";
+ item->has_default = 0;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if ((jk_worker_file != NULL) &&
+ !jk_map_read_properties(jk_worker_properties, NULL, jk_worker_file, NULL,
+ JK_MAP_HANDLE_DUPLICATES, conf->log)) {
+ jk_error_exit(APLOG_MARK, APLOG_EMERG | APLOG_NOERRNO, s, p,
+ "Error in reading worker properties from '%s'",
+ jk_worker_file);
+ }
+
+ if (jk_map_resolve_references(jk_worker_properties, "worker.",
+ 1, 1, conf->log) == JK_FALSE) {
+ jk_error_exit(APLOG_MARK, APLOG_EMERG | APLOG_NOERRNO, s, p,
+ "Error in resolving configuration references");
+ }
+
+#if !defined(WIN32) && !defined(NETWARE)
+ if (!jk_shm_file) {
+ jk_shm_file = ap_server_root_relative(p, JK_SHM_DEF_FILE);
+
+#ifdef CHROOTED_APACHE
+ ap_server_strip_chroot(jk_shm_file, 0);
+#endif
+
+ if (jk_shm_file)
+ ap_log_error(APLOG_MARK, APLOG_WARNING | APLOG_NOERRNO, s,
+ "No JkShmFile defined in httpd.conf. "
+ "Using default %s", jk_shm_file);
+ }
+#endif
+
+ if (jk_shm_size == 0)
+ jk_shm_size = jk_shm_calculate_size(jk_worker_properties, conf->log);
+ else {
+ jk_log(conf->log, JK_LOG_WARNING,
+ "The optimal shared memory size can now be determined automatically.");
+ jk_log(conf->log, JK_LOG_WARNING,
+ "You can remove the JkShmSize directive if you want to use the optimal size.");
+ }
+ if ((rc = jk_shm_open(jk_shm_file, jk_shm_size, conf->log)) != 0)
+ jk_log(conf->log, JK_LOG_ERROR,
+ "Initializing shm:%s errno=%d. Load balancing workers will not function properly.",
+ jk_shm_name(), rc);
+
+ /* SREVILAK -- register cleanup handler to clear resources on restart,
+ * to make sure log file gets closed in the parent process */
+ ap_register_cleanup(p, s, jk_server_cleanup, ap_null_cleanup);
+
+ /* we add the URI->WORKER MAP since workers using AJP14 will feed it */
+ worker_env.uri_to_worker = conf->uw_map;
+ worker_env.virtual = "*"; /* for now */
+ worker_env.server_name = (char *)ap_get_server_version();
+ worker_env.pool = NULL;
+
+ if (wc_open(jk_worker_properties, &worker_env, conf->log)) {
+#if MODULE_MAGIC_NUMBER >= 19980527
+ /* Tell apache we're here */
+ ap_add_version_component(JK_EXPOSED_VERSION);
+#endif
+ jk_log(conf->log, JK_LOG_INFO,
+ "%s initialized",
+ JK_FULL_EXPOSED_VERSION);
+ }
+ else {
+ jk_error_exit(APLOG_MARK, APLOG_EMERG | APLOG_NOERRNO, s, p,
+ "Error in creating the workers."
+ " Please consult your mod_jk log file '%s'.", conf->log_file);
+ }
+ if (conf->uw_map) {
+ uri_worker_map_ext(conf->uw_map, conf->log);
+ uri_worker_map_switch(conf->uw_map, conf->log);
+ }
+ for (srv = s; srv; srv = srv->next) {
+ jk_server_conf_t *sconf = (jk_server_conf_t *)ap_get_module_config(srv->module_config,
+ &jk_module);
+ if (conf->uw_map != sconf->uw_map && sconf->uw_map) {
+ uri_worker_map_ext(sconf->uw_map, sconf->log);
+ uri_worker_map_switch(sconf->uw_map, sconf->log);
+ }
+ }
+
+}
+
+/*
+ * Perform uri to worker mapping, and store the name of the relevant worker
+ * in the notes fields of the request_rec object passed in. This will then
+ * get picked up in jk_handler().
+ */
+static int jk_translate(request_rec * r)
+{
+ ap_set_module_config(r->request_config, &jk_module, NULL);
+
+ if (!r->proxyreq) {
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(r->server->
+ module_config,
+ &jk_module);
+
+ if (conf) {
+ char *clean_uri = ap_pstrdup(r->pool, r->uri);
+ const char *worker;
+
+ if (ap_table_get(r->subprocess_env, "no-jk")) {
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "Into translate no-jk env var detected for uri=%s, declined",
+ r->uri);
+ return DECLINED;
+ }
+
+ ap_no2slash(clean_uri);
+ if (!conf->uw_map) {
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "missing uri map for %s:%s",
+ conf->s->server_hostname ? conf->s->server_hostname : "_default_",
+ r->uri);
+ return DECLINED;
+ }
+ else {
+ rule_extension_t *e;
+ worker = map_uri_to_worker_ext(conf->uw_map, clean_uri,
+ NULL, &e, NULL, conf->log);
+ ap_set_module_config(r->request_config, &jk_module, e);
+ }
+
+ /* Don't know the worker, ForwardDirectories is set, there is a
+ * previous request for which the handler is JK_HANDLER (as set by
+ * jk_fixups) and the request is for a directory:
+ * --> forward to Tomcat, via default worker */
+ if (!worker && (conf->options & JK_OPT_FWDDIRS) &&
+ r->prev && r->prev->handler &&
+ !strcmp(r->prev->handler, JK_HANDLER) && clean_uri &&
+ strlen(clean_uri) && clean_uri[strlen(clean_uri) - 1] == '/') {
+
+ if (worker_env.num_of_workers) {
+ /* Nothing here to do but assign the first worker since we
+ * already tried mapping and it didn't work out */
+ worker = worker_env.worker_list[0];
+
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG, "Manual configuration for %s %s",
+ clean_uri, worker_env.worker_list[0]);
+ }
+ }
+
+ if (worker) {
+ r->handler = ap_pstrdup(r->pool, JK_HANDLER);
+ ap_table_setn(r->notes, JK_NOTE_WORKER_NAME, worker);
+ }
+ else if (conf->alias_dir != NULL) {
+ /* Automatically map uri to a context static file */
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "check alias_dir: %s",
+ conf->alias_dir);
+ if (strlen(clean_uri) > 1) {
+ /* Get the context directory name */
+ char *context_dir = NULL;
+ char *context_path = NULL;
+ char *child_dir = NULL;
+ char *index = clean_uri;
+ char *suffix = strchr(index + 1, '/');
+ if (suffix != NULL) {
+ int size = suffix - index;
+ context_dir = ap_pstrndup(r->pool, index, size);
+ /* Get the context child directory name */
+ index = index + size + 1;
+ suffix = strchr(index, '/');
+ if (suffix != NULL) {
+ size = suffix - index;
+ child_dir = ap_pstrndup(r->pool, index, size);
+ }
+ else {
+ child_dir = index;
+ }
+ /* Deny access to WEB-INF and META-INF directories */
+ if (child_dir != NULL) {
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "AutoAlias child_dir: %s",
+ child_dir);
+ if (!strcasecmp(child_dir, "WEB-INF") ||
+ !strcasecmp(child_dir, "META-INF")) {
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "AutoAlias HTTP_NOT_FOUND for URI: %s",
+ r->uri);
+ return HTTP_NOT_FOUND;
+ }
+ }
+ }
+ else {
+ context_dir = ap_pstrdup(r->pool, index);
+ }
+
+ context_path = ap_pstrcat(r->pool, conf->alias_dir,
+ ap_os_escape_path(r->pool,
+ context_dir,
+ 1), NULL);
+ if (context_path != NULL) {
+ DIR *dir = ap_popendir(r->pool, context_path);
+ if (dir != NULL) {
+ char *escurl =
+ ap_os_escape_path(r->pool, clean_uri, 1);
+ char *ret =
+ ap_pstrcat(r->pool, conf->alias_dir, escurl,
+ NULL);
+ ap_pclosedir(r->pool, dir);
+ /* Add code to verify real path ap_os_canonical_name */
+ if (ret != NULL) {
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "AutoAlias OK for file: %s",
+ ret);
+ r->filename = ret;
+ return OK;
+ }
+ }
+ else {
+ /* Deny access to war files in web app directory */
+ int size = strlen(context_dir);
+ if (size > 4
+ && !strcasecmp(context_dir + (size - 4),
+ ".war")) {
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "AutoAlias FORBIDDEN for URI: %s",
+ r->uri);
+ return FORBIDDEN;
+ }
+ }
+ }
+ }
+ }
+ else {
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "no match for %s found",
+ r->uri);
+ if (conf->strip_session == JK_TRUE) {
+ char *jsessionid;
+ if (r->uri) {
+ jsessionid = strstr(r->uri, JK_PATH_SESSION_IDENTIFIER);
+ if (jsessionid) {
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "removing session identifier [%s] for non servlet url [%s]",
+ jsessionid, r->uri);
+ *jsessionid = '\0';
+ }
+ }
+ if (r->filename) {
+ jsessionid = strstr(r->filename, JK_PATH_SESSION_IDENTIFIER);
+ if (jsessionid)
+ *jsessionid = '\0';
+ }
+ }
+ }
+ }
+ }
+
+ return DECLINED;
+}
+
+/* In case ForwardDirectories option is set, we need to know if all files
+ * mentioned in DirectoryIndex have been exhausted without success. If yes, we
+ * need to let mod_dir know that we want Tomcat to handle the directory
+ */
+static int jk_fixups(request_rec * r)
+{
+ /* This is a sub-request, probably from mod_dir */
+ if (r->main) {
+ jk_server_conf_t *conf = (jk_server_conf_t *)
+ ap_get_module_config(r->server->module_config, &jk_module);
+ char *worker = (char *)ap_table_get(r->notes, JK_NOTE_WORKER_NAME);
+
+ if (ap_table_get(r->subprocess_env, "no-jk")) {
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "Into fixup no-jk env var detected for uri=%s, declined",
+ r->uri);
+ return DECLINED;
+ }
+
+ /* Only if we have no worker and ForwardDirectories is set */
+ if (!worker && (conf->options & JK_OPT_FWDDIRS)) {
+ char *dummy_ptr[1], **names_ptr, *idx;
+ int num_names;
+ dir_config_rec *d = (dir_config_rec *)
+ ap_get_module_config(r->per_dir_config, &dir_module);
+
+ /* Direct lift from mod_dir */
+ if (d->index_names) {
+ names_ptr = (char **)d->index_names->elts;
+ num_names = d->index_names->nelts;
+ }
+ else {
+ dummy_ptr[0] = DEFAULT_INDEX;
+ names_ptr = dummy_ptr;
+ num_names = 1;
+ }
+
+ /* Where the index file would start within the filename */
+ idx = r->filename + strlen(r->filename) -
+ strlen(names_ptr[num_names - 1]);
+
+ /* The requested filename has the last index file at the end */
+ if (idx >= r->filename && !strcmp(idx, names_ptr[num_names - 1])) {
+ r->uri = r->main->uri; /* Trick mod_dir with URI */
+ r->finfo.st_mode = S_IFREG; /* Trick mod_dir with file stat */
+
+ /* We'll be checking for handler in r->prev later on */
+ r->main->handler = ap_pstrdup(r->pool, JK_HANDLER);
+
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG, "ForwardDirectories on: %s",
+ r->uri);
+ }
+ }
+ }
+
+ return DECLINED;
+}
+
+static void child_exit_handler(server_rec * s, ap_pool * p)
+{
+ /* srevilak - refactor cleanup body to jk_generic_cleanup() */
+ jk_generic_cleanup(s);
+ jk_shm_close();
+}
+
+static void child_init_handler(server_rec * s, ap_pool * p)
+{
+ int rc;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ JK_TRACE_ENTER(conf->log);
+
+ if ((rc = jk_shm_attach(jk_shm_file, jk_shm_size, conf->log)) != 0)
+ jk_log(conf->log, JK_LOG_ERROR, "Attaching shm:%s errno=%d",
+ jk_shm_name(), rc);
+
+ JK_TRACE_EXIT(conf->log);
+
+}
+
+
+/** srevilak -- registered as a cleanup handler in jk_init */
+static void jk_server_cleanup(void *data)
+{
+ jk_generic_cleanup((server_rec *) data);
+ jk_shm_close();
+}
+
+
+/** BEGIN SREVILAK
+ * body taken from exit_handler()
+ */
+static void jk_generic_cleanup(server_rec *s)
+{
+
+ if (jk_worker_properties) {
+ jk_map_free(&jk_worker_properties);
+ jk_worker_properties = NULL;
+ jk_worker_file = NULL;
+ jk_mount_copy_all = JK_FALSE;
+ }
+
+ /* loop through all available servers to clean up all configuration
+ * records we've created
+ */
+ while (NULL != s) {
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ if (conf && conf->was_initialized == JK_TRUE) {
+ /* On pool cleanup pass NULL for the jk_logger to
+ prevent segmentation faults on Windows because
+ we can't guarantee what order pools get cleaned
+ up between APR implementations. */
+ wc_close(NULL);
+ if (conf->uri_to_context) {
+ jk_map_free(&conf->uri_to_context);
+ /* We cannot have allocated uw_map
+ * unless we've allocated uri_to_context
+ */
+ if (conf->uw_map)
+ uri_worker_map_free(&conf->uw_map, NULL);
+ }
+ conf->was_initialized = JK_FALSE;
+ }
+ s = s->next;
+ }
+}
+
+/** END SREVILAK **/
+
+
+static const handler_rec jk_handlers[] = {
+ {JK_MAGIC_TYPE, jk_handler},
+ {JK_HANDLER, jk_handler},
+ {NULL}
+};
+
+module MODULE_VAR_EXPORT jk_module = {
+ STANDARD_MODULE_STUFF,
+ jk_init, /* module initializer */
+ NULL, /* per-directory config creator */
+ NULL, /* dir config merger */
+ create_jk_config, /* server config creator */
+ merge_jk_config, /* server config merger */
+ jk_cmds, /* command table */
+ jk_handlers, /* [7] list of handlers */
+ jk_translate, /* [2] filename-to-URI translation */
+ NULL, /* [5] check/validate user_id */
+ NULL, /* [6] check user_id is valid *here* */
+ NULL, /* [4] check access by host address */
+ NULL, /* XXX [7] MIME type checker/setter */
+ jk_fixups, /* [8] fixups */
+ NULL, /* [10] logger */
+ NULL, /* [3] header parser */
+ child_init_handler, /* apache child process initializer */
+ child_exit_handler, /* apache child process exit/cleanup */
+ NULL /* [1] post read_request handling */
+#ifdef EAPI
+ /*
+ * Extended module APIs, needed when using SSL.
+ * STDC say that we do not have to have them as NULL but
+ * why take a chance
+ */
+ , NULL, /* add_module */
+ NULL, /* remove_module */
+ NULL, /* rewrite_command */
+ NULL, /* new_connection */
+ NULL /* close_connection */
+#endif /* EAPI */
+};
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/mod_jk.dsp b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/mod_jk.dsp
new file mode 100644
index 00000000..b4e8f306
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/mod_jk.dsp
@@ -0,0 +1,295 @@
+# Microsoft Developer Studio Project File - Name="mod_jk" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=mod_jk - 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 "mod_jk.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 "mod_jk.mak" CFG="mod_jk - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "mod_jk - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "mod_jk - 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)" == "mod_jk - 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 /MD /W3 /Zi /O2 /Oy- /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "MOD_JK_EXPORTS" /FD /c
+# ADD CPP /nologo /MD /W3 /Zi /O2 /Oy- /I "..\common" /I "$(APACHE1_HOME)\include" /I "$(APACHE1_HOME)\src\include" /I "$(APACHE1_HOME)\src\os\win32" /I "$(JAVA_HOME)\include" /I "$(JAVA_HOME)\include\win32" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "MOD_JK_EXPORTS" /Fd"Release\mod_jk_src" /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# 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 ApacheCore.lib kernel32.lib user32.lib advapi32.lib ws2_32.lib mswsock.lib /nologo /base:"0x6A6B0000" /subsystem:windows /dll /debug /machine:I386 /out:"Release/mod_jk.so" /libpath:"$(APACHE1_HOME)\libexec" /libpath:"$(APACHE1_HOME)\src\CoreR" /libpath:"$(APACHE1_HOME)\src\Release" /opt:ref
+
+!ELSEIF "$(CFG)" == "mod_jk - 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 /MDd /W3 /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "MOD_JK_EXPORTS" /FD /c
+# ADD CPP /nologo /MDd /W3 /GX /Zi /Od /I "..\common" /I "$(APACHE1_HOME)\include" /I "$(APACHE1_HOME)\src\include" /I "$(APACHE1_HOME)\src\os\win32" /I "$(JAVA_HOME)\include" /I "$(JAVA_HOME)\include\win32" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "MOD_JK_EXPORTS" /Fd"Debug\mod_jk_src" /FD /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# 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 ApacheCore.lib kernel32.lib user32.lib advapi32.lib ws2_32.lib mswsock.lib /nologo /base:"0x6A6B0000" /subsystem:windows /dll /incremental:no /debug /machine:I386 /out:"Debug/mod_jk.so" /libpath:"$(APACHE1_HOME)\libexec" /libpath:"$(APACHE1_HOME)\src\CoreD" /libpath:"$(APACHE1_HOME)\src\Debug"
+
+!ENDIF
+
+# Begin Target
+
+# Name "mod_jk - Win32 Release"
+# Name "mod_jk - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\common\jk_ajp12_worker.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp13.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp13_worker.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp14.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp14_worker.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp_common.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_connect.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_context.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_jni_worker.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_lb_worker.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_map.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_md5.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_msg_buff.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_pool.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_shm.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_sockbuf.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_status.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_uri_worker_map.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_url.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_util.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_worker.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\mod_jk.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\common\jk_ajp12_worker.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp13.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp13_worker.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp14.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp14_worker.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp_common.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_connect.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_context.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_global.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_jni_worker.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_lb_worker.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_logger.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_map.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_md5.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_msg_buff.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_mt.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_pool.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_service.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_shm.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_sockbuf.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_status.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_uri_worker_map.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_url.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_util.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_worker.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_worker_list.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"
+# End Group
+# End Target
+# End Project
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/mod_jk.exp b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/mod_jk.exp
new file mode 100644
index 00000000..a4b90e5b
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-1.3/mod_jk.exp
@@ -0,0 +1 @@
+mod_jk.exp
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/.libs/mod_jk.a b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/.libs/mod_jk.a
new file mode 100644
index 00000000..7ad60378
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/.libs/mod_jk.a
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/.libs/mod_jk.la b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/.libs/mod_jk.la
new file mode 100644
index 00000000..96c4259f
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/.libs/mod_jk.la
@@ -0,0 +1,35 @@
+# mod_jk.la - a libtool library file
+# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18)
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='mod_jk.so'
+
+# Names of this library.
+library_names='mod_jk.so mod_jk.so mod_jk.so'
+
+# The name of the static archive.
+old_library='mod_jk.a'
+
+# Libraries that this one depends upon.
+dependency_libs=''
+
+# Version information for mod_jk.
+current=0
+age=0
+revision=0
+
+# Is this an already installed library?
+installed=yes
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=yes
+
+# Files to dlopen/dlpreopen
+dlopen=''
+dlpreopen=''
+
+# Directory that this library needs to be installed in:
+libdir='/bottlenecks/rubbos/app/apache2/modules'
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/.libs/mod_jk.lai b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/.libs/mod_jk.lai
new file mode 100644
index 00000000..96c4259f
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/.libs/mod_jk.lai
@@ -0,0 +1,35 @@
+# mod_jk.la - a libtool library file
+# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18)
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='mod_jk.so'
+
+# Names of this library.
+library_names='mod_jk.so mod_jk.so mod_jk.so'
+
+# The name of the static archive.
+old_library='mod_jk.a'
+
+# Libraries that this one depends upon.
+dependency_libs=''
+
+# Version information for mod_jk.
+current=0
+age=0
+revision=0
+
+# Is this an already installed library?
+installed=yes
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=yes
+
+# Files to dlopen/dlpreopen
+dlopen=''
+dlpreopen=''
+
+# Directory that this library needs to be installed in:
+libdir='/bottlenecks/rubbos/app/apache2/modules'
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/.libs/mod_jk.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/.libs/mod_jk.o
new file mode 100644
index 00000000..406ee004
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/.libs/mod_jk.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/.libs/mod_jk.so b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/.libs/mod_jk.so
new file mode 100755
index 00000000..46c3ee0d
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/.libs/mod_jk.so
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/Makefile b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/Makefile
new file mode 100644
index 00000000..2f931b67
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/Makefile
@@ -0,0 +1,99 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+##
+
+APXS=/bottlenecks/rubbos/app/apache2/bin/apxs
+OS=linux
+JAVA_HOME=/bottlenecks/rubbos/app/jdk1.6.0_27
+CP=/bin/cp
+APACHE_DIR=/bottlenecks/rubbos/app/apache2
+MKDIR=/bin/mkdir
+APXSCFLAGS= -g -O2 -pthread -DHAVE_APR -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include -DHAVE_CONFIG_H -DHAVE_JNI
+APXSCPPFLAGS=-D_REENTRANT -D_GNU_SOURCE
+APXSLDFLAGS=
+CC=gcc
+
+# Defaults
+libexecdir=${APACHE_DIR}/modules
+
+JK=../common/
+# Defines APACHE_OBJECTS - the list of all common files
+include ../common/list.mk
+
+# Apache2 settings, values guessed by Apache config and used to build it
+# Will define libexecdir, LIBTOOL, etc
+include /bottlenecks/rubbos/app/apache2/build/config_vars.mk
+
+# Local settings ( overriding/appending to Apache's )
+COMMON=../common
+JK_INCL=-DUSE_APACHE_MD5 -I ${COMMON}
+JAVA_INCL=-I ${JAVA_HOME}/include -I ${JAVA_HOME}/include/${OS}
+JAVA_LIB=-L ${JAVA_HOME}/jre/lib/${ARCH} -L ${JAVA_HOME}/lib/${ARCH}/native_threads
+CFLAGS=-I/bottlenecks/rubbos/app/apache2/include -DHAVE_CONFIG_H -DHAVE_JNI ${JK_INCL} ${JAVA_INCL} ${APXSCPPFLAGS} ${APXSCFLAGS} ${EXTRA_CFLAGS} ${EXTRA_CPPFLAGS}
+
+
+# Implicit rules
+include ../scripts/build/rules.mk
+
+OEXT=.lo
+
+all: Makefile mod_jk.so
+install: install_dynamic
+
+Makefile: Makefile.in
+ echo Regenerating Makefile
+ ( cd ..; ./config.status )
+
+lib_jk.la: mod_jk.lo ${APACHE_OBJECTS}
+ $(LIBTOOL) --mode=link $(CC) -o lib_jk.la -static -rpath ${libexecdir}/jk mod_jk.lo $(APACHE_OBJECTS)
+
+install_static:
+ @echo ""
+ @echo "Copying files to Apache Modules Directory..."
+ -${MKDIR} ${APACHE_DIR}/modules/jk
+ ${CP} config.m4 ${APACHE_DIR}/modules/jk
+ ${LIBTOOL} --mode=install cp lib_jk.la ${APACHE_DIR}/modules/jk
+ @echo ""
+ @echo "Please be sure to re-compile Apache..."
+ @echo ""
+ @echo "cd ${APACHE_DIR}"
+ @echo "./buildconf"
+ @echo "./configure --with-mod_jk"
+ @echo "make"
+ @echo ""
+
+#################### Dynamic .so file ####################
+# APXS will compile every file, this is derived from apxs
+
+mod_jk.la: mod_jk.lo $(APACHE_OBJECTS)
+ $(LIBTOOL) --mode=link ${COMPILE} $(APXSLDFLAGS) -o $@ -module -rpath ${libexecdir} -avoid-version mod_jk.lo $(APACHE_OBJECTS)
+
+mod_jk.so: mod_jk.la
+ ../scripts/build/instdso.sh SH_LIBTOOL='$(LIBTOOL)' mod_jk.la `pwd`
+
+install_dynamic:
+ @echo ""
+ @echo "Installing files to Apache Modules Directory..."
+ $(APXS) -i mod_jk.la
+ @echo ""
+ @echo "Please be sure to arrange ${APACHE_DIR}/conf/httpd.conf..."
+ @echo ""
+
+clean:
+ rm -f *.o *.lo *.a *.la *.so *.so.* *.slo
+ rm -rf .libs
+
+maintainer-clean: clean
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/Makefile.apxs b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/Makefile.apxs
new file mode 100644
index 00000000..517699b9
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/Makefile.apxs
@@ -0,0 +1,45 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+## configure should make the Makefile out of this file.
+
+APXS=/bottlenecks/rubbos/app/apache2/bin/apxs
+OS=linux
+JAVA_HOME=/bottlenecks/rubbos/app/jdk1.6.0_27
+APXSLDFLAGS=
+APXSCFLAGS= -g -O2 -pthread -DHAVE_APR -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include -DHAVE_CONFIG_H -DHAVE_JNI
+
+JK=../common/
+JK_INCL=-DUSE_APACHE_MD5 -I ${JK}
+JAVA_INCL=-I ${JAVA_HOME}/include -I ${JAVA_HOME}/include/${OS}
+JAVA_LIB=-L ${JAVA_HOME}/jre/lib/${ARCH} -L ${JAVA_HOME}/lib/${ARCH}/native_threads
+
+## read the object (.c) from the list file.
+OEXT=.c
+include ../common/list.mk
+
+all: mod_jk.la
+
+mod_jk.la:
+ $(APXS) -c -o $@ -Wc,"${APXSCFLAGS} ${JK_INCL}" "${JAVA_INCL}" ${APXSLDFLAGS} mod_jk.c ${APACHE_OBJECTS}
+
+install: mod_jk.la
+ $(APXS) -i mod_jk.la
+
+clean:
+ rm -f *.o *.lo *.a *.la *.so *.so.* *.slo
+ rm -rf .libs
+
+maintainer-clean: clean
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/Makefile.apxs.in b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/Makefile.apxs.in
new file mode 100644
index 00000000..aef3907e
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/Makefile.apxs.in
@@ -0,0 +1,45 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+## configure should make the Makefile out of this file.
+
+APXS=@APXS@
+OS=@OS@
+JAVA_HOME=@JAVA_HOME@
+APXSLDFLAGS=@APXSLDFLAGS@
+APXSCFLAGS=@APXSCFLAGS@
+
+JK=../common/
+JK_INCL=-DUSE_APACHE_MD5 -I ${JK}
+JAVA_INCL=-I ${JAVA_HOME}/include -I ${JAVA_HOME}/include/${OS}
+JAVA_LIB=-L ${JAVA_HOME}/jre/lib/${ARCH} -L ${JAVA_HOME}/lib/${ARCH}/native_threads
+
+## read the object (.c) from the list file.
+OEXT=.c
+include ../common/list.mk
+
+all: mod_jk.la
+
+mod_jk.la:
+ $(APXS) -c -o $@ -Wc,"${APXSCFLAGS} ${JK_INCL}" "${JAVA_INCL}" ${APXSLDFLAGS} mod_jk.c ${APACHE_OBJECTS}
+
+install: mod_jk.la
+ $(APXS) -i mod_jk.la
+
+clean:
+ rm -f *.o *.lo *.a *.la *.so *.so.* *.slo
+ rm -rf .libs
+
+maintainer-clean: clean
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/Makefile.in b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/Makefile.in
new file mode 100644
index 00000000..7c45e217
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/Makefile.in
@@ -0,0 +1,99 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+##
+
+APXS=@APXS@
+OS=@OS@
+JAVA_HOME=@JAVA_HOME@
+CP=@CP@
+APACHE_DIR=@APACHE_DIR@
+MKDIR=@MKDIR@
+APXSCFLAGS=@APXSCFLAGS@
+APXSCPPFLAGS=@APXSCPPFLAGS@
+APXSLDFLAGS=@APXSLDFLAGS@
+CC=@CC@
+
+# Defaults
+libexecdir=${APACHE_DIR}/modules
+
+JK=../common/
+# Defines APACHE_OBJECTS - the list of all common files
+include ../common/list.mk
+
+# Apache2 settings, values guessed by Apache config and used to build it
+# Will define libexecdir, LIBTOOL, etc
+include @APACHE_CONFIG_VARS@
+
+# Local settings ( overriding/appending to Apache's )
+COMMON=../common
+JK_INCL=-DUSE_APACHE_MD5 -I ${COMMON}
+JAVA_INCL=-I ${JAVA_HOME}/include -I ${JAVA_HOME}/include/${OS}
+JAVA_LIB=-L ${JAVA_HOME}/jre/lib/${ARCH} -L ${JAVA_HOME}/lib/${ARCH}/native_threads
+CFLAGS=@apache_include@ @CFLAGS@ ${JK_INCL} ${JAVA_INCL} ${APXSCPPFLAGS} ${APXSCFLAGS} ${EXTRA_CFLAGS} ${EXTRA_CPPFLAGS}
+
+
+# Implicit rules
+include ../scripts/build/rules.mk
+
+OEXT=.lo
+
+all: Makefile @LIB_JK_TYPE@
+install: @INSTALL_TYPE@
+
+Makefile: Makefile.in
+ echo Regenerating Makefile
+ ( cd ..; ./config.status )
+
+lib_jk.la: mod_jk.lo ${APACHE_OBJECTS}
+ $(LIBTOOL) --mode=link $(CC) -o lib_jk.la -static -rpath ${libexecdir}/jk mod_jk.lo $(APACHE_OBJECTS)
+
+install_static:
+ @echo ""
+ @echo "Copying files to Apache Modules Directory..."
+ -${MKDIR} ${APACHE_DIR}/modules/jk
+ ${CP} config.m4 ${APACHE_DIR}/modules/jk
+ ${LIBTOOL} --mode=install cp lib_jk.la ${APACHE_DIR}/modules/jk
+ @echo ""
+ @echo "Please be sure to re-compile Apache..."
+ @echo ""
+ @echo "cd ${APACHE_DIR}"
+ @echo "./buildconf"
+ @echo "./configure --with-mod_jk"
+ @echo "make"
+ @echo ""
+
+#################### Dynamic .so file ####################
+# APXS will compile every file, this is derived from apxs
+
+mod_jk.la: mod_jk.lo $(APACHE_OBJECTS)
+ $(LIBTOOL) --mode=link ${COMPILE} $(APXSLDFLAGS) -o $@ -module -rpath ${libexecdir} -avoid-version mod_jk.lo $(APACHE_OBJECTS)
+
+mod_jk.so: mod_jk.la
+ ../scripts/build/instdso.sh SH_LIBTOOL='$(LIBTOOL)' mod_jk.la `pwd`
+
+install_dynamic:
+ @echo ""
+ @echo "Installing files to Apache Modules Directory..."
+ $(APXS) -i mod_jk.la
+ @echo ""
+ @echo "Please be sure to arrange ${APACHE_DIR}/conf/httpd.conf..."
+ @echo ""
+
+clean:
+ rm -f *.o *.lo *.a *.la *.so *.so.* *.slo
+ rm -rf .libs
+
+maintainer-clean: clean
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/Makefile.vc b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/Makefile.vc
new file mode 100644
index 00000000..6032521f
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/Makefile.vc
@@ -0,0 +1,293 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+!IFDEF APACHE20_HOME
+APR_LIB=libapr.lib
+APU_LIB=libaprutil.lib
+OUTDIR=.\Release20
+INTDIR=.\Release20
+APACHE2_HOME=$(APACHE20_HOME)
+!ELSE
+!IFDEF APACHE23_HOME
+APACHE2_HOME=$(APACHE23_HOME)
+OUTDIR=.\Release23
+INTDIR=.\Release23
+!ELSE
+!IFDEF APACHE22_HOME
+APACHE2_HOME=$(APACHE22_HOME)
+OUTDIR=.\Release22
+INTDIR=.\Release22
+!ENDIF
+!ENDIF
+APR_LIB=libapr-1.lib
+APU_LIB=libaprutil-1.lib
+!ENDIF
+
+!IFNDEF APACHE2_HOME
+!ERROR Missing APACHE2_HOME environment variable.
+!ENDIF
+
+TARGET=mod_jk$(SO_VERSION)$(SO_HTTPD_VERSION)
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+ALL : "$(OUTDIR)\$(TARGET).so"
+
+
+CLEAN :
+ -@erase "$(INTDIR)\jk.res"
+ -@erase "$(INTDIR)\jk_ajp12_worker.obj"
+ -@erase "$(INTDIR)\jk_ajp13.obj"
+ -@erase "$(INTDIR)\jk_ajp13_worker.obj"
+ -@erase "$(INTDIR)\jk_ajp14.obj"
+ -@erase "$(INTDIR)\jk_ajp14_worker.obj"
+ -@erase "$(INTDIR)\jk_ajp_common.obj"
+ -@erase "$(INTDIR)\jk_connect.obj"
+ -@erase "$(INTDIR)\jk_context.obj"
+ -@erase "$(INTDIR)\jk_jni_worker.obj"
+ -@erase "$(INTDIR)\jk_lb_worker.obj"
+ -@erase "$(INTDIR)\jk_map.obj"
+ -@erase "$(INTDIR)\jk_md5.obj"
+ -@erase "$(INTDIR)\jk_msg_buff.obj"
+ -@erase "$(INTDIR)\jk_pool.obj"
+ -@erase "$(INTDIR)\jk_shm.obj"
+ -@erase "$(INTDIR)\jk_sockbuf.obj"
+ -@erase "$(INTDIR)\jk_status.obj"
+ -@erase "$(INTDIR)\jk_uri_worker_map.obj"
+ -@erase "$(INTDIR)\jk_url.obj"
+ -@erase "$(INTDIR)\jk_util.obj"
+ -@erase "$(INTDIR)\jk_worker.obj"
+ -@erase "$(INTDIR)\mod_jk.obj"
+ -@erase "$(INTDIR)\mod_jk_src.idb"
+ -@erase "$(INTDIR)\mod_jk_src.pdb"
+ -@erase "$(OUTDIR)\mod_jk.exp"
+ -@erase "$(OUTDIR)\mod_jk.lib"
+ -@erase "$(OUTDIR)\$(TARGET).pdb"
+ -@erase "$(OUTDIR)\$(TARGET).so"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\$(TARGET).bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+LINK32_FLAGS=libhttpd.lib $(APR_LIB) $(APU_LIB) kernel32.lib user32.lib advapi32.lib mswsock.lib ws2_32.lib $(EXTRA_LIBS) /nologo /base:"0x6A6B0000" /subsystem:windows /dll /incremental:no /pdb:"$(OUTDIR)\$(TARGET).pdb" /debug /machine:I386 /out:"$(OUTDIR)\$(TARGET).so" /implib:"$(OUTDIR)\mod_jk.lib" /libpath:"$(APACHE2_HOME)\lib" /opt:ref
+LINK32_OBJS= \
+ "$(INTDIR)\jk_ajp12_worker.obj" \
+ "$(INTDIR)\jk_ajp13.obj" \
+ "$(INTDIR)\jk_ajp13_worker.obj" \
+ "$(INTDIR)\jk_ajp14.obj" \
+ "$(INTDIR)\jk_ajp14_worker.obj" \
+ "$(INTDIR)\jk_ajp_common.obj" \
+ "$(INTDIR)\jk_connect.obj" \
+ "$(INTDIR)\jk_context.obj" \
+ "$(INTDIR)\jk_jni_worker.obj" \
+ "$(INTDIR)\jk_lb_worker.obj" \
+ "$(INTDIR)\jk_map.obj" \
+ "$(INTDIR)\jk_md5.obj" \
+ "$(INTDIR)\jk_msg_buff.obj" \
+ "$(INTDIR)\jk_pool.obj" \
+ "$(INTDIR)\jk_shm.obj" \
+ "$(INTDIR)\jk_sockbuf.obj" \
+ "$(INTDIR)\jk_status.obj" \
+ "$(INTDIR)\jk_uri_worker_map.obj" \
+ "$(INTDIR)\jk_url.obj" \
+ "$(INTDIR)\jk_util.obj" \
+ "$(INTDIR)\jk_worker.obj" \
+ "$(INTDIR)\jk.res" \
+ "$(INTDIR)\mod_jk.obj"
+
+"$(OUTDIR)\$(TARGET).so" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+ @IF EXIST $(OUTDIR)\$(TARGET).manifest \
+ mt -nologo -manifest $(OUTDIR)\$(TARGET).manifest -outputresource:$(OUTDIR)\$(TARGET).so;2
+
+
+CPP_PROJ=-nologo -MD -W3 -O2 -Ob2 -Oy- -Zi -EHsc /I "..\common" /I "$(JAVA_HOME)\include" /I "$(JAVA_HOME)\include\win32" /I "$(APACHE2_HOME)\include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\mod_jk_src" /FD /c
+
+.c{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /win32
+RSC_PROJ=/l 0x409 /fo"$(INTDIR)\jk.res" /i "..\common" /d BASENAME="mod_jk" /d "NDEBUG"
+
+SOURCE=..\common\jk.rc
+
+"$(INTDIR)\jk.res" : $(SOURCE) "$(INTDIR)"
+ $(RSC) $(RSC_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_ajp12_worker.c
+
+"$(INTDIR)\jk_ajp12_worker.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_ajp13.c
+
+"$(INTDIR)\jk_ajp13.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_ajp13_worker.c
+
+"$(INTDIR)\jk_ajp13_worker.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_ajp14.c
+
+"$(INTDIR)\jk_ajp14.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_ajp14_worker.c
+
+"$(INTDIR)\jk_ajp14_worker.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_ajp_common.c
+
+"$(INTDIR)\jk_ajp_common.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_connect.c
+
+"$(INTDIR)\jk_connect.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_context.c
+
+"$(INTDIR)\jk_context.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_jni_worker.c
+
+"$(INTDIR)\jk_jni_worker.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_lb_worker.c
+
+"$(INTDIR)\jk_lb_worker.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_map.c
+
+"$(INTDIR)\jk_map.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_md5.c
+
+"$(INTDIR)\jk_md5.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_msg_buff.c
+
+"$(INTDIR)\jk_msg_buff.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_pool.c
+
+"$(INTDIR)\jk_pool.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_shm.c
+
+"$(INTDIR)\jk_shm.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_sockbuf.c
+
+"$(INTDIR)\jk_sockbuf.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_status.c
+
+"$(INTDIR)\jk_status.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_uri_worker_map.c
+
+"$(INTDIR)\jk_uri_worker_map.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_url.c
+
+"$(INTDIR)\jk_url.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_util.c
+
+"$(INTDIR)\jk_util.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_worker.c
+
+"$(INTDIR)\jk_worker.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=.\mod_jk.c
+
+"$(INTDIR)\mod_jk.obj" : $(SOURCE) "$(INTDIR)"
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/NWGNUmakefile b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/NWGNUmakefile
new file mode 100644
index 00000000..6f085730
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/NWGNUmakefile
@@ -0,0 +1,332 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+#
+# NetWare Makefile for mod_jk (uses build system of Apache 2.x - gnu make)
+# created by Guenter Knauf <fuankg@apache.org>
+#
+
+ifneq "$(wildcard $(JAVA_HOME)/include/netware/jni_md.h)" "$(JAVA_HOME)/include/netware/jni_md.h"
+$(error JAVA_HOME does not point to a valid NetWare Java SDK!)
+endif
+
+#
+# Declare the sub-directories to be built here
+#
+
+SUBDIRS = \
+ $(EOLIST)
+
+#
+# Get the 'head' of the build environment. This includes default targets and
+# paths to tools
+#
+
+include $(AP_WORK)/build/NWGNUhead.inc
+
+#
+# build this level's files
+
+#
+# Make sure all needed macro's are defined
+#
+
+JKCOMMON = ../common
+
+#
+# These directories will be at the beginning of the include list, followed by
+# INCDIRS
+#
+XINCDIRS += \
+ $(JKCOMMON) \
+ $(APR)/include \
+ $(APRUTIL)/include \
+ $(AP_WORK)/include \
+ $(NWOS) \
+ $(JAVA_HOME)/include \
+ $(JAVA_HOME)/include/netware \
+ $(EOLIST)
+
+#
+# These flags will come after CFLAGS
+#
+XCFLAGS += \
+ $(EOLIST)
+
+#
+# These defines will come after DEFINES
+#
+XDEFINES += \
+ -D__NOVELL_LIBC__ \
+ -D_POSIX_SOURCE \
+ $(EOLIST)
+
+#
+# These flags will be added to the link.opt file
+#
+XLFLAGS += \
+ $(EOLIST)
+
+#
+# These values will be appended to the correct variables based on the value of
+# RELEASE
+#
+ifeq "$(RELEASE)" "debug"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+ifeq "$(RELEASE)" "noopt"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+ifeq "$(RELEASE)" "release"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+#
+# These are used by the link target if an NLM is being generated
+# This is used by the link 'name' directive to name the nlm. If left blank
+# TARGET_nlm (see below) will be used.
+#
+NLM_NAME = mod_jk
+
+#
+# This is used by the link '-desc ' directive.
+# If left blank, NLM_NAME will be used.
+#
+NLM_DESCRIPTION = Apache $(VERSION_STR) plugin for Tomcat $(JK_VERSION_STR)
+
+#
+# This is used by the link '-copy ' directive.
+# If left blank, the ASF copyright defined in NWGNUtail.inc will be used.
+#
+NLM_COPYRIGHT =
+
+#
+# This is used by the '-threadname' directive. If left blank,
+# NLM_NAME Thread will be used.
+#
+NLM_THREAD_NAME = JK Module
+
+#
+# If this is specified, it will override VERSION value in
+# $(AP_WORK)\build\NWGNUenvironment.inc
+#
+NLM_VERSION = $(JK_VERSION)
+
+#
+# If this is specified, it will override the default of 64K
+#
+NLM_STACK_SIZE = 49152
+
+
+#
+# If this is specified it will be used by the link '-entry' directive
+#
+NLM_ENTRY_SYM = _LibCPrelude
+
+#
+# If this is specified it will be used by the link '-exit' directive
+#
+NLM_EXIT_SYM = _LibCPostlude
+
+#
+# If this is specified it will be used by the link '-check' directive
+#
+NLM_CHECK_SYM =
+
+#
+# If these are specified it will be used by the link '-flags' directive
+#
+NLM_FLAGS = AUTOUNLOAD, PSEUDOPREEMPTION
+
+#
+# If this is specified it will be linked in with the XDCData option in the def
+# file instead of the default of $(NWOS)/apache.xdc. XDCData can be disabled
+# by setting APACHE_UNIPROC in the environment
+#
+XDCDATA =
+
+#
+# If there is an NLM target, put it here
+#
+TARGET_nlm = \
+ $(OBJDIR)/$(NLM_NAME).nlm \
+ $(EOLIST)
+
+#
+# If there is an LIB target, put it here
+#
+TARGET_lib = \
+ $(EOLIST)
+
+#
+# These are the OBJ files needed to create the NLM target above.
+# Paths must all use the '/' character
+#
+FILES_nlm_objs = \
+ $(OBJDIR)/jk_nwmain.o \
+ $(OBJDIR)/jk_ajp12_worker.o \
+ $(OBJDIR)/jk_ajp13.o \
+ $(OBJDIR)/jk_ajp13_worker.o \
+ $(OBJDIR)/jk_ajp14.o \
+ $(OBJDIR)/jk_ajp14_worker.o \
+ $(OBJDIR)/jk_ajp_common.o \
+ $(OBJDIR)/jk_connect.o \
+ $(OBJDIR)/jk_context.o \
+ $(OBJDIR)/jk_jni_worker.o \
+ $(OBJDIR)/jk_lb_worker.o \
+ $(OBJDIR)/jk_map.o \
+ $(OBJDIR)/jk_md5.o \
+ $(OBJDIR)/jk_msg_buff.o \
+ $(OBJDIR)/jk_pool.o \
+ $(OBJDIR)/jk_shm.o \
+ $(OBJDIR)/jk_sockbuf.o \
+ $(OBJDIR)/jk_status.o \
+ $(OBJDIR)/jk_uri_worker_map.o \
+ $(OBJDIR)/jk_url.o \
+ $(OBJDIR)/jk_util.o \
+ $(OBJDIR)/jk_worker.o \
+ $(OBJDIR)/mod_jk.o \
+ $(EOLIST)
+
+#
+# These are the LIB files needed to create the NLM target above.
+# These will be added as a library command in the link.opt file.
+#
+FILES_nlm_libs = \
+ $(NOVELLLIBC)/imports/libcpre.o \
+ $(EOLIST)
+
+#
+# These are the modules that the above NLM target depends on to load.
+# These will be added as a module command in the link.opt file.
+#
+FILES_nlm_modules = \
+ aprlib \
+ libc \
+ $(EOLIST)
+
+#
+# If the nlm has a msg file, put it's path here
+#
+FILE_nlm_msg =
+
+#
+# If the nlm has a hlp file put it's path here
+#
+FILE_nlm_hlp =
+
+#
+# If this is specified, it will override $(NWOS)\copyright.txt.
+#
+FILE_nlm_copyright =
+
+#
+# Any additional imports go here
+#
+FILES_nlm_Ximports = \
+ @aprlib.imp \
+ @httpd.imp \
+ @libc.imp \
+ @ws2nlm.imp \
+ $(EOLIST)
+
+#
+# Any symbols exported to here
+#
+FILES_nlm_exports = \
+ jk_module \
+ $(EOLIST)
+
+#
+# These are the OBJ files needed to create the LIB target above.
+# Paths must all use the '/' character
+#
+FILES_lib_objs = \
+ $(EOLIST)
+
+#
+# implement targets and dependancies (leave this section alone)
+#
+
+libs :: $(OBJDIR) $(TARGET_lib)
+
+nlms :: libs $(TARGET_nlm)
+
+#
+# Updated this target to create necessary directories and copy files to the
+# correct place. (See $(AP_WORK)\build\NWGNUhead.inc for examples)
+#
+install :: nlms FORCE
+ copy $(OBJDIR)\*.nlm $(INSTALL)\Apache2\modules\*.*
+
+#
+# Any specialized rules here
+#
+
+vpath %.c $(JKCOMMON)
+
+$(OBJDIR)/version.inc: $(JKCOMMON)/jk_version.h $(OBJDIR)
+ @echo Creating $@
+ @awk -f ../../support/get_ver.awk $< > $@
+
+
+#
+# Include the version info retrieved from jk_version.h
+#
+
+-include $(OBJDIR)/version.inc
+
+#
+# Include the 'tail' makefile that has targets that depend on variables defined
+# in this makefile
+#
+
+include $(AP_WORK)/build/NWGNUtail.inc
+
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/bldjk.qclsrc b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/bldjk.qclsrc
new file mode 100644
index 00000000..7761cda9
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/bldjk.qclsrc
@@ -0,0 +1,291 @@
+PGM
+CRTCMOD MODULE(MOD_JK/MOD_JK) +
+ SRCSTMF('/home/apache/jk/native/apache-2.0/mod_jk.c') +
+ DEFINE('AS400' 'HAVE_JNI' 'HAVE_APR' '_XOPEN_SOURCE=520' +
+ 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('mod_jk.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALE) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_AJP_COM) +
+ SRCSTMF('/home/apache/jk/native/common/jk_ajp_common.c') +
+ DEFINE('AS400' 'HAVE_JNI' 'HAVE_APR' '_XOPEN_SOURCE=520' +
+ 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_ajp_common.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALE) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_AJP12_W) +
+ SRCSTMF('/home/apache/jk/native/common/jk_ajp12_worker.c') +
+ DEFINE('AS400' 'HAVE_JNI' 'HAVE_APR' '_XOPEN_SOURCE=520' +
+ 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_ajp12_worker.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALE) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_AJP13) +
+ SRCSTMF('/home/apache/jk/native/common/jk_ajp13.c') +
+ DEFINE('AS400' 'HAVE_JNI' 'HAVE_APR' '_XOPEN_SOURCE=520' +
+ 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_ajp13.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALE) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_AJP13_W) +
+ SRCSTMF('/home/apache/jk/native/common/jk_ajp13_worker.c') +
+ DEFINE('AS400' 'HAVE_JNI' 'HAVE_APR' '_XOPEN_SOURCE=520' +
+ 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_ajp13_worker.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALE) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_AJP14) +
+ SRCSTMF('/home/apache/jk/native/common/jk_ajp14.c') +
+ DEFINE('AS400' 'HAVE_JNI' 'HAVE_APR' '_XOPEN_SOURCE=520' +
+ 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_ajp14.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALE) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_AJP14_W) +
+ SRCSTMF('/home/apache/jk/native/common/jk_ajp14_worker.c') +
+ DEFINE('AS400' 'HAVE_JNI' 'HAVE_APR' '_XOPEN_SOURCE=520' +
+ 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_ajp14_worker.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALE) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_CONNECT) +
+ SRCSTMF('/home/apache/jk/native/common/jk_connect.c') +
+ DEFINE('AS400' 'HAVE_JNI' 'HAVE_APR' '_XOPEN_SOURCE=520' +
+ 'USE_APACHE_MD5' '_REENTRANT' 'USE_SO_RCVTIMEO' +
+ 'USE_SO_SNDTIMEO' ) +
+ TEXT('jk_connect.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALE) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_CONTEXT) +
+ SRCSTMF('/home/apache/jk/native/common/jk_context.c') +
+ DEFINE('AS400' 'HAVE_JNI' 'HAVE_APR' '_XOPEN_SOURCE=520' +
+ 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_context.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALE) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_JNI_WOR) +
+ SRCSTMF('/home/apache/jk/native/common/jk_jni_worker.c') +
+ DEFINE('AS400' 'HAVE_JNI' 'HAVE_APR' 'OS400_JVM_12' +
+ '_XOPEN_SOURCE=520' + 'USE_APACHE_MD5' +
+ '_REENTRANT') +
+ TEXT('jk_jni_worker.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALE) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_LB_WORK) +
+ SRCSTMF('/home/apache/jk/native/common/jk_lb_worker.c') +
+ DEFINE('AS400' 'HAVE_JNI' 'HAVE_APR' '_XOPEN_SOURCE=520' +
+ 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_lb_worker.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALE) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_MAP) +
+ SRCSTMF('/home/apache/jk/native/common/jk_map.c') +
+ DEFINE('AS400' 'HAVE_JNI' 'HAVE_APR' '_XOPEN_SOURCE=520' +
+ 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_map.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALE) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_MD5) +
+ SRCSTMF('/home/apache/jk/native/common/jk_md5.c') +
+ DEFINE('AS400' 'HAVE_JNI' 'HAVE_APR' '_XOPEN_SOURCE=520' +
+ 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_md5.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALE) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_MSG_BUF) +
+ SRCSTMF('/home/apache/jk/native/common/jk_msg_buff.c') +
+ DEFINE('AS400' 'HAVE_JNI' 'HAVE_APR' '_XOPEN_SOURCE=520' +
+ 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_msg_buff.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALE) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_POOL) +
+ SRCSTMF('/home/apache/jk/native/common/jk_pool.c') +
+ DEFINE('AS400' 'HAVE_JNI' 'HAVE_APR' '_XOPEN_SOURCE=520' +
+ 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_pool.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALE) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_SOCKBUF) +
+ SRCSTMF('/home/apache/jk/native/common/jk_sockbuf.c') +
+ DEFINE('AS400' 'HAVE_JNI' 'HAVE_APR' '_XOPEN_SOURCE=520' +
+ 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_sockbuf.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALE) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_URI_W_M) +
+ SRCSTMF('/home/apache/jk/native/common/jk_uri_worker_map.c') +
+ DEFINE('AS400' 'HAVE_JNI' 'HAVE_APR' '_XOPEN_SOURCE=520' +
+ 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_uri_worker_map.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALE) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_URL) +
+ SRCSTMF('/home/apache/jk/native/common/jk_url.c') +
+ DEFINE('AS400' 'HAVE_JNI' 'HAVE_APR' '_XOPEN_SOURCE=520' +
+ 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_url.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALE) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_UTIL) +
+ SRCSTMF('/home/apache/jk/native/common/jk_util.c') +
+ DEFINE('AS400' 'HAVE_JNI' 'HAVE_APR' '_XOPEN_SOURCE=520' +
+ 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_util.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALE) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_WORKER) +
+ SRCSTMF('/home/apache/jk/native/common/jk_worker.c') +
+ DEFINE('AS400' 'HAVE_JNI' 'HAVE_APR' '_XOPEN_SOURCE=520' +
+ 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_worker.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALE) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_STATUS) +
+ SRCSTMF('/home/apache/jk/native/common/jk_status.c') +
+ DEFINE('AS400' 'HAVE_JNI' 'HAVE_APR' '_XOPEN_SOURCE=520' +
+ 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_status.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALE) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_SHM) +
+ SRCSTMF('/home/apache/jk/native/common/jk_shm.c') +
+ DEFINE('AS400' 'HAVE_JNI' 'HAVE_APR' '_XOPEN_SOURCE=520' +
+ 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_shm.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALE) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTSRVPGM SRVPGM(MOD_JK/MOD_JK) +
+ MODULE(MOD_JK/MOD_JK +
+ MOD_JK/JK_AJP_COM MOD_JK/JK_AJP12_W +
+ MOD_JK/JK_AJP13 MOD_JK/JK_AJP13_W +
+ MOD_JK/JK_AJP14 MOD_JK/JK_AJP14_W +
+ MOD_JK/JK_CONNECT MOD_JK/JK_CONTEXT +
+ MOD_JK/JK_JNI_WOR MOD_JK/JK_LB_WORK +
+ MOD_JK/JK_MAP MOD_JK/JK_MD5 +
+ MOD_JK/JK_MSG_BUF MOD_JK/JK_POOL +
+ MOD_JK/JK_SOCKBUF MOD_JK/JK_URI_W_M +
+ MOD_JK/JK_URL +
+ MOD_JK/JK_UTIL MOD_JK/JK_WORKER +
+ MOD_JK/JK_STATUS MOD_JK/JK_SHM) +
+ EXPORT(*SRCFILE) +
+ BNDDIR() +
+ TGTRLS(*CURRENT) +
+ SRCFILE(MOD_JK/QSRVSRC) +
+ SRCMBR(MOD_JK) +
+ USRPRF(*USER) +
+ BNDSRVPGM(QHTTPSVR/QZSRAPR QHTTPSVR/QZSRCORE +
+ QHTTPSVR/QZSRXMLP QHTTPSVR/QZSRSDBM) +
+ TEXT('Apache Tomcat mod_jk connector module')
+
+ENDPGM
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/bldjk54.qclsrc b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/bldjk54.qclsrc
new file mode 100644
index 00000000..7d0f7189
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/bldjk54.qclsrc
@@ -0,0 +1,313 @@
+PGM
+CRTCMOD MODULE(MOD_JK/MOD_JK) +
+ SRCSTMF('/home/apache/jk/native/apache-2.0/mod_jk.c') +
+ DEFINE('AS400' 'AS400_UTF8' 'HAVE_JNI' 'HAVE_APR' +
+ '_XOPEN_SOURCE=520' + 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('mod_jk.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALEUTF) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TERASPACE(*YES) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_AJP_COM) +
+ SRCSTMF('/home/apache/jk/native/common/jk_ajp_common.c') +
+ DEFINE('AS400' 'AS400_UTF8' 'HAVE_JNI' 'HAVE_APR' +
+ '_XOPEN_SOURCE=520' + 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_ajp_common.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALEUTF) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TERASPACE(*YES) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_AJP12_W) +
+ SRCSTMF('/home/apache/jk/native/common/jk_ajp12_worker.c') +
+ DEFINE('AS400' 'AS400_UTF8' 'HAVE_JNI' 'HAVE_APR' +
+ '_XOPEN_SOURCE=520' + 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_ajp12_worker.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALEUTF) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TERASPACE(*YES) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_AJP13) +
+ SRCSTMF('/home/apache/jk/native/common/jk_ajp13.c') +
+ DEFINE('AS400' 'AS400_UTF8' 'HAVE_JNI' 'HAVE_APR' +
+ '_XOPEN_SOURCE=520' + 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_ajp13.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALEUTF) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TERASPACE(*YES) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_AJP13_W) +
+ SRCSTMF('/home/apache/jk/native/common/jk_ajp13_worker.c') +
+ DEFINE('AS400' 'AS400_UTF8' 'HAVE_JNI' 'HAVE_APR' +
+ '_XOPEN_SOURCE=520' 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_ajp13_worker.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALEUTF) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TERASPACE(*YES) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_AJP14) +
+ SRCSTMF('/home/apache/jk/native/common/jk_ajp14.c') +
+ DEFINE('AS400' 'AS400_UTF8' 'HAVE_JNI' 'HAVE_APR' +
+ '_XOPEN_SOURCE=520' 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_ajp14.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALEUTF) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TERASPACE(*YES) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_AJP14_W) +
+ SRCSTMF('/home/apache/jk/native/common/jk_ajp14_worker.c') +
+ DEFINE('AS400' 'AS400_UTF8' 'HAVE_JNI' 'HAVE_APR' +
+ '_XOPEN_SOURCE=520' 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_ajp14_worker.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALEUTF) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TERASPACE(*YES) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_CONNECT) +
+ SRCSTMF('/home/apache/jk/native/common/jk_connect.c') +
+ DEFINE('AS400' 'AS400_UTF8' 'HAVE_JNI' 'HAVE_APR' +
+ '_XOPEN_SOURCE=520' 'USE_APACHE_MD5' '_REENTRANT' +
+ 'USE_SO_RCVTIMEO' + 'USE_SO_SNDTIMEO' ) +
+ TEXT('jk_connect.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALEUTF) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TERASPACE(*YES) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_CONTEXT) +
+ SRCSTMF('/home/apache/jk/native/common/jk_context.c') +
+ DEFINE('AS400' 'AS400_UTF8' 'HAVE_JNI' 'HAVE_APR' +
+ '_XOPEN_SOURCE=520' 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_context.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALEUTF) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TERASPACE(*YES) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_JNI_WOR) +
+ SRCSTMF('/home/apache/jk/native/common/jk_jni_worker.c') +
+ DEFINE('AS400' 'AS400_UTF8' 'HAVE_JNI' 'HAVE_APR' 'OS400_JVM_12' +
+ '_XOPEN_SOURCE=520' + 'USE_APACHE_MD5' +
+ '_REENTRANT') +
+ TEXT('jk_jni_worker.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALEUTF) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TERASPACE(*YES) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_LB_WORK) +
+ SRCSTMF('/home/apache/jk/native/common/jk_lb_worker.c') +
+ DEFINE('AS400' 'AS400_UTF8' 'HAVE_JNI' 'HAVE_APR' +
+ '_XOPEN_SOURCE=520' 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_lb_worker.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALEUTF) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TERASPACE(*YES) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_MAP) +
+ SRCSTMF('/home/apache/jk/native/common/jk_map.c') +
+ DEFINE('AS400' 'AS400_UTF8' 'HAVE_JNI' 'HAVE_APR' +
+ '_XOPEN_SOURCE=520' 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_map.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALEUTF) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TERASPACE(*YES) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_MD5) +
+ SRCSTMF('/home/apache/jk/native/common/jk_md5.c') +
+ DEFINE('AS400' 'AS400_UTF8' 'HAVE_JNI' 'HAVE_APR' +
+ '_XOPEN_SOURCE=520' 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_md5.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALEUTF) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TERASPACE(*YES) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_MSG_BUF) +
+ SRCSTMF('/home/apache/jk/native/common/jk_msg_buff.c') +
+ DEFINE('AS400' 'AS400_UTF8' 'HAVE_JNI' 'HAVE_APR' +
+ '_XOPEN_SOURCE=520' 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_msg_buff.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALEUTF) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TERASPACE(*YES) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_POOL) +
+ SRCSTMF('/home/apache/jk/native/common/jk_pool.c') +
+ DEFINE('AS400' 'AS400_UTF8' 'HAVE_JNI' 'HAVE_APR' +
+ '_XOPEN_SOURCE=520' 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_pool.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALEUTF) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TERASPACE(*YES) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_SOCKBUF) +
+ SRCSTMF('/home/apache/jk/native/common/jk_sockbuf.c') +
+ DEFINE('AS400' 'AS400_UTF8' 'HAVE_JNI' 'HAVE_APR' +
+ '_XOPEN_SOURCE=520' 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_sockbuf.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALEUTF) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TERASPACE(*YES) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_URI_W_M) +
+ SRCSTMF('/home/apache/jk/native/common/jk_uri_worker_map.c') +
+ DEFINE('AS400' 'AS400_UTF8' 'HAVE_JNI' 'HAVE_APR' +
+ '_XOPEN_SOURCE=520' 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_uri_worker_map.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALEUTF) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TERASPACE(*YES) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_URL) +
+ SRCSTMF('/home/apache/jk/native/common/jk_url.c') +
+ DEFINE('AS400' 'AS400_UTF8' 'HAVE_JNI' 'HAVE_APR' +
+ '_XOPEN_SOURCE=520' 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_url.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALEUTF) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TERASPACE(*YES) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_UTIL) +
+ SRCSTMF('/home/apache/jk/native/common/jk_util.c') +
+ DEFINE('AS400' 'AS400_UTF8' 'HAVE_JNI' 'HAVE_APR' +
+ '_XOPEN_SOURCE=520' 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_util.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALEUTF) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TERASPACE(*YES) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_WORKER) +
+ SRCSTMF('/home/apache/jk/native/common/jk_worker.c') +
+ DEFINE('AS400' 'AS400_UTF8' 'HAVE_JNI' 'HAVE_APR' +
+ '_XOPEN_SOURCE=520' 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_worker.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALEUTF) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TERASPACE(*YES) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_STATUS) +
+ SRCSTMF('/home/apache/jk/native/common/jk_status.c') +
+ DEFINE('AS400' 'AS400_UTF8' 'HAVE_JNI' 'HAVE_APR' +
+ '_XOPEN_SOURCE=520' 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_status.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALEUTF) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TERASPACE(*YES) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTCMOD MODULE(MOD_JK/JK_SHM) +
+ SRCSTMF('/home/apache/jk/native/common/jk_shm.c') +
+ DEFINE('AS400' 'AS400_UTF8' 'HAVE_JNI' 'HAVE_APR' +
+ '_XOPEN_SOURCE=520' 'USE_APACHE_MD5' '_REENTRANT') +
+ TEXT('jk_shm.c') +
+ OPTIMIZE(40) +
+ LOCALETYPE(*LOCALEUTF) +
+ SYSIFCOPT(*IFSIO) +
+ LANGLVL(*EXTENDED) +
+ TERASPACE(*YES) +
+ TGTRLS(*CURRENT) +
+ INCDIR('/home/apache/jk/native/common' '/QIBM/ProdData/HTTPA/Include')
+
+CRTSRVPGM SRVPGM(MOD_JK/MOD_JK) +
+ MODULE(MOD_JK/MOD_JK +
+ MOD_JK/JK_AJP_COM MOD_JK/JK_AJP12_W +
+ MOD_JK/JK_AJP13 MOD_JK/JK_AJP13_W +
+ MOD_JK/JK_AJP14 MOD_JK/JK_AJP14_W +
+ MOD_JK/JK_CONNECT MOD_JK/JK_CONTEXT +
+ MOD_JK/JK_JNI_WOR MOD_JK/JK_LB_WORK +
+ MOD_JK/JK_MAP MOD_JK/JK_MD5 +
+ MOD_JK/JK_MSG_BUF MOD_JK/JK_POOL +
+ MOD_JK/JK_SOCKBUF MOD_JK/JK_URI_W_M +
+ MOD_JK/JK_URL +
+ MOD_JK/JK_UTIL MOD_JK/JK_WORKER +
+ MOD_JK/JK_STATUS MOD_JK/JK_SHM) +
+ EXPORT(*SRCFILE) +
+ BNDDIR() +
+ TGTRLS(*CURRENT) +
+ SRCFILE(MOD_JK/QSRVSRC) +
+ SRCMBR(MOD_JK) +
+ USRPRF(*USER) +
+ BNDSRVPGM(QHTTPSVR/QZSRAPR QHTTPSVR/QZSRCORE +
+ QHTTPSVR/QZSRXMLP QHTTPSVR/QZSRSDBM) +
+ TEXT('Apache Tomcat mod_jk connector module')
+
+ENDPGM
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/config.m4 b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/config.m4
new file mode 100644
index 00000000..939e839c
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/config.m4
@@ -0,0 +1,34 @@
+dnl -------------------------------------------------------- -*- autoconf -*-
+dnl Licensed to the Apache Software Foundation (ASF) under one or more
+dnl contributor license agreements. See the NOTICE file distributed with
+dnl this work for additional information regarding copyright ownership.
+dnl The ASF licenses this file to You under the Apache License, Version 2.0
+dnl (the "License"); you may not use this file except in compliance with
+dnl the License. You may obtain a copy of the License at
+dnl
+dnl http://www.apache.org/licenses/LICENSE-2.0
+dnl
+dnl Unless required by applicable law or agreed to in writing, software
+dnl distributed under the License is distributed on an "AS IS" BASIS,
+dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+dnl See the License for the specific language governing permissions and
+dnl limitations under the License.
+
+AC_MSG_CHECKING(for mod_jk module)
+AC_ARG_WITH(mod_jk,
+ [ --with-mod_jk Include the mod_jk (static).],
+ [
+ modpath_current=modules/jk
+ module=jk
+ libname=lib_jk.la
+ BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname"
+ cat >>$modpath_current/modules.mk<<EOF
+DISTCLEAN_TARGETS = modules.mk
+static = $libname
+shared =
+EOF
+ MODLIST="$MODLIST $module"
+ AC_MSG_RESULT(added $withval)
+ ],
+ [ AC_MSG_RESULT(no mod_jk added)
+ ])
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/mod_jk.a b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/mod_jk.a
new file mode 100644
index 00000000..7ad60378
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/mod_jk.a
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/mod_jk.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/mod_jk.c
new file mode 100644
index 00000000..40f08e47
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/mod_jk.c
@@ -0,0 +1,3748 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: Apache 2 plugin for Tomcat *
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Henri Gomez <hgomez@apache.org> *
+ * Version: $Revision: 1126561 $ *
+ ***************************************************************************/
+
+/*
+ * mod_jk: keeps all servlet related ramblings together.
+ */
+
+#include "ap_config.h"
+#include "apr_lib.h"
+#include "apr_date.h"
+#include "apr_file_info.h"
+#include "apr_file_io.h"
+#include "httpd.h"
+#include "http_config.h"
+#include "http_request.h"
+#include "http_core.h"
+#include "http_protocol.h"
+#include "http_main.h"
+#include "http_log.h"
+#include "util_script.h"
+#include "ap_mpm.h"
+
+#if defined(AS400) && !defined(AS400_UTF8)
+#include "ap_charset.h"
+#include "util_charset.h" /* ap_hdrs_from_ascii */
+#endif
+
+/* deprecated with apr 0.9.3 */
+
+#include "apr_version.h"
+#if (APR_MAJOR_VERSION == 0) && \
+ (APR_MINOR_VERSION <= 9) && \
+ (APR_PATCH_VERSION < 3)
+#define apr_filepath_name_get apr_filename_of_pathname
+#endif
+
+#include "apr_strings.h"
+
+/* Yes; sorta sucks - with luck we will clean this up before httpd-2.2
+ * ships, leaving AP_NEED_SET_MUTEX_PERMS def'd as 1 or 0 on all platforms.
+ */
+#ifdef AP_NEED_SET_MUTEX_PERMS
+# define JK_NEED_SET_MUTEX_PERMS AP_NEED_SET_MUTEX_PERMS
+#else
+ /* A special case for httpd-2.0 */
+# if !defined(OS2) && !defined(WIN32) && !defined(BEOS) && !defined(NETWARE) && !defined(AS400)
+# define JK_NEED_SET_MUTEX_PERMS 1
+# else
+# define JK_NEED_SET_MUTEX_PERMS 0
+# endif
+#endif
+
+#if JK_NEED_SET_MUTEX_PERMS
+#include "unixd.h" /* for unixd_set_global_mutex_perms */
+#endif
+/*
+ * jk_ include files
+ */
+#ifdef NETWARE
+#define __sys_types_h__
+#define __sys_socket_h__
+#define __netdb_h__
+#define __netinet_in_h__
+#define __arpa_inet_h__
+#define __sys_timeval_h__
+#endif
+
+#include "jk_global.h"
+#include "jk_ajp13.h"
+#include "jk_logger.h"
+#include "jk_map.h"
+#include "jk_pool.h"
+#include "jk_service.h"
+#include "jk_uri_worker_map.h"
+#include "jk_util.h"
+#include "jk_worker.h"
+#include "jk_shm.h"
+#include "jk_url.h"
+
+#define JK_LOG_DEF_FILE ("logs/mod_jk.log")
+#define JK_SHM_DEF_FILE ("logs/jk-runtime-status")
+#define JK_ENV_REMOTE_ADDR ("JK_REMOTE_ADDR")
+#define JK_ENV_REMOTE_PORT ("JK_REMOTE_PORT")
+#define JK_ENV_REMOTE_HOST ("JK_REMOTE_HOST")
+#define JK_ENV_REMOTE_USER ("JK_REMOTE_USER")
+#define JK_ENV_AUTH_TYPE ("JK_AUTH_TYPE")
+#define JK_ENV_LOCAL_NAME ("JK_LOCAL_NAME")
+#define JK_ENV_LOCAL_PORT ("JK_LOCAL_PORT")
+#define JK_ENV_HTTPS ("HTTPS")
+#define JK_ENV_CERTS ("SSL_CLIENT_CERT")
+#define JK_ENV_CIPHER ("SSL_CIPHER")
+#define JK_ENV_SESSION ("SSL_SESSION_ID")
+#define JK_ENV_KEY_SIZE ("SSL_CIPHER_USEKEYSIZE")
+#define JK_ENV_CERTCHAIN_PREFIX ("SSL_CLIENT_CERT_CHAIN_")
+#define JK_ENV_REPLY_TIMEOUT ("JK_REPLY_TIMEOUT")
+#define JK_ENV_WORKER_NAME ("JK_WORKER_NAME")
+#define JK_NOTE_WORKER_NAME ("JK_WORKER_NAME")
+#define JK_NOTE_WORKER_TYPE ("JK_WORKER_TYPE")
+#define JK_NOTE_REQUEST_DURATION ("JK_REQUEST_DURATION")
+#define JK_NOTE_WORKER_ROUTE ("JK_WORKER_ROUTE")
+#define JK_HANDLER ("jakarta-servlet")
+#define JK_MAGIC_TYPE ("application/x-jakarta-servlet")
+#define NULL_FOR_EMPTY(x) ((x && !strlen(x)) ? NULL : x)
+#define STRNULL_FOR_NULL(x) ((x) ? (x) : "(null)")
+#define JK_LOG_LOCK_KEY ("jk_log_lock_key")
+#define JKLOG_MARK __FILE__,__LINE__
+
+/*
+ * If you are not using SSL, comment out the following line. It will make
+ * apache run faster.
+ *
+ * Personally, I (DM), think this may be a lie.
+ */
+#define ADD_SSL_INFO
+
+/* Needed for Apache 2.3/2.4 per-module log config */
+#ifdef APLOG_USE_MODULE
+APLOG_USE_MODULE(jk);
+#endif
+
+/* module MODULE_VAR_EXPORT jk_module; */
+AP_MODULE_DECLARE_DATA module jk_module;
+
+/*
+ * Environment variable forward object
+ */
+typedef struct
+{
+ int has_default;
+ char *name;
+ char *value;
+} envvar_item;
+
+/*
+ * Configuration object for the mod_jk module.
+ */
+typedef struct
+{
+
+ /*
+ * Log stuff
+ */
+ char *log_file;
+ int log_level;
+ jk_logger_t *log;
+ apr_file_t *jklogfp;
+
+ /*
+ * Mount stuff
+ */
+ char *mount_file;
+ int mount_file_reload;
+ jk_map_t *uri_to_context;
+
+ int mountcopy;
+
+ jk_uri_worker_map_t *uw_map;
+
+ int was_initialized;
+
+ /*
+ * Automatic context path apache alias
+ */
+ char *alias_dir;
+
+ /*
+ * Request Logging
+ */
+
+ char *stamp_format_string;
+ char *format_string;
+ apr_array_header_t *format;
+
+ /*
+ * Setting target worker via environment
+ */
+ char *worker_indicator;
+
+ /*
+ * Configurable environment variables to overwrite
+ * request information using meta data send by a
+ * proxy in front of us.
+ */
+ char *remote_addr_indicator;
+ char *remote_port_indicator;
+ char *remote_host_indicator;
+ char *remote_user_indicator;
+ char *auth_type_indicator;
+ char *local_name_indicator;
+ char *local_port_indicator;
+
+ /*
+ * SSL Support
+ */
+ int ssl_enable;
+ char *https_indicator;
+ char *certs_indicator;
+ char *cipher_indicator;
+ char *session_indicator; /* Servlet API 2.3 requirement */
+ char *key_size_indicator; /* Servlet API 2.3 requirement */
+ char *certchain_prefix; /* Client certificate chain prefix */
+
+ /*
+ * Jk Options
+ */
+ int options;
+ int exclude_options;
+
+ int strip_session;
+ char *strip_session_name;
+ /*
+ * Environment variables support
+ */
+ int envvars_has_own;
+ apr_table_t *envvars;
+ apr_table_t *envvars_def;
+ apr_array_header_t *envvar_items;
+
+ server_rec *s;
+} jk_server_conf_t;
+
+struct apache_private_data
+{
+ jk_pool_t p;
+
+ int read_body_started;
+ request_rec *r;
+};
+typedef struct apache_private_data apache_private_data_t;
+
+static server_rec *main_server = NULL;
+static jk_logger_t *main_log = NULL;
+static apr_hash_t *jk_log_fps = NULL;
+static jk_worker_env_t worker_env;
+static apr_global_mutex_t *jk_log_lock = NULL;
+static char *jk_shm_file = NULL;
+static size_t jk_shm_size = 0;
+static int jk_shm_size_set = 0;
+static volatile int jk_watchdog_interval = 0;
+static volatile int jk_watchdog_running = 0;
+
+/*
+ * Worker stuff
+*/
+static jk_map_t *jk_worker_properties = NULL;
+static char *jk_worker_file = NULL;
+static int jk_mount_copy_all = JK_FALSE;
+
+static int JK_METHOD ws_start_response(jk_ws_service_t *s,
+ int status,
+ const char *reason,
+ const char *const *header_names,
+ const char *const *header_values,
+ unsigned num_of_headers);
+
+static int JK_METHOD ws_read(jk_ws_service_t *s,
+ void *b, unsigned len, unsigned *actually_read);
+
+static int init_jk(apr_pool_t * pconf, jk_server_conf_t * conf,
+ server_rec * s);
+
+static int JK_METHOD ws_write(jk_ws_service_t *s, const void *b, unsigned l);
+
+static void JK_METHOD ws_add_log_items(jk_ws_service_t *s,
+ const char *const *log_names,
+ const char *const *log_values,
+ unsigned num_of_log_items);
+
+static void * JK_METHOD ws_next_vhost(void *d);
+
+static void JK_METHOD ws_vhost_to_text(void *d, char *buf, size_t len);
+
+static jk_uri_worker_map_t * JK_METHOD ws_vhost_to_uw_map(void *d);
+
+/* ========================================================================= */
+/* JK Service step callbacks */
+/* ========================================================================= */
+
+static int JK_METHOD ws_start_response(jk_ws_service_t *s,
+ int status,
+ const char *reason,
+ const char *const *header_names,
+ const char *const *header_values,
+ unsigned num_of_headers)
+{
+ unsigned h;
+ apache_private_data_t *p = s->ws_private;
+ request_rec *r = p->r;
+
+ /* If we use proxy error pages, still pass
+ * through context headers needed for special status codes.
+ */
+ if (s->extension.use_server_error_pages &&
+ status >= s->extension.use_server_error_pages) {
+ if (status == HTTP_UNAUTHORIZED) {
+ int found = JK_FALSE;
+ for (h = 0; h < num_of_headers; h++) {
+ if (!strcasecmp(header_names[h], "WWW-Authenticate")) {
+ char *tmp = apr_pstrdup(r->pool, header_values[h]);
+ apr_table_set(r->err_headers_out,
+ "WWW-Authenticate", tmp);
+ found = JK_TRUE;
+ }
+ }
+ if (found == JK_FALSE) {
+ jk_server_conf_t *xconf = (jk_server_conf_t *)
+ ap_get_module_config(r->server->module_config,
+ &jk_module);
+ jk_log(xconf->log, JK_LOG_INFO,
+ "origin server sent 401 without"
+ " WWW-Authenticate header");
+ }
+ }
+ return JK_TRUE;
+ }
+
+ /* If there is no reason given (or an empty one),
+ * we'll try to guess a good one.
+ */
+ if (!reason || *reason == '\0') {
+ /* We ask Apache httpd about a good reason phrase. */
+ reason = ap_get_status_line(status);
+ /* Unfortunately it returns with a 500 reason phrase,
+ * whenever it does not know about the given status code,
+ * e.g. in the case of custom status codes.
+ */
+ if (status != 500 && !strncmp(reason, "500 ", 4)) {
+ reason = "Unknown Reason";
+ } else {
+ /* Apache httpd returns a full status line,
+ * but we only want a reason phrase, so skip
+ * the prepended status code.
+ */
+ reason = reason + 4;
+ }
+ }
+ r->status = status;
+ r->status_line = apr_psprintf(r->pool, "%d %s", status, reason);
+
+ for (h = 0; h < num_of_headers; h++) {
+ if (!strcasecmp(header_names[h], "Content-type")) {
+ char *tmp = apr_pstrdup(r->pool, header_values[h]);
+ ap_content_type_tolower(tmp);
+ /* It should be done like this in Apache 2.0 */
+ /* This way, Apache 2.0 will be able to set the output filter */
+ /* and it make jk useable with deflate using */
+ /* AddOutputFilterByType DEFLATE text/html */
+ ap_set_content_type(r, tmp);
+ }
+ else if (!strcasecmp(header_names[h], "Location")) {
+#if defined(AS400) && !defined(AS400_UTF8)
+ /* Fix escapes in Location Header URL */
+ ap_fixup_escapes((char *)header_values[h],
+ strlen(header_values[h]), ap_hdrs_from_ascii);
+#endif
+ apr_table_set(r->headers_out, header_names[h], header_values[h]);
+ }
+ else if (!strcasecmp(header_names[h], "Content-Length")) {
+ apr_table_set(r->headers_out, header_names[h], header_values[h]);
+ }
+ else if (!strcasecmp(header_names[h], "Transfer-Encoding")) {
+ apr_table_set(r->headers_out, header_names[h], header_values[h]);
+ }
+ else if (!strcasecmp(header_names[h], "Last-Modified")) {
+ /*
+ * If the script gave us a Last-Modified header, we can't just
+ * pass it on blindly because of restrictions on future values.
+ */
+ ap_update_mtime(r, apr_date_parse_http(header_values[h]));
+ ap_set_last_modified(r);
+ }
+ else {
+ apr_table_add(r->headers_out, header_names[h], header_values[h]);
+ }
+ }
+
+ /* this NOP function was removed in apache 2.0 alpha14 */
+ /* ap_send_http_header(r); */
+ s->response_started = JK_TRUE;
+
+ return JK_TRUE;
+}
+
+/*
+ * Read a chunk of the request body into a buffer. Attempt to read len
+ * bytes into the buffer. Write the number of bytes actually read into
+ * actually_read.
+ *
+ * Think of this function as a method of the apache1.3-specific subclass of
+ * the jk_ws_service class. Think of the *s param as a "this" or "self"
+ * pointer.
+ */
+static int JK_METHOD ws_read(jk_ws_service_t *s,
+ void *b, unsigned len, unsigned *actually_read)
+{
+ if (s && s->ws_private && b && actually_read) {
+ apache_private_data_t *p = s->ws_private;
+ if (!p->read_body_started) {
+ if (ap_should_client_block(p->r)) {
+ p->read_body_started = JK_TRUE;
+ }
+ }
+
+ if (p->read_body_started) {
+#if defined(AS400) && !defined(AS400_UTF8)
+ int long rv = OK;
+ if (rv = ap_change_request_body_xlate(p->r, 65535, 65535)) { /* turn off request body translation */
+ ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_CRIT, 0, NULL,
+ "mod_jk: Error on ap_change_request_body_xlate, rc=%d",
+ rv);
+ return JK_FALSE;
+ }
+#else
+ long rv;
+#endif
+
+ if ((rv = ap_get_client_block(p->r, b, len)) < 0) {
+ *actually_read = 0;
+ }
+ else {
+ *actually_read = (unsigned)rv;
+ }
+ return JK_TRUE;
+ }
+ }
+ return JK_FALSE;
+}
+
+static void JK_METHOD ws_flush(jk_ws_service_t *s)
+{
+#if ! (defined(AS400) && !defined(AS400_UTF8))
+ if (s && s->ws_private) {
+ apache_private_data_t *p = s->ws_private;
+ ap_rflush(p->r);
+ }
+#endif
+}
+
+static void JK_METHOD ws_done(jk_ws_service_t *s)
+{
+#if ! (defined(AS400) && !defined(AS400_UTF8))
+ if (s && s->ws_private) {
+ apache_private_data_t *p = s->ws_private;
+ ap_finalize_request_protocol(p->r);
+ }
+#endif
+}
+
+/*
+ * Write a chunk of response data back to the browser. If the headers
+ * haven't yet been sent over, send over default header values (Status =
+ * 200, basically).
+ *
+ * Write len bytes from buffer b.
+ *
+ * Think of this function as a method of the apache1.3-specific subclass of
+ * the jk_ws_service class. Think of the *s param as a "this" or "self"
+ * pointer.
+ */
+/* Works with 4096, fails with 8192 */
+#ifndef CHUNK_SIZE
+#define CHUNK_SIZE 4096
+#endif
+
+static int JK_METHOD ws_write(jk_ws_service_t *s, const void *b, unsigned int l)
+{
+#if defined(AS400) && !defined(AS400_UTF8)
+ int rc;
+#endif
+
+ if (s && s->ws_private && b) {
+ apache_private_data_t *p = s->ws_private;
+
+ if (l) {
+ /* BUFF *bf = p->r->connection->client; */
+ int r = 0;
+ int ll = l;
+ const char *bb = (const char *)b;
+
+ if (!s->response_started) {
+ if (main_log)
+ jk_log(main_log, JK_LOG_INFO,
+ "Write without start, starting with defaults");
+ if (!s->start_response(s, 200, NULL, NULL, NULL, 0)) {
+ return JK_FALSE;
+ }
+ }
+ if (p->r->header_only) {
+#if ! (defined(AS400) && !defined(AS400_UTF8))
+ ap_rflush(p->r);
+#endif
+ return JK_TRUE;
+ }
+#if defined(AS400) && !defined(AS400_UTF8)
+ /* turn off response body translation */
+ rc = ap_change_response_body_xlate(p->r, 65535, 65535);
+ if (rc) {
+ ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_CRIT, 0, NULL,
+ "mod_jk: Error on ap_change_response_body_xlate, rc=%d",
+ rc);
+ return JK_FALSE;
+ }
+#endif
+
+ while (ll > 0 && !p->r->connection->aborted) {
+#if 0
+ /* Apache 2 output filter does not write
+ * directly to the wire.
+ */
+ int toSend = (ll > CHUNK_SIZE) ? CHUNK_SIZE : ll;
+ r = ap_rwrite(bb, toSend, p->r);
+#else
+ r = ap_rwrite(bb, ll, p->r);
+#endif
+ if (JK_IS_DEBUG_LEVEL(main_log))
+ jk_log(main_log, JK_LOG_DEBUG,
+ "written %d out of %d", r, ll);
+
+ if (r < 0)
+ return JK_FALSE;
+ ll -= r;
+ bb += r;
+ }
+ if (ll && p->r->connection->aborted) {
+ /* Fail if there is something left to send and
+ * the connection was aborted by the client
+ */
+ return JK_FALSE;
+ }
+ }
+
+ return JK_TRUE;
+ }
+ return JK_FALSE;
+}
+
+static void JK_METHOD ws_add_log_items(jk_ws_service_t *s,
+ const char *const *log_names,
+ const char *const *log_values,
+ unsigned num_of_log_items)
+{
+ unsigned h;
+ apache_private_data_t *p = s->ws_private;
+ request_rec *r = p->r;
+
+ for (h = 0; h < num_of_log_items; h++) {
+ if (log_names[h] && log_values[h]) {
+ apr_table_setn(r->notes, log_names[h], log_values[h]);
+ }
+ }
+}
+
+static void * JK_METHOD ws_next_vhost(void *d)
+{
+ server_rec *s = (server_rec *)d;
+ if (s == NULL)
+ return main_server;
+ return s->next;
+}
+
+static void JK_METHOD ws_vhost_to_text(void *d, char *buf, size_t len)
+{
+ server_rec *s = (server_rec *)d;
+ size_t used = 0;
+
+ if (s->server_hostname)
+ used += strlen(s->server_hostname);
+ if (!s->is_virtual) {
+ if (s->port)
+ used += strlen(":XXXXX");
+ }
+ else if (s->addrs) {
+ used += strlen(" [");
+ if (s->addrs->virthost)
+ used += strlen(s->addrs->virthost);
+ if (s->addrs->host_port)
+ used += strlen(":XXXXX");
+ used += strlen("]");
+ }
+
+ if (len < used && len > strlen("XXX")) {
+ strcpy(buf, "XXX");
+ return;
+ }
+
+ used = 0;
+
+ if (s->server_hostname) {
+ strcpy(buf + used, s->server_hostname);
+ used += strlen(s->server_hostname);
+ }
+ if (!s->is_virtual) {
+ if (s->port) {
+ sprintf(buf + used, ":%hu", s->port);
+ used = strlen(buf);
+ }
+ }
+ else if (s->addrs) {
+ strcpy(buf + used, " [");
+ used += strlen(" [");
+ if (s->addrs->virthost) {
+ strcpy(buf + used, s->addrs->virthost);
+ used += strlen(s->addrs->virthost);
+ }
+ if (s->addrs->host_port) {
+ sprintf(buf + used, ":%hu", s->addrs->host_port);
+ used = strlen(buf);
+ }
+ strcpy(buf + used, "]");
+ used += strlen("]");
+ }
+}
+
+static jk_uri_worker_map_t * JK_METHOD ws_vhost_to_uw_map(void *d)
+{
+ server_rec *s = (server_rec *)d;
+ jk_server_conf_t *conf = NULL;
+ if (s == NULL)
+ return NULL;
+ conf = (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+ return conf->uw_map;
+}
+
+/* ========================================================================= */
+/* Utility functions */
+/* ========================================================================= */
+
+/* ========================================================================= */
+/* Log something to Jk log file then exit */
+static void jk_error_exit(const char *file,
+ int line,
+ int level,
+ const server_rec * s,
+ apr_pool_t * p, const char *fmt, ...)
+{
+ va_list ap;
+ char *res;
+ char *ch;
+
+ va_start(ap, fmt);
+ res = apr_pvsprintf(s->process->pool, fmt, ap);
+ va_end(ap);
+ /* Replace all format characters in the resulting message */
+ /* because we feed the message to ap_log_error(). */
+ ch = res;
+ while (*ch) {
+ if (*ch == '%') {
+ *ch = '#';
+ }
+ ch++;
+ }
+
+#if (MODULE_MAGIC_NUMBER_MAJOR >= 20100606)
+ ap_log_error(file, line, APLOG_MODULE_INDEX, level, 0, s, res);
+#else
+ ap_log_error(file, line, level, 0, s, res);
+#endif
+ if ( s ) {
+#if (MODULE_MAGIC_NUMBER_MAJOR >= 20100606)
+ ap_log_error(file, line, APLOG_MODULE_INDEX, level, 0, NULL, res);
+#else
+ ap_log_error(file, line, level, 0, NULL, res);
+#endif
+ }
+
+ /* Exit process */
+ exit(1);
+}
+
+static jk_uint64_t get_content_length(request_rec * r)
+{
+ if (r->clength > 0) {
+ return (jk_uint64_t)r->clength;
+ }
+ else if (r->main == NULL || r->main == r) {
+ char *lenp = (char *)apr_table_get(r->headers_in, "Content-Length");
+
+ if (lenp) {
+ jk_uint64_t rc = 0;
+ if (sscanf(lenp, "%" JK_UINT64_T_FMT, &rc) > 0 && rc > 0) {
+ return rc;
+ }
+ }
+ }
+
+ return 0;
+}
+
+/* Retrieve string value from env var, use default if env var does not exist. */
+static const char *get_env_string(request_rec *r, const char *def,
+ char *env, int null_for_empty)
+{
+ char *value = (char *)apr_table_get(r->subprocess_env, env);
+ if (value)
+ return null_for_empty ? NULL_FOR_EMPTY(value) : value;
+ return null_for_empty ? NULL_FOR_EMPTY(def) : def;
+}
+
+/* Retrieve integer value from env var, use default if env var does not exist. */
+static int get_env_int(request_rec *r, int def, char *env)
+{
+ char *value = (char *)apr_table_get(r->subprocess_env, env);
+ if (value)
+ return atoi(value);
+ return def;
+}
+
+static int init_ws_service(apache_private_data_t * private_data,
+ jk_ws_service_t *s, jk_server_conf_t * conf)
+{
+ int size;
+ request_rec *r = private_data->r;
+ char *ssl_temp = NULL;
+ const char *reply_timeout = NULL;
+ rule_extension_t *e;
+
+ /* Copy in function pointers (which are really methods) */
+ s->start_response = ws_start_response;
+ s->read = ws_read;
+ s->write = ws_write;
+ s->flush = ws_flush;
+ s->done = ws_done;
+ s->add_log_items = ws_add_log_items;
+ s->next_vhost = ws_next_vhost;
+ s->vhost_to_text = ws_vhost_to_text;
+ s->vhost_to_uw_map = ws_vhost_to_uw_map;
+
+ s->auth_type = get_env_string(r, r->ap_auth_type,
+ conf->auth_type_indicator, 1);
+ s->remote_user = get_env_string(r, r->user,
+ conf->remote_user_indicator, 1);
+
+ s->protocol = r->protocol;
+ s->remote_host = (char *)ap_get_remote_host(r->connection,
+ r->per_dir_config,
+ REMOTE_HOST, NULL);
+ s->remote_host = get_env_string(r, s->remote_host,
+ conf->remote_host_indicator, 1);
+ if (conf->options & JK_OPT_FWDLOCAL) {
+ s->remote_addr = r->connection->local_ip;
+ /* We don't know the client port of the backend connection. */
+ s->remote_port = "0";
+ }
+ else {
+ s->remote_addr = r->connection->remote_ip;
+ s->remote_port = apr_itoa(r->pool, r->connection->remote_addr->port);
+ }
+ s->remote_addr = get_env_string(r, s->remote_addr,
+ conf->remote_addr_indicator, 1);
+ s->remote_port = get_env_string(r, s->remote_port,
+ conf->remote_port_indicator, 1);
+
+ if (conf->options & JK_OPT_FLUSHPACKETS)
+ s->flush_packets = 1;
+ if (conf->options & JK_OPT_FLUSHEADER)
+ s->flush_header = 1;
+
+ e = (rule_extension_t *)ap_get_module_config(r->request_config, &jk_module);
+ if (e) {
+ s->extension.reply_timeout = e->reply_timeout;
+ s->extension.use_server_error_pages = e->use_server_error_pages;
+ if (e->activation) {
+ s->extension.activation = apr_palloc(r->pool, e->activation_size * sizeof(int));
+ memcpy(s->extension.activation, e->activation, e->activation_size * sizeof(int));
+ }
+ if (e->fail_on_status_size > 0) {
+ s->extension.fail_on_status_size = e->fail_on_status_size;
+ s->extension.fail_on_status = apr_palloc(r->pool, e->fail_on_status_size * sizeof(int));
+ memcpy(s->extension.fail_on_status, e->fail_on_status, e->fail_on_status_size * sizeof(int));
+ }
+ }
+ reply_timeout = apr_table_get(r->subprocess_env, "JK_REPLY_TIMEOUT");
+ if (reply_timeout) {
+ int r = atoi(reply_timeout);
+ if (r >= 0)
+ s->extension.reply_timeout = r;
+ }
+
+ if (conf->options & JK_OPT_DISABLEREUSE)
+ s->disable_reuse = 1;
+
+ /* get server name */
+ s->server_name = get_env_string(r, (char *)ap_get_server_name(r),
+ conf->local_name_indicator, 0);
+
+ /* get the real port (otherwise redirect failed) */
+ /* XXX: use apache API for getting server port
+ *
+ * Pre 1.2.7 versions used:
+ * s->server_port = r->connection->local_addr->port;
+ */
+ s->server_port = get_env_int(r, ap_get_server_port(r),
+ conf->local_port_indicator);
+
+#if ((AP_MODULE_MAGIC_AT_LEAST(20051115,4)) && !defined(API_COMPATIBILITY)) || (MODULE_MAGIC_NUMBER_MAJOR >= 20060905)
+ s->server_software = (char *)ap_get_server_description();
+#else
+ s->server_software = (char *)ap_get_server_version();
+#endif
+ s->method = (char *)r->method;
+ s->content_length = get_content_length(r);
+ s->is_chunked = r->read_chunked;
+ s->no_more_chunks = 0;
+#if defined(AS400) && !defined(AS400_UTF8)
+ /* Get the query string that is not translated to EBCDIC */
+ s->query_string = ap_get_original_query_string(r);
+#else
+ s->query_string = r->args;
+#endif
+
+ /*
+ * The 2.2 servlet spec errata says the uri from
+ * HttpServletRequest.getRequestURI() should remain encoded.
+ * [http://java.sun.com/products/servlet/errata_042700.html]
+ *
+ * We use JkOptions to determine which method to be used
+ *
+ * ap_escape_uri is the latest recommanded but require
+ * some java decoding (in TC 3.3 rc2)
+ *
+ * unparsed_uri is used for strict compliance with spec and
+ * old Tomcat (3.2.3 for example)
+ *
+ * uri is use for compatibilty with mod_rewrite with old Tomcats
+ */
+
+ switch (conf->options & JK_OPT_FWDURIMASK) {
+
+ case JK_OPT_FWDURICOMPATUNPARSED:
+ s->req_uri = r->unparsed_uri;
+ if (s->req_uri != NULL) {
+ char *query_str = strchr(s->req_uri, '?');
+ if (query_str != NULL) {
+ *query_str = 0;
+ }
+ }
+
+ break;
+
+ case JK_OPT_FWDURICOMPAT:
+ s->req_uri = r->uri;
+ break;
+
+ case JK_OPT_FWDURIPROXY:
+ size = 3 * strlen(r->uri) + 1;
+ s->req_uri = apr_palloc(r->pool, size);
+ jk_canonenc(r->uri, s->req_uri, size);
+ break;
+
+ case JK_OPT_FWDURIESCAPED:
+ s->req_uri = ap_escape_uri(r->pool, r->uri);
+ break;
+
+ default:
+ return JK_FALSE;
+ }
+
+ if (conf->ssl_enable || conf->envvars) {
+ ap_add_common_vars(r);
+
+ if (conf->ssl_enable) {
+ ssl_temp =
+ (char *)apr_table_get(r->subprocess_env,
+ conf->https_indicator);
+ if (ssl_temp && !strcasecmp(ssl_temp, "on")) {
+ s->is_ssl = JK_TRUE;
+ s->ssl_cert =
+ (char *)apr_table_get(r->subprocess_env,
+ conf->certs_indicator);
+
+ if (conf->options & JK_OPT_FWDCERTCHAIN) {
+ const apr_array_header_t *t = apr_table_elts(r->subprocess_env);
+ if (t && t->nelts) {
+ int i;
+ const apr_table_entry_t *elts = (const apr_table_entry_t *) t->elts;
+ apr_array_header_t *certs = apr_array_make(r->pool, 1, sizeof(char *));
+ *(const char **)apr_array_push(certs) = s->ssl_cert;
+ for (i = 0; i < t->nelts; i++) {
+ if (!elts[i].key)
+ continue;
+ if (!strncasecmp(elts[i].key, conf->certchain_prefix,
+ strlen(conf->certchain_prefix)))
+ *(const char **)apr_array_push(certs) = elts[i].val;
+ }
+ s->ssl_cert = apr_array_pstrcat(r->pool, certs, '\0');
+ }
+ }
+
+ if (s->ssl_cert) {
+ s->ssl_cert_len = strlen(s->ssl_cert);
+ if (JK_IS_DEBUG_LEVEL(conf->log)) {
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "SSL client certificate (%d bytes): %s",
+ s->ssl_cert_len, s->ssl_cert);
+ }
+ }
+ /* Servlet 2.3 API */
+ s->ssl_cipher =
+ (char *)apr_table_get(r->subprocess_env,
+ conf->cipher_indicator);
+ s->ssl_session =
+ (char *)apr_table_get(r->subprocess_env,
+ conf->session_indicator);
+
+ if (conf->options & JK_OPT_FWDKEYSIZE) {
+ /* Servlet 2.3 API */
+ ssl_temp = (char *)apr_table_get(r->subprocess_env,
+ conf->
+ key_size_indicator);
+ if (ssl_temp)
+ s->ssl_key_size = atoi(ssl_temp);
+ }
+
+
+ }
+ }
+
+ if (conf->envvars) {
+ const apr_array_header_t *t = conf->envvar_items;
+ if (t && t->nelts) {
+ int i;
+ int j = 0;
+ envvar_item *elts = (envvar_item *) t->elts;
+ s->attributes_names = apr_palloc(r->pool,
+ sizeof(char *) * t->nelts);
+ s->attributes_values = apr_palloc(r->pool,
+ sizeof(char *) * t->nelts);
+
+ for (i = 0; i < t->nelts; i++) {
+ s->attributes_names[i - j] = elts[i].name;
+ s->attributes_values[i - j] =
+ (char *)apr_table_get(r->subprocess_env, elts[i].name);
+ if (!s->attributes_values[i - j]) {
+ if (elts[i].has_default) {
+ s->attributes_values[i - j] = elts[i].value;
+ }
+ else {
+ s->attributes_values[i - j] = "";
+ s->attributes_names[i - j] = "";
+ j++;
+ }
+ }
+ }
+
+ s->num_attributes = t->nelts - j;
+ }
+ }
+ }
+
+ if (r->headers_in && apr_table_elts(r->headers_in)) {
+ int need_content_length_header = (!s->is_chunked
+ && s->content_length ==
+ 0) ? JK_TRUE : JK_FALSE;
+ const apr_array_header_t *t = apr_table_elts(r->headers_in);
+ if (t && t->nelts) {
+ int i;
+ apr_table_entry_t *elts = (apr_table_entry_t *) t->elts;
+ s->num_headers = t->nelts;
+ /* allocate an extra header slot in case we need to add a content-length header */
+ s->headers_names =
+ apr_palloc(r->pool, sizeof(char *) * (t->nelts + 1));
+ s->headers_values =
+ apr_palloc(r->pool, sizeof(char *) * (t->nelts + 1));
+ if (!s->headers_names || !s->headers_values)
+ return JK_FALSE;
+ for (i = 0; i < t->nelts; i++) {
+ char *hname = apr_pstrdup(r->pool, elts[i].key);
+ s->headers_values[i] = apr_pstrdup(r->pool, elts[i].val);
+ s->headers_names[i] = hname;
+ if (need_content_length_header &&
+ !strcasecmp(s->headers_names[i], "content-length")) {
+ need_content_length_header = JK_FALSE;
+ }
+ }
+ /* Add a content-length = 0 header if needed.
+ * Ajp13 assumes an absent content-length header means an unknown,
+ * but non-zero length body.
+ */
+ if (need_content_length_header) {
+ s->headers_names[s->num_headers] = "content-length";
+ s->headers_values[s->num_headers] = "0";
+ s->num_headers++;
+ }
+ }
+ /* Add a content-length = 0 header if needed. */
+ else if (need_content_length_header) {
+ s->headers_names = apr_palloc(r->pool, sizeof(char *));
+ s->headers_values = apr_palloc(r->pool, sizeof(char *));
+ if (!s->headers_names || !s->headers_values)
+ return JK_FALSE;
+ s->headers_names[0] = "content-length";
+ s->headers_values[0] = "0";
+ s->num_headers++;
+ }
+ }
+ s->uw_map = conf->uw_map;
+
+ /* Dump all connection param so we can trace what's going to
+ * the remote tomcat
+ */
+ if (JK_IS_DEBUG_LEVEL(conf->log)) {
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "Service protocol=%s method=%s ssl=%s host=%s addr=%s name=%s port=%d auth=%s user=%s laddr=%s raddr=%s uri=%s",
+ STRNULL_FOR_NULL(s->protocol),
+ STRNULL_FOR_NULL(s->method),
+ s->is_ssl ? "true" : "false",
+ STRNULL_FOR_NULL(s->remote_host),
+ STRNULL_FOR_NULL(s->remote_addr),
+ STRNULL_FOR_NULL(s->server_name),
+ s->server_port,
+ STRNULL_FOR_NULL(s->auth_type),
+ STRNULL_FOR_NULL(s->remote_user),
+ STRNULL_FOR_NULL(r->connection->local_ip),
+ STRNULL_FOR_NULL(r->connection->remote_ip),
+ STRNULL_FOR_NULL(s->req_uri));
+ }
+
+ return JK_TRUE;
+}
+
+/*
+ * The JK module command processors
+ *
+ * The below are all installed so that Apache calls them while it is
+ * processing its config files. This allows configuration info to be
+ * copied into a jk_server_conf_t object, which is then used for request
+ * filtering/processing.
+ *
+ * See jk_cmds definition below for explanations of these options.
+ */
+
+/*
+ * JkMountCopy directive handling
+ *
+ * JkMountCopy On/Off/All
+ */
+
+static const char *jk_set_mountcopy(cmd_parms * cmd,
+ void *dummy, const char *mount_copy)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ if (! strcasecmp(mount_copy, "all")) {
+ const char *err_string = ap_check_cmd_context(cmd, GLOBAL_ONLY);
+ if (err_string != NULL) {
+ return err_string;
+ }
+ jk_mount_copy_all = JK_TRUE;
+ }
+ else if (strcasecmp(mount_copy, "on") && strcasecmp(mount_copy, "off")) {
+ return "JkMountCopy must be All, On or Off";
+ }
+ else {
+ conf->mountcopy = strcasecmp(mount_copy, "off") ? JK_TRUE : JK_FALSE;
+ }
+
+ return NULL;
+}
+
+/*
+ * JkMount directive handling
+ *
+ * JkMount URI(context) worker
+ */
+
+static const char *jk_mount_context(cmd_parms * cmd,
+ void *dummy,
+ const char *context,
+ const char *worker)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+ const char *c, *w;
+
+ if (worker != NULL && cmd->path == NULL ) {
+ c = context;
+ w = worker;
+ }
+ else if (worker == NULL && cmd->path != NULL) {
+ c = cmd->path;
+ w = context;
+ }
+ else {
+ if (worker == NULL)
+ return "JkMount needs a path when not defined in a location";
+ else
+ return "JkMount can not have a path when defined in a location";
+ }
+
+ if (c[0] != '/')
+ return "JkMount context should start with /";
+
+ if (!conf->uri_to_context) {
+ if (!jk_map_alloc(&(conf->uri_to_context))) {
+ return "JkMount Memory error";
+ }
+ }
+ /*
+ * Add the new worker to the alias map.
+ */
+ jk_map_put(conf->uri_to_context, c, w, NULL);
+ return NULL;
+}
+
+/*
+ * JkUnMount directive handling
+ *
+ * JkUnMount URI(context) worker
+ */
+
+static const char *jk_unmount_context(cmd_parms * cmd,
+ void *dummy,
+ const char *context,
+ const char *worker)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+ char *uri;
+ const char *c, *w;
+
+ if (worker != NULL && cmd->path == NULL ) {
+ c = context;
+ w = worker;
+ }
+ else if (worker == NULL && cmd->path != NULL) {
+ c = cmd->path;
+ w = context;
+ }
+ else {
+ if (worker == NULL)
+ return "JkUnMount needs a path when not defined in a location";
+ else
+ return "JkUnMount can not have a path when defined in a location";
+ }
+
+ if (c[0] != '/')
+ return "JkUnMount context should start with /";
+
+ uri = apr_pstrcat(cmd->temp_pool, "!", c, NULL);
+
+ if (!conf->uri_to_context) {
+ if (!jk_map_alloc(&(conf->uri_to_context))) {
+ return "JkUnMount Memory error";
+ }
+ }
+ /*
+ * Add the new worker to the alias map.
+ */
+ jk_map_put(conf->uri_to_context, uri, w, NULL);
+ return NULL;
+}
+
+
+/*
+ * JkWorkersFile Directive Handling
+ *
+ * JkWorkersFile file
+ */
+
+static const char *jk_set_worker_file(cmd_parms * cmd,
+ void *dummy, const char *worker_file)
+{
+ const char *err_string = ap_check_cmd_context(cmd, GLOBAL_ONLY);
+ if (err_string != NULL) {
+ return err_string;
+ }
+
+ if (jk_worker_file != NULL)
+ return "JkWorkersFile only allowed once";
+
+ /* we need an absolute path (ap_server_root_relative does the ap_pstrdup) */
+ jk_worker_file = ap_server_root_relative(cmd->pool, worker_file);
+
+ if (jk_worker_file == NULL)
+ return "JkWorkersFile file name invalid";
+
+ if (jk_file_exists(jk_worker_file) != JK_TRUE)
+ return "JkWorkersFile: Can't find the workers file specified";
+
+ return NULL;
+}
+
+/*
+ * JkMountFile Directive Handling
+ *
+ * JkMountFile file
+ */
+
+static const char *jk_set_mount_file(cmd_parms * cmd,
+ void *dummy, const char *mount_file)
+{
+ server_rec *s = cmd->server;
+
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ /* we need an absolute path (ap_server_root_relative does the ap_pstrdup) */
+ conf->mount_file = ap_server_root_relative(cmd->pool, mount_file);
+
+ if (conf->mount_file == NULL)
+ return "JkMountFile file name invalid";
+
+ if (jk_file_exists(conf->mount_file) != JK_TRUE)
+ return "JkMountFile: Can't find the mount file specified";
+
+ if (!conf->uri_to_context) {
+ if (!jk_map_alloc(&(conf->uri_to_context))) {
+ return "JkMountFile Memory error";
+ }
+ }
+
+ return NULL;
+}
+
+/*
+ * JkMountFileReload Directive Handling
+ *
+ * JkMountFileReload seconds
+ */
+
+static const char *jk_set_mount_file_reload(cmd_parms * cmd,
+ void *dummy, const char *mount_file_reload)
+{
+ server_rec *s = cmd->server;
+ int interval;
+
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ interval = atoi(mount_file_reload);
+ if (interval < 0) {
+ interval = 0;
+ }
+
+ conf->mount_file_reload = interval;
+
+ return NULL;
+}
+
+/*
+ * JkWatchdogInterval Directive Handling
+ *
+ * JkWatchdogInterval seconds
+ */
+
+static const char *jk_set_watchdog_interval(cmd_parms * cmd,
+ void *dummy, const char *watchdog_interval)
+{
+ const char *err_string = ap_check_cmd_context(cmd, GLOBAL_ONLY);
+ if (err_string != NULL) {
+ return err_string;
+ }
+
+#if APR_HAS_THREADS
+ jk_watchdog_interval = atoi(watchdog_interval);
+ if (jk_watchdog_interval < 0) {
+ jk_watchdog_interval = 0;
+ }
+ return NULL;
+#else
+ return "JkWatchdogInterval: APR was compiled without threading support. Cannot create watchdog thread";
+#endif
+}
+
+/*
+ * JkLogFile Directive Handling
+ *
+ * JkLogFile file
+ */
+
+static const char *jk_set_log_file(cmd_parms * cmd,
+ void *dummy, const char *log_file)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ /* we need an absolute path */
+ if (*log_file != '|')
+ conf->log_file = ap_server_root_relative(cmd->pool, log_file);
+ else
+ conf->log_file = apr_pstrdup(cmd->pool, log_file);
+
+ if (conf->log_file == NULL)
+ return "JkLogFile file name invalid";
+
+ return NULL;
+}
+
+/*
+ * JkShmFile Directive Handling
+ *
+ * JkShmFile file
+ */
+
+static const char *jk_set_shm_file(cmd_parms * cmd,
+ void *dummy, const char *shm_file)
+{
+ const char *err_string = ap_check_cmd_context(cmd, GLOBAL_ONLY);
+ if (err_string != NULL) {
+ return err_string;
+ }
+
+ /* we need an absolute path */
+ jk_shm_file = ap_server_root_relative(cmd->pool, shm_file);
+ if (jk_shm_file == NULL)
+ return "JkShmFile file name invalid";
+
+ return NULL;
+}
+
+/*
+ * JkShmSize Directive Handling
+ *
+ * JkShmSize size in kilobytes
+ */
+
+static const char *jk_set_shm_size(cmd_parms * cmd,
+ void *dummy, const char *shm_size)
+{
+ int sz = 0;
+ const char *err_string = ap_check_cmd_context(cmd, GLOBAL_ONLY);
+ if (err_string != NULL) {
+ return err_string;
+ }
+
+ sz = atoi(shm_size) * 1024;
+ if (sz < JK_SHM_DEF_SIZE)
+ sz = JK_SHM_DEF_SIZE;
+ else
+ sz = JK_SHM_ALIGN(sz);
+ jk_shm_size = (size_t)sz;
+ if (jk_shm_size)
+ jk_shm_size_set = 1;
+ return NULL;
+}
+
+/*
+ * JkLogLevel Directive Handling
+ *
+ * JkLogLevel debug/info/error/emerg
+ */
+
+static const char *jk_set_log_level(cmd_parms * cmd,
+ void *dummy, const char *log_level)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ conf->log_level = jk_parse_log_level(log_level);
+
+ return NULL;
+}
+
+/*
+ * JkLogStampFormat Directive Handling
+ *
+ * JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
+ */
+
+static const char *jk_set_log_fmt(cmd_parms * cmd,
+ void *dummy, const char *log_format)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ conf->stamp_format_string = apr_pstrdup(cmd->pool, log_format);
+
+ return NULL;
+}
+
+
+/*
+ * JkAutoAlias Directive Handling
+ *
+ * JkAutoAlias application directory
+ */
+
+static const char *jk_set_auto_alias(cmd_parms * cmd,
+ void *dummy, const char *directory)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ conf->alias_dir = apr_pstrdup(cmd->pool, directory);
+
+ if (conf->alias_dir == NULL)
+ return "JkAutoAlias directory invalid";
+
+ return NULL;
+}
+
+/*
+ * JkStripSession directive handling
+ *
+ * JkStripSession On/Off [session path identifier]
+ */
+
+static const char *jk_set_strip_session(cmd_parms * cmd, void *dummy,
+ const char *flag, const char *name)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ if (strcasecmp(flag, "on") && strcasecmp(flag, "off")) {
+ return "JkStripSession must be On or Off";
+ }
+ else {
+ conf->strip_session = strcasecmp(flag, "off") ? JK_TRUE : JK_FALSE;
+ }
+
+ /* Check for optional path value */
+ if (name)
+ conf->strip_session_name = apr_pstrdup(cmd->pool, name);
+ else
+ conf->strip_session_name = apr_pstrdup(cmd->pool, JK_PATH_SESSION_IDENTIFIER);
+
+ return NULL;
+}
+
+/*****************************************************************
+ *
+ * Actually logging.
+ */
+
+typedef const char *(*item_key_func) (request_rec *, char *);
+
+typedef struct
+{
+ item_key_func func;
+ char *arg;
+} request_log_format_item;
+
+static const char *process_item(request_rec * r,
+ request_log_format_item * item)
+{
+ const char *cp;
+
+ cp = (*item->func) (r, item->arg);
+ return cp ? cp : "-";
+}
+
+static void request_log_transaction(request_rec * r, jk_server_conf_t * conf)
+{
+ request_log_format_item *items;
+ char *str, *s;
+ int i;
+ int len = 0;
+ const char **strs;
+ int *strl;
+ apr_array_header_t *format = conf->format;
+
+ strs = apr_palloc(r->pool, sizeof(char *) * (format->nelts));
+ strl = apr_palloc(r->pool, sizeof(int) * (format->nelts));
+ items = (request_log_format_item *) format->elts;
+ for (i = 0; i < format->nelts; ++i) {
+ strs[i] = process_item(r, &items[i]);
+ }
+ for (i = 0; i < format->nelts; ++i) {
+ len += strl[i] = strlen(strs[i]);
+ }
+ str = apr_palloc(r->pool, len + 1);
+ for (i = 0, s = str; i < format->nelts; ++i) {
+ memcpy(s, strs[i], strl[i]);
+ s += strl[i];
+ }
+ *s = 0;
+
+ jk_log(conf->log, JK_LOG_REQUEST, "%s", str);
+
+}
+
+/*****************************************************************
+ *
+ * Parsing the log format string
+ */
+
+static char *format_integer(apr_pool_t * p, int i)
+{
+ return apr_psprintf(p, "%d", i);
+}
+
+static char *pfmt(apr_pool_t * p, int i)
+{
+ if (i <= 0) {
+ return "-";
+ }
+ else {
+ return format_integer(p, i);
+ }
+}
+
+static const char *constant_item(request_rec * dummy, char *stuff)
+{
+ return stuff;
+}
+
+static const char *log_worker_name(request_rec * r, char *a)
+{
+ return apr_table_get(r->notes, JK_NOTE_WORKER_NAME);
+}
+
+static const char *log_worker_route(request_rec * r, char *a)
+{
+ return apr_table_get(r->notes, JK_NOTE_WORKER_ROUTE);
+}
+
+
+static const char *log_request_duration(request_rec * r, char *a)
+{
+ return apr_table_get(r->notes, JK_NOTE_REQUEST_DURATION);
+}
+
+static const char *log_request_line(request_rec * r, char *a)
+{
+ /* NOTE: If the original request contained a password, we
+ * re-write the request line here to contain XXXXXX instead:
+ * (note the truncation before the protocol string for HTTP/0.9 requests)
+ * (note also that r->the_request contains the unmodified request)
+ */
+ return (r->parsed_uri.password) ? apr_pstrcat(r->pool, r->method, " ",
+ apr_uri_unparse(r->pool,
+ &r->
+ parsed_uri,
+ 0),
+ r->
+ assbackwards ? NULL : " ",
+ r->protocol, NULL)
+ : r->the_request;
+}
+
+/* These next two routines use the canonical name:port so that log
+ * parsers don't need to duplicate all the vhost parsing crud.
+ */
+static const char *log_virtual_host(request_rec * r, char *a)
+{
+ return r->server->server_hostname;
+}
+
+static const char *log_server_port(request_rec * r, char *a)
+{
+ return apr_psprintf(r->pool, "%u",
+ r->server->port ? r->server->
+ port : ap_default_port(r));
+}
+
+/* This respects the setting of UseCanonicalName so that
+ * the dynamic mass virtual hosting trick works better.
+ */
+static const char *log_server_name(request_rec * r, char *a)
+{
+ return ap_get_server_name(r);
+}
+
+static const char *log_request_uri(request_rec * r, char *a)
+{
+ return r->uri;
+}
+static const char *log_request_method(request_rec * r, char *a)
+{
+ return r->method;
+}
+
+static const char *log_request_protocol(request_rec * r, char *a)
+{
+ return r->protocol;
+}
+static const char *log_request_query(request_rec * r, char *a)
+{
+ return (r->args != NULL) ? apr_pstrcat(r->pool, "?", r->args, NULL)
+ : "";
+}
+static const char *log_status(request_rec * r, char *a)
+{
+ return pfmt(r->pool, r->status);
+}
+
+static const char *clf_log_bytes_sent(request_rec * r, char *a)
+{
+ if (!r->sent_bodyct) {
+ return "-";
+ }
+ else {
+ return apr_off_t_toa(r->pool, r->bytes_sent);
+ }
+}
+
+static const char *log_bytes_sent(request_rec * r, char *a)
+{
+ if (!r->sent_bodyct) {
+ return "0";
+ }
+ else {
+ return apr_psprintf(r->pool, "%" APR_OFF_T_FMT, r->bytes_sent);
+ }
+}
+
+static struct log_item_list
+{
+ char ch;
+ item_key_func func;
+} log_item_keys[] = {
+
+ {
+ 'T', log_request_duration}, {
+ 'r', log_request_line}, {
+ 'U', log_request_uri}, {
+ 's', log_status}, {
+ 'b', clf_log_bytes_sent}, {
+ 'B', log_bytes_sent}, {
+ 'V', log_server_name}, {
+ 'v', log_virtual_host}, {
+ 'p', log_server_port}, {
+ 'H', log_request_protocol}, {
+ 'm', log_request_method}, {
+ 'q', log_request_query}, {
+ 'w', log_worker_name}, {
+ 'R', log_worker_route}, {
+ '\0'}
+};
+
+static struct log_item_list *find_log_func(char k)
+{
+ int i;
+
+ for (i = 0; log_item_keys[i].ch; ++i)
+ if (k == log_item_keys[i].ch) {
+ return &log_item_keys[i];
+ }
+
+ return NULL;
+}
+
+static char *parse_request_log_misc_string(apr_pool_t * p,
+ request_log_format_item * it,
+ const char **sa)
+{
+ const char *s;
+ char *d;
+
+ it->func = constant_item;
+
+ s = *sa;
+ while (*s && *s != '%') {
+ s++;
+ }
+ /*
+ * This might allocate a few chars extra if there's a backslash
+ * escape in the format string.
+ */
+ it->arg = apr_palloc(p, s - *sa + 1);
+
+ d = it->arg;
+ s = *sa;
+ while (*s && *s != '%') {
+ if (*s != '\\') {
+ *d++ = *s++;
+ }
+ else {
+ s++;
+ switch (*s) {
+ case '\\':
+ *d++ = '\\';
+ s++;
+ break;
+ case 'n':
+ *d++ = '\n';
+ s++;
+ break;
+ case 't':
+ *d++ = '\t';
+ s++;
+ break;
+ default:
+ /* copy verbatim */
+ *d++ = '\\';
+ /*
+ * Allow the loop to deal with this *s in the normal
+ * fashion so that it handles end of string etc.
+ * properly.
+ */
+ break;
+ }
+ }
+ }
+ *d = '\0';
+
+ *sa = s;
+ return NULL;
+}
+
+static char *parse_request_log_item(apr_pool_t * p,
+ request_log_format_item * it,
+ const char **sa)
+{
+ const char *s = *sa;
+ struct log_item_list *l;
+
+ if (*s != '%') {
+ return parse_request_log_misc_string(p, it, sa);
+ }
+
+ ++s;
+ it->arg = ""; /* For safety's sake... */
+
+ l = find_log_func(*s++);
+ if (!l) {
+ char dummy[2];
+
+ dummy[0] = s[-1];
+ dummy[1] = '\0';
+ return apr_pstrcat(p, "Unrecognized JkRequestLogFormat directive %",
+ dummy, NULL);
+ }
+ it->func = l->func;
+ *sa = s;
+ return NULL;
+}
+
+static apr_array_header_t *parse_request_log_string(apr_pool_t * p,
+ const char *s,
+ const char **err)
+{
+ apr_array_header_t *a =
+ apr_array_make(p, 0, sizeof(request_log_format_item));
+ char *res;
+
+ while (*s) {
+ if ((res =
+ parse_request_log_item(p,
+ (request_log_format_item *)
+ apr_array_push(a), &s))) {
+ *err = res;
+ return NULL;
+ }
+ }
+
+ return a;
+}
+
+/*
+ * JkRequestLogFormat Directive Handling
+ *
+ * JkRequestLogFormat format string
+ *
+ * %b - Bytes sent, excluding HTTP headers. In CLF format
+ * %B - Bytes sent, excluding HTTP headers.
+ * %H - The request protocol
+ * %m - The request method
+ * %p - The canonical Port of the server serving the request
+ * %q - The query string (prepended with a ? if a query string exists,
+ * otherwise an empty string)
+ * %r - First line of request
+ * %s - request HTTP status code
+ * %T - Requset duration, elapsed time to handle request in seconds '.' micro seconds
+ * %U - The URL path requested, not including any query string.
+ * %v - The canonical ServerName of the server serving the request.
+ * %V - The server name according to the UseCanonicalName setting.
+ * %w - Tomcat worker name
+ */
+
+static const char *jk_set_request_log_format(cmd_parms * cmd,
+ void *dummy, const char *format)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ conf->format_string = apr_pstrdup(cmd->pool, format);
+
+ return NULL;
+}
+
+
+/*
+ * JkWorkerIndicator Directive Handling
+ *
+ * JkWorkerIndicator JkWorker
+ */
+
+static const char *jk_set_worker_indicator(cmd_parms * cmd,
+ void *dummy, const char *indicator)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ conf->worker_indicator = apr_pstrdup(cmd->pool, indicator);
+
+ return NULL;
+}
+
+/*
+ * Directives Handling for setting various environment names
+ * used to overwrite the following request information:
+ * - remote_addr
+ * - remote_port
+ * - remote_host
+ * - remote_user
+ * - auth_type
+ * - server_name
+ * - server_port
+ */
+static const char *jk_set_remote_addr_indicator(cmd_parms * cmd,
+ void *dummy, const char *indicator)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config, &jk_module);
+ conf->remote_addr_indicator = apr_pstrdup(cmd->pool, indicator);
+ return NULL;
+}
+
+static const char *jk_set_remote_port_indicator(cmd_parms * cmd,
+ void *dummy, const char *indicator)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config, &jk_module);
+ conf->remote_port_indicator = apr_pstrdup(cmd->pool, indicator);
+ return NULL;
+}
+
+static const char *jk_set_remote_host_indicator(cmd_parms * cmd,
+ void *dummy, const char *indicator)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config, &jk_module);
+ conf->remote_host_indicator = apr_pstrdup(cmd->pool, indicator);
+ return NULL;
+}
+
+static const char *jk_set_remote_user_indicator(cmd_parms * cmd,
+ void *dummy, const char *indicator)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config, &jk_module);
+ conf->remote_user_indicator = apr_pstrdup(cmd->pool, indicator);
+ return NULL;
+}
+
+static const char *jk_set_auth_type_indicator(cmd_parms * cmd,
+ void *dummy, const char *indicator)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config, &jk_module);
+ conf->auth_type_indicator = apr_pstrdup(cmd->pool, indicator);
+ return NULL;
+}
+
+static const char *jk_set_local_name_indicator(cmd_parms * cmd,
+ void *dummy, const char *indicator)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config, &jk_module);
+ conf->local_name_indicator = apr_pstrdup(cmd->pool, indicator);
+ return NULL;
+}
+
+static const char *jk_set_local_port_indicator(cmd_parms * cmd,
+ void *dummy, const char *indicator)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config, &jk_module);
+ conf->local_port_indicator = apr_pstrdup(cmd->pool, indicator);
+ return NULL;
+}
+
+/*
+ * JkExtractSSL Directive Handling
+ *
+ * JkExtractSSL On/Off
+ */
+
+static const char *jk_set_enable_ssl(cmd_parms * cmd, void *dummy, int flag)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ /* Set up our value */
+ conf->ssl_enable = flag ? JK_TRUE : JK_FALSE;
+
+ return NULL;
+}
+
+/*
+ * JkHTTPSIndicator Directive Handling
+ *
+ * JkHTTPSIndicator HTTPS
+ */
+
+static const char *jk_set_https_indicator(cmd_parms * cmd,
+ void *dummy, const char *indicator)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ conf->https_indicator = apr_pstrdup(cmd->pool, indicator);
+
+ return NULL;
+}
+
+/*
+ * JkCERTSIndicator Directive Handling
+ *
+ * JkCERTSIndicator SSL_CLIENT_CERT
+ */
+
+static const char *jk_set_certs_indicator(cmd_parms * cmd,
+ void *dummy, const char *indicator)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ conf->certs_indicator = apr_pstrdup(cmd->pool, indicator);
+
+ return NULL;
+}
+
+/*
+ * JkCIPHERIndicator Directive Handling
+ *
+ * JkCIPHERIndicator SSL_CIPHER
+ */
+
+static const char *jk_set_cipher_indicator(cmd_parms * cmd,
+ void *dummy, const char *indicator)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ conf->cipher_indicator = apr_pstrdup(cmd->pool, indicator);
+
+ return NULL;
+}
+
+/*
+ * JkCERTCHAINPrefix Directive Handling
+ *
+ * JkCERTCHAINPrefix SSL_CLIENT_CERT_CHAIN_
+ */
+
+static const char *jk_set_certchain_prefix(cmd_parms * cmd,
+ void *dummy, const char *prefix)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ conf->certchain_prefix = apr_pstrdup(cmd->pool, prefix);
+
+ return NULL;
+}
+
+/*
+ * JkSESSIONIndicator Directive Handling
+ *
+ * JkSESSIONIndicator SSL_SESSION_ID
+ */
+
+static const char *jk_set_session_indicator(cmd_parms * cmd,
+ void *dummy,
+ const char *indicator)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ conf->session_indicator = apr_pstrdup(cmd->pool, indicator);
+
+ return NULL;
+}
+
+/*
+ * JkKEYSIZEIndicator Directive Handling
+ *
+ * JkKEYSIZEIndicator SSL_CIPHER_USEKEYSIZE
+ */
+
+static const char *jk_set_key_size_indicator(cmd_parms * cmd,
+ void *dummy,
+ const char *indicator)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ conf->key_size_indicator = apr_pstrdup(cmd->pool, indicator);
+
+ return NULL;
+}
+
+/*
+ * JkOptions Directive Handling
+ *
+ *
+ * +ForwardSSLKeySize => Forward SSL Key Size, to follow 2.3 specs but may broke old TC 3.2
+ * -ForwardSSLKeySize => Don't Forward SSL Key Size, will make mod_jk works with all TC release
+ * ForwardURICompat => Forward URI normally, less spec compliant but mod_rewrite compatible (old TC)
+ * ForwardURICompatUnparsed => Forward URI as unparsed, spec compliant but broke mod_rewrite (old TC)
+ * ForwardURIEscaped => Forward URI escaped and Tomcat (3.3 rc2) stuff will do the decoding part
+ * ForwardDirectories => Forward all directory requests with no index files to Tomcat
+ * +ForwardSSLCertChain => Forward SSL Cert Chain
+ * -ForwardSSLCertChain => Don't Forward SSL Cert Chain (default)
+ */
+
+static const char *jk_set_options(cmd_parms * cmd, void *dummy,
+ const char *line)
+{
+ int opt = 0;
+ int mask = 0;
+ char action;
+ char *w;
+
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ while (line[0] != 0) {
+ w = ap_getword_conf(cmd->pool, &line);
+ action = 0;
+
+ if (*w == '+' || *w == '-') {
+ action = *(w++);
+ }
+
+ mask = 0;
+
+ if (action == '-' && !strncasecmp(w, "ForwardURI", strlen("ForwardURI")))
+ return apr_pstrcat(cmd->pool, "JkOptions: Illegal option '-", w,
+ "': ForwardURI* options can not be disabled", NULL);
+
+ if (!strcasecmp(w, "ForwardURICompat")) {
+ opt = JK_OPT_FWDURICOMPAT;
+ mask = JK_OPT_FWDURIMASK;
+ }
+ else if (!strcasecmp(w, "ForwardURICompatUnparsed")) {
+ opt = JK_OPT_FWDURICOMPATUNPARSED;
+ mask = JK_OPT_FWDURIMASK;
+ }
+ else if (!strcasecmp(w, "ForwardURIEscaped")) {
+ opt = JK_OPT_FWDURIESCAPED;
+ mask = JK_OPT_FWDURIMASK;
+ }
+ else if (!strcasecmp(w, "ForwardURIProxy")) {
+ opt = JK_OPT_FWDURIPROXY;
+ mask = JK_OPT_FWDURIMASK;
+ }
+ else if (!strcasecmp(w, "ForwardDirectories")) {
+ opt = JK_OPT_FWDDIRS;
+ }
+ else if (!strcasecmp(w, "ForwardLocalAddress")) {
+ opt = JK_OPT_FWDLOCAL;
+ }
+ else if (!strcasecmp(w, "FlushPackets")) {
+ opt = JK_OPT_FLUSHPACKETS;
+ }
+ else if (!strcasecmp(w, "FlushHeader")) {
+ opt = JK_OPT_FLUSHEADER;
+ }
+ else if (!strcasecmp(w, "DisableReuse")) {
+ opt = JK_OPT_DISABLEREUSE;
+ }
+ else if (!strcasecmp(w, "ForwardSSLCertChain")) {
+ opt = JK_OPT_FWDCERTCHAIN;
+ }
+ else if (!strcasecmp(w, "ForwardKeySize")) {
+ opt = JK_OPT_FWDKEYSIZE;
+ }
+ else if (!strcasecmp(w, "RejectUnsafeURI")) {
+ opt = JK_OPT_REJECTUNSAFE;
+ }
+ else
+ return apr_pstrcat(cmd->pool, "JkOptions: Illegal option '", w,
+ "'", NULL);
+
+ conf->options &= ~mask;
+
+ if (action == '-') {
+ conf->exclude_options |= opt;
+ }
+ else if (action == '+') {
+ conf->options |= opt;
+ }
+ else { /* for now +Opt == Opt */
+ conf->options |= opt;
+ }
+ }
+ return NULL;
+}
+
+/*
+ * JkEnvVar Directive Handling
+ *
+ * JkEnvVar MYOWNDIR
+ */
+
+static const char *jk_add_env_var(cmd_parms * cmd,
+ void *dummy,
+ const char *env_name,
+ const char *default_value)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ conf->envvars_has_own = JK_TRUE;
+ if (!conf->envvars) {
+ conf->envvars = apr_table_make(cmd->pool, 0);
+ conf->envvars_def = apr_table_make(cmd->pool, 0);
+ conf->envvar_items = apr_array_make(cmd->pool, 0,
+ sizeof(envvar_item));
+ }
+
+ /* env_name is mandatory, default_value is optional.
+ * No value means send the attribute only, if the env var is set during runtime.
+ */
+ apr_table_setn(conf->envvars, env_name, default_value ? default_value : "");
+ apr_table_setn(conf->envvars_def, env_name, default_value ? "1" : "0");
+
+ return NULL;
+}
+
+/*
+ * JkWorkerProperty Directive Handling
+ *
+ * JkWorkerProperty name=value
+ */
+
+static const char *jk_set_worker_property(cmd_parms * cmd,
+ void *dummy,
+ const char *line)
+{
+ server_rec *s = cmd->server;
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ const char *err_string = ap_check_cmd_context(cmd, GLOBAL_ONLY);
+ if (err_string != NULL) {
+ return err_string;
+ }
+
+ if (!jk_worker_properties)
+ jk_map_alloc(&jk_worker_properties);
+ if (jk_map_read_property(jk_worker_properties, NULL, line,
+ JK_MAP_HANDLE_DUPLICATES, conf->log) == JK_FALSE)
+ return apr_pstrcat(cmd->temp_pool, "Invalid JkWorkerProperty ", line, NULL);
+
+ return NULL;
+}
+
+static const command_rec jk_cmds[] = {
+ /*
+ * JkWorkersFile specifies a full path to the location of the worker
+ * properties file.
+ *
+ * This file defines the different workers used by apache to redirect
+ * servlet requests.
+ */
+ AP_INIT_TAKE1("JkWorkersFile", jk_set_worker_file, NULL, RSRC_CONF,
+ "The name of a worker file for the Tomcat servlet containers"),
+
+ /*
+ * JkMountFile specifies a full path to the location of the
+ * uriworker properties file.
+ *
+ * This file defines the different mapping for workers used by apache
+ * to redirect servlet requests.
+ */
+ AP_INIT_TAKE1("JkMountFile", jk_set_mount_file, NULL, RSRC_CONF,
+ "The name of a mount file for the Tomcat servlet uri mapping"),
+
+ /*
+ * JkMountFileReload specifies the reload check interval for the
+ * uriworker properties file.
+ *
+ * Default value is: JK_URIMAP_DEF_RELOAD
+ */
+ AP_INIT_TAKE1("JkMountFileReload", jk_set_mount_file_reload, NULL, RSRC_CONF,
+ "The reload check interval of the mount file"),
+
+ /*
+ * JkWatchdogInterval specifies the maintain interval for the
+ * watchdog thread.
+ *
+ * Default value is: 0 meaning watchdog thread will not be created
+ */
+ AP_INIT_TAKE1("JkWatchdogInterval", jk_set_watchdog_interval, NULL, RSRC_CONF,
+ "The maintain interval of the watchdog thread"),
+
+ /*
+ * JkMount mounts a url prefix to a worker (the worker need to be
+ * defined in the worker properties file.
+ */
+ AP_INIT_TAKE12("JkMount", jk_mount_context, NULL, RSRC_CONF|ACCESS_CONF,
+ "A mount point from a context to a Tomcat worker"),
+
+ /*
+ * JkUnMount unmounts a url prefix to a worker (the worker need to be
+ * defined in the worker properties file.
+ */
+ AP_INIT_TAKE12("JkUnMount", jk_unmount_context, NULL, RSRC_CONF|ACCESS_CONF,
+ "A no mount point from a context to a Tomcat worker"),
+
+ /*
+ * JkMountCopy specifies if mod_jk should copy the mount points
+ * from the main server to the virtual servers.
+ */
+ AP_INIT_TAKE1("JkMountCopy", jk_set_mountcopy, NULL, RSRC_CONF,
+ "Should the base server mounts be copied to the virtual server"),
+
+ /*
+ * JkStripSession specifies if mod_jk should strip the ;jsessionid
+ * from the unmapped urls
+ */
+ AP_INIT_TAKE12("JkStripSession", jk_set_strip_session, NULL, RSRC_CONF,
+ "Should the server strip the jsessionid from unmapped URLs"),
+
+ /*
+ * JkLogFile & JkLogLevel specifies to where should the plugin log
+ * its information and how much.
+ * JkLogStampFormat specify the time-stamp to be used on log
+ */
+ AP_INIT_TAKE1("JkLogFile", jk_set_log_file, NULL, RSRC_CONF,
+ "Full path to the Tomcat module log file"),
+
+ AP_INIT_TAKE1("JkShmFile", jk_set_shm_file, NULL, RSRC_CONF,
+ "Full path to the Tomcat module shared memory file"),
+
+ AP_INIT_TAKE1("JkShmSize", jk_set_shm_size, NULL, RSRC_CONF,
+ "Size of the shared memory file in KBytes"),
+
+ AP_INIT_TAKE1("JkLogLevel", jk_set_log_level, NULL, RSRC_CONF,
+ "The Tomcat module log level, can be debug, "
+ "info, error or emerg"),
+ AP_INIT_TAKE1("JkLogStampFormat", jk_set_log_fmt, NULL, RSRC_CONF,
+ "The Tomcat module log format, follow strftime syntax"),
+ AP_INIT_TAKE1("JkRequestLogFormat", jk_set_request_log_format, NULL,
+ RSRC_CONF,
+ "The mod_jk module request log format string"),
+
+ /*
+ * Automatically Alias webapp context directories into the Apache
+ * document space.
+ */
+ AP_INIT_TAKE1("JkAutoAlias", jk_set_auto_alias, NULL, RSRC_CONF,
+ "The mod_jk module automatic context apache alias directory"),
+
+ /*
+ * Enable worker name to be set in an environment variable.
+ * This way one can use LocationMatch together with mod_env,
+ * mod_setenvif and mod_rewrite to set the target worker.
+ * Use this in combination with SetHandler jakarta-servlet to
+ * make mod_jk the handler for the request.
+ *
+ */
+ AP_INIT_TAKE1("JkWorkerIndicator", jk_set_worker_indicator, NULL, RSRC_CONF,
+ "Name of the Apache environment that contains the worker name"),
+
+ /*
+ * Environment variables used to overwrite the following
+ * request information which gets forwarded:
+ * - remote_addr
+ * - remote_port
+ * - remote_host
+ * - remote_user
+ * - auth_type
+ * - server_name
+ * - server_port
+ */
+ AP_INIT_TAKE1("JkRemoteAddrIndicator", jk_set_remote_addr_indicator, NULL, RSRC_CONF,
+ "Name of the Apache environment that contains the remote address"),
+ AP_INIT_TAKE1("JkRemotePortIndicator", jk_set_remote_port_indicator, NULL, RSRC_CONF,
+ "Name of the Apache environment that contains the remote port"),
+ AP_INIT_TAKE1("JkRemoteHostIndicator", jk_set_remote_host_indicator, NULL, RSRC_CONF,
+ "Name of the Apache environment that contains the remote host name"),
+ AP_INIT_TAKE1("JkRemoteUserIndicator", jk_set_remote_user_indicator, NULL, RSRC_CONF,
+ "Name of the Apache environment that contains the remote user name"),
+ AP_INIT_TAKE1("JkAuthTypeIndicator", jk_set_auth_type_indicator, NULL, RSRC_CONF,
+ "Name of the Apache environment that contains the type of authentication"),
+ AP_INIT_TAKE1("JkLocalNameIndicator", jk_set_local_name_indicator, NULL, RSRC_CONF,
+ "Name of the Apache environment that contains the local name"),
+ AP_INIT_TAKE1("JkLocalPortIndicator", jk_set_local_port_indicator, NULL, RSRC_CONF,
+ "Name of the Apache environment that contains the local port"),
+
+ /*
+ * Apache has multiple SSL modules (for example apache_ssl, stronghold
+ * IHS ...). Each of these can have a different SSL environment names
+ * The following properties let the administrator specify the envoiroment
+ * variables names.
+ *
+ * HTTPS - indication for SSL
+ * CERTS - Base64-Der-encoded client certificates.
+ * CIPHER - A string specifing the ciphers suite in use.
+ * KEYSIZE - Size of Key used in dialogue (#bits are secure)
+ * SESSION - A string specifing the current SSL session.
+ */
+ AP_INIT_TAKE1("JkHTTPSIndicator", jk_set_https_indicator, NULL, RSRC_CONF,
+ "Name of the Apache environment that contains SSL indication"),
+ AP_INIT_TAKE1("JkCERTSIndicator", jk_set_certs_indicator, NULL, RSRC_CONF,
+ "Name of the Apache environment that contains SSL client certificates"),
+ AP_INIT_TAKE1("JkCIPHERIndicator", jk_set_cipher_indicator, NULL,
+ RSRC_CONF,
+ "Name of the Apache environment that contains SSL client cipher"),
+ AP_INIT_TAKE1("JkSESSIONIndicator", jk_set_session_indicator, NULL,
+ RSRC_CONF,
+ "Name of the Apache environment that contains SSL session"),
+ AP_INIT_TAKE1("JkKEYSIZEIndicator", jk_set_key_size_indicator, NULL,
+ RSRC_CONF,
+ "Name of the Apache environment that contains SSL key size in use"),
+ AP_INIT_TAKE1("JkCERTCHAINPrefix", jk_set_certchain_prefix, NULL, RSRC_CONF,
+ "Name of the Apache environment (prefix) that contains SSL client chain certificates"),
+ AP_INIT_FLAG("JkExtractSSL", jk_set_enable_ssl, NULL, RSRC_CONF,
+ "Turns on SSL processing and information gathering by mod_jk"),
+
+ /*
+ * Options to tune mod_jk configuration
+ * for now we understand :
+ * +ForwardSSLKeySize => Forward SSL Key Size, to follow 2.3 specs but may broke old TC 3.2
+ * -ForwardSSLKeySize => Don't Forward SSL Key Size, will make mod_jk works with all TC release
+ * ForwardURICompat => Forward URI normally, less spec compliant but mod_rewrite compatible (old TC)
+ * ForwardURICompatUnparsed => Forward URI as unparsed, spec compliant but broke mod_rewrite (old TC)
+ * ForwardURIEscaped => Forward URI escaped and Tomcat (3.3 rc2) stuff will do the decoding part
+ * +ForwardSSLCertChain => Forward SSL certificate chain
+ * -ForwardSSLCertChain => Don't forward SSL certificate chain
+ */
+ AP_INIT_RAW_ARGS("JkOptions", jk_set_options, NULL, RSRC_CONF,
+ "Set one of more options to configure the mod_jk module"),
+
+ /*
+ * JkEnvVar let user defines envs var passed from WebServer to
+ * Servlet Engine
+ */
+ AP_INIT_TAKE12("JkEnvVar", jk_add_env_var, NULL, RSRC_CONF,
+ "Adds a name of environment variable and an optional value "
+ "that should be sent to servlet-engine"),
+
+ AP_INIT_RAW_ARGS("JkWorkerProperty", jk_set_worker_property,
+ NULL, RSRC_CONF,
+ "Set workers.properties formated directive"),
+
+ {NULL}
+};
+
+/* ========================================================================= */
+/* The JK module handlers */
+/* ========================================================================= */
+
+/** Util - cleanup shmem.
+ */
+static apr_status_t jk_cleanup_shmem(void *data)
+{
+ /* Force the watchdog thread exit */
+ if (jk_watchdog_interval > 0) {
+ jk_watchdog_interval = 0;
+ while (jk_watchdog_running)
+ apr_sleep(apr_time_from_sec(1));
+ }
+ jk_shm_close();
+ return APR_SUCCESS;
+}
+
+/** Main service method, called to forward a request to tomcat
+ */
+static int jk_handler(request_rec * r)
+{
+ const char *worker_name;
+ jk_server_conf_t *xconf;
+ int rc, dmt = 1;
+
+ /* We do DIR_MAGIC_TYPE here to make sure TC gets all requests, even
+ * if they are directory requests, in case there are no static files
+ * visible to Apache and/or DirectoryIndex was not used. This is only
+ * used when JkOptions has ForwardDirectories set. */
+ /* Not for me, try next handler */
+ if (strcmp(r->handler, JK_HANDLER)
+ && (dmt = strcmp(r->handler, DIR_MAGIC_TYPE)))
+ return DECLINED;
+
+ xconf = (jk_server_conf_t *) ap_get_module_config(r->server->module_config,
+ &jk_module);
+ JK_TRACE_ENTER(xconf->log);
+ if (apr_table_get(r->subprocess_env, "no-jk")) {
+ if (JK_IS_DEBUG_LEVEL(xconf->log))
+ jk_log(xconf->log, JK_LOG_DEBUG,
+ "Into handler no-jk env var detected for uri=%s, declined",
+ r->uri);
+
+ JK_TRACE_EXIT(xconf->log);
+ return DECLINED;
+ }
+
+ /* Was the option to forward directories to Tomcat set? */
+ if (!dmt && !(xconf->options & JK_OPT_FWDDIRS)) {
+ JK_TRACE_EXIT(xconf->log);
+ return DECLINED;
+ }
+ worker_name = apr_table_get(r->notes, JK_NOTE_WORKER_NAME);
+
+ /* Set up r->read_chunked flags for chunked encoding, if present */
+ if ((rc = ap_setup_client_block(r, REQUEST_CHUNKED_DECHUNK)) != APR_SUCCESS) {
+ JK_TRACE_EXIT(xconf->log);
+ return rc;
+ }
+
+ if (worker_name == NULL) {
+ /* we may be here because of a manual directive ( that overrides
+ translate and
+ sets the handler directly ). We still need to know the worker.
+ */
+ worker_name = apr_table_get(r->subprocess_env, xconf->worker_indicator);
+ if (worker_name) {
+ /* The JkWorkerIndicator environment variable has
+ * been used to explicitely set the worker without JkMount.
+ * This is useful in combination with LocationMatch or mod_rewrite.
+ */
+ if (JK_IS_DEBUG_LEVEL(xconf->log))
+ jk_log(xconf->log, JK_LOG_DEBUG,
+ "Retrieved worker (%s) from env %s for %s",
+ worker_name, xconf->worker_indicator, r->uri);
+ }
+ else if (worker_env.num_of_workers == 1) {
+ /** We have a single worker ( the common case ).
+ ( lb is a bit special, it should count as a single worker but
+ I'm not sure how ). We also have a manual config directive that
+ explicitely give control to us. */
+ worker_name = worker_env.worker_list[0];
+ if (JK_IS_DEBUG_LEVEL(xconf->log))
+ jk_log(xconf->log, JK_LOG_DEBUG,
+ "Single worker (%s) configuration for %s",
+ worker_name, r->uri);
+ }
+ else {
+ if (!xconf->uw_map) {
+ if (JK_IS_DEBUG_LEVEL(xconf->log))
+ jk_log(xconf->log, JK_LOG_DEBUG,
+ "missing uri map for %s:%s",
+ xconf->s->server_hostname ? xconf->s->server_hostname : "_default_",
+ r->uri);
+ }
+ else {
+ rule_extension_t *e;
+ worker_name = map_uri_to_worker_ext(xconf->uw_map, r->uri,
+ NULL, &e, NULL, xconf->log);
+ ap_set_module_config(r->request_config, &jk_module, e);
+ }
+
+ if (worker_name == NULL && worker_env.num_of_workers) {
+ worker_name = worker_env.worker_list[0];
+ if (JK_IS_DEBUG_LEVEL(xconf->log))
+ jk_log(xconf->log, JK_LOG_DEBUG,
+ "Using first worker (%s) from %d workers for %s",
+ worker_name, worker_env.num_of_workers, r->uri);
+ }
+ }
+ if (worker_name)
+ apr_table_setn(r->notes, JK_NOTE_WORKER_NAME, worker_name);
+ }
+
+ if (JK_IS_DEBUG_LEVEL(xconf->log))
+ jk_log(xconf->log, JK_LOG_DEBUG, "Into handler %s worker=%s"
+ " r->proxyreq=%d",
+ r->handler, STRNULL_FOR_NULL(worker_name), r->proxyreq);
+
+ /* If this is a proxy request, we'll notify an error */
+ if (r->proxyreq) {
+ jk_log(xconf->log, JK_LOG_INFO, "Proxy request for worker=%s"
+ " is not allowed",
+ STRNULL_FOR_NULL(worker_name));
+ JK_TRACE_EXIT(xconf->log);
+ return HTTP_INTERNAL_SERVER_ERROR;
+ }
+
+ if (worker_name) {
+ jk_worker_t *worker = wc_get_worker_for_name(worker_name, xconf->log);
+
+ /* If the remote client has aborted, just ignore the request */
+ if (r->connection->aborted) {
+ jk_log(xconf->log, JK_LOG_INFO, "Client connection aborted for"
+ " worker=%s",
+ worker_name);
+ JK_TRACE_EXIT(xconf->log);
+ return OK;
+ }
+
+ if (worker) {
+ long micro, seconds;
+ char *duration = NULL;
+ apr_time_t rd;
+ apr_time_t request_begin = 0;
+ int is_error = HTTP_INTERNAL_SERVER_ERROR;
+ int rc = JK_FALSE;
+ apache_private_data_t private_data;
+ jk_ws_service_t s;
+ jk_pool_atom_t buf[SMALL_POOL_SIZE];
+ jk_open_pool(&private_data.p, buf, sizeof(buf));
+
+ private_data.read_body_started = JK_FALSE;
+ private_data.r = r;
+
+ /* Maintain will be done by watchdog thread */
+ if (!jk_watchdog_interval)
+ wc_maintain(xconf->log);
+ jk_init_ws_service(&s);
+ s.ws_private = &private_data;
+ s.pool = &private_data.p;
+ apr_table_setn(r->notes, JK_NOTE_WORKER_TYPE,
+ wc_get_name_for_type(worker->type, xconf->log));
+
+ request_begin = apr_time_now();
+
+ if (init_ws_service(&private_data, &s, xconf)) {
+ jk_endpoint_t *end = NULL;
+
+ /* Use per/thread pool ( or "context" ) to reuse the
+ endpoint. It's a bit faster, but I don't know
+ how to deal with load balancing - but it's usefull for JNI
+ */
+
+ /* worker->get_endpoint might fail if we are out of memory so check */
+ /* and handle it */
+ if (worker->get_endpoint(worker, &end, xconf->log)) {
+ rc = end->service(end, &s, xconf->log,
+ &is_error);
+ end->done(&end, xconf->log);
+ if (s.content_read < s.content_length ||
+ (s.is_chunked && !s.no_more_chunks)) {
+ /*
+ * If the servlet engine didn't consume all of the
+ * request data, consume and discard all further
+ * characters left to read from client
+ */
+ char *buff = apr_palloc(r->pool, 2048);
+ int consumed = 0;
+ if (buff != NULL) {
+ int rd;
+ while ((rd =
+ ap_get_client_block(r, buff, 2048)) > 0) {
+ s.content_read += rd;
+ consumed += rd;
+ }
+ }
+ if (JK_IS_DEBUG_LEVEL(xconf->log)) {
+ jk_log(xconf->log, JK_LOG_DEBUG,
+ "Consumed %d bytes of remaining request data for worker=%s",
+ consumed, STRNULL_FOR_NULL(worker_name));
+ }
+ }
+ }
+ else { /* this means we couldn't get an endpoint */
+ jk_log(xconf->log, JK_LOG_ERROR, "Could not get endpoint"
+ " for worker=%s",
+ worker_name);
+ rc = 0; /* just to make sure that we know we've failed */
+ }
+ }
+ else {
+ jk_log(xconf->log, JK_LOG_ERROR, "Could not init service"
+ " for worker=%s",
+ worker_name);
+ jk_close_pool(&private_data.p);
+ JK_TRACE_EXIT(xconf->log);
+ return HTTP_INTERNAL_SERVER_ERROR;
+ }
+ rd = apr_time_now() - request_begin;
+ seconds = (long)apr_time_sec(rd);
+ micro = (long)(rd - apr_time_from_sec(seconds));
+
+ duration = apr_psprintf(r->pool, "%.1ld.%.6ld", seconds, micro);
+ apr_table_setn(r->notes, JK_NOTE_REQUEST_DURATION, duration);
+ if (s.route && *s.route)
+ apr_table_setn(r->notes, JK_NOTE_WORKER_ROUTE, s.route);
+
+ if (xconf->format != NULL) {
+ request_log_transaction(r, xconf);
+ }
+
+ jk_close_pool(&private_data.p);
+
+ if (rc > 0) {
+ if (s.extension.use_server_error_pages &&
+ s.http_response_status >= s.extension.use_server_error_pages) {
+ if (JK_IS_DEBUG_LEVEL(xconf->log))
+ jk_log(xconf->log, JK_LOG_DEBUG, "Forwarding status=%d"
+ " for worker=%s",
+ s.http_response_status, worker_name);
+ JK_TRACE_EXIT(xconf->log);
+ return s.http_response_status;
+ }
+ /* If tomcat returned no body and the status is not OK,
+ let apache handle the error code */
+
+ if (!r->sent_bodyct && r->status >= HTTP_BAD_REQUEST) {
+ jk_log(xconf->log, JK_LOG_INFO, "No body with status=%d"
+ " for worker=%s",
+ r->status, worker_name);
+ JK_TRACE_EXIT(xconf->log);
+ return r->status;
+ }
+ if (JK_IS_DEBUG_LEVEL(xconf->log))
+ jk_log(xconf->log, JK_LOG_DEBUG, "Service finished"
+ " with status=%d for worker=%s",
+ r->status, worker_name);
+ JK_TRACE_EXIT(xconf->log);
+ return OK; /* NOT r->status, even if it has changed. */
+ }
+ else if (rc == JK_CLIENT_ERROR) {
+ if (is_error != HTTP_REQUEST_ENTITY_TOO_LARGE)
+ r->connection->aborted = 1;
+ jk_log(xconf->log, JK_LOG_INFO, "Aborting connection"
+ " for worker=%s",
+ worker_name);
+ JK_TRACE_EXIT(xconf->log);
+ return is_error;
+ }
+ else {
+ jk_log(xconf->log, JK_LOG_INFO, "Service error=%d"
+ " for worker=%s",
+ rc, worker_name);
+ JK_TRACE_EXIT(xconf->log);
+ return is_error;
+ }
+ }
+ else {
+ jk_log(xconf->log, JK_LOG_INFO, "Could not find a worker"
+ " for worker name=%s",
+ worker_name);
+ JK_TRACE_EXIT(xconf->log);
+ return HTTP_INTERNAL_SERVER_ERROR;
+ }
+ }
+
+ JK_TRACE_EXIT(xconf->log);
+ return DECLINED;
+}
+
+/** Standard apache hook, cleanup jk
+ */
+static apr_status_t jk_apr_pool_cleanup(void *data)
+{
+ server_rec *s = data;
+
+ if (jk_worker_properties) {
+ jk_map_free(&jk_worker_properties);
+ jk_worker_properties = NULL;
+ jk_worker_file = NULL;
+ jk_mount_copy_all = JK_FALSE;
+ }
+
+ while (NULL != s) {
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(s->module_config,
+ &jk_module);
+
+ if (conf && conf->was_initialized == JK_TRUE) {
+ /* On pool cleanup pass NULL for the jk_logger to
+ prevent segmentation faults on Windows because
+ we can't guarantee what order pools get cleaned
+ up between APR implementations. */
+ wc_close(NULL);
+ if (conf->uri_to_context) {
+ jk_map_free(&conf->uri_to_context);
+ /* We cannot have allocated uw_map
+ * unless we've allocated uri_to_context
+ */
+ if (conf->uw_map)
+ uri_worker_map_free(&conf->uw_map, NULL);
+ }
+ conf->was_initialized = JK_FALSE;
+ }
+ s = s->next;
+ }
+ return APR_SUCCESS;
+}
+
+/** Create default jk_config. XXX This is mostly server-independent,
+ all servers are using something similar - should go to common.
+ */
+static void *create_jk_config(apr_pool_t * p, server_rec * s)
+{
+ jk_server_conf_t *c =
+ (jk_server_conf_t *) apr_pcalloc(p, sizeof(jk_server_conf_t));
+
+ c->was_initialized = JK_FALSE;
+
+ if (s->is_virtual) {
+ c->mountcopy = JK_UNSET;
+ c->mount_file_reload = JK_UNSET;
+ c->log_level = JK_UNSET;
+ c->ssl_enable = JK_UNSET;
+ c->strip_session = JK_UNSET;
+ } else {
+ if (!jk_map_alloc(&(c->uri_to_context))) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, "Memory error");
+ }
+ c->mountcopy = JK_FALSE;
+ c->mount_file_reload = JK_URIMAP_DEF_RELOAD;
+ c->log_level = JK_LOG_DEF_LEVEL;
+ c->options = JK_OPT_DEFAULT;
+ c->worker_indicator = JK_ENV_WORKER_NAME;
+
+ /*
+ * Configurable environment variables to overwrite
+ * request information using meta data send by a
+ * proxy in front of us.
+ */
+ c->remote_addr_indicator = JK_ENV_REMOTE_ADDR;
+ c->remote_port_indicator = JK_ENV_REMOTE_PORT;
+ c->remote_host_indicator = JK_ENV_REMOTE_HOST;
+ c->remote_user_indicator = JK_ENV_REMOTE_USER;
+ c->auth_type_indicator = JK_ENV_AUTH_TYPE;
+ c->local_name_indicator = JK_ENV_LOCAL_NAME;
+ c->local_port_indicator = JK_ENV_LOCAL_PORT;
+
+ /*
+ * By default we will try to gather SSL info.
+ * Disable this functionality through JkExtractSSL
+ */
+ c->ssl_enable = JK_TRUE;
+ /*
+ * The defaults ssl indicators match those in mod_ssl (seems
+ * to be in more use).
+ */
+ c->https_indicator = JK_ENV_HTTPS;
+ c->certs_indicator = JK_ENV_CERTS;
+ c->cipher_indicator = JK_ENV_CIPHER;
+ c->certchain_prefix = JK_ENV_CERTCHAIN_PREFIX;
+ c->session_indicator = JK_ENV_SESSION;
+ c->key_size_indicator = JK_ENV_KEY_SIZE;
+ c->strip_session = JK_FALSE;
+ }
+ c->envvars_has_own = JK_FALSE;
+
+ c->s = s;
+ apr_pool_cleanup_register(p, s, jk_apr_pool_cleanup, apr_pool_cleanup_null);
+ return c;
+}
+
+
+/*
+ * Utility - copy items from apr table src to dst,
+ * for keys that exist in src but not in dst.
+ */
+static void merge_apr_table(apr_table_t *src, apr_table_t *dst)
+{
+ int i;
+ const apr_array_header_t *arr;
+ const apr_table_entry_t *elts;
+
+ arr = apr_table_elts(src);
+ elts = (const apr_table_entry_t *)arr->elts;
+ for (i = 0; i < arr->nelts; ++i) {
+ if (!apr_table_get(dst, elts[i].key)) {
+ apr_table_setn(dst, elts[i].key, elts[i].val);
+ }
+ }
+}
+
+
+/** Standard apache callback, merge jk options specified in <Directory>
+ context or <Host>.
+ */
+static void *merge_jk_config(apr_pool_t * p, void *basev, void *overridesv)
+{
+ jk_server_conf_t *base = (jk_server_conf_t *) basev;
+ jk_server_conf_t *overrides = (jk_server_conf_t *) overridesv;
+
+ if (!overrides->log_file)
+ overrides->log_file = base->log_file;
+ if (overrides->log_level == JK_UNSET)
+ overrides->log_level = base->log_level;
+
+ if (!overrides->stamp_format_string)
+ overrides->stamp_format_string = base->stamp_format_string;
+ if (!overrides->format_string)
+ overrides->format_string = base->format_string;
+
+ if (!overrides->worker_indicator)
+ overrides->worker_indicator = base->worker_indicator;
+
+ if (!overrides->remote_addr_indicator)
+ overrides->remote_addr_indicator = base->remote_addr_indicator;
+ if (!overrides->remote_port_indicator)
+ overrides->remote_port_indicator = base->remote_port_indicator;
+ if (!overrides->remote_host_indicator)
+ overrides->remote_host_indicator = base->remote_host_indicator;
+ if (!overrides->remote_user_indicator)
+ overrides->remote_user_indicator = base->remote_user_indicator;
+ if (!overrides->auth_type_indicator)
+ overrides->auth_type_indicator = base->auth_type_indicator;
+ if (!overrides->local_name_indicator)
+ overrides->local_name_indicator = base->local_name_indicator;
+ if (!overrides->local_port_indicator)
+ overrides->local_port_indicator = base->local_port_indicator;
+
+ if (overrides->ssl_enable == JK_UNSET)
+ overrides->ssl_enable = base->ssl_enable;
+ if (!overrides->https_indicator)
+ overrides->https_indicator = base->https_indicator;
+ if (!overrides->certs_indicator)
+ overrides->certs_indicator = base->certs_indicator;
+ if (!overrides->cipher_indicator)
+ overrides->cipher_indicator = base->cipher_indicator;
+ if (!overrides->certchain_prefix)
+ overrides->certchain_prefix = base->certchain_prefix;
+ if (!overrides->session_indicator)
+ overrides->session_indicator = base->session_indicator;
+ if (!overrides->key_size_indicator)
+ overrides->key_size_indicator = base->key_size_indicator;
+
+/* Don't simply accumulate bits in the JK_OPT_FWDURIMASK region, */
+/* because those are multi-bit values. */
+ if (overrides->options & JK_OPT_FWDURIMASK)
+ overrides->options |= (base->options & ~base->exclude_options) & ~JK_OPT_FWDURIMASK;
+ else
+ overrides->options |= (base->options & ~base->exclude_options);
+
+ if (base->envvars) {
+ if (overrides->envvars && overrides->envvars_has_own) {
+/* merge_apr_table() preserves existing entries in overrides table */
+ merge_apr_table(base->envvars, overrides->envvars);
+ merge_apr_table(base->envvars_def, overrides->envvars_def);
+ }
+ else {
+ overrides->envvars = base->envvars;
+ overrides->envvars_def = base->envvars_def;
+ overrides->envvar_items = base->envvar_items;
+ }
+ }
+
+ if (overrides->mountcopy == JK_UNSET && jk_mount_copy_all == JK_TRUE) {
+ overrides->mountcopy = JK_TRUE;
+ }
+ if (overrides->uri_to_context && overrides->mountcopy == JK_TRUE) {
+/* jk_map_copy() preserves existing entries in overrides map */
+ if (jk_map_copy(base->uri_to_context, overrides->uri_to_context) == JK_FALSE) {
+ jk_error_exit(JKLOG_MARK, APLOG_EMERG, overrides->s, p, "Memory error");
+ }
+ if (!overrides->mount_file)
+ overrides->mount_file = base->mount_file;
+ }
+ if (overrides->mountcopy == JK_TRUE) {
+ if (!overrides->alias_dir)
+ overrides->alias_dir = base->alias_dir;
+ }
+ if (overrides->mount_file_reload == JK_UNSET)
+ overrides->mount_file_reload = base->mount_file_reload;
+ if (overrides->strip_session == JK_UNSET) {
+ overrides->strip_session = base->strip_session;
+ overrides->strip_session_name = base->strip_session_name;
+ }
+ return overrides;
+}
+
+static int JK_METHOD jk_log_to_file(jk_logger_t *l, int level,
+ int used, char *what)
+{
+ if (l &&
+ (l->level <= level || level == JK_LOG_REQUEST_LEVEL) &&
+ l->logger_private && what && used > 0) {
+ jk_file_logger_t *p = l->logger_private;
+ if (p->jklogfp) {
+ apr_status_t rv;
+ apr_size_t wrote;
+#if defined(WIN32)
+ what[used++] = '\r';
+#endif
+ what[used++] = '\n';
+ wrote = used;
+ rv = apr_global_mutex_lock(jk_log_lock);
+ if (rv != APR_SUCCESS) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL,
+ "apr_global_mutex_lock(jk_log_lock) failed");
+ /* XXX: Maybe this should be fatal? */
+ }
+ rv = apr_file_write(p->jklogfp, what, &wrote);
+ if (rv != APR_SUCCESS) {
+ char error[256];
+ apr_strerror(rv, error, 254);
+ ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL,
+ "mod_jk: jk_log_to_file %s failed: %s",
+ what, error);
+ }
+ rv = apr_global_mutex_unlock(jk_log_lock);
+ if (rv != APR_SUCCESS) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL,
+ "apr_global_mutex_unlock(jk_log_lock) failed");
+ /* XXX: Maybe this should be fatal? */
+ }
+ }
+
+ return JK_TRUE;
+ }
+
+ return JK_FALSE;
+}
+
+/*
+** +-------------------------------------------------------+
+** | |
+** | jk logfile support |
+** | |
+** +-------------------------------------------------------+
+*/
+
+static apr_status_t jklog_cleanup(void *d)
+{
+ /* hgomez@20070425 */
+ /* Clean up pointer content */
+ if (d != NULL)
+ *(jk_logger_t **)d = NULL;
+
+ return APR_SUCCESS;
+}
+
+static int open_jklog(server_rec * s, apr_pool_t * p)
+{
+ jk_server_conf_t *conf;
+ const char *fname;
+ apr_status_t rc;
+ apr_file_t *jklogfp;
+ piped_log *pl;
+ jk_logger_t *jkl;
+ jk_file_logger_t *flp;
+ int jklog_flags = (APR_WRITE | APR_APPEND | APR_CREATE);
+ apr_fileperms_t jklog_mode =
+ (APR_UREAD | APR_UWRITE | APR_GREAD | APR_WREAD);
+
+ conf = ap_get_module_config(s->module_config, &jk_module);
+
+ if (conf->log_file == NULL) {
+ conf->log_file = ap_server_root_relative(p, JK_LOG_DEF_FILE);
+ if (conf->log_file)
+ ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s,
+ "No JkLogFile defined in httpd.conf. "
+ "Using default %s", conf->log_file);
+ }
+ if (*(conf->log_file) == '\0') {
+ ap_log_error(APLOG_MARK, APLOG_ERR, APR_EBADPATH, s,
+ "mod_jk: Invalid JkLogFile EMPTY");
+ conf->log = main_log;
+ return 0;
+ }
+
+ jklogfp = apr_hash_get(jk_log_fps, conf->log_file, APR_HASH_KEY_STRING);
+ if (!jklogfp) {
+ if (*conf->log_file == '|') {
+ if ((pl = ap_open_piped_log(p, conf->log_file + 1)) == NULL) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, 0, s,
+ "mod_jk: could not open reliable pipe "
+ "to jk log %s", conf->log_file + 1);
+ return -1;
+ }
+ jklogfp = (void *)ap_piped_log_write_fd(pl);
+ }
+ else {
+ fname = ap_server_root_relative(p, conf->log_file);
+ if (!fname) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, APR_EBADPATH, s,
+ "mod_jk: Invalid JkLog " "path %s", conf->log_file);
+ return -1;
+ }
+ if ((rc = apr_file_open(&jklogfp, fname,
+ jklog_flags, jklog_mode, p))
+ != APR_SUCCESS) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, rc, s,
+ "mod_jk: could not open JkLog " "file %s", fname);
+ return -1;
+ }
+ }
+ apr_file_inherit_set(jklogfp);
+ apr_hash_set(jk_log_fps, conf->log_file, APR_HASH_KEY_STRING, jklogfp);
+ }
+ conf->jklogfp = jklogfp;
+ jkl = (jk_logger_t *)apr_palloc(p, sizeof(jk_logger_t));
+ flp = (jk_file_logger_t *) apr_palloc(p, sizeof(jk_file_logger_t));
+ if (jkl && flp) {
+ jkl->log = jk_log_to_file;
+ jkl->level = conf->log_level;
+ jkl->logger_private = flp;
+ flp->jklogfp = conf->jklogfp;
+ conf->log = jkl;
+ jk_set_time_fmt(conf->log, conf->stamp_format_string);
+ if (main_log == NULL) {
+ main_log = conf->log;
+
+ /* hgomez@20070425 */
+ /* Shouldn't we clean both conf->log and main_log ? */
+ /* Also should we pass pointer (ie: main_log) or handle (*main_log) ? */
+ apr_pool_cleanup_register(p, &main_log,
+ jklog_cleanup,
+ apr_pool_cleanup_null);
+ }
+
+ return 0;
+ }
+
+ return -1;
+}
+
+#if APR_HAS_THREADS
+
+static void * APR_THREAD_FUNC jk_watchdog_func(apr_thread_t *thd, void *data)
+{
+ int i;
+ jk_server_conf_t *conf = (jk_server_conf_t *)data;
+
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "Watchdog thread initialized with %d second interval",
+ jk_watchdog_interval);
+ for (;;) {
+ for (i = 0; i < (jk_watchdog_interval * 10); i++) {
+ /* apr_sleep() uses microseconds */
+ apr_sleep((apr_time_t)(100000));
+ if (!jk_watchdog_interval)
+ break;
+ }
+ if (!jk_watchdog_interval)
+ break;
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "Watchdog thread running");
+ jk_watchdog_running = 1;
+ wc_maintain(conf->log);
+ if (!jk_watchdog_interval)
+ break;
+ }
+ jk_watchdog_running = 0;
+ return NULL;
+}
+
+#endif
+
+/** Standard apache callback, initialize jk.
+ */
+static void jk_child_init(apr_pool_t * pconf, server_rec * s)
+{
+ jk_server_conf_t *conf;
+ apr_status_t rv;
+ int rc;
+ apr_thread_t *wdt;
+
+ conf = ap_get_module_config(s->module_config, &jk_module);
+
+ rv = apr_global_mutex_child_init(&jk_log_lock, NULL, pconf);
+ if (rv != APR_SUCCESS) {
+ ap_log_error(APLOG_MARK, APLOG_CRIT, rv, s,
+ "mod_jk: could not init JK log lock in child");
+ }
+
+ JK_TRACE_ENTER(conf->log);
+
+ if (jk_watchdog_interval) {
+#if APR_HAS_THREADS
+ rv = apr_thread_create(&wdt, NULL, jk_watchdog_func, conf, pconf);
+ if (rv != APR_SUCCESS) {
+ jk_log(conf->log, JK_LOG_ERROR,
+ "Could not init watchdog thread, error=%d", rv);
+ jk_watchdog_interval = 0;
+ }
+ apr_thread_detach(wdt);
+#endif
+ }
+
+ if ((rc = jk_shm_attach(jk_shm_file, jk_shm_size, conf->log)) == 0) {
+ apr_pool_cleanup_register(pconf, conf->log, jk_cleanup_shmem,
+ apr_pool_cleanup_null);
+ }
+ else
+ jk_log(conf->log, JK_LOG_ERROR, "Attaching shm:%s errno=%d",
+ jk_shm_name(), rc);
+
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG, "Initialized %s", JK_FULL_EXPOSED_VERSION);
+ JK_TRACE_EXIT(conf->log);
+}
+
+/** Initialize jk, using worker.properties.
+ We also use apache commands ( JkWorker, etc), but this use is
+ deprecated, as we'll try to concentrate all config in
+ workers.properties, urimap.properties, and ajp14 autoconf.
+
+ Apache config will only be used for manual override, using
+ SetHandler and normal apache directives ( but minimal jk-specific
+ stuff )
+*/
+static int init_jk(apr_pool_t * pconf, jk_server_conf_t * conf,
+ server_rec * s)
+{
+ int rc;
+ int is_threaded;
+ int mpm_threads = 1;
+
+ if (!jk_worker_properties)
+ jk_map_alloc(&jk_worker_properties);
+ jk_map_put(jk_worker_properties, "ServerRoot", ap_server_root, NULL);
+
+ /* Set default connection cache size for multi-threaded MPMs */
+ if (ap_mpm_query(AP_MPMQ_IS_THREADED, &is_threaded) == APR_SUCCESS &&
+ is_threaded != AP_MPMQ_NOT_SUPPORTED) {
+ if (ap_mpm_query(AP_MPMQ_MAX_THREADS, &mpm_threads) != APR_SUCCESS)
+ mpm_threads = 1;
+ }
+ if (mpm_threads > 1) {
+#if _MT_CODE
+ /* _MT_CODE */
+ if (JK_IS_DEBUG_LEVEL(conf->log)) {
+#if !defined(WIN32) && !defined(NETWARE)
+#if USE_FLOCK_LK
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "Using flock() for locking.");
+#else
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "Using fcntl() for locking.");
+#endif /* USE_FLOCK_LK */
+#else /* WIN32 */
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "Not using locking.");
+#endif
+ }
+#else
+ /* !_MT_CODE */
+ ap_log_error(APLOG_MARK, APLOG_EMERG, 0, s,
+ "Cannot run prefork mod_jk on threaded server.");
+ return JK_FALSE;
+#endif
+ }
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "Setting default connection pool max size to %d",
+ mpm_threads);
+ jk_set_worker_def_cache_size(mpm_threads);
+
+ if ((jk_worker_file != NULL) &&
+ !jk_map_read_properties(jk_worker_properties, NULL, jk_worker_file, NULL,
+ JK_MAP_HANDLE_DUPLICATES, conf->log)) {
+ ap_log_error(APLOG_MARK, APLOG_EMERG, 0, s,
+ "Error in reading worker properties from '%s'",
+ jk_worker_file);
+ return JK_FALSE;
+ }
+
+ if (jk_map_resolve_references(jk_worker_properties, "worker.",
+ 1, 1, conf->log) == JK_FALSE) {
+ ap_log_error(APLOG_MARK, APLOG_EMERG, 0, s,
+ "Error in resolving configuration references");
+ return JK_FALSE;
+ }
+
+#if !defined(WIN32) && !defined(NETWARE)
+ if (!jk_shm_file) {
+ jk_shm_file = ap_server_root_relative(pconf, JK_SHM_DEF_FILE);
+ if (jk_shm_file)
+ ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s,
+ "No JkShmFile defined in httpd.conf. "
+ "Using default %s", jk_shm_file);
+ }
+#endif
+ if (jk_shm_size == 0)
+ jk_shm_size = jk_shm_calculate_size(jk_worker_properties, conf->log);
+ else if (jk_shm_size_set) {
+ jk_log(conf->log, JK_LOG_WARNING,
+ "The optimal shared memory size can now be determined automatically.");
+ jk_log(conf->log, JK_LOG_WARNING,
+ "You can remove the JkShmSize directive if you want to use the optimal size.");
+ }
+ if ((rc = jk_shm_open(jk_shm_file, jk_shm_size, conf->log)) == 0) {
+ apr_pool_cleanup_register(pconf, conf->log,
+ jk_cleanup_shmem,
+ apr_pool_cleanup_null);
+ }
+ else
+ jk_log(conf->log, JK_LOG_ERROR,
+ "Initializing shm:%s errno=%d. Load balancing workers will not function properly.",
+ jk_shm_name(), rc);
+
+ /* we add the URI->WORKER MAP since workers using AJP14
+ will feed it */
+ worker_env.uri_to_worker = conf->uw_map;
+ worker_env.virtual = "*"; /* for now */
+#if ((AP_MODULE_MAGIC_AT_LEAST(20051115,4)) && !defined(API_COMPATIBILITY)) || (MODULE_MAGIC_NUMBER_MAJOR >= 20060905)
+ worker_env.server_name = (char *)ap_get_server_description();
+#else
+ worker_env.server_name = (char *)ap_get_server_version();
+#endif
+ worker_env.pool = pconf;
+
+ if (wc_open(jk_worker_properties, &worker_env, conf->log)) {
+ ap_add_version_component(pconf, JK_EXPOSED_VERSION);
+ jk_log(conf->log, JK_LOG_INFO,
+ "%s initialized",
+ JK_FULL_EXPOSED_VERSION);
+ }
+ else {
+ ap_log_error(APLOG_MARK, APLOG_EMERG, 0, s,
+ "Error in creating the workers."
+ " Please consult your mod_jk log file '%s'.", conf->log_file);
+ return JK_FALSE;
+ }
+ return JK_TRUE;
+}
+
+static int jk_post_config(apr_pool_t * pconf,
+ apr_pool_t * plog,
+ apr_pool_t * ptemp, server_rec * s)
+{
+ apr_status_t rv;
+ jk_server_conf_t *conf;
+ server_rec *srv = s;
+ const char *err_string = NULL;
+ void *data = NULL;
+
+ apr_pool_userdata_get(&data, JK_LOG_LOCK_KEY, s->process->pool);
+ if (data == NULL) {
+ /* create the jk log lockfiles in the parent */
+ if ((rv = apr_global_mutex_create(&jk_log_lock, NULL,
+ APR_LOCK_DEFAULT,
+ s->process->pool)) != APR_SUCCESS) {
+ ap_log_error(APLOG_MARK, APLOG_CRIT, rv, s,
+ "mod_jk: could not create jk_log_lock");
+ return HTTP_INTERNAL_SERVER_ERROR;
+ }
+
+#if JK_NEED_SET_MUTEX_PERMS
+#if (MODULE_MAGIC_NUMBER_MAJOR >= 20090208)
+ rv = ap_unixd_set_global_mutex_perms(jk_log_lock);
+#else
+ rv = unixd_set_global_mutex_perms(jk_log_lock);
+#endif
+ if (rv != APR_SUCCESS) {
+ ap_log_error(APLOG_MARK, APLOG_CRIT, rv, s,
+ "mod_jk: Could not set permissions on "
+ "jk_log_lock; check User and Group directives");
+ return HTTP_INTERNAL_SERVER_ERROR;
+ }
+#endif
+ apr_pool_userdata_set((const void *)jk_log_lock, JK_LOG_LOCK_KEY,
+ apr_pool_cleanup_null, s->process->pool);
+ } else {
+ jk_log_lock = (apr_global_mutex_t *)data;
+ }
+
+ main_server = s;
+ jk_log_fps = apr_hash_make(pconf);
+
+ if (!s->is_virtual) {
+ conf = (jk_server_conf_t *)ap_get_module_config(s->module_config,
+ &jk_module);
+ if (conf->was_initialized == JK_FALSE) {
+ /* step through the servers and open each jk logfile
+ * and do additional post config initialization.
+ */
+ for (; srv; srv = srv->next) {
+ jk_server_conf_t *sconf = (jk_server_conf_t *)ap_get_module_config(srv->module_config,
+ &jk_module);
+
+/*
+ * If a virtual server contains no JK directive, httpd shares
+ * the config structure. But we don't want to share some settings
+ * by default, especially the JkMount rules.
+ * Therefore we check, if this config structure really belongs to this
+ * vhost, otherwise we create a new one and merge.
+ */
+ if (sconf && sconf->s != srv) {
+ jk_server_conf_t *srvconf = (jk_server_conf_t *)create_jk_config(pconf, srv);
+ sconf = (jk_server_conf_t *)merge_jk_config(pconf, sconf, srvconf);
+ ap_set_module_config(srv->module_config, &jk_module, sconf);
+
+ }
+
+ if (sconf && sconf->was_initialized == JK_FALSE) {
+ sconf->was_initialized = JK_TRUE;
+ if (open_jklog(srv, pconf))
+ return HTTP_INTERNAL_SERVER_ERROR;
+ sconf->options &= ~sconf->exclude_options;
+ if (sconf->uri_to_context) {
+ if (!uri_worker_map_alloc(&(sconf->uw_map),
+ sconf->uri_to_context, sconf->log))
+ jk_error_exit(JKLOG_MARK, APLOG_EMERG, srv,
+ srv->process->pool, "Memory error");
+ if (sconf->options & JK_OPT_REJECTUNSAFE)
+ sconf->uw_map->reject_unsafe = 1;
+ else
+ sconf->uw_map->reject_unsafe = 0;
+ if (sconf->mount_file) {
+ sconf->uw_map->fname = sconf->mount_file;
+ sconf->uw_map->reload = sconf->mount_file_reload;
+ uri_worker_map_switch(sconf->uw_map, sconf->log);
+ uri_worker_map_load(sconf->uw_map, sconf->log);
+ }
+ }
+ else {
+ if (sconf->mountcopy == JK_TRUE) {
+ sconf->uw_map = conf->uw_map;
+ }
+ }
+ if (sconf->format_string) {
+ sconf->format =
+ parse_request_log_string(pconf, sconf->format_string, &err_string);
+ if (sconf->format == NULL)
+ ap_log_error(APLOG_MARK, APLOG_ERR, 0, s,
+ "JkRequestLogFormat format array NULL");
+ }
+ if (sconf->envvars && sconf->envvars_has_own) {
+ int i;
+ const apr_array_header_t *arr;
+ const apr_table_entry_t *elts;
+ envvar_item *item;
+ const char *envvar_def;
+
+ arr = apr_table_elts(sconf->envvars);
+ if (arr) {
+ elts = (const apr_table_entry_t *)arr->elts;
+ for (i = 0; i < arr->nelts; ++i) {
+ item = (envvar_item *)apr_array_push(sconf->envvar_items);
+ if (!item)
+ return HTTP_INTERNAL_SERVER_ERROR;
+ item->name = elts[i].key;
+ envvar_def = apr_table_get(sconf->envvars_def, elts[i].key);
+ if (envvar_def && !strcmp("1", envvar_def) ) {
+ item->value = elts[i].val;
+ item->has_default = 1;
+ }
+ else {
+ item->value = "";
+ item->has_default = 0;
+ }
+ }
+ }
+ }
+ }
+ }
+ conf->was_initialized = JK_TRUE;
+ if (init_jk(pconf, conf, s) == JK_FALSE)
+ return HTTP_INTERNAL_SERVER_ERROR;
+ if (conf->uw_map) {
+ uri_worker_map_ext(conf->uw_map, conf->log);
+ uri_worker_map_switch(conf->uw_map, conf->log);
+ }
+ for (srv = s; srv; srv = srv->next) {
+ jk_server_conf_t *sconf = (jk_server_conf_t *)ap_get_module_config(srv->module_config,
+ &jk_module);
+ if (conf->uw_map != sconf->uw_map && sconf->uw_map) {
+ uri_worker_map_ext(sconf->uw_map, sconf->log);
+ uri_worker_map_switch(sconf->uw_map, sconf->log);
+ }
+ }
+
+ }
+ }
+
+ return OK;
+}
+
+/** Use the internal mod_jk mappings to find if this is a request for
+ * tomcat and what worker to use.
+ */
+static int jk_translate(request_rec * r)
+{
+ ap_set_module_config(r->request_config, &jk_module, NULL);
+
+ if (!r->proxyreq) {
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(r->server->
+ module_config,
+ &jk_module);
+
+ if (conf) {
+ const char *worker;
+ if ((r->handler != NULL) && (!strcmp(r->handler, JK_HANDLER))) {
+ /* Somebody already set the handler, probably manual config
+ * or "native" configuration, no need for extra overhead
+ */
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "Manually mapped, no need to call uri_to_worker");
+ return DECLINED;
+ }
+
+ if (apr_table_get(r->subprocess_env, "no-jk")) {
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "Into translate no-jk env var detected for uri=%s, declined",
+ r->uri);
+
+ return DECLINED;
+ }
+
+ /* Special case to make sure that apache can serve a directory
+ listing if there are no matches for the DirectoryIndex and
+ Tomcat webapps are mapped into apache using JkAutoAlias. */
+ if (r->main != NULL && r->main->handler != NULL &&
+ (conf->alias_dir != NULL) &&
+ !strcmp(r->main->handler, DIR_MAGIC_TYPE)) {
+
+ /* Append the request uri to the JkAutoAlias directory and
+ determine if the file exists. */
+ char *clean_uri;
+ apr_finfo_t finfo;
+ finfo.filetype = APR_NOFILE;
+ clean_uri = apr_pstrdup(r->pool, r->uri);
+ ap_no2slash(clean_uri);
+ /* Map uri to a context static file */
+ if (strlen(clean_uri) > 1) {
+ char *context_path = NULL;
+
+ context_path = apr_pstrcat(r->pool, conf->alias_dir,
+ ap_os_escape_path(r->pool,
+ clean_uri,
+ 1), NULL);
+ if (context_path != NULL) {
+ apr_stat(&finfo, context_path, APR_FINFO_TYPE,
+ r->pool);
+ }
+ }
+ if (finfo.filetype != APR_REG) {
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "JkAutoAlias, no DirectoryIndex file for URI %s",
+ r->uri);
+ return DECLINED;
+ }
+ }
+ if (!conf->uw_map) {
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "missing uri map for %s:%s",
+ conf->s->server_hostname ? conf->s->server_hostname : "_default_",
+ r->uri);
+ return DECLINED;
+ }
+ else {
+ rule_extension_t *e;
+ worker = map_uri_to_worker_ext(conf->uw_map, r->uri,
+ NULL, &e, NULL, conf->log);
+ ap_set_module_config(r->request_config, &jk_module, e);
+ }
+
+ if (worker) {
+ r->handler = apr_pstrdup(r->pool, JK_HANDLER);
+ apr_table_setn(r->notes, JK_NOTE_WORKER_NAME, worker);
+
+ /* This could be a sub-request, possibly from mod_dir */
+ /* Also add the the HANDLER to the main request */
+ if (r->main) {
+ r->main->handler = apr_pstrdup(r->main->pool, JK_HANDLER);
+ apr_table_setn(r->main->notes, JK_NOTE_WORKER_NAME, worker);
+ }
+
+ return OK;
+ }
+ else if (conf->alias_dir != NULL) {
+ char *clean_uri = apr_pstrdup(r->pool, r->uri);
+ ap_no2slash(clean_uri);
+ /* Automatically map uri to a context static file */
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "check alias_dir: %s",
+ conf->alias_dir);
+ if (strlen(clean_uri) > 1) {
+ /* Get the context directory name */
+ char *context_dir = NULL;
+ char *context_path = NULL;
+ char *child_dir = NULL;
+ char *index = clean_uri;
+ char *suffix = strchr(index + 1, '/');
+ if (suffix != NULL) {
+ int size = suffix - index;
+ context_dir = apr_pstrndup(r->pool, index, size);
+ /* Get the context child directory name */
+ index = index + size + 1;
+ suffix = strchr(index, '/');
+ if (suffix != NULL) {
+ size = suffix - index;
+ child_dir = apr_pstrndup(r->pool, index, size);
+ }
+ else {
+ child_dir = index;
+ }
+ /* Deny access to WEB-INF and META-INF directories */
+ if (child_dir != NULL) {
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "AutoAlias child_dir: %s",
+ child_dir);
+ if (!strcasecmp(child_dir, "WEB-INF")
+ || !strcasecmp(child_dir, "META-INF")) {
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "AutoAlias HTTP_NOT_FOUND for URI: %s",
+ r->uri);
+ return HTTP_NOT_FOUND;
+ }
+ }
+ }
+ else {
+ context_dir = apr_pstrdup(r->pool, index);
+ }
+
+ context_path = apr_pstrcat(r->pool, conf->alias_dir,
+ ap_os_escape_path(r->pool,
+ context_dir,
+ 1), NULL);
+ if (context_path != NULL) {
+ apr_finfo_t finfo;
+ finfo.filetype = APR_NOFILE;
+ apr_stat(&finfo, context_path, APR_FINFO_TYPE,
+ r->pool);
+ if (finfo.filetype == APR_DIR) {
+ char *escurl =
+ ap_os_escape_path(r->pool, clean_uri, 1);
+ char *ret =
+ apr_pstrcat(r->pool, conf->alias_dir, escurl,
+ NULL);
+ /* Add code to verify real path ap_os_canonical_name */
+ if (ret != NULL) {
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "AutoAlias OK for file: %s",
+ ret);
+ r->filename = ret;
+ return OK;
+ }
+ }
+ else {
+ /* Deny access to war files in web app directory */
+ int size = strlen(context_dir);
+ if (size > 4
+ && !strcasecmp(context_dir + (size - 4),
+ ".war")) {
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "AutoAlias HTTP_FORBIDDEN for URI: %s",
+ r->uri);
+ return HTTP_FORBIDDEN;
+ }
+ }
+ }
+ }
+ }
+ else {
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "no match for %s found",
+ r->uri);
+ }
+ }
+ }
+
+ return DECLINED;
+}
+
+/* bypass the directory_walk and file_walk for non-file requests */
+static int jk_map_to_storage(request_rec * r)
+{
+
+ if (!r->proxyreq && !apr_table_get(r->notes, JK_NOTE_WORKER_NAME)) {
+ jk_server_conf_t *conf =
+ (jk_server_conf_t *) ap_get_module_config(r->server->
+ module_config,
+ &jk_module);
+
+ if (conf) {
+ const char *worker;
+ if ((r->handler != NULL) && (!strcmp(r->handler, JK_HANDLER))) {
+ /* Somebody already set the handler, probably manual config
+ * or "native" configuration, no need for extra overhead
+ */
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "Manually mapped, no need to call uri_to_worker");
+ return DECLINED;
+ }
+
+ if (apr_table_get(r->subprocess_env, "no-jk")) {
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "Into map_to_storage no-jk env var detected for uri=%s, declined",
+ r->uri);
+
+ return DECLINED;
+ }
+ if (!conf->uw_map) {
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "missing uri map for %s:%s",
+ conf->s->server_hostname ? conf->s->server_hostname : "_default_",
+ r->uri);
+ return DECLINED;
+ }
+ else {
+ rule_extension_t *e;
+ worker = map_uri_to_worker_ext(conf->uw_map, r->uri,
+ NULL, &e, NULL, conf->log);
+ ap_set_module_config(r->request_config, &jk_module, e);
+ }
+
+ if (worker) {
+ r->handler = apr_pstrdup(r->pool, JK_HANDLER);
+ apr_table_setn(r->notes, JK_NOTE_WORKER_NAME, worker);
+
+ /* This could be a sub-request, possibly from mod_dir */
+ if (r->main)
+ apr_table_setn(r->main->notes, JK_NOTE_WORKER_NAME, worker);
+
+ }
+ else {
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "no match for %s found",
+ r->uri);
+ if (conf->strip_session == JK_TRUE &&
+ conf->strip_session_name) {
+ char *jsessionid;
+ if (r->uri) {
+ jsessionid = strstr(r->uri, conf->strip_session_name);
+ if (jsessionid) {
+ if (JK_IS_DEBUG_LEVEL(conf->log))
+ jk_log(conf->log, JK_LOG_DEBUG,
+ "removing session identifier [%s] for non servlet url [%s]",
+ jsessionid, r->uri);
+ *jsessionid = '\0';
+ }
+ }
+ if (r->filename) {
+ jsessionid = strstr(r->filename, conf->strip_session_name);
+ if (jsessionid)
+ *jsessionid = '\0';
+ }
+ return DECLINED;
+ }
+ }
+ }
+ }
+
+ if (apr_table_get(r->notes, JK_NOTE_WORKER_NAME)) {
+
+ /* First find just the name of the file, no directory */
+ r->filename = (char *)apr_filepath_name_get(r->uri);
+
+ /* Only if sub-request for a directory, most likely from mod_dir */
+ if (r->main && r->main->filename &&
+ (!apr_filepath_name_get(r->main->filename) ||
+ !strlen(apr_filepath_name_get(r->main->filename)))) {
+
+ /* The filename from the main request will be set to what should
+ * be picked up, aliases included. Tomcat will need to know about
+ * those aliases or things won't work for them. Normal files should
+ * be fine. */
+
+ /* Need absolute path to stat */
+ if (apr_filepath_merge(&r->filename,
+ r->main->filename, r->filename,
+ APR_FILEPATH_SECUREROOT |
+ APR_FILEPATH_TRUENAME, r->pool)
+ != APR_SUCCESS) {
+ return DECLINED; /* We should never get here, very bad */
+ }
+
+ /* Stat the file so that mod_dir knows it's there */
+ apr_stat(&r->finfo, r->filename, APR_FINFO_TYPE, r->pool);
+ }
+
+ return OK;
+ }
+ return DECLINED;
+}
+
+static void jk_register_hooks(apr_pool_t * p)
+{
+ ap_hook_handler(jk_handler, NULL, NULL, APR_HOOK_MIDDLE);
+ ap_hook_post_config(jk_post_config, NULL, NULL, APR_HOOK_MIDDLE);
+ ap_hook_child_init(jk_child_init, NULL, NULL, APR_HOOK_MIDDLE);
+ ap_hook_translate_name(jk_translate, NULL, NULL, APR_HOOK_MIDDLE);
+ ap_hook_map_to_storage(jk_map_to_storage, NULL, NULL, APR_HOOK_MIDDLE);
+}
+
+module AP_MODULE_DECLARE_DATA jk_module = {
+ STANDARD20_MODULE_STUFF,
+ NULL, /* dir config creater */
+ NULL, /* dir merger --- default is to override */
+ create_jk_config, /* server config */
+ merge_jk_config, /* merge server config */
+ jk_cmds, /* command ap_table_t */
+ jk_register_hooks /* register hooks */
+};
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/mod_jk.dsp b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/mod_jk.dsp
new file mode 100644
index 00000000..5640bed0
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/mod_jk.dsp
@@ -0,0 +1,355 @@
+# Microsoft Developer Studio Project File - Name="mod_jk" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=mod_jk - 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 "mod_jk.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 "mod_jk.mak" CFG="mod_jk - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "mod_jk - Win32 Release httpd 2.0" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "mod_jk - Win32 Debug httpd 2.0" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "mod_jk - Win32 Release httpd 2.2" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "mod_jk - Win32 Debug httpd 2.2" (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)" == "mod_jk - Win32 Release httpd 2.0"
+
+# 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 /MD /W3 /Zi /O2 /Oy- /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
+# ADD CPP /nologo /MD /W3 /Zi /O2 /Oy- /I "..\common" /I "$(JAVA_HOME)\include" /I "$(JAVA_HOME)\include\win32" /I "$(APACHE2_HOME)\include" /I "$(APACHE2_HOME)\srclib\apr\include" /I "$(APACHE2_HOME)\srclib\apr-util\include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "HAVE_APR" /Fd"Release/mod_jk_src" /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /fo"Release/mod_jk.res" /I "..\common" /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /dll /machine:I386
+# ADD LINK32 libhttpd.lib libapr.lib libaprutil.lib kernel32.lib user32.lib advapi32.lib ws2_32.lib mswsock.lib /nologo /base:"0x6A6B0000" /subsystem:windows /dll /debug /machine:I386 /out:"Release/mod_jk.so" /libpath:"$(APACHE2_HOME)\Release" /libpath:"$(APACHE2_HOME)\srclib\apr\Release" /libpath:"$(APACHE2_HOME)\srclib\apr-util\Release" /libpath:"$(APACHE2_HOME)\lib" /opt:ref
+
+!ELSEIF "$(CFG)" == "mod_jk - Win32 Debug httpd 2.0"
+
+# 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 /MDd /W3 /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c
+# ADD CPP /nologo /MDd /W3 /GX /Zi /Od /I "..\common" /I "$(JAVA_HOME)\include" /I "$(JAVA_HOME)\include\win32" /I "$(APACHE2_HOME)\include" /I "$(APACHE2_HOME)\srclib\apr\include" /I "$(APACHE2_HOME)\srclib\apr-util\include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "HAVE_APR" /Fd"Debug/mod_jk_src" /FD /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /fo"Debug/mod_jk.res" /I "..\common" /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 libhttpd.lib libapr.lib libaprutil.lib kernel32.lib user32.lib advapi32.lib ws2_32.lib mswsock.lib /nologo /base:"0x6A6B0000" /subsystem:windows /dll /incremental:no /debug /machine:I386 /out:"Debug/mod_jk.so" /libpath:"$(APACHE2_HOME)/Debug" /libpath:"$(APACHE2_HOME)\srclib\apr\Debug" /libpath:"$(APACHE2_HOME)\srclib\apr-util\Debug" /libpath:"$(APACHE2_HOME)\lib"
+
+!ELSEIF "$(CFG)" == "mod_jk - Win32 Release httpd 2.2"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release22"
+# PROP BASE Intermediate_Dir "Release22"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release22"
+# PROP Intermediate_Dir "Release22"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MD /W3 /Zi /O2 /Oy- /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
+# ADD CPP /nologo /MD /W3 /Zi /O2 /Oy- /I "..\common" /I "$(JAVA_HOME)\include" /I "$(JAVA_HOME)\include\win32" /I "$(APACHE2_HOME)\include" /I "$(APACHE2_HOME)\srclib\apr\include" /I "$(APACHE2_HOME)\srclib\apr-util\include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "HAVE_APR" /Fd"Release22/mod_jk_src" /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /fo"Release22/mod_jk.res" /I "..\common" /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib /nologo /dll /machine:I386
+# ADD LINK32 libhttpd.lib libapr-1.lib libaprutil-1.lib kernel32.lib user32.lib advapi32.lib ws2_32.lib mswsock.lib /nologo /base:"0x6A6B0000" /subsystem:windows /dll /debug /machine:I386 /out:"Release22/mod_jk.so" /libpath:"$(APACHE2_HOME)\Release" /libpath:"$(APACHE2_HOME)\srclib\apr\Release" /libpath:"$(APACHE2_HOME)\srclib\apr-util\Release" /libpath:"$(APACHE2_HOME)\lib" /opt:ref
+
+!ELSEIF "$(CFG)" == "mod_jk - Win32 Debug httpd 2.2"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug22"
+# PROP BASE Intermediate_Dir "Debug22"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug22"
+# PROP Intermediate_Dir "Debug22"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MDd /W3 /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c
+# ADD CPP /nologo /MDd /W3 /GX /Zi /Od /I "..\common" /I "$(JAVA_HOME)\include" /I "$(JAVA_HOME)\include\win32" /I "$(APACHE2_HOME)\include" /I "$(APACHE2_HOME)\srclib\apr\include" /I "$(APACHE2_HOME)\srclib\apr-util\include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "HAVE_APR" /Fd"Debug22/mod_jk_src" /FD /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /fo"Debug22/mod_jk.res" /I "..\common" /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 libhttpd.lib libapr-1.lib libaprutil-1.lib kernel32.lib user32.lib advapi32.lib ws2_32.lib mswsock.lib /nologo /base:"0x6A6B0000" /subsystem:windows /dll /incremental:no /debug /machine:I386 /out:"Debug22/mod_jk.so" /libpath:"$(APACHE2_HOME)/Debug" /libpath:"$(APACHE2_HOME)\srclib\apr\Debug" /libpath:"$(APACHE2_HOME)\srclib\apr-util\Debug" /libpath:"$(APACHE2_HOME)\lib"
+
+!ENDIF
+
+# Begin Target
+
+# Name "mod_jk - Win32 Release httpd 2.0"
+# Name "mod_jk - Win32 Debug httpd 2.0"
+# Name "mod_jk - Win32 Release httpd 2.2"
+# Name "mod_jk - Win32 Debug httpd 2.2"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\common\jk_ajp12_worker.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp13.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp13_worker.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp14.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp14_worker.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp_common.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_connect.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_context.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_jni_worker.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_lb_worker.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_map.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_md5.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_msg_buff.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_pool.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_shm.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_sockbuf.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_status.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_uri_worker_map.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_url.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_util.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_worker.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\mod_jk.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\common\jk_ajp12_worker.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp13.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp13_worker.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp14.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp14_worker.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp23_worker.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp_common.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_connect.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_context.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_global.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_jni_worker.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_lb_worker.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_logger.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_map.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_md5.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_msg_buff.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_mt.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_pool.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_service.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_shm.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_sockbuf.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_status.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_uri_worker_map.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_url.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_util.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_worker.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=..\common\jk.rc
+# End Source File
+# End Group
+# End Target
+# End Project
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/mod_jk.la b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/mod_jk.la
new file mode 100644
index 00000000..96c4259f
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/mod_jk.la
@@ -0,0 +1,35 @@
+# mod_jk.la - a libtool library file
+# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18)
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='mod_jk.so'
+
+# Names of this library.
+library_names='mod_jk.so mod_jk.so mod_jk.so'
+
+# The name of the static archive.
+old_library='mod_jk.a'
+
+# Libraries that this one depends upon.
+dependency_libs=''
+
+# Version information for mod_jk.
+current=0
+age=0
+revision=0
+
+# Is this an already installed library?
+installed=yes
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=yes
+
+# Files to dlopen/dlpreopen
+dlopen=''
+dlpreopen=''
+
+# Directory that this library needs to be installed in:
+libdir='/bottlenecks/rubbos/app/apache2/modules'
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/mod_jk.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/mod_jk.lo
new file mode 100644
index 00000000..e0917bb9
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/mod_jk.lo
@@ -0,0 +1,12 @@
+# mod_jk.lo - a libtool object file
+# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18)
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/mod_jk.o'
+
+# Name of the non-PIC object.
+non_pic_object='mod_jk.o'
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/mod_jk.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/mod_jk.o
new file mode 100644
index 00000000..1500a658
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/mod_jk.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/mod_jk.so b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/mod_jk.so
new file mode 100755
index 00000000..46c3ee0d
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/apache-2.0/mod_jk.so
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/buildconf.sh b/rubbos/app/tomcat-connectors-1.2.32-src/native/buildconf.sh
new file mode 100755
index 00000000..20544e36
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/buildconf.sh
@@ -0,0 +1,36 @@
+#!/bin/sh
+
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+echo "rm autom4te.cache"
+rm -rf autom4te.cache
+
+echo "libtoolize --force --automake --copy"
+libtoolize --force --automake --copy
+echo "aclocal"
+#aclocal --acdir=`aclocal --print-ac-dir`
+#aclocal --acdir=/usr/local/share/aclocal
+aclocal
+echo "autoheader"
+autoheader
+echo "automake -a --foreign --copy"
+automake -a --foreign --copy --force-missing
+echo "autoconf"
+autoconf
+
+echo "rm autom4te.cache"
+rm -rf autom4te.cache
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.indent.pro b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.indent.pro
new file mode 100644
index 00000000..87ca4192
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.indent.pro
@@ -0,0 +1,18 @@
+-i4 -npsl -di0 -br -nce -d0 -cli0 -npcs -nfc1 -nut -ncs
+-Tjk_env_t
+-Tjk_worker_t
+-Tjk_worker_env_t
+-Tjk_endpoint_t
+-Tjk_channel_t
+-Tjk_sockbuf_t
+-Tjk_msg_t
+-Tjk_msg_buf_t
+-Tjk_map_t
+-Tjk_uri_worker_map_t
+-Tjk_pool_t
+-Tjk_pool_atom_t
+-Tjk_logger_t
+-Tjk_ws_service_t
+-Tjk_context_item_t
+-Tjk_context_t
+-Tjk_login_service_t
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp12_worker.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp12_worker.o
new file mode 100644
index 00000000..43f069c5
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp12_worker.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp13.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp13.o
new file mode 100644
index 00000000..65a3b17c
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp13.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp13_worker.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp13_worker.o
new file mode 100644
index 00000000..6964abbf
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp13_worker.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp14.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp14.o
new file mode 100644
index 00000000..052f3ef2
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp14.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp14_worker.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp14_worker.o
new file mode 100644
index 00000000..87fafdbf
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp14_worker.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp_common.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp_common.o
new file mode 100644
index 00000000..a20eca35
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_ajp_common.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_connect.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_connect.o
new file mode 100644
index 00000000..007bd0d3
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_connect.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_context.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_context.o
new file mode 100644
index 00000000..48f29a7d
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_context.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_jni_worker.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_jni_worker.o
new file mode 100644
index 00000000..01dc3d23
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_jni_worker.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_lb_worker.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_lb_worker.o
new file mode 100644
index 00000000..ed0cc246
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_lb_worker.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_map.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_map.o
new file mode 100644
index 00000000..4ccd1aac
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_map.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_md5.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_md5.o
new file mode 100644
index 00000000..b9780541
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_md5.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_msg_buff.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_msg_buff.o
new file mode 100644
index 00000000..7b0c05b4
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_msg_buff.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_pool.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_pool.o
new file mode 100644
index 00000000..52c12aa9
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_pool.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_shm.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_shm.o
new file mode 100644
index 00000000..96025d9f
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_shm.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_sockbuf.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_sockbuf.o
new file mode 100644
index 00000000..248f7d0c
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_sockbuf.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_status.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_status.o
new file mode 100644
index 00000000..763f6b40
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_status.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_uri_worker_map.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_uri_worker_map.o
new file mode 100644
index 00000000..3d1c5b53
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_uri_worker_map.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_url.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_url.o
new file mode 100644
index 00000000..c0d52ee0
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_url.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_util.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_util.o
new file mode 100644
index 00000000..0bfdc8b4
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_util.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_worker.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_worker.o
new file mode 100644
index 00000000..e6530d0d
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/.libs/jk_worker.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/Makefile b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/Makefile
new file mode 100644
index 00000000..880168d8
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/Makefile
@@ -0,0 +1,49 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#### XXXX DO we need this Makefile ????
+srcdir = .
+top_srcdir = ..
+
+prefix = /usr/local
+exec_prefix = ${prefix}
+APXSLDFLAGS=
+APXSCFLAGS= -g -O2 -pthread -DHAVE_APR -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include -DHAVE_CONFIG_H -DHAVE_JNI
+APXSCPPFLAGS=-D_REENTRANT -D_GNU_SOURCE
+
+top_builddir = ..
+
+LIBTOOL = /bin/bash /bottlenecks/rubbos/app/apache2/build/libtool --silent
+CC = gcc
+
+OEXT=.lo
+include list.mk
+
+JAVA_INCL=-I /bottlenecks/rubbos/app/jdk1.6.0_27/include -I /bottlenecks/rubbos/app/jdk1.6.0_27/include/linux
+CFLAGS=-I/bottlenecks/rubbos/app/apache2/include -DHAVE_CONFIG_H -DHAVE_JNI ${APXSCFLAGS} ${APXSCPPFLAGS} ${JAVA_INCL}
+
+include ../scripts/build/rules.mk
+
+JK=./
+
+all: ${APACHE_OBJECTS}
+
+install:
+
+clean:
+ rm -f *.o *.lo *.a *.la *.so *.so.* *.slo
+ rm -rf .libs
+
+maintainer-clean: clean
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/Makefile.in b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/Makefile.in
new file mode 100644
index 00000000..4304ae5f
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/Makefile.in
@@ -0,0 +1,49 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#### XXXX DO we need this Makefile ????
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+APXSLDFLAGS=@APXSLDFLAGS@
+APXSCFLAGS=@APXSCFLAGS@
+APXSCPPFLAGS=@APXSCPPFLAGS@
+
+top_builddir = ..
+
+LIBTOOL = @LIBTOOL@
+CC = @CC@
+
+OEXT=.lo
+include list.mk
+
+JAVA_INCL=-I @JAVA_HOME@/include -I @JAVA_HOME@/include/@OS@
+CFLAGS=@apache_include@ @CFLAGS@ ${APXSCFLAGS} ${APXSCPPFLAGS} ${JAVA_INCL}
+
+include @top_srcdir@/scripts/build/rules.mk
+
+JK=./
+
+all: ${APACHE_OBJECTS}
+
+install:
+
+clean:
+ rm -f *.o *.lo *.a *.la *.so *.so.* *.slo
+ rm -rf .libs
+
+maintainer-clean: clean
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/ap_snprintf.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/ap_snprintf.c
new file mode 100644
index 00000000..18b539de
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/ap_snprintf.c
@@ -0,0 +1,1178 @@
+/* Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * This code is based on, and used with the permission of, the
+ * SIO stdio-replacement strx_* functions by Panos Tsirigotis
+ * <panos@alumni.cs.colorado.edu> for xinetd.
+ */
+#define BUILD_STANDALONE
+
+#ifndef BUILD_STANDALONE
+#include "httpd.h"
+#else
+#include "ap_snprintf.h"
+#endif
+
+#include <stdio.h>
+#include <ctype.h>
+#ifndef NETWARE
+#include <sys/types.h>
+#endif
+#include <stdarg.h>
+#include <string.h>
+#include <stdlib.h>
+#include <math.h>
+#ifdef WIN32
+#include <float.h>
+#endif
+
+typedef enum {
+ NO = 0, YES = 1
+} boolean_e;
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+#ifndef TRUE
+#define TRUE 1
+#endif
+#ifndef AP_LONGEST_LONG
+#define AP_LONGEST_LONG long
+#endif
+#define NUL '\0'
+#define WIDE_INT long
+#define WIDEST_INT AP_LONGEST_LONG
+
+typedef WIDE_INT wide_int;
+typedef unsigned WIDE_INT u_wide_int;
+typedef WIDEST_INT widest_int;
+#ifdef __TANDEM
+/* Although Tandem supports "long long" there is no unsigned variant. */
+typedef unsigned long u_widest_int;
+#else
+typedef unsigned WIDEST_INT u_widest_int;
+#endif
+typedef int bool_int;
+
+#define S_NULL "(null)"
+#define S_NULL_LEN 6
+
+#define FLOAT_DIGITS 6
+#define EXPONENT_LENGTH 10
+
+/*
+ * NUM_BUF_SIZE is the size of the buffer used for arithmetic conversions
+ *
+ * XXX: this is a magic number; do not decrease it
+ */
+#define NUM_BUF_SIZE 512
+
+/*
+ * cvt - IEEE floating point formatting routines.
+ * Derived from UNIX V7, Copyright(C) Caldera International Inc.
+ */
+
+/*
+ * ap_ecvt converts to decimal
+ * the number of digits is specified by ndigit
+ * decpt is set to the position of the decimal point
+ * sign is set to 0 for positive, 1 for negative
+ */
+
+#define NDIG 80
+
+/* buf must have at least NDIG bytes */
+static char *ap_cvt(double arg, int ndigits, int *decpt, int *sign, int eflag, char *buf)
+{
+ register int r2;
+ double fi, fj;
+ register char *p, *p1;
+
+ if (ndigits >= NDIG - 1)
+ ndigits = NDIG - 2;
+ r2 = 0;
+ *sign = 0;
+ p = &buf[0];
+ if (arg < 0) {
+ *sign = 1;
+ arg = -arg;
+ }
+ arg = modf(arg, &fi);
+ p1 = &buf[NDIG];
+ /*
+ * Do integer part
+ */
+ if (fi != 0) {
+ p1 = &buf[NDIG];
+ while (p1 > &buf[0] && fi != 0) {
+ fj = modf(fi / 10, &fi);
+ *--p1 = (int) ((fj + .03) * 10) + '0';
+ r2++;
+ }
+ while (p1 < &buf[NDIG])
+ *p++ = *p1++;
+ }
+ else if (arg > 0) {
+ while ((fj = arg * 10) < 1) {
+ arg = fj;
+ r2--;
+ }
+ }
+ p1 = &buf[ndigits];
+ if (eflag == 0)
+ p1 += r2;
+ *decpt = r2;
+ if (p1 < &buf[0]) {
+ buf[0] = '\0';
+ return (buf);
+ }
+ while (p <= p1 && p < &buf[NDIG]) {
+ arg *= 10;
+ arg = modf(arg, &fj);
+ *p++ = (int) fj + '0';
+ }
+ if (p1 >= &buf[NDIG]) {
+ buf[NDIG - 1] = '\0';
+ return (buf);
+ }
+ p = p1;
+ *p1 += 5;
+ while (*p1 > '9') {
+ *p1 = '0';
+ if (p1 > buf)
+ ++ * --p1;
+ else {
+ *p1 = '1';
+ (*decpt)++;
+ if (eflag == 0) {
+ if (p > buf)
+ *p = '0';
+ p++;
+ }
+ }
+ }
+ *p = '\0';
+ return (buf);
+}
+
+static char *ap_ecvt(double arg, int ndigits, int *decpt, int *sign, char *buf)
+{
+ return (ap_cvt(arg, ndigits, decpt, sign, 1, buf));
+}
+
+static char *ap_fcvt(double arg, int ndigits, int *decpt, int *sign, char *buf)
+{
+ return (ap_cvt(arg, ndigits, decpt, sign, 0, buf));
+}
+
+/*
+ * ap_gcvt - Floating output conversion to
+ * minimal length string
+ */
+
+static char *ap_gcvt(double number, int ndigit, char *buf, boolean_e altform)
+{
+ int sign, decpt;
+ register char *p1, *p2;
+ register int i;
+ char buf1[NDIG];
+
+ p1 = ap_ecvt(number, ndigit, &decpt, &sign, buf1);
+ p2 = buf;
+ if (sign)
+ *p2++ = '-';
+ for (i = ndigit - 1; i > 0 && p1[i] == '0'; i--)
+ ndigit--;
+ if ((decpt >= 0 && decpt - ndigit > 4)
+ || (decpt < 0 && decpt < -3)) { /* use E-style */
+ decpt--;
+ *p2++ = *p1++;
+ *p2++ = '.';
+ for (i = 1; i < ndigit; i++)
+ *p2++ = *p1++;
+ *p2++ = 'e';
+ if (decpt < 0) {
+ decpt = -decpt;
+ *p2++ = '-';
+ }
+ else
+ *p2++ = '+';
+ if (decpt / 100 > 0)
+ *p2++ = decpt / 100 + '0';
+ if (decpt / 10 > 0)
+ *p2++ = (decpt % 100) / 10 + '0';
+ *p2++ = decpt % 10 + '0';
+ }
+ else {
+ if (decpt <= 0) {
+ if (*p1 != '0')
+ *p2++ = '.';
+ while (decpt < 0) {
+ decpt++;
+ *p2++ = '0';
+ }
+ }
+ for (i = 1; i <= ndigit; i++) {
+ *p2++ = *p1++;
+ if (i == decpt)
+ *p2++ = '.';
+ }
+ if (ndigit < decpt) {
+ while (ndigit++ < decpt)
+ *p2++ = '0';
+ *p2++ = '.';
+ }
+ }
+ if (p2[-1] == '.' && !altform)
+ p2--;
+ *p2 = '\0';
+ return (buf);
+}
+
+/*
+ * The INS_CHAR macro inserts a character in the buffer and writes
+ * the buffer back to disk if necessary
+ * It uses the char pointers sp and bep:
+ * sp points to the next available character in the buffer
+ * bep points to the end-of-buffer+1
+ * While using this macro, note that the nextb pointer is NOT updated.
+ *
+ * NOTE: Evaluation of the c argument should not have any side-effects
+ */
+#define INS_CHAR(c, sp, bep, cc) \
+ { \
+ if (sp >= bep) { \
+ vbuff->curpos = sp; \
+ if (flush_func(vbuff)) \
+ return -1; \
+ sp = vbuff->curpos; \
+ bep = vbuff->endpos; \
+ } \
+ *sp++ = (c); \
+ cc++; \
+ }
+
+#define NUM( c ) ( c - '0' )
+
+#define STR_TO_DEC( str, num ) \
+ num = NUM( *str++ ) ; \
+ while ( ap_isdigit( *str ) ) \
+ { \
+ num *= 10 ; \
+ num += NUM( *str++ ) ; \
+ }
+
+/*
+ * This macro does zero padding so that the precision
+ * requirement is satisfied. The padding is done by
+ * adding '0's to the left of the string that is going
+ * to be printed. We don't allow precision to be large
+ * enough that we continue past the start of s.
+ *
+ * NOTE: this makes use of the magic info that s is
+ * always based on num_buf with a size of NUM_BUF_SIZE.
+ */
+#define FIX_PRECISION( adjust, precision, s, s_len ) \
+ if ( adjust ) { \
+ int p = precision < NUM_BUF_SIZE - 1 ? precision : NUM_BUF_SIZE - 1; \
+ while ( s_len < p ) \
+ { \
+ *--s = '0' ; \
+ s_len++ ; \
+ } \
+ }
+
+/*
+ * Macro that does padding. The padding is done by printing
+ * the character ch.
+ */
+#define PAD( width, len, ch ) do \
+ { \
+ INS_CHAR( ch, sp, bep, cc ) ; \
+ width-- ; \
+ } \
+ while ( width > len )
+
+/*
+ * Prefix the character ch to the string str
+ * Increase length
+ * Set the has_prefix flag
+ */
+#define PREFIX( str, length, ch ) *--str = ch ; length++ ; has_prefix = YES
+
+
+/*
+ * Convert num to its decimal format.
+ * Return value:
+ * - a pointer to a string containing the number (no sign)
+ * - len contains the length of the string
+ * - is_negative is set to TRUE or FALSE depending on the sign
+ * of the number (always set to FALSE if is_unsigned is TRUE)
+ *
+ * The caller provides a buffer for the string: that is the buf_end argument
+ * which is a pointer to the END of the buffer + 1 (i.e. if the buffer
+ * is declared as buf[ 100 ], buf_end should be &buf[ 100 ])
+ *
+ * Note: we have 2 versions. One is used when we need to use quads
+ * (conv_10_quad), the other when we don't (conv_10). We're assuming the
+ * latter is faster.
+ */
+static char *conv_10(register wide_int num, register bool_int is_unsigned,
+ register bool_int *is_negative, char *buf_end,
+ register int *len)
+{
+ register char *p = buf_end;
+ register u_wide_int magnitude;
+
+ if (is_unsigned) {
+ magnitude = (u_wide_int) num;
+ *is_negative = FALSE;
+ }
+ else {
+ *is_negative = (num < 0);
+
+ /*
+ * On a 2's complement machine, negating the most negative integer
+ * results in a number that cannot be represented as a signed integer.
+ * Here is what we do to obtain the number's magnitude:
+ * a. add 1 to the number
+ * b. negate it (becomes positive)
+ * c. convert it to unsigned
+ * d. add 1
+ */
+ if (*is_negative) {
+ wide_int t = num + 1;
+
+ magnitude = ((u_wide_int) -t) + 1;
+ }
+ else
+ magnitude = (u_wide_int) num;
+ }
+
+ /*
+ * We use a do-while loop so that we write at least 1 digit
+ */
+ do {
+ register u_wide_int new_magnitude = magnitude / 10;
+
+ *--p = (char) (magnitude - new_magnitude * 10 + '0');
+ magnitude = new_magnitude;
+ }
+ while (magnitude);
+
+ *len = buf_end - p;
+ return (p);
+}
+
+static char *conv_10_quad(widest_int num, register bool_int is_unsigned,
+ register bool_int *is_negative, char *buf_end,
+ register int *len)
+{
+ register char *p = buf_end;
+ u_widest_int magnitude;
+
+ /*
+ * We see if we can use the faster non-quad version by checking the
+ * number against the largest long value it can be. If <=, we
+ * punt to the quicker version.
+ */
+ if ((num <= ULONG_MAX && is_unsigned) || (num <= LONG_MAX && !is_unsigned))
+ return(conv_10( (wide_int)num, is_unsigned, is_negative,
+ buf_end, len));
+
+ if (is_unsigned) {
+ magnitude = (u_widest_int) num;
+ *is_negative = FALSE;
+ }
+ else {
+ *is_negative = (num < 0);
+
+ /*
+ * On a 2's complement machine, negating the most negative integer
+ * results in a number that cannot be represented as a signed integer.
+ * Here is what we do to obtain the number's magnitude:
+ * a. add 1 to the number
+ * b. negate it (becomes positive)
+ * c. convert it to unsigned
+ * d. add 1
+ */
+ if (*is_negative) {
+ widest_int t = num + 1;
+
+ magnitude = ((u_widest_int) -t) + 1;
+ }
+ else
+ magnitude = (u_widest_int) num;
+ }
+
+ /*
+ * We use a do-while loop so that we write at least 1 digit
+ */
+ do {
+ u_widest_int new_magnitude = magnitude / 10;
+
+ *--p = (char) (magnitude - new_magnitude * 10 + '0');
+ magnitude = new_magnitude;
+ }
+ while (magnitude);
+
+ *len = buf_end - p;
+ return (p);
+}
+
+
+
+#ifndef BUILD_STANDALONE
+static char *conv_in_addr(struct in_addr *ia, char *buf_end, int *len)
+{
+ unsigned addr = ntohl(ia->s_addr);
+ char *p = buf_end;
+ bool_int is_negative;
+ int sub_len;
+
+ p = conv_10((addr & 0x000000FF) , TRUE, &is_negative, p, &sub_len);
+ *--p = '.';
+ p = conv_10((addr & 0x0000FF00) >> 8, TRUE, &is_negative, p, &sub_len);
+ *--p = '.';
+ p = conv_10((addr & 0x00FF0000) >> 16, TRUE, &is_negative, p, &sub_len);
+ *--p = '.';
+ p = conv_10((addr & 0xFF000000) >> 24, TRUE, &is_negative, p, &sub_len);
+
+ *len = buf_end - p;
+ return (p);
+}
+
+
+
+static char *conv_sockaddr_in(struct sockaddr_in *si, char *buf_end, int *len)
+{
+ char *p = buf_end;
+ bool_int is_negative;
+ int sub_len;
+
+ p = conv_10(ntohs(si->sin_port), TRUE, &is_negative, p, &sub_len);
+ *--p = ':';
+ p = conv_in_addr(&si->sin_addr, p, &sub_len);
+
+ *len = buf_end - p;
+ return (p);
+}
+#endif
+
+
+/*
+ * Convert a floating point number to a string formats 'f', 'e' or 'E'.
+ * The result is placed in buf, and len denotes the length of the string
+ * The sign is returned in the is_negative argument (and is not placed
+ * in buf).
+ */
+static char *conv_fp(register char format, register double num,
+ boolean_e add_dp, int precision, bool_int *is_negative,
+ char *buf, int *len)
+{
+ register char *s = buf;
+ register char *p;
+ int decimal_point;
+ char buf1[NDIG];
+
+ if (format == 'f')
+ p = ap_fcvt(num, precision, &decimal_point, is_negative, buf1);
+ else /* either e or E format */
+ p = ap_ecvt(num, precision + 1, &decimal_point, is_negative, buf1);
+
+ /*
+ * Check for Infinity and NaN
+ */
+ if (ap_isalpha(*p)) {
+ *len = strlen(strcpy(buf, p));
+ *is_negative = FALSE;
+ return (buf);
+ }
+
+ if (format == 'f') {
+ if (decimal_point <= 0) {
+ *s++ = '0';
+ if (precision > 0) {
+ *s++ = '.';
+ while (decimal_point++ < 0)
+ *s++ = '0';
+ }
+ else if (add_dp)
+ *s++ = '.';
+ }
+ else {
+ while (decimal_point-- > 0)
+ *s++ = *p++;
+ if (precision > 0 || add_dp)
+ *s++ = '.';
+ }
+ }
+ else {
+ *s++ = *p++;
+ if (precision > 0 || add_dp)
+ *s++ = '.';
+ }
+
+ /*
+ * copy the rest of p, the NUL is NOT copied
+ */
+ while (*p)
+ *s++ = *p++;
+
+ if (format != 'f') {
+ char temp[EXPONENT_LENGTH]; /* for exponent conversion */
+ int t_len;
+ bool_int exponent_is_negative;
+
+ *s++ = format; /* either e or E */
+ decimal_point--;
+ if (decimal_point != 0) {
+ p = conv_10((wide_int) decimal_point, FALSE, &exponent_is_negative,
+ &temp[EXPONENT_LENGTH], &t_len);
+ *s++ = exponent_is_negative ? '-' : '+';
+
+ /*
+ * Make sure the exponent has at least 2 digits
+ */
+ if (t_len == 1)
+ *s++ = '0';
+ while (t_len--)
+ *s++ = *p++;
+ }
+ else {
+ *s++ = '+';
+ *s++ = '0';
+ *s++ = '0';
+ }
+ }
+
+ *len = s - buf;
+ return (buf);
+}
+
+
+/*
+ * Convert num to a base X number where X is a power of 2. nbits determines X.
+ * For example, if nbits is 3, we do base 8 conversion
+ * Return value:
+ * a pointer to a string containing the number
+ *
+ * The caller provides a buffer for the string: that is the buf_end argument
+ * which is a pointer to the END of the buffer + 1 (i.e. if the buffer
+ * is declared as buf[ 100 ], buf_end should be &buf[ 100 ])
+ *
+ * As with conv_10, we have a faster version which is used when
+ * the number isn't quad size.
+ */
+static char *conv_p2(register u_wide_int num, register int nbits,
+ char format, char *buf_end, register int *len)
+{
+ register int mask = (1 << nbits) - 1;
+ register char *p = buf_end;
+ static const char low_digits[] = "0123456789abcdef";
+ static const char upper_digits[] = "0123456789ABCDEF";
+ register const char *digits = (format == 'X') ? upper_digits : low_digits;
+
+ do {
+ *--p = digits[num & mask];
+ num >>= nbits;
+ }
+ while (num);
+
+ *len = buf_end - p;
+ return (p);
+}
+
+static char *conv_p2_quad(u_widest_int num, register int nbits,
+ char format, char *buf_end, register int *len)
+{
+ register int mask = (1 << nbits) - 1;
+ register char *p = buf_end;
+ static const char low_digits[] = "0123456789abcdef";
+ static const char upper_digits[] = "0123456789ABCDEF";
+ register const char *digits = (format == 'X') ? upper_digits : low_digits;
+
+ if (num <= ULONG_MAX)
+ return(conv_p2( (u_wide_int)num, nbits, format, buf_end, len));
+
+ do {
+ *--p = digits[num & mask];
+ num >>= nbits;
+ }
+ while (num);
+
+ *len = buf_end - p;
+ return (p);
+}
+
+
+/*
+ * Do format conversion placing the output in buffer
+ */
+API_EXPORT(int) ap_vformatter(int (*flush_func)(ap_vformatter_buff *),
+ ap_vformatter_buff *vbuff, const char *fmt, va_list ap)
+{
+ register char *sp;
+ register char *bep;
+ register int cc = 0;
+ register int i;
+
+ register char *s = NULL;
+ char *q;
+ int s_len;
+
+ register int min_width = 0;
+ int precision = 0;
+ enum {
+ LEFT, RIGHT
+ } adjust;
+ char pad_char;
+ char prefix_char;
+
+ double fp_num;
+ widest_int i_quad = (widest_int) 0;
+ u_widest_int ui_quad;
+ wide_int i_num = (wide_int) 0;
+ u_wide_int ui_num;
+
+ char num_buf[NUM_BUF_SIZE];
+ char char_buf[2]; /* for printing %% and %<unknown> */
+
+ enum var_type_enum {
+ IS_QUAD, IS_LONG, IS_SHORT, IS_INT
+ };
+ enum var_type_enum var_type = IS_INT;
+
+ /*
+ * Flag variables
+ */
+ boolean_e alternate_form;
+ boolean_e print_sign;
+ boolean_e print_blank;
+ boolean_e adjust_precision;
+ boolean_e adjust_width;
+ bool_int is_negative;
+
+ sp = vbuff->curpos;
+ bep = vbuff->endpos;
+
+ while (*fmt) {
+ if (*fmt != '%') {
+ INS_CHAR(*fmt, sp, bep, cc);
+ }
+ else {
+ /*
+ * Default variable settings
+ */
+ adjust = RIGHT;
+ alternate_form = print_sign = print_blank = NO;
+ pad_char = ' ';
+ prefix_char = NUL;
+
+ fmt++;
+
+ /*
+ * Try to avoid checking for flags, width or precision
+ */
+ if (!ap_islower(*fmt)) {
+ /*
+ * Recognize flags: -, #, BLANK, +
+ */
+ for (;; fmt++) {
+ if (*fmt == '-')
+ adjust = LEFT;
+ else if (*fmt == '+')
+ print_sign = YES;
+ else if (*fmt == '#')
+ alternate_form = YES;
+ else if (*fmt == ' ')
+ print_blank = YES;
+ else if (*fmt == '0')
+ pad_char = '0';
+ else
+ break;
+ }
+
+ /*
+ * Check if a width was specified
+ */
+ if (ap_isdigit(*fmt)) {
+ STR_TO_DEC(fmt, min_width);
+ adjust_width = YES;
+ }
+ else if (*fmt == '*') {
+ min_width = va_arg(ap, int);
+ fmt++;
+ adjust_width = YES;
+ if (min_width < 0) {
+ adjust = LEFT;
+ min_width = -min_width;
+ }
+ }
+ else
+ adjust_width = NO;
+
+ /*
+ * Check if a precision was specified
+ */
+ if (*fmt == '.') {
+ adjust_precision = YES;
+ fmt++;
+ if (ap_isdigit(*fmt)) {
+ STR_TO_DEC(fmt, precision);
+ }
+ else if (*fmt == '*') {
+ precision = va_arg(ap, int);
+ fmt++;
+ if (precision < 0)
+ precision = 0;
+ }
+ else
+ precision = 0;
+ }
+ else
+ adjust_precision = NO;
+ }
+ else
+ adjust_precision = adjust_width = NO;
+
+ /*
+ * Modifier check
+ */
+ if (*fmt == 'q') {
+ var_type = IS_QUAD;
+ fmt++;
+ }
+ else if (*fmt == 'l') {
+ var_type = IS_LONG;
+ fmt++;
+ }
+ else if (*fmt == 'h') {
+ var_type = IS_SHORT;
+ fmt++;
+ }
+ else {
+ var_type = IS_INT;
+ }
+
+ /*
+ * Argument extraction and printing.
+ * First we determine the argument type.
+ * Then, we convert the argument to a string.
+ * On exit from the switch, s points to the string that
+ * must be printed, s_len has the length of the string
+ * The precision requirements, if any, are reflected in s_len.
+ *
+ * NOTE: pad_char may be set to '0' because of the 0 flag.
+ * It is reset to ' ' by non-numeric formats
+ */
+ switch (*fmt) {
+ case 'u':
+ if (var_type == IS_QUAD) {
+ i_quad = va_arg(ap, u_widest_int);
+ s = conv_10_quad(i_quad, 1, &is_negative,
+ &num_buf[NUM_BUF_SIZE], &s_len);
+ }
+ else {
+ if (var_type == IS_LONG)
+ i_num = (wide_int) va_arg(ap, u_wide_int);
+ else if (var_type == IS_SHORT)
+ i_num = (wide_int) (unsigned short) va_arg(ap, unsigned int);
+ else
+ i_num = (wide_int) va_arg(ap, unsigned int);
+ s = conv_10(i_num, 1, &is_negative,
+ &num_buf[NUM_BUF_SIZE], &s_len);
+ }
+ FIX_PRECISION(adjust_precision, precision, s, s_len);
+ break;
+
+ case 'd':
+ case 'i':
+ if (var_type == IS_QUAD) {
+ i_quad = va_arg(ap, widest_int);
+ s = conv_10_quad(i_quad, 0, &is_negative,
+ &num_buf[NUM_BUF_SIZE], &s_len);
+ }
+ else {
+ if (var_type == IS_LONG)
+ i_num = (wide_int) va_arg(ap, wide_int);
+ else if (var_type == IS_SHORT)
+ i_num = (wide_int) (short) va_arg(ap, int);
+ else
+ i_num = (wide_int) va_arg(ap, int);
+ s = conv_10(i_num, 0, &is_negative,
+ &num_buf[NUM_BUF_SIZE], &s_len);
+ }
+ FIX_PRECISION(adjust_precision, precision, s, s_len);
+
+ if (is_negative)
+ prefix_char = '-';
+ else if (print_sign)
+ prefix_char = '+';
+ else if (print_blank)
+ prefix_char = ' ';
+ break;
+
+
+ case 'o':
+ if (var_type == IS_QUAD) {
+ ui_quad = va_arg(ap, u_widest_int);
+ s = conv_p2_quad(ui_quad, 3, *fmt,
+ &num_buf[NUM_BUF_SIZE], &s_len);
+ }
+ else {
+ if (var_type == IS_LONG)
+ ui_num = (u_wide_int) va_arg(ap, u_wide_int);
+ else if (var_type == IS_SHORT)
+ ui_num = (u_wide_int) (unsigned short) va_arg(ap, unsigned int);
+ else
+ ui_num = (u_wide_int) va_arg(ap, unsigned int);
+ s = conv_p2(ui_num, 3, *fmt,
+ &num_buf[NUM_BUF_SIZE], &s_len);
+ }
+ FIX_PRECISION(adjust_precision, precision, s, s_len);
+ if (alternate_form && *s != '0') {
+ *--s = '0';
+ s_len++;
+ }
+ break;
+
+
+ case 'x':
+ case 'X':
+ if (var_type == IS_QUAD) {
+ ui_quad = va_arg(ap, u_widest_int);
+ s = conv_p2_quad(ui_quad, 4, *fmt,
+ &num_buf[NUM_BUF_SIZE], &s_len);
+ }
+ else {
+ if (var_type == IS_LONG)
+ ui_num = (u_wide_int) va_arg(ap, u_wide_int);
+ else if (var_type == IS_SHORT)
+ ui_num = (u_wide_int) (unsigned short) va_arg(ap, unsigned int);
+ else
+ ui_num = (u_wide_int) va_arg(ap, unsigned int);
+ s = conv_p2(ui_num, 4, *fmt,
+ &num_buf[NUM_BUF_SIZE], &s_len);
+ }
+ FIX_PRECISION(adjust_precision, precision, s, s_len);
+ if (alternate_form && i_num != 0) {
+ *--s = *fmt; /* 'x' or 'X' */
+ *--s = '0';
+ s_len += 2;
+ }
+ break;
+
+
+ case 's':
+ s = va_arg(ap, char *);
+ if (s != NULL) {
+ s_len = strlen(s);
+ if (adjust_precision && precision < s_len)
+ s_len = precision;
+ }
+ else {
+ s = S_NULL;
+ s_len = S_NULL_LEN;
+ }
+ pad_char = ' ';
+ break;
+
+
+ case 'f':
+ case 'e':
+ case 'E':
+ fp_num = va_arg(ap, double);
+ /*
+ * * We use &num_buf[ 1 ], so that we have room for the sign
+ */
+#ifdef HAVE_ISNAN
+ if (isnan(fp_num)) {
+ s = "nan";
+ s_len = 3;
+ }
+ else
+#endif
+#ifdef HAVE_ISINF
+ if (isinf(fp_num)) {
+ s = "inf";
+ s_len = 3;
+ }
+ else
+#endif
+ {
+ s = conv_fp(*fmt, fp_num, alternate_form,
+ (adjust_precision == NO) ? FLOAT_DIGITS : precision,
+ &is_negative, &num_buf[1], &s_len);
+ if (is_negative)
+ prefix_char = '-';
+ else if (print_sign)
+ prefix_char = '+';
+ else if (print_blank)
+ prefix_char = ' ';
+ }
+ break;
+
+
+ case 'g':
+ case 'G':
+ if (adjust_precision == NO)
+ precision = FLOAT_DIGITS;
+ else if (precision == 0)
+ precision = 1;
+ /*
+ * * We use &num_buf[ 1 ], so that we have room for the sign
+ */
+ s = ap_gcvt(va_arg(ap, double), precision, &num_buf[1],
+ alternate_form);
+ if (*s == '-')
+ prefix_char = *s++;
+ else if (print_sign)
+ prefix_char = '+';
+ else if (print_blank)
+ prefix_char = ' ';
+
+ s_len = strlen(s);
+
+ if (alternate_form && (q = strchr(s, '.')) == NULL) {
+ s[s_len++] = '.';
+ s[s_len] = '\0'; /* delimit for following strchr() */
+ }
+ if (*fmt == 'G' && (q = strchr(s, 'e')) != NULL)
+ *q = 'E';
+ break;
+
+
+ case 'c':
+ char_buf[0] = (char) (va_arg(ap, int));
+ s = &char_buf[0];
+ s_len = 1;
+ pad_char = ' ';
+ break;
+
+
+ case '%':
+ char_buf[0] = '%';
+ s = &char_buf[0];
+ s_len = 1;
+ pad_char = ' ';
+ break;
+
+
+ case 'n':
+ if (var_type == IS_QUAD)
+ *(va_arg(ap, widest_int *)) = cc;
+ else if (var_type == IS_LONG)
+ *(va_arg(ap, long *)) = cc;
+ else if (var_type == IS_SHORT)
+ *(va_arg(ap, short *)) = cc;
+ else
+ *(va_arg(ap, int *)) = cc;
+ break;
+
+ /*
+ * This is where we extend the printf format, with a second
+ * type specifier
+ */
+ case 'p':
+ switch(*++fmt) {
+ /*
+ * If the pointer size is equal to or smaller than the size
+ * of the largest unsigned int, we convert the pointer to a
+ * hex number, otherwise we print "%p" to indicate that we
+ * don't handle "%p".
+ */
+ case 'p':
+#ifdef AP_VOID_P_IS_QUAD
+ if (sizeof(void *) <= sizeof(u_widest_int)) {
+ ui_quad = (u_widest_int) va_arg(ap, void *);
+ s = conv_p2_quad(ui_quad, 4, 'x',
+ &num_buf[NUM_BUF_SIZE], &s_len);
+ }
+#else
+ if (sizeof(void *) <= sizeof(u_wide_int)) {
+ ui_num = (u_wide_int) va_arg(ap, void *);
+ s = conv_p2(ui_num, 4, 'x',
+ &num_buf[NUM_BUF_SIZE], &s_len);
+ }
+#endif
+ else {
+ s = "%p";
+ s_len = 2;
+ prefix_char = NUL;
+ }
+ pad_char = ' ';
+ break;
+
+#ifndef BUILD_STANDALONE
+ /* print a struct sockaddr_in as a.b.c.d:port */
+ case 'I':
+ {
+ struct sockaddr_in *si;
+
+ si = va_arg(ap, struct sockaddr_in *);
+ if (si != NULL) {
+ s = conv_sockaddr_in(si, &num_buf[NUM_BUF_SIZE], &s_len);
+ if (adjust_precision && precision < s_len)
+ s_len = precision;
+ }
+ else {
+ s = S_NULL;
+ s_len = S_NULL_LEN;
+ }
+ pad_char = ' ';
+ }
+ break;
+
+ /* print a struct in_addr as a.b.c.d */
+ case 'A':
+ {
+ struct in_addr *ia;
+
+ ia = va_arg(ap, struct in_addr *);
+ if (ia != NULL) {
+ s = conv_in_addr(ia, &num_buf[NUM_BUF_SIZE], &s_len);
+ if (adjust_precision && precision < s_len)
+ s_len = precision;
+ }
+ else {
+ s = S_NULL;
+ s_len = S_NULL_LEN;
+ }
+ pad_char = ' ';
+ }
+ break;
+#endif
+
+ case NUL:
+ /* if %p ends the string, oh well ignore it */
+ continue;
+
+ default:
+ s = "bogus %p";
+ s_len = 8;
+ prefix_char = NUL;
+ break;
+ }
+ break;
+
+ case NUL:
+ /*
+ * The last character of the format string was %.
+ * We ignore it.
+ */
+ continue;
+
+
+ /*
+ * The default case is for unrecognized %'s.
+ * We print %<char> to help the user identify what
+ * option is not understood.
+ * This is also useful in case the user wants to pass
+ * the output of format_converter to another function
+ * that understands some other %<char> (like syslog).
+ * Note that we can't point s inside fmt because the
+ * unknown <char> could be preceded by width etc.
+ */
+ default:
+ char_buf[0] = '%';
+ char_buf[1] = *fmt;
+ s = char_buf;
+ s_len = 2;
+ pad_char = ' ';
+ break;
+ }
+
+ if (prefix_char != NUL && s != S_NULL && s != char_buf) {
+ *--s = prefix_char;
+ s_len++;
+ }
+
+ if (adjust_width && adjust == RIGHT && min_width > s_len) {
+ if (pad_char == '0' && prefix_char != NUL) {
+ INS_CHAR(*s, sp, bep, cc);
+ s++;
+ s_len--;
+ min_width--;
+ }
+ PAD(min_width, s_len, pad_char);
+ }
+
+ /*
+ * Print the string s.
+ */
+ for (i = s_len; i != 0; i--) {
+ INS_CHAR(*s, sp, bep, cc);
+ s++;
+ }
+
+ if (adjust_width && adjust == LEFT && min_width > s_len)
+ PAD(min_width, s_len, pad_char);
+ }
+ fmt++;
+ }
+ vbuff->curpos = sp;
+
+ return cc;
+}
+
+
+static int snprintf_flush(ap_vformatter_buff *vbuff)
+{
+ /* if the buffer fills we have to abort immediately, there is no way
+ * to "flush" an ap_snprintf... there's nowhere to flush it to.
+ */
+ return -1;
+}
+
+
+API_EXPORT_NONSTD(int) ap_snprintf(char *buf, size_t len, const char *format,...)
+{
+ int cc;
+ va_list ap;
+ ap_vformatter_buff vbuff;
+
+ if (len == 0)
+ return 0;
+
+ /* save one byte for nul terminator */
+ vbuff.curpos = buf;
+ vbuff.endpos = buf + len - 1;
+ va_start(ap, format);
+ cc = ap_vformatter(snprintf_flush, &vbuff, format, ap);
+ va_end(ap);
+ *vbuff.curpos = '\0';
+ return (cc == -1) ? len : cc;
+}
+
+
+API_EXPORT(int) ap_vsnprintf(char *buf, size_t len, const char *format,
+ va_list ap)
+{
+ int cc;
+ ap_vformatter_buff vbuff;
+
+ if (len == 0)
+ return 0;
+
+ /* save one byte for nul terminator */
+ vbuff.curpos = buf;
+ vbuff.endpos = buf + len - 1;
+ cc = ap_vformatter(snprintf_flush, &vbuff, format, ap);
+ *vbuff.curpos = '\0';
+ return (cc == -1) ? len : cc;
+}
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/ap_snprintf.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/ap_snprintf.h
new file mode 100644
index 00000000..73b3c6e5
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/ap_snprintf.h
@@ -0,0 +1,150 @@
+/* Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * The ap_vsnprintf/ap_snprintf functions are based on, and used with the
+ * permission of, the SIO stdio-replacement strx_* functions by Panos
+ * Tsirigotis <panos@alumni.cs.colorado.edu> for xinetd.
+ */
+
+#ifndef APACHE_AP_SNPRINTF_H
+#define APACHE_AP_SNPRINTF_H
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <limits.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* stuff marked API_EXPORT is part of the API, and intended for use
+ * by modules
+ */
+#ifndef API_EXPORT
+#define API_EXPORT(type) type
+#endif
+
+/* Stuff marked API_EXPORT_NONSTD is part of the API, and intended for
+ * use by modules. The difference between API_EXPORT and
+ * API_EXPORT_NONSTD is that the latter is required for any functions
+ * which use varargs or are used via indirect function call. This
+ * is to accomodate the two calling conventions in windows dlls.
+ */
+#ifndef API_EXPORT_NONSTD
+#define API_EXPORT_NONSTD(type) type
+#endif
+
+#if !defined(__GNUC__) || __GNUC__ < 2 || \
+ (__GNUC__ == 2 && __GNUC_MINOR__ < 7) ||\
+ defined(NEXT)
+#define __attribute__(__x)
+#endif
+
+/* These macros allow correct support of 8-bit characters on systems which
+ * support 8-bit characters. Pretty dumb how the cast is required, but
+ * that's legacy libc for ya. These new macros do not support EOF like
+ * the standard macros do. Tough.
+ */
+#define ap_isalpha(c) (isalpha(((unsigned char)(c))))
+#define ap_isdigit(c) (isdigit(((unsigned char)(c))))
+#define ap_islower(c) (islower(((unsigned char)(c))))
+
+
+/* ap_vformatter() is a generic printf-style formatting routine
+ * with some extensions. The extensions are:
+ *
+ * %pA takes a struct in_addr *, and prints it as a.b.c.d
+ * %pI takes a struct sockaddr_in * and prints it as a.b.c.d:port
+ * %pp takes a void * and outputs it in hex
+ *
+ * The %p hacks are to force gcc's printf warning code to skip
+ * over a pointer argument without complaining. This does
+ * mean that the ANSI-style %p (output a void * in hex format) won't
+ * work as expected at all, but that seems to be a fair trade-off
+ * for the increased robustness of having printf-warnings work.
+ *
+ * Additionally, ap_vformatter allows for arbitrary output methods
+ * using the ap_vformatter_buff and flush_func.
+ *
+ * The ap_vformatter_buff has two elements curpos and endpos.
+ * curpos is where ap_vformatter will write the next byte of output.
+ * It proceeds writing output to curpos, and updating curpos, until
+ * either the end of output is reached, or curpos == endpos (i.e. the
+ * buffer is full).
+ *
+ * If the end of output is reached, ap_vformatter returns the
+ * number of bytes written.
+ *
+ * When the buffer is full, the flush_func is called. The flush_func
+ * can return -1 to indicate that no further output should be attempted,
+ * and ap_vformatter will return immediately with -1. Otherwise
+ * the flush_func should flush the buffer in whatever manner is
+ * appropriate, re-initialize curpos and endpos, and return 0.
+ *
+ * Note that flush_func is only invoked as a result of attempting to
+ * write another byte at curpos when curpos >= endpos. So for
+ * example, it's possible when the output exactly matches the buffer
+ * space available that curpos == endpos will be true when
+ * ap_vformatter returns.
+ *
+ * ap_vformatter does not call out to any other code, it is entirely
+ * self-contained. This allows the callers to do things which are
+ * otherwise "unsafe". For example, ap_psprintf uses the "scratch"
+ * space at the unallocated end of a block, and doesn't actually
+ * complete the allocation until ap_vformatter returns. ap_psprintf
+ * would be completely broken if ap_vformatter were to call anything
+ * that used a pool. Similarly http_bprintf() uses the "scratch"
+ * space at the end of its output buffer, and doesn't actually note
+ * that the space is in use until it either has to flush the buffer
+ * or until ap_vformatter returns.
+ */
+
+typedef struct {
+ char *curpos;
+ char *endpos;
+} ap_vformatter_buff;
+
+API_EXPORT(int) ap_vformatter(int (*flush_func)(ap_vformatter_buff *),
+ ap_vformatter_buff *, const char *fmt, va_list ap);
+
+/* These are snprintf implementations based on ap_vformatter().
+ *
+ * Note that various standards and implementations disagree on the return
+ * value of snprintf, and side-effects due to %n in the formatting string.
+ * ap_snprintf behaves as follows:
+ *
+ * Process the format string until the entire string is exhausted, or
+ * the buffer fills. If the buffer fills then stop processing immediately
+ * (so no further %n arguments are processed), and return the buffer
+ * length. In all cases the buffer is NUL terminated. The return value
+ * is the number of characters placed in the buffer, excluding the
+ * terminating NUL. All this implies that, at most, (len-1) characters
+ * will be copied over; if the return value is >= len, then truncation
+ * occured.
+ *
+ * In no event does ap_snprintf return a negative number.
+ */
+API_EXPORT_NONSTD(int) ap_snprintf(char *buf, size_t len, const char *format,...)
+ __attribute__((format(printf,3,4)));
+API_EXPORT(int) ap_vsnprintf(char *buf, size_t len, const char *format,
+ va_list ap);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !APACHE_AP_SNPRINTF_H */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/config.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/config.h
new file mode 100644
index 00000000..e92dec8d
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/config.h
@@ -0,0 +1,110 @@
+/* common/config.h. Generated by configure. */
+/* common/config.h.in. Generated from configure.in by autoheader. */
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#define HAVE_DLFCN_H 1
+
+/* Have flock() */
+#define HAVE_FLOCK 1
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Define to 1 if you have the <memory.h> header file. */
+#define HAVE_MEMORY_H 1
+
+/* Have poll() */
+#define HAVE_POLL 1
+
+/* Define to 1 if you have the <poll.h> header file. */
+#define HAVE_POLL_H 1
+
+/* Have snprintf() */
+#define HAVE_SNPRINTF 1
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the <strings.h> header file. */
+#define HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the <sys/filio.h> header file. */
+/* #undef HAVE_SYS_FILIO_H */
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Have vsnprintf() */
+#define HAVE_VSNPRINTF 1
+
+/* Name of package */
+#define PACKAGE "mod_jk"
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT ""
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME ""
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING ""
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME ""
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION ""
+
+/* The size of a `char', as computed by sizeof. */
+#define SIZEOF_CHAR 1
+
+/* The size of a `int', as computed by sizeof. */
+#define SIZEOF_INT 4
+
+/* The size of a `long', as computed by sizeof. */
+#define SIZEOF_LONG 8
+
+/* The size of a `longlong', as computed by sizeof. */
+#define SIZEOF_LONGLONG 0
+
+/* The size of a `long double', as computed by sizeof. */
+#define SIZEOF_LONG_DOUBLE 16
+
+/* The size of a `long long', as computed by sizeof. */
+#define SIZEOF_LONG_LONG 8
+
+/* The size of pid_t */
+#define SIZEOF_PID_T 4
+
+/* The size of pthread_t */
+#define SIZEOF_PTHREAD_T 8
+
+/* The size of a `short', as computed by sizeof. */
+#define SIZEOF_SHORT 2
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Define to use SOCK_CLOEXEC with socket() */
+#define USE_SOCK_CLOEXEC 1
+
+/* Define to use SO_RCVTIMEO with setsockopt() */
+#define USE_SO_RCVTIMEO 1
+
+/* Define to use SO_SNDTIMEO with setsockopt() */
+#define USE_SO_SNDTIMEO 1
+
+/* Version number of package */
+#define VERSION "1.2.32"
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/config.h.in b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/config.h.in
new file mode 100644
index 00000000..7426f4f6
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/config.h.in
@@ -0,0 +1,109 @@
+/* common/config.h.in. Generated from configure.in by autoheader. */
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Have flock() */
+#undef HAVE_FLOCK
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Have poll() */
+#undef HAVE_POLL
+
+/* Define to 1 if you have the <poll.h> header file. */
+#undef HAVE_POLL_H
+
+/* Have snprintf() */
+#undef HAVE_SNPRINTF
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the <sys/filio.h> header file. */
+#undef HAVE_SYS_FILIO_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Have vsnprintf() */
+#undef HAVE_VSNPRINTF
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* The size of a `char', as computed by sizeof. */
+#undef SIZEOF_CHAR
+
+/* The size of a `int', as computed by sizeof. */
+#undef SIZEOF_INT
+
+/* The size of a `long', as computed by sizeof. */
+#undef SIZEOF_LONG
+
+/* The size of a `longlong', as computed by sizeof. */
+#undef SIZEOF_LONGLONG
+
+/* The size of a `long double', as computed by sizeof. */
+#undef SIZEOF_LONG_DOUBLE
+
+/* The size of a `long long', as computed by sizeof. */
+#undef SIZEOF_LONG_LONG
+
+/* The size of pid_t */
+#undef SIZEOF_PID_T
+
+/* The size of pthread_t */
+#undef SIZEOF_PTHREAD_T
+
+/* The size of a `short', as computed by sizeof. */
+#undef SIZEOF_SHORT
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Define to use SOCK_CLOEXEC with socket() */
+#undef USE_SOCK_CLOEXEC
+
+/* Define to use SO_RCVTIMEO with setsockopt() */
+#undef USE_SO_RCVTIMEO
+
+/* Define to use SO_SNDTIMEO with setsockopt() */
+#undef USE_SO_SNDTIMEO
+
+/* Version number of package */
+#undef VERSION
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk.rc b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk.rc
new file mode 100644
index 00000000..e0eae360
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk.rc
@@ -0,0 +1,74 @@
+/* Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <windows.h>
+#include "jk_version.h"
+
+#define ASF_COPYRIGHT "Licensed to the Apache Software Foundation " \
+ "(ASF) under one or more contributor license " \
+ "agreements. See the NOTICE file distributed " \
+ "with this work for additional information " \
+ "regarding copyright ownership."
+
+#define ASF_LICENSE "The ASF licenses this file to You under the " \
+ "Apache License, Version 2.0 (the ""License""); " \
+ "you may not use this file except in compliance " \
+ "with the License. You may obtain a copy of " \
+ "the License at\r\n\r\n" \
+ "http://www.apache.org/licenses/LICENSE-2.0\r\n\r\n" \
+ "Unless required by applicable law or agreed to in " \
+ "writing, software distributed under the License is " \
+ "distributed on an ""AS IS"" BASIS, WITHOUT " \
+ "WARRANTIES OR CONDITIONS OF ANY KIND, either " \
+ "express or implied. See the License for the " \
+ "specific language governing permissions and " \
+ "limitations under the License."
+
+
+1 VERSIONINFO
+ FILEVERSION JK_VERSIONCSV
+ PRODUCTVERSION JK_VERSIONCSV
+ FILEFLAGSMASK 0x3fL
+#if defined(_DEBUG)
+ FILEFLAGS 0x01L
+#else
+ FILEFLAGS 0x00L
+#endif
+ FILEOS 0x40004L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904b0"
+ BEGIN
+ VALUE "Comments", ASF_LICENSE "\0"
+ VALUE "CompanyName", "Apache Software Foundation\0"
+ VALUE "FileDescription", "Apache Tomcat Connector\0"
+ VALUE "FileVersion", JK_VERSTRING "\0"
+ VALUE "InternalName", PACKAGE "\0"
+ VALUE "LegalCopyright", ASF_COPYRIGHT "\0"
+ VALUE "OriginalFilename", PACKAGE "." JK_DLL_SUFFIX "\0"
+ VALUE "ProductName", "Apache Tomcat " PACKAGE " Connector\0"
+ VALUE "ProductVersion", JK_VERSTRING "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp12_worker.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp12_worker.c
new file mode 100644
index 00000000..c10ef0b4
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp12_worker.c
@@ -0,0 +1,682 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: ajpv1.2 worker, used to call local or remote jserv hosts *
+ * This worker is deprecated *
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Based on: jserv_ajpv12.c from Jserv *
+ * Version: $Revision: 747878 $ *
+ ***************************************************************************/
+
+#include "jk_ajp12_worker.h"
+#include "jk_pool.h"
+#include "jk_connect.h"
+#include "jk_util.h"
+#include "jk_sockbuf.h"
+#if defined(AS400) && !defined(AS400_UTF8)
+#include "util_ebcdic.h"
+#include <string.h>
+#endif
+
+#define AJP_DEF_HOST ("localhost")
+#define AJP_DEF_PORT (8007)
+#define READ_BUF_SIZE (8*1024)
+#define DEF_RETRY_ATTEMPTS (1)
+
+struct ajp12_worker
+{
+ struct sockaddr_in worker_inet_addr;
+ unsigned connect_retry_attempts;
+ char *name;
+ jk_worker_t worker;
+};
+
+typedef struct ajp12_worker ajp12_worker_t;
+
+struct ajp12_endpoint
+{
+ ajp12_worker_t *worker;
+
+ jk_sock_t sd;
+ jk_sockbuf_t sb;
+
+ jk_endpoint_t endpoint;
+};
+typedef struct ajp12_endpoint ajp12_endpoint_t;
+
+static int ajpv12_mark(ajp12_endpoint_t * p, unsigned char type);
+
+#if defined(AS400) && !defined(AS400_UTF8)
+static int ajpv12_sendasciistring(ajp12_endpoint_t * p, char *buffer);
+#endif
+
+#if defined(AS400) && !defined(AS400_UTF8)
+static int ajpv12_sendstring(ajp12_endpoint_t * p, char *buffer);
+#else
+static int ajpv12_sendstring(ajp12_endpoint_t * p, const char *buffer);
+#endif
+
+static int ajpv12_sendint(ajp12_endpoint_t * p, int d);
+
+static int ajpv12_sendnbytes(ajp12_endpoint_t * p,
+ const void *buffer, int bufferlen);
+
+static int ajpv12_flush(ajp12_endpoint_t * p);
+
+static int ajpv12_handle_response(ajp12_endpoint_t * p,
+ jk_ws_service_t *s, jk_logger_t *l);
+
+static int ajpv12_handle_request(ajp12_endpoint_t * p,
+ jk_ws_service_t *s, jk_logger_t *l);
+
+/*
+ * Return values of service() method for ajp12 worker:
+ * return value is_error reason
+ * JK_FALSE JK_HTTP_SERVER_ERROR Invalid parameters (null values)
+ * Error during connect to the backend
+ * ajpv12_handle_request() returns false:
+ * Any error during reading a request body from the client or
+ * sending the request to the backend
+ * JK_FALSE JK_HTTP_OK ajpv12_handle_response() returns false:
+ * Any error during reading parts of response from backend or
+ * sending to client
+ * JK_TRUE JK_HTTP_OK All other cases
+ */
+static int JK_METHOD service(jk_endpoint_t *e,
+ jk_ws_service_t *s,
+ jk_logger_t *l, int *is_error)
+{
+ ajp12_endpoint_t *p;
+ unsigned int attempt;
+ int rc = -1;
+ /*
+ * AJP12 protocol is not recoverable.
+ */
+
+ JK_TRACE_ENTER(l);
+
+ if (!e || !e->endpoint_private || !s || !is_error) {
+ JK_LOG_NULL_PARAMS(l);
+ if (is_error)
+ *is_error = JK_HTTP_SERVER_ERROR;
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ p = e->endpoint_private;
+
+ /* Set returned error to OK */
+ *is_error = JK_HTTP_OK;
+
+ for (attempt = 0; attempt < p->worker->connect_retry_attempts;
+ attempt++) {
+ p->sd =
+ jk_open_socket(&p->worker->worker_inet_addr,
+ JK_FALSE, 0, 0, 0, l);
+
+ jk_log(l, JK_LOG_DEBUG, "In jk_endpoint_t::service, sd = %d",
+ p->sd);
+ if (IS_VALID_SOCKET(p->sd)) {
+ break;
+ }
+ }
+ if (IS_VALID_SOCKET(p->sd)) {
+
+ jk_sb_open(&p->sb, p->sd);
+ if (ajpv12_handle_request(p, s, l)) {
+ jk_log(l, JK_LOG_DEBUG,
+ "In jk_endpoint_t::service, sent request");
+ rc = ajpv12_handle_response(p, s, l);
+ JK_TRACE_EXIT(l);
+ return rc;
+ }
+ }
+ jk_log(l, JK_LOG_ERROR, "In jk_endpoint_t::service, Error sd = %d",
+ p->sd);
+ *is_error = JK_HTTP_SERVER_ERROR;
+
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+}
+
+static int JK_METHOD done(jk_endpoint_t **e, jk_logger_t *l)
+{
+ jk_log(l, JK_LOG_DEBUG, "Into jk_endpoint_t::done");
+ if (e && *e && (*e)->endpoint_private) {
+ ajp12_endpoint_t *p = (*e)->endpoint_private;
+ if (IS_VALID_SOCKET(p->sd)) {
+ jk_shutdown_socket(p->sd, l);
+ }
+ free(p);
+ *e = NULL;
+ return JK_TRUE;
+ }
+
+ jk_log(l, JK_LOG_ERROR, "In jk_endpoint_t::done, NULL parameters");
+ return JK_FALSE;
+}
+
+static int JK_METHOD validate(jk_worker_t *pThis,
+ jk_map_t *props,
+ jk_worker_env_t *we, jk_logger_t *l)
+{
+ jk_log(l, JK_LOG_DEBUG, "Into jk_worker_t::validate");
+
+ if (pThis && pThis->worker_private) {
+ ajp12_worker_t *p = pThis->worker_private;
+ int port = jk_get_worker_port(props,
+ p->name,
+ AJP_DEF_PORT);
+
+ const char *host = jk_get_worker_host(props,
+ p->name,
+ AJP_DEF_HOST);
+
+ jk_log(l, JK_LOG_DEBUG,
+ "In jk_worker_t::validate for worker %s contact is %s:%d",
+ p->name, host, port);
+
+ if (host) {
+ if (jk_resolve(host, port, &p->worker_inet_addr, we->pool, l)) {
+ return JK_TRUE;
+ }
+ jk_log(l, JK_LOG_ERROR,
+ "In jk_worker_t::validate, resolve failed");
+ }
+ jk_log(l, JK_LOG_ERROR, "In jk_worker_t::validate, Error %s %d",
+ host, port);
+ }
+ else {
+ jk_log(l, JK_LOG_ERROR,
+ "In jk_worker_t::validate, NULL parameters");
+ }
+
+ return JK_FALSE;
+}
+
+static int JK_METHOD init(jk_worker_t *pThis,
+ jk_map_t *props,
+ jk_worker_env_t *we, jk_logger_t *log)
+{
+ /* Nothing to do for now */
+ return JK_TRUE;
+}
+
+static int JK_METHOD get_endpoint(jk_worker_t *pThis,
+ jk_endpoint_t **pend, jk_logger_t *l)
+{
+ jk_log(l, JK_LOG_DEBUG, "Into jk_worker_t::get_endpoint");
+
+ if (pThis && pThis->worker_private && pend) {
+ ajp12_endpoint_t *p =
+ (ajp12_endpoint_t *) malloc(sizeof(ajp12_endpoint_t));
+ if (p) {
+ p->sd = JK_INVALID_SOCKET;
+ p->worker = pThis->worker_private;
+ p->endpoint.endpoint_private = p;
+ p->endpoint.service = service;
+ p->endpoint.done = done;
+ *pend = &p->endpoint;
+ return JK_TRUE;
+ }
+ jk_log(l, JK_LOG_ERROR,
+ "In jk_worker_t::get_endpoint, malloc failed");
+ }
+ else {
+ jk_log(l, JK_LOG_ERROR,
+ "In jk_worker_t::get_endpoint, NULL parameters");
+ }
+
+ return JK_FALSE;
+}
+
+static int JK_METHOD destroy(jk_worker_t **pThis, jk_logger_t *l)
+{
+ jk_log(l, JK_LOG_DEBUG, "Into jk_worker_t::destroy");
+ if (pThis && *pThis && (*pThis)->worker_private) {
+ ajp12_worker_t *private_data = (*pThis)->worker_private;
+ free(private_data->name);
+ free(private_data);
+
+ return JK_TRUE;
+ }
+
+ jk_log(l, JK_LOG_ERROR, "In jk_worker_t::destroy, NULL parameters");
+ return JK_FALSE;
+}
+
+int JK_METHOD ajp12_worker_factory(jk_worker_t **w,
+ const char *name, jk_logger_t *l)
+{
+ jk_log(l, JK_LOG_DEBUG, "Into ajp12_worker_factory");
+ if (NULL != name && NULL != w) {
+ ajp12_worker_t *private_data =
+ (ajp12_worker_t *) malloc(sizeof(ajp12_worker_t));
+
+ if (private_data) {
+ private_data->name = strdup(name);
+
+ if (private_data->name) {
+ private_data->connect_retry_attempts = DEF_RETRY_ATTEMPTS;
+ private_data->worker.worker_private = private_data;
+
+ private_data->worker.validate = validate;
+ private_data->worker.init = init;
+ private_data->worker.get_endpoint = get_endpoint;
+ private_data->worker.destroy = destroy;
+ private_data->worker.maintain = NULL;
+
+ *w = &private_data->worker;
+ return JK_AJP12_WORKER_TYPE;
+ }
+
+ free(private_data);
+ }
+ jk_log(l, JK_LOG_ERROR, "In ajp12_worker_factory, malloc failed");
+ }
+ else {
+ jk_log(l, JK_LOG_ERROR, "In ajp12_worker_factory, NULL parameters");
+ }
+
+ return 0;
+}
+
+static int ajpv12_sendnbytes(ajp12_endpoint_t * p,
+ const void *buffer, int bufferlen)
+{
+ unsigned char bytes[2];
+ static const unsigned char null_b[2] =
+ { (unsigned char)0xff, (unsigned char)0xff };
+
+ if (buffer) {
+ bytes[0] = (unsigned char)((bufferlen >> 8) & 0xff);
+ bytes[1] = (unsigned char)(bufferlen & 0xff);
+
+ if (jk_sb_write(&p->sb, bytes, 2)) {
+ return jk_sb_write(&p->sb, buffer, bufferlen);
+ }
+ else {
+ return JK_FALSE;
+ }
+ }
+ else {
+ return jk_sb_write(&p->sb, null_b, 2);
+ }
+}
+
+#if defined(AS400) && !defined(AS400_UTF8)
+static int ajpv12_sendasciistring(ajp12_endpoint_t * p, const char *buffer)
+{
+ int bufferlen;
+
+ if (buffer && (bufferlen = strlen(buffer))) {
+ return ajpv12_sendnbytes(p, buffer, bufferlen);
+ }
+ else {
+ return ajpv12_sendnbytes(p, NULL, 0);
+ }
+}
+#endif
+
+static int ajpv12_sendstring(ajp12_endpoint_t * p, const char *buffer)
+{
+ int bufferlen;
+
+ if (buffer && (bufferlen = (int)strlen(buffer))) {
+#if (defined(AS400) && !defined(AS400_UTF8)) || defined(_OSD_POSIX)
+ char buf[2048];
+ if (bufferlen < 2048) {
+ memcpy(buf, buffer, bufferlen);
+ jk_xlate_to_ascii(buf, bufferlen);
+ return ajpv12_sendnbytes(p, buf, bufferlen);
+ }
+ else
+ return -1;
+#else
+ return ajpv12_sendnbytes(p, buffer, bufferlen);
+#endif
+ }
+ else {
+ return ajpv12_sendnbytes(p, NULL, 0);
+ }
+}
+
+static int ajpv12_mark(ajp12_endpoint_t * p, unsigned char type)
+{
+ if (jk_sb_write(&p->sb, &type, 1)) {
+ return JK_TRUE;
+ }
+ else {
+ return JK_FALSE;
+ }
+}
+
+static int ajpv12_sendint(ajp12_endpoint_t * p, int d)
+{
+ char buf[20];
+ sprintf(buf, "%d", d);
+ return ajpv12_sendstring(p, buf);
+}
+
+static int ajpv12_flush(ajp12_endpoint_t * p)
+{
+ return jk_sb_flush(&p->sb);
+}
+
+static int ajpv12_handle_request(ajp12_endpoint_t * p,
+ jk_ws_service_t *s, jk_logger_t *l)
+{
+ int ret;
+
+ jk_log(l, JK_LOG_DEBUG, "Into ajpv12_handle_request");
+ /*
+ * Start the ajp 12 service sequence
+ */
+ jk_log(l, JK_LOG_DEBUG,
+ "ajpv12_handle_request, sending the ajp12 start sequence");
+
+ ret = (ajpv12_mark(p, 1) && ajpv12_sendstring(p, s->method) && ajpv12_sendstring(p, 0) && /* zone */
+ ajpv12_sendstring(p, 0) && /* servlet */
+ ajpv12_sendstring(p, s->server_name) && ajpv12_sendstring(p, 0) && /* doc root */
+ ajpv12_sendstring(p, 0) && /* path info */
+ ajpv12_sendstring(p, 0) && /* path translated */
+#if defined(AS400) && !defined(AS400_UTF8)
+ ajpv12_sendasciistring(p, s->query_string) &&
+#else
+ ajpv12_sendstring(p, s->query_string) &&
+#endif
+ ajpv12_sendstring(p, s->remote_addr) &&
+ ajpv12_sendstring(p, s->remote_host) &&
+ ajpv12_sendstring(p, s->remote_user) &&
+ ajpv12_sendstring(p, s->auth_type) &&
+ ajpv12_sendint(p, s->server_port) &&
+#if defined(AS400) && !defined(AS400_UTF8)
+ ajpv12_sendasciistring(p, s->method) &&
+#else
+ ajpv12_sendstring(p, s->method) &&
+#endif
+ ajpv12_sendstring(p, s->req_uri) && ajpv12_sendstring(p, 0) && /* */
+ ajpv12_sendstring(p, 0) && /* SCRIPT_NAME */
+#if defined(AS400) && !defined(AS400_UTF8)
+ ajpv12_sendasciistring(p, s->server_name) &&
+#else
+ ajpv12_sendstring(p, s->server_name) &&
+#endif
+ ajpv12_sendint(p, s->server_port) && ajpv12_sendstring(p, s->protocol) && ajpv12_sendstring(p, 0) && /* SERVER_SIGNATURE */
+ ajpv12_sendstring(p, s->server_software) && ajpv12_sendstring(p, s->route) && /* JSERV_ROUTE */
+ ajpv12_sendstring(p, "") && /* JSERV ajpv12 compatibility */
+ ajpv12_sendstring(p, "")); /* JSERV ajpv12 compatibility */
+
+ if (!ret) {
+ jk_log(l, JK_LOG_ERROR,
+ "In ajpv12_handle_request, failed to send the ajp12 start sequence");
+ return JK_FALSE;
+ }
+
+ if (s->num_attributes > 0) {
+ unsigned i;
+ jk_log(l, JK_LOG_DEBUG,
+ "ajpv12_handle_request, sending the environment variables");
+
+ for (i = 0; i < s->num_attributes; i++) {
+ ret = (ajpv12_mark(p, 5) &&
+ ajpv12_sendstring(p, s->attributes_names[i]) &&
+ ajpv12_sendstring(p, s->attributes_values[i]));
+ if (!ret) {
+ jk_log(l, JK_LOG_ERROR,
+ "In ajpv12_handle_request, failed to send environment");
+ return JK_FALSE;
+ }
+ }
+ }
+
+ jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_request, sending the headers");
+
+ /* Send the request headers */
+ if (s->num_headers) {
+ unsigned i;
+ for (i = 0; i < s->num_headers; ++i) {
+ ret = (ajpv12_mark(p, 3) &&
+ ajpv12_sendstring(p, s->headers_names[i]) &&
+ ajpv12_sendstring(p, s->headers_values[i]));
+
+ if (!ret) {
+ jk_log(l, JK_LOG_ERROR,
+ "In ajpv12_handle_request, failed to send headers");
+ return JK_FALSE;
+ }
+ }
+ }
+
+ jk_log(l, JK_LOG_DEBUG,
+ "ajpv12_handle_request, sending the terminating mark");
+
+ ret = (ajpv12_mark(p, 4) && ajpv12_flush(p));
+ if (!ret) {
+ jk_log(l, JK_LOG_ERROR,
+ "In ajpv12_handle_request, failed to send the terminating mark");
+ return JK_FALSE;
+ }
+
+ if (s->content_length) {
+ char buf[READ_BUF_SIZE];
+ jk_uint64_t so_far = 0;
+
+ jk_log(l, JK_LOG_DEBUG,
+ "ajpv12_handle_request, sending the request body");
+
+ while (so_far < s->content_length) {
+ unsigned this_time = 0;
+ unsigned to_read;
+ if (s->content_length > so_far + READ_BUF_SIZE) {
+ to_read = READ_BUF_SIZE;
+ }
+ else {
+ to_read = (unsigned int)(s->content_length - so_far);
+ }
+
+ if (!s->read(s, buf, to_read, &this_time)) {
+ jk_log(l, JK_LOG_ERROR,
+ "In ajpv12_handle_request, failed to read from the web server");
+ return JK_FALSE;
+ }
+ jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_request, read %d bytes",
+ this_time);
+ if (this_time > 0) {
+ so_far += this_time;
+ if ((int)this_time != send(p->sd, buf, this_time, 0)) {
+ jk_log(l, JK_LOG_ERROR,
+ "In ajpv12_handle_request, failed to write to the container");
+ return JK_FALSE;
+ }
+ jk_log(l, JK_LOG_DEBUG,
+ "ajpv12_handle_request, sent %d bytes", this_time);
+ }
+ else if (this_time == 0) {
+ jk_log(l, JK_LOG_ERROR,
+ "In ajpv12_handle_request, Error: short read. content length is %" JK_UINT64_T_FMT ", read %" JK_UINT64_T_FMT,
+ s->content_length, so_far);
+ return JK_FALSE;
+ }
+ }
+ }
+
+ jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_request done");
+ return JK_TRUE;
+}
+
+static int ajpv12_handle_response(ajp12_endpoint_t * p,
+ jk_ws_service_t *s, jk_logger_t *l)
+{
+ int status = 200;
+ char *reason = NULL;
+ char **names = NULL;
+ char **values = NULL;
+ int headers_capacity = 0;
+ int headers_len = 0;
+ int write_to_ws;
+
+ jk_log(l, JK_LOG_DEBUG, "Into ajpv12_handle_response");
+ /*
+ * Read headers ...
+ */
+ while (1) {
+ char *line = NULL;
+ char *name = NULL;
+ char *value = NULL;
+#ifdef _MT_CODE_PTHREAD
+ char *lasts;
+#endif
+
+ if (!jk_sb_gets(&p->sb, &line)) {
+ jk_log(l, JK_LOG_ERROR,
+ "ajpv12_handle_response, error reading header line");
+ return JK_FALSE;
+ }
+#if (defined(AS400) && !defined(AS400_UTF8)) || defined(_OSD_POSIX)
+ jk_xlate_from_ascii(line, strlen(line));
+#endif
+
+ jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_response, read %s", line);
+ if (0 == strlen(line)) {
+ jk_log(l, JK_LOG_DEBUG,
+ "ajpv12_handle_response, headers are done");
+ break; /* Empty line -> end of headers */
+ }
+
+ name = line;
+ while (isspace((int)(*name)) && *name) {
+ name++; /* Skip leading white chars */
+ }
+ if (!*name) { /* Empty header name */
+ jk_log(l, JK_LOG_ERROR,
+ "ajpv12_handle_response, empty header name");
+ return JK_FALSE;
+ }
+ if (!(value = strchr(name, ':'))) {
+ jk_log(l, JK_LOG_ERROR,
+ "ajpv12_handle_response, no value supplied");
+ return JK_FALSE; /* No value !!! */
+ }
+ *value = '\0';
+ value++;
+ while (isspace((int)(*value)) && *value) {
+ value++; /* Skip leading white chars */
+ }
+ if (!*value) { /* Empty header value */
+ jk_log(l, JK_LOG_ERROR,
+ "ajpv12_handle_response, empty header value");
+ return JK_FALSE;
+ }
+
+ jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_response, read %s=%s", name,
+ value);
+ if (0 == strcmp("Status", name)) {
+#ifdef _MT_CODE_PTHREAD
+ char *numeric = strtok_r(value, " \t", &lasts);
+#else
+ char *numeric = strtok(value, " \t");
+#endif
+
+ status = atoi(numeric);
+ if (status < 100 || status > 999) {
+ jk_log(l, JK_LOG_ERROR,
+ "ajpv12_handle_response, invalid status code");
+ return JK_FALSE;
+ }
+#ifdef _MT_CODE_PTHREAD
+ reason = jk_pool_strdup(s->pool, strtok_r(NULL, " \t", &lasts));
+#else
+ reason = jk_pool_strdup(s->pool, strtok(NULL, " \t"));
+#endif
+ }
+ else {
+ if (headers_capacity == headers_len) {
+ jk_log(l, JK_LOG_DEBUG,
+ "ajpv12_handle_response, allocating header arrays");
+ names =
+ (char **)jk_pool_realloc(s->pool,
+ sizeof(char *) *
+ (headers_capacity + 5), names,
+ sizeof(char *) *
+ headers_capacity);
+ values =
+ (char **)jk_pool_realloc(s->pool,
+ sizeof(char *) *
+ (headers_capacity + 5), values,
+ sizeof(char *) *
+ headers_capacity);
+ if (!values || !names) {
+ jk_log(l, JK_LOG_ERROR,
+ "ajpv12_handle_response, malloc error");
+ return JK_FALSE;
+ }
+ headers_capacity = headers_capacity + 5;
+ }
+ names[headers_len] = jk_pool_strdup(s->pool, name);
+ values[headers_len] = jk_pool_strdup(s->pool, value);
+ headers_len++;
+ }
+ }
+
+ jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_response, starting response");
+ if (!s->start_response(s,
+ status,
+ reason,
+ (const char *const *)names,
+ (const char *const *)values, headers_len)) {
+ jk_log(l, JK_LOG_ERROR,
+ "ajpv12_handle_response, error starting response");
+ return JK_FALSE;
+ }
+
+ jk_log(l, JK_LOG_DEBUG,
+ "ajpv12_handle_response, reading response body");
+ /*
+ * Read response body
+ */
+ write_to_ws = JK_TRUE;
+ while (1) {
+ unsigned to_read = READ_BUF_SIZE;
+ unsigned acc = 0;
+ char *buf = NULL;
+
+ if (!jk_sb_read(&p->sb, &buf, to_read, &acc)) {
+ jk_log(l, JK_LOG_ERROR,
+ "ajpv12_handle_response, error reading from ");
+ return JK_FALSE;
+ }
+
+ if (!acc) {
+ jk_log(l, JK_LOG_DEBUG,
+ "ajpv12_handle_response, response body is done");
+ break;
+ }
+
+ if (write_to_ws) {
+ if (!s->write(s, buf, acc)) {
+ jk_log(l, JK_LOG_ERROR,
+ "ajpv12_handle_response, error writing back to server");
+ write_to_ws = JK_FALSE;
+ }
+ }
+ }
+
+ jk_log(l, JK_LOG_DEBUG, "ajpv12_handle_response done");
+ return JK_TRUE;
+}
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp12_worker.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp12_worker.h
new file mode 100644
index 00000000..e4e5eaca
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp12_worker.h
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: ajpv1.2 worker header file *
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Version: $Revision: 466585 $ *
+ ***************************************************************************/
+
+#ifndef JK_AJP12_WORKER_H
+#define JK_AJP12_WORKER_H
+
+#include "jk_logger.h"
+#include "jk_service.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+#define JK_AJP12_WORKER_NAME ("ajp12")
+#define JK_AJP12_WORKER_TYPE (1)
+
+int JK_METHOD ajp12_worker_factory(jk_worker_t **w,
+ const char *name, jk_logger_t *l);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* JK_AJP12_WORKER_H */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp12_worker.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp12_worker.lo
new file mode 100644
index 00000000..9c11bcb9
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp12_worker.lo
@@ -0,0 +1,12 @@
+# jk_ajp12_worker.lo - a libtool object file
+# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18)
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/jk_ajp12_worker.o'
+
+# Name of the non-PIC object.
+non_pic_object='jk_ajp12_worker.o'
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp12_worker.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp12_worker.o
new file mode 100644
index 00000000..3ab1134b
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp12_worker.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13.c
new file mode 100644
index 00000000..4c16a023
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13.c
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: Experimental bi-directionl protocol handler. *
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Author: Henri Gomez <hgomez@apache.org> *
+ * Version: $Revision: 466585 $ *
+ ***************************************************************************/
+
+
+#include "jk_global.h"
+#include "jk_util.h"
+#include "jk_ajp_common.h"
+#include "jk_ajp13.h"
+
+int ajp13_marshal_shutdown_into_msgb(jk_msg_buf_t *msg,
+ jk_pool_t *p, jk_logger_t *l)
+{
+ JK_TRACE_ENTER(l);
+ /* To be on the safe side */
+ jk_b_reset(msg);
+
+ /*
+ * Just a single byte with s/d command.
+ */
+ if (jk_b_append_byte(msg, JK_AJP13_SHUTDOWN)) {
+ jk_log(l, JK_LOG_ERROR,
+ "failed appending shutdown message");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13.h
new file mode 100644
index 00000000..d2a9ab2e
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13.h
@@ -0,0 +1,126 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: Experimental bi-directionl protocol handler. *
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Version: $Revision: 751213 $ *
+ ***************************************************************************/
+#ifndef JK_AJP13_H
+#define JK_AJP13_H
+
+#include "jk_ajp_common.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+#define AJP13_PROTO 13
+#define AJP13_WS_HEADER 0x1234
+#define AJP13_SW_HEADER 0x4142 /* 'AB' */
+
+#define AJP13_DEF_HOST ("localhost")
+#define AJP13_DEF_PORT (8009)
+#define AJP13_READ_BUF_SIZE (8*1024)
+#define AJP13_DEF_CACHE_SZ (1)
+#define JK_INTERNAL_ERROR (-2)
+#define JK_FATAL_ERROR (-3)
+#define JK_CLIENT_ERROR (-4)
+#define JK_SERVER_ERROR (-5)
+#define JK_CLIENT_RD_ERROR (-6)
+#define JK_CLIENT_WR_ERROR (-7)
+#define JK_STATUS_ERROR (-8)
+#define JK_STATUS_FATAL_ERROR (-9)
+#define JK_REPLY_TIMEOUT (-10)
+#define JK_AJP_PROTOCOL_ERROR (-11)
+
+#define AJP13_MAX_SEND_BODY_SZ (DEF_BUFFER_SZ - 6)
+#define AJP13_DEF_TIMEOUT (0) /* Idle timout for pooled connections */
+
+/*
+ * Message does not have a response (for example, JK_AJP13_END_RESPONSE)
+ */
+#define JK_AJP13_ERROR -1
+/*
+ * Message does not have a response (for example, JK_AJP13_END_RESPONSE)
+ */
+#define JK_AJP13_NO_RESPONSE 0
+/*
+ * Message have a response.
+ */
+#define JK_AJP13_HAS_RESPONSE 1
+
+/*
+ * Forward a request from the web server to the servlet container.
+ */
+#define JK_AJP13_FORWARD_REQUEST (unsigned char)2
+
+/*
+ * Write a body chunk from the servlet container to the web server
+ */
+#define JK_AJP13_SEND_BODY_CHUNK (unsigned char)3
+
+/*
+ * Send response headers from the servlet container to the web server.
+ */
+#define JK_AJP13_SEND_HEADERS (unsigned char)4
+
+/*
+ * Marks the end of response.
+ */
+#define JK_AJP13_END_RESPONSE (unsigned char)5
+
+/*
+ * Marks the end of response.
+ */
+#define JK_AJP13_GET_BODY_CHUNK (unsigned char)6
+
+/*
+ * Asks the container to shutdown
+ */
+#define JK_AJP13_SHUTDOWN (unsigned char)7
+
+/*
+ * Told container to take control (secure login phase)
+ */
+#define AJP13_PING_REQUEST (unsigned char)8
+
+/*
+ * Check if the container is alive
+ */
+#define AJP13_CPING_REQUEST (unsigned char)10
+
+/*
+ * Reply from the container to alive request
+ */
+#define AJP13_CPONG_REPLY (unsigned char)9
+
+
+
+/*
+ * Functions
+ */
+
+int ajp13_marshal_shutdown_into_msgb(jk_msg_buf_t *msg,
+ jk_pool_t *p, jk_logger_t *l);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* JK_AJP13_H */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13.lo
new file mode 100644
index 00000000..33d31154
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13.lo
@@ -0,0 +1,12 @@
+# jk_ajp13.lo - a libtool object file
+# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18)
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/jk_ajp13.o'
+
+# Name of the non-PIC object.
+non_pic_object='jk_ajp13.o'
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13.o
new file mode 100644
index 00000000..872b5f5f
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13_worker.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13_worker.c
new file mode 100644
index 00000000..13e140ff
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13_worker.c
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: Bi-directional protocol. *
+ * Author: Costin <costin@costin.dnt.ro> *
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Author: Henri Gomez <hgomez@apache.org> *
+ * Version: $Revision: 611589 $ *
+ ***************************************************************************/
+
+#include "jk_ajp13_worker.h"
+
+
+/* -------------------- Method -------------------- */
+static int JK_METHOD validate(jk_worker_t *pThis,
+ jk_map_t *props,
+ jk_worker_env_t *we, jk_logger_t *l)
+{
+ int rc;
+ JK_TRACE_ENTER(l);
+ rc = ajp_validate(pThis, props, we, l, AJP13_PROTO);
+ JK_TRACE_EXIT(l);
+ return rc;
+}
+
+
+static int JK_METHOD init(jk_worker_t *pThis,
+ jk_map_t *props,
+ jk_worker_env_t *we, jk_logger_t *l)
+{
+ int rc;
+ JK_TRACE_ENTER(l);
+
+ rc = ajp_init(pThis, props, we, l, AJP13_PROTO);
+ JK_TRACE_EXIT(l);
+ return rc;
+}
+
+
+static int JK_METHOD destroy(jk_worker_t **pThis, jk_logger_t *l)
+{
+ int rc;
+ JK_TRACE_ENTER(l);
+ rc = ajp_destroy(pThis, l, AJP13_PROTO);
+ JK_TRACE_EXIT(l);
+ return rc;
+}
+
+
+static int JK_METHOD get_endpoint(jk_worker_t *pThis,
+ jk_endpoint_t **pend, jk_logger_t *l)
+{
+ int rc;
+ JK_TRACE_ENTER(l);
+ rc = ajp_get_endpoint(pThis, pend, l, AJP13_PROTO);
+ JK_TRACE_EXIT(l);
+ return rc;
+}
+
+int JK_METHOD ajp13_worker_factory(jk_worker_t **w,
+ const char *name, jk_logger_t *l)
+{
+ ajp_worker_t *aw;
+
+ JK_TRACE_ENTER(l);
+ if (ajp_worker_factory(w, name, l) == JK_FALSE)
+ return 0;
+
+ aw = (*w)->worker_private;
+ aw->proto = AJP13_PROTO;
+
+ aw->worker.validate = validate;
+ aw->worker.init = init;
+ aw->worker.get_endpoint = get_endpoint;
+ aw->worker.destroy = destroy;
+
+ JK_TRACE_EXIT(l);
+ return JK_AJP13_WORKER_TYPE;
+}
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13_worker.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13_worker.h
new file mode 100644
index 00000000..b3098d6f
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13_worker.h
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: ajpv1.3 worker header file *
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Version: $Revision: 466585 $ *
+ ***************************************************************************/
+
+#ifndef JK_AJP13_WORKER_H
+#define JK_AJP13_WORKER_H
+
+#include "jk_pool.h"
+#include "jk_connect.h"
+#include "jk_util.h"
+#include "jk_msg_buff.h"
+#include "jk_ajp_common.h"
+#include "jk_ajp13.h"
+#include "jk_logger.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+#define JK_AJP13_WORKER_NAME ("ajp13")
+#define JK_AJP13_WORKER_TYPE (2)
+
+int JK_METHOD ajp13_worker_factory(jk_worker_t **w,
+ const char *name, jk_logger_t *l);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* JK_AJP13_WORKER_H */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13_worker.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13_worker.lo
new file mode 100644
index 00000000..415f71ae
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13_worker.lo
@@ -0,0 +1,12 @@
+# jk_ajp13_worker.lo - a libtool object file
+# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18)
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/jk_ajp13_worker.o'
+
+# Name of the non-PIC object.
+non_pic_object='jk_ajp13_worker.o'
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13_worker.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13_worker.o
new file mode 100644
index 00000000..b8f3d642
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp13_worker.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14.c
new file mode 100644
index 00000000..161356ab
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14.c
@@ -0,0 +1,695 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: Next generation bi-directional protocol handler. *
+ * Author: Henri Gomez <hgomez@apache.org> *
+ * Version: $Revision: 466585 $ *
+ ***************************************************************************/
+
+
+#include "jk_global.h"
+#include "jk_util.h"
+#include "jk_map.h"
+#include "jk_ajp_common.h"
+#include "jk_ajp14.h"
+#include "jk_md5.h"
+
+/*
+ * Compute the MD5 with ENTROPY / SECRET KEY
+ */
+
+void ajp14_compute_md5(jk_login_service_t *s, jk_logger_t *l)
+{
+ JK_TRACE_ENTER(l);
+ jk_md5((const unsigned char *)s->entropy,
+ (const unsigned char *)s->secret_key, s->computed_key);
+
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG, "(%s/%s) -> (%s)",
+ s->entropy, s->secret_key, s->computed_key);
+ JK_TRACE_EXIT(l);
+}
+
+
+/*
+ * Build the Login Init Command
+ *
+ * +-------------------------+---------------------------+---------------------------+
+ * | LOGIN INIT CMD (1 byte) | NEGOCIATION DATA (32bits) | WEB SERVER INFO (CString) |
+ * +-------------------------+---------------------------+---------------------------+
+ *
+ */
+
+int ajp14_marshal_login_init_into_msgb(jk_msg_buf_t *msg,
+ jk_login_service_t *s, jk_logger_t *l)
+{
+ JK_TRACE_ENTER(l);
+ /* To be on the safe side */
+ jk_b_reset(msg);
+
+ /*
+ * LOGIN
+ */
+ if (jk_b_append_byte(msg, AJP14_LOGINIT_CMD)) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ /*
+ * NEGOCIATION FLAGS
+ */
+ if (jk_b_append_long(msg, s->negociation)) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ /*
+ * WEB-SERVER NAME
+ */
+ if (jk_b_append_string(msg, s->web_server_name)) {
+ jk_log(l, JK_LOG_ERROR,
+ "failed appending the web_server_name string");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+
+/*
+ * Decode the Login Seed Command
+ *
+ * +-------------------------+---------------------------+
+ * | LOGIN SEED CMD (1 byte) | MD5 of entropy (32 chars) |
+ * +-------------------------+---------------------------+
+ *
+ */
+
+int ajp14_unmarshal_login_seed(jk_msg_buf_t *msg,
+ jk_login_service_t *s, jk_logger_t *l)
+{
+ JK_TRACE_ENTER(l);
+
+ if (jk_b_get_bytes
+ (msg, (unsigned char *)s->entropy, AJP14_ENTROPY_SEED_LEN) < 0) {
+ jk_log(l, JK_LOG_ERROR,
+ "can't get seed");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ s->entropy[AJP14_ENTROPY_SEED_LEN] = 0; /* Just to have a CString */
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+/*
+ * Build the Login Computed Command
+ *
+ * +-------------------------+---------------------------------------+
+ * | LOGIN COMP CMD (1 byte) | MD5 of RANDOM + SECRET KEY (32 chars) |
+ * +-------------------------+---------------------------------------+
+ *
+ */
+
+int ajp14_marshal_login_comp_into_msgb(jk_msg_buf_t *msg,
+ jk_login_service_t *s, jk_logger_t *l)
+{
+ JK_TRACE_ENTER(l);
+
+ /* To be on the safe side */
+ jk_b_reset(msg);
+
+ /*
+ * LOGIN
+ */
+ if (jk_b_append_byte(msg, AJP14_LOGCOMP_CMD)) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ /*
+ * COMPUTED-SEED
+ */
+ if (jk_b_append_bytes
+ (msg, (const unsigned char *)s->computed_key,
+ AJP14_COMPUTED_KEY_LEN)) {
+ jk_log(l, JK_LOG_ERROR,
+ "failed appending the COMPUTED MD5 bytes");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+
+/*
+ * Decode the LogOk Command
+ *
+ * +--------------------+------------------------+-------------------------------+
+ * | LOGOK CMD (1 byte) | NEGOCIED DATA (32bits) | SERVLET ENGINE INFO (CString) |
+ * +--------------------+------------------------+-------------------------------+
+ *
+ */
+
+int ajp14_unmarshal_log_ok(jk_msg_buf_t *msg,
+ jk_login_service_t *s, jk_logger_t *l)
+{
+ unsigned long nego;
+ char *sname;
+
+ JK_TRACE_ENTER(l);
+
+ nego = jk_b_get_long(msg);
+
+ if (nego == 0xFFFFFFFF) {
+ jk_log(l, JK_LOG_ERROR,
+ "can't get negociated data");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ sname = (char *)jk_b_get_string(msg);
+
+ if (!sname) {
+ jk_log(l, JK_LOG_ERROR,
+ "can't get servlet engine name");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ if (s->servlet_engine_name) /* take care of removing previously allocated data */
+ free(s->servlet_engine_name);
+
+ s->servlet_engine_name = strdup(sname);
+
+ if (!s->servlet_engine_name) {
+ jk_log(l, JK_LOG_ERROR,
+ "can't malloc servlet engine name");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+
+/*
+ * Decode the Log Nok Command
+ *
+ * +---------------------+-----------------------+
+ * | LOGNOK CMD (1 byte) | FAILURE CODE (32bits) |
+ * +---------------------+-----------------------+
+ *
+ */
+
+int ajp14_unmarshal_log_nok(jk_msg_buf_t *msg, jk_logger_t *l)
+{
+ unsigned long status;
+
+ JK_TRACE_ENTER(l);
+
+ status = jk_b_get_long(msg);
+
+ if (status == 0xFFFFFFFF) {
+ jk_log(l, JK_LOG_ERROR,
+ "can't get failure code");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ jk_log(l, JK_LOG_INFO, "Can't Log with servlet engine - code %08lx",
+ status);
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+
+/*
+ * Build the Shutdown Cmd
+ *
+ * +-----------------------+---------------------------------------+
+ * | SHUTDOWN CMD (1 byte) | MD5 of RANDOM + SECRET KEY (32 chars) |
+ * +-----------------------+---------------------------------------+
+ *
+ */
+
+int ajp14_marshal_shutdown_into_msgb(jk_msg_buf_t *msg,
+ jk_login_service_t *s, jk_logger_t *l)
+{
+
+ JK_TRACE_ENTER(l);
+
+ /* To be on the safe side */
+ jk_b_reset(msg);
+
+ /*
+ * SHUTDOWN CMD
+ */
+ if (jk_b_append_byte(msg, AJP14_SHUTDOWN_CMD)) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ /*
+ * COMPUTED-SEED
+ */
+ if (jk_b_append_bytes
+ (msg, (const unsigned char *)s->computed_key,
+ AJP14_COMPUTED_KEY_LEN)) {
+ jk_log(l, JK_LOG_ERROR,
+ "failed appending the COMPUTED MD5 bytes");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+/*
+ * Decode the Shutdown Nok Command
+ *
+ * +----------------------+-----------------------+
+ * | SHUTNOK CMD (1 byte) | FAILURE CODE (32bits) |
+ * +----------------------+-----------------------+
+ *
+ */
+int ajp14_unmarshal_shutdown_nok(jk_msg_buf_t *msg, jk_logger_t *l)
+{
+ unsigned long status;
+
+ JK_TRACE_ENTER(l);
+ status = jk_b_get_long(msg);
+
+ if (status == 0xFFFFFFFF) {
+ jk_log(l, JK_LOG_ERROR,
+ "can't get failure code");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ jk_log(l, JK_LOG_INFO, "Can't shutdown servlet engine - code %08lx",
+ status);
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+/*
+ * Build the Unknown Packet
+ *
+ * +-----------------------------+---------------------------------+------------------------------+
+ * | UNKNOWN PACKET CMD (1 byte) | UNHANDLED MESSAGE SIZE (16bits) | UNHANDLED MESSAGE (bytes...) |
+ * +-----------------------------+---------------------------------+------------------------------+
+ *
+ */
+
+int ajp14_marshal_unknown_packet_into_msgb(jk_msg_buf_t *msg,
+ jk_msg_buf_t *unk, jk_logger_t *l)
+{
+ JK_TRACE_ENTER(l);
+
+ /* To be on the safe side */
+ jk_b_reset(msg);
+
+ /*
+ * UNKNOWN PACKET CMD
+ */
+ if (jk_b_append_byte(msg, AJP14_UNKNOW_PACKET_CMD)) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ /*
+ * UNHANDLED MESSAGE SIZE
+ */
+ if (jk_b_append_int(msg, (unsigned short)unk->len)) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ /*
+ * UNHANDLED MESSAGE (Question : Did we have to send all the message or only part of)
+ * ( ie: only 1k max )
+ */
+ if (jk_b_append_bytes(msg, unk->buf, unk->len)) {
+ jk_log(l, JK_LOG_ERROR,
+ "failed appending the UNHANDLED MESSAGE");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+/*
+ * Build the Context Query Cmd (autoconf)
+ *
+ * +--------------------------+---------------------------------+
+ * | CONTEXT QRY CMD (1 byte) | VIRTUAL HOST NAME (CString (*)) |
+ * +--------------------------+---------------------------------+
+ *
+ */
+
+int ajp14_marshal_context_query_into_msgb(jk_msg_buf_t *msg,
+ char *virtual, jk_logger_t *l)
+{
+ JK_TRACE_ENTER(l);
+
+ /* To be on the safe side */
+ jk_b_reset(msg);
+
+ /*
+ * CONTEXT QUERY CMD
+ */
+ if (jk_b_append_byte(msg, AJP14_CONTEXT_QRY_CMD)) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ /*
+ * VIRTUAL HOST CSTRING
+ */
+ if (jk_b_append_string(msg, virtual)) {
+ jk_log(l, JK_LOG_ERROR,
+ "failed appending the virtual host string");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+
+/*
+ * Decode the Context Info Cmd (Autoconf)
+ *
+ * The Autoconf feature of AJP14, let us know which URL/URI could
+ * be handled by the servlet-engine
+ *
+ * +---------------------------+---------------------------------+----------------------------+-------------------------------+-----------+
+ * | CONTEXT INFO CMD (1 byte) | VIRTUAL HOST NAME (CString (*)) | CONTEXT NAME (CString (*)) | URL1 [\n] URL2 [\n] URL3 [\n] | NEXT CTX. |
+ * +---------------------------+---------------------------------+----------------------------+-------------------------------+-----------+
+ */
+
+int ajp14_unmarshal_context_info(jk_msg_buf_t *msg,
+ jk_context_t *c, jk_logger_t *l)
+{
+ char *vname;
+ char *cname;
+ char *uri;
+
+ vname = (char *)jk_b_get_string(msg);
+
+ JK_TRACE_ENTER(l);
+ jk_log(l, JK_LOG_DEBUG,
+ "get virtual %s for virtual %s",
+ vname, c->virt);
+
+ if (!vname) {
+ jk_log(l, JK_LOG_ERROR,
+ "can't get virtual hostname");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ /* Check if we get the correct virtual host */
+ if (c->virt != NULL && vname != NULL && strcmp(c->virt, vname)) {
+ /* set the virtual name, better to add to a virtual list ? */
+
+ if (context_set_virtual(c, vname) == JK_FALSE) {
+ jk_log(l, JK_LOG_ERROR,
+ "can't malloc virtual hostname");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ }
+
+ for (;;) {
+
+ cname = (char *)jk_b_get_string(msg);
+
+ if (!cname) {
+ jk_log(l, JK_LOG_ERROR,
+ "can't get context");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ jk_log(l, JK_LOG_DEBUG,
+ "get context %s for virtual %s",
+ cname, vname);
+
+ /* grab all contexts up to empty one which indicate end of contexts */
+ if (!strlen(cname))
+ break;
+
+ /* create new context base (if needed) */
+
+ if (context_add_base(c, cname) == JK_FALSE) {
+ jk_log(l, JK_LOG_ERROR,
+ "can't add/set context %s",
+ cname);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ for (;;) {
+
+ uri = (char *)jk_b_get_string(msg);
+
+ if (!uri) {
+ jk_log(l, JK_LOG_ERROR,
+ "can't get URI");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ if (!strlen(uri)) {
+ jk_log(l, JK_LOG_DEBUG, "No more URI for context %s", cname);
+ break;
+ }
+
+ jk_log(l, JK_LOG_INFO,
+ "Got URI (%s) for virtualhost %s and context %s", uri,
+ vname, cname);
+
+ if (context_add_uri(c, cname, uri) == JK_FALSE) {
+ jk_log(l, JK_LOG_ERROR,
+ "can't add/set uri (%s) for context %s",
+ uri, cname);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ }
+ }
+
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+
+/*
+ * Build the Context State Query Cmd
+ *
+ * We send the list of contexts where we want to know state, empty string end context list*
+ * If cname is set, only ask about THIS context
+ *
+ * +----------------------------+----------------------------------+----------------------------+----+
+ * | CONTEXT STATE CMD (1 byte) | VIRTUAL HOST NAME (CString (*)) | CONTEXT NAME (CString (*)) | .. |
+ * +----------------------------+----------------------------------+----------------------------+----+
+ *
+ */
+
+int ajp14_marshal_context_state_into_msgb(jk_msg_buf_t *msg,
+ jk_context_t *c,
+ char *cname, jk_logger_t *l)
+{
+ jk_context_item_t *ci;
+ int i;
+
+ JK_TRACE_ENTER(l);
+
+ /* To be on the safe side */
+ jk_b_reset(msg);
+
+ /*
+ * CONTEXT STATE CMD
+ */
+ if (jk_b_append_byte(msg, AJP14_CONTEXT_STATE_CMD)) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ /*
+ * VIRTUAL HOST CSTRING
+ */
+ if (jk_b_append_string(msg, c->virt)) {
+ jk_log(l, JK_LOG_ERROR,
+ "failed appending the virtual host string");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ if (cname) {
+
+ ci = context_find_base(c, cname);
+
+ if (!ci) {
+ jk_log(l, JK_LOG_ERROR,
+ "unknown context %s",
+ cname);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ /*
+ * CONTEXT CSTRING
+ */
+
+ if (jk_b_append_string(msg, cname)) {
+ jk_log(l, JK_LOG_ERROR,
+ "failed appending the context string %s",
+ cname);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ }
+ else { /* Grab all contexts name */
+
+ for (i = 0; i < c->size; i++) {
+
+ /*
+ * CONTEXT CSTRING
+ */
+ if (jk_b_append_string(msg, c->contexts[i]->cbase)) {
+ jk_log(l, JK_LOG_ERROR,
+ "failed appending the context string %s",
+ c->contexts[i]->cbase);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ }
+ }
+
+ /* End of context list, an empty string */
+
+ if (jk_b_append_string(msg, "")) {
+ jk_log(l, JK_LOG_ERROR,
+ "failed appending end of contexts");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+
+/*
+ * Decode the Context State Reply Cmd
+ *
+ * We get update of contexts list, empty string end context list*
+ *
+ * +----------------------------------+---------------------------------+----------------------------+------------------+----+
+ * | CONTEXT STATE REPLY CMD (1 byte) | VIRTUAL HOST NAME (CString (*)) | CONTEXT NAME (CString (*)) | UP/DOWN (1 byte) | .. |
+ * +----------------------------------+---------------------------------+----------------------------+------------------+----+
+ *
+ */
+
+int ajp14_unmarshal_context_state_reply(jk_msg_buf_t *msg,
+ jk_context_t *c, jk_logger_t *l)
+{
+ char *vname;
+ char *cname;
+ jk_context_item_t *ci;
+
+ JK_TRACE_ENTER(l);
+ /* get virtual name */
+ vname = (char *)jk_b_get_string(msg);
+
+ if (!vname) {
+ jk_log(l, JK_LOG_ERROR,
+ "can't get virtual hostname");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ /* Check if we speak about the correct virtual */
+ if (strcmp(c->virt, vname)) {
+ jk_log(l, JK_LOG_ERROR,
+ "incorrect virtual %s instead of %s",
+ vname, c->virt);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ for (;;) {
+
+ /* get context name */
+ cname = (char *)jk_b_get_string(msg);
+
+ if (!cname) {
+ jk_log(l, JK_LOG_ERROR,
+ "can't get context");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ if (!strlen(cname))
+ break;
+
+ ci = context_find_base(c, cname);
+
+ if (!ci) {
+ jk_log(l, JK_LOG_ERROR,
+ "unknow context %s for virtual %s",
+ cname, vname);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ ci->status = jk_b_get_int(msg);
+
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "updated context %s to state %d",
+ cname, ci->status);
+ }
+
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+/*
+ * Decode the Context Update Cmd
+ *
+ * +-----------------------------+---------------------------------+----------------------------+------------------+
+ * | CONTEXT UPDATE CMD (1 byte) | VIRTUAL HOST NAME (CString (*)) | CONTEXT NAME (CString (*)) | UP/DOWN (1 byte) |
+ * +-----------------------------+---------------------------------+----------------------------+------------------+
+ *
+ */
+
+int ajp14_unmarshal_context_update_cmd(jk_msg_buf_t *msg,
+ jk_context_t *c, jk_logger_t *l)
+{
+ int rc;
+ JK_TRACE_ENTER(l);
+ rc = ajp14_unmarshal_context_state_reply(msg, c, l);
+ JK_TRACE_EXIT(l);
+ return rc;
+}
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14.h
new file mode 100644
index 00000000..58a5a4de
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14.h
@@ -0,0 +1,307 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: Next generation bi-directional protocol handler. *
+ * Author: Henri Gomez <hgomez@apache.org> *
+ * Version: $Revision: 466585 $ *
+ ***************************************************************************/
+#ifndef JK_AJP14_H
+#define JK_AJP14_H
+
+#include "jk_ajp_common.h"
+#include "jk_context.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+#define AJP14_PROTO 14
+
+#define AJP14_WS_HEADER 0x1235
+#define AJP14_SW_HEADER 0x1235 /* AJP14 use now the same header in both directions */
+
+#define AJP14_DEF_HOST ("localhost")
+#define AJP14_DEF_PORT (8011)
+#define AJP14_READ_BUF_SIZE (8*1024)
+#define AJP14_DEF_RETRY_ATTEMPTS (1)
+#define AJP14_DEF_CACHE_SZ (1)
+#define AJP14_MAX_SEND_BODY_SZ (DEF_BUFFER_SZ - 6)
+#define AJP14_HEADER_LEN (4)
+#define AJP14_HEADER_SZ_LEN (2)
+
+/*
+ * Initial Login Phase (web server -> servlet engine)
+ */
+#define AJP14_LOGINIT_CMD (unsigned char)0x10
+
+/*
+ * Second Login Phase (servlet engine -> web server), md5 seed is received
+ */
+#define AJP14_LOGSEED_CMD (unsigned char)0x11
+
+/*
+ * Third Login Phase (web server -> servlet engine), md5 of seed + secret is sent
+ */
+#define AJP14_LOGCOMP_CMD (unsigned char)0x12
+
+/*
+ * Login Accepted (servlet engine -> web server)
+ */
+#define AJP14_LOGOK_CMD (unsigned char)0x13
+
+/*
+ * Login Rejected (servlet engine -> web server), will be logged
+ */
+#define AJP14_LOGNOK_CMD (unsigned char)0x14
+
+/*
+ * Context Query (web server -> servlet engine), which URI are handled by servlet engine ?
+ */
+#define AJP14_CONTEXT_QRY_CMD (unsigned char)0x15
+
+/*
+ * Context Info (servlet engine -> web server), URI handled response
+ */
+#define AJP14_CONTEXT_INFO_CMD (unsigned char)0x16
+
+/*
+ * Context Update (servlet engine -> web server), status of context changed
+ */
+#define AJP14_CONTEXT_UPDATE_CMD (unsigned char)0x17
+
+/*
+ * Servlet Engine Status (web server -> servlet engine), what's the status of the servlet engine ?
+ */
+#define AJP14_STATUS_CMD (unsigned char)0x18
+
+/*
+ * Secure Shutdown command (web server -> servlet engine), please servlet stop yourself.
+ */
+#define AJP14_SHUTDOWN_CMD (unsigned char)0x19
+
+/*
+ * Secure Shutdown command Accepted (servlet engine -> web server)
+ */
+#define AJP14_SHUTOK_CMD (unsigned char)0x1A
+
+/*
+ * Secure Shutdown Rejected (servlet engine -> web server)
+ */
+#define AJP14_SHUTNOK_CMD (unsigned char)0x1B
+
+/*
+ * Context Status (web server -> servlet engine), what's the status of the context ?
+ */
+#define AJP14_CONTEXT_STATE_CMD (unsigned char)0x1C
+
+/*
+ * Context Status Reply (servlet engine -> web server), status of context
+ */
+#define AJP14_CONTEXT_STATE_REP_CMD (unsigned char)0x1D
+
+/*
+ * Unknown Packet Reply (web server <-> servlet engine), when a packet couldn't be decoded
+ */
+#define AJP14_UNKNOW_PACKET_CMD (unsigned char)0x1E
+
+
+/*
+ * Negociation flags
+ */
+
+/*
+ * web-server want context info after login
+ */
+#define AJP14_CONTEXT_INFO_NEG 0x80000000
+
+/*
+ * web-server want context updates
+ */
+#define AJP14_CONTEXT_UPDATE_NEG 0x40000000
+
+/*
+ * web-server want compressed stream
+ */
+#define AJP14_GZIP_STREAM_NEG 0x20000000
+
+/*
+ * web-server want crypted DES56 stream with secret key
+ */
+#define AJP14_DES56_STREAM_NEG 0x10000000
+
+/*
+ * Extended info on server SSL vars
+ */
+#define AJP14_SSL_VSERVER_NEG 0x08000000
+
+/*
+ *Extended info on client SSL vars
+ */
+#define AJP14_SSL_VCLIENT_NEG 0x04000000
+
+/*
+ * Extended info on crypto SSL vars
+ */
+#define AJP14_SSL_VCRYPTO_NEG 0x02000000
+
+/*
+ * Extended info on misc SSL vars
+ */
+#define AJP14_SSL_VMISC_NEG 0x01000000
+
+/*
+ * mask of protocol supported
+ */
+#define AJP14_PROTO_SUPPORT_AJPXX_NEG 0x00FF0000
+
+/*
+ * communication could use AJP14
+ */
+#define AJP14_PROTO_SUPPORT_AJP14_NEG 0x00010000
+
+/*
+ * communication could use AJP15
+ */
+#define AJP14_PROTO_SUPPORT_AJP15_NEG 0x00020000
+
+/*
+ * communication could use AJP16
+ */
+#define AJP14_PROTO_SUPPORT_AJP16_NEG 0x00040000
+
+/*
+ * Some failure codes
+ */
+#define AJP14_BAD_KEY_ERR 0xFFFFFFFF
+#define AJP14_ENGINE_DOWN_ERR 0xFFFFFFFE
+#define AJP14_RETRY_LATER_ERR 0xFFFFFFFD
+#define AJP14_SHUT_AUTHOR_FAILED_ERR 0xFFFFFFFC
+
+/*
+ * Some status codes
+ */
+#define AJP14_CONTEXT_DOWN 0x01
+#define AJP14_CONTEXT_UP 0x02
+#define AJP14_CONTEXT_OK 0x03
+
+/*
+ * Misc defines
+ */
+#define AJP14_ENTROPY_SEED_LEN 32 /* we're using MD5 => 32 chars */
+#define AJP14_COMPUTED_KEY_LEN 32 /* we're using MD5 also */
+
+/*
+ * The login structure
+ */
+typedef struct jk_login_service jk_login_service_t;
+
+struct jk_login_service
+{
+
+ /*
+ * Pointer to web-server name
+ */
+ const char *web_server_name;
+
+ /*
+ * Pointer to servlet-engine name
+ */
+ char *servlet_engine_name;
+
+ /*
+ * Pointer to secret key
+ */
+ const char *secret_key;
+
+ /*
+ * Received entropy seed
+ */
+ char entropy[AJP14_ENTROPY_SEED_LEN + 1];
+
+ /*
+ * Computed key
+ */
+ char computed_key[AJP14_COMPUTED_KEY_LEN + 1];
+
+ /*
+ * What we want to negociate
+ */
+ unsigned long negociation;
+
+ /*
+ * What we received from servlet engine
+ */
+ unsigned long negociated;
+};
+
+/*
+ * functions defined here
+ */
+
+void ajp14_compute_md5(jk_login_service_t *s, jk_logger_t *l);
+
+int ajp14_marshal_login_init_into_msgb(jk_msg_buf_t *msg,
+ jk_login_service_t *s,
+ jk_logger_t *l);
+
+int ajp14_unmarshal_login_seed(jk_msg_buf_t *msg,
+ jk_login_service_t *s, jk_logger_t *l);
+
+int ajp14_marshal_login_comp_into_msgb(jk_msg_buf_t *msg,
+ jk_login_service_t *s,
+ jk_logger_t *l);
+
+int ajp14_unmarshal_log_ok(jk_msg_buf_t *msg,
+ jk_login_service_t *s, jk_logger_t *l);
+
+int ajp14_unmarshal_log_nok(jk_msg_buf_t *msg, jk_logger_t *l);
+
+int ajp14_marshal_shutdown_into_msgb(jk_msg_buf_t *msg,
+ jk_login_service_t *s,
+ jk_logger_t *l);
+
+int ajp14_unmarshal_shutdown_nok(jk_msg_buf_t *msg, jk_logger_t *l);
+
+int ajp14_marshal_unknown_packet_into_msgb(jk_msg_buf_t *msg,
+ jk_msg_buf_t *unk,
+ jk_logger_t *l);
+
+int ajp14_marshal_context_query_into_msgb(jk_msg_buf_t *msg,
+ char *virtual, jk_logger_t *l);
+
+int ajp14_unmarshal_context_info(jk_msg_buf_t *msg,
+ jk_context_t *context, jk_logger_t *l);
+
+int ajp14_marshal_context_state_into_msgb(jk_msg_buf_t *msg,
+ jk_context_t *context,
+ char *cname, jk_logger_t *l);
+
+int ajp14_unmarshal_context_state_reply(jk_msg_buf_t *msg,
+ jk_context_t *context,
+ jk_logger_t *l);
+
+int ajp14_unmarshal_context_update_cmd(jk_msg_buf_t *msg,
+ jk_context_t *context,
+ jk_logger_t *l);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* JK_AJP14_H */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14.lo
new file mode 100644
index 00000000..3613a169
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14.lo
@@ -0,0 +1,12 @@
+# jk_ajp14.lo - a libtool object file
+# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18)
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/jk_ajp14.o'
+
+# Name of the non-PIC object.
+non_pic_object='jk_ajp14.o'
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14.o
new file mode 100644
index 00000000..f3f783c5
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14_worker.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14_worker.c
new file mode 100644
index 00000000..639fb11c
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14_worker.c
@@ -0,0 +1,404 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: AJP14 next generation Bi-directional protocol. *
+ * Author: Henri Gomez <hgomez@apache.org> *
+ * Version: $Revision: 611589 $ *
+ ***************************************************************************/
+
+#include "jk_context.h"
+#include "jk_ajp14_worker.h"
+
+
+/*
+ * AJP14 Autoconf Phase
+ *
+ * CONTEXT QUERY / REPLY
+ */
+
+#define MAX_URI_SIZE 512
+
+static int handle_discovery(ajp_endpoint_t * ae,
+ jk_worker_env_t *we,
+ jk_msg_buf_t *msg, jk_logger_t *l)
+{
+ int cmd;
+ int i, j;
+#if 0
+ /* Not used for now */
+ jk_login_service_t *jl = ae->worker->login;
+#endif
+ jk_context_item_t *ci;
+ jk_context_t *c;
+ char *buf;
+
+#ifndef TESTME
+ JK_TRACE_ENTER(l);
+
+ ajp14_marshal_context_query_into_msgb(msg, we->virtual, l);
+
+ jk_log(l, JK_LOG_DEBUG, "send query");
+
+ if (ajp_connection_tcp_send_message(ae, msg, l) != JK_TRUE) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ jk_log(l, JK_LOG_DEBUG, "wait context reply");
+
+ jk_b_reset(msg);
+
+ if (ajp_connection_tcp_get_message(ae, msg, l) != JK_TRUE) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ if ((cmd = jk_b_get_byte(msg)) != AJP14_CONTEXT_INFO_CMD) {
+ jk_log(l, JK_LOG_ERROR,
+ "awaited command %d, received %d",
+ AJP14_CONTEXT_INFO_CMD, cmd);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ if (context_alloc(&c, we->virtual) != JK_TRUE) {
+ jk_log(l, JK_LOG_ERROR,
+ "can't allocate context room");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ if (ajp14_unmarshal_context_info(msg, c, l) != JK_TRUE) {
+ jk_log(l, JK_LOG_ERROR,
+ "can't get context reply");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ jk_log(l, JK_LOG_DEBUG, "received context");
+
+ buf = malloc(MAX_URI_SIZE); /* Really a very long URI */
+
+ if (!buf) {
+ jk_log(l, JK_LOG_ERROR, "can't malloc buf");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ for (i = 0; i < c->size; i++) {
+ ci = c->contexts[i];
+ for (j = 0; j < ci->size; j++) {
+
+#ifndef USE_SPRINTF
+ snprintf(buf, MAX_URI_SIZE - 1, "/%s/%s", ci->cbase, ci->uris[j]);
+#else
+ sprintf(buf, "/%s/%s", ci->cbase, ci->uris[j]);
+#endif
+
+ jk_log(l, JK_LOG_INFO,
+ "worker %s will handle uri %s in context %s [%s]",
+ ae->worker->name, ci->uris[j], ci->cbase, buf);
+
+ uri_worker_map_add(we->uri_to_worker, buf, ae->worker->name, SOURCE_TYPE_DISCOVER, l);
+ }
+ }
+
+ free(buf);
+ context_free(&c);
+
+#else
+
+ uri_worker_map_add(we->uri_to_worker, "/examples/servlet/*",
+ ae->worker->name, SOURCE_TYPE_DISCOVER, l);
+ uri_worker_map_add(we->uri_to_worker, "/examples/*.jsp", ae->worker->name,
+ SOURCE_TYPE_DISCOVER, l);
+ uri_worker_map_add(we->uri_to_worker, "/examples/*.gif", ae->worker->name,
+ SOURCE_TYPE_DISCOVER, l);
+
+#endif
+
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+/*
+ * AJP14 Logon Phase
+ *
+ * INIT + REPLY / NEGO + REPLY
+ */
+
+static int handle_logon(ajp_endpoint_t * ae,
+ jk_msg_buf_t *msg, jk_logger_t *l)
+{
+ int cmd;
+
+ jk_login_service_t *jl = ae->worker->login;
+ JK_TRACE_ENTER(l);
+
+ ajp14_marshal_login_init_into_msgb(msg, jl, l);
+
+ jk_log(l, JK_LOG_DEBUG, "send init");
+
+ if (ajp_connection_tcp_send_message(ae, msg, l) != JK_TRUE) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ jk_log(l, JK_LOG_DEBUG, "wait init reply");
+
+ jk_b_reset(msg);
+
+ if (ajp_connection_tcp_get_message(ae, msg, l) != JK_TRUE) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ if ((cmd = jk_b_get_byte(msg)) != AJP14_LOGSEED_CMD) {
+ jk_log(l, JK_LOG_ERROR,
+ "awaited command %d, received %d",
+ AJP14_LOGSEED_CMD, cmd);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ if (ajp14_unmarshal_login_seed(msg, jl, l) != JK_TRUE) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ jk_log(l, JK_LOG_DEBUG, "received entropy %s",
+ jl->entropy);
+
+ ajp14_compute_md5(jl, l);
+
+ if (ajp14_marshal_login_comp_into_msgb(msg, jl, l) != JK_TRUE) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ if (ajp_connection_tcp_send_message(ae, msg, l) != JK_TRUE) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ jk_b_reset(msg);
+
+ if (ajp_connection_tcp_get_message(ae, msg, l) != JK_TRUE) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ switch (jk_b_get_byte(msg)) {
+
+ case AJP14_LOGOK_CMD:
+ if (ajp14_unmarshal_log_ok(msg, jl, l) == JK_TRUE) {
+ jk_log(l, JK_LOG_DEBUG,
+ "Successfully connected to servlet-engine %s",
+ jl->servlet_engine_name);
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+ break;
+
+ case AJP14_LOGNOK_CMD:
+ ajp14_unmarshal_log_nok(msg, l);
+ break;
+ }
+
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+}
+
+static int logon(ajp_endpoint_t * ae, jk_logger_t *l)
+{
+ jk_pool_t *p = &ae->pool;
+ jk_msg_buf_t *msg;
+ int rc;
+
+ JK_TRACE_ENTER(l);
+
+ msg = jk_b_new(p);
+ jk_b_set_buffer_size(msg, DEF_BUFFER_SZ);
+
+ if ((rc = handle_logon(ae, msg, l)) == JK_FALSE)
+ ajp_close_endpoint(ae, l);
+
+ JK_TRACE_EXIT(l);
+ return rc;
+}
+
+static int discovery(ajp_endpoint_t * ae, jk_worker_env_t *we, jk_logger_t *l)
+{
+ jk_pool_t *p = &ae->pool;
+ jk_msg_buf_t *msg;
+ int rc;
+
+ JK_TRACE_ENTER(l);
+
+ msg = jk_b_new(p);
+ jk_b_set_buffer_size(msg, DEF_BUFFER_SZ);
+
+ if ((rc = handle_discovery(ae, we, msg, l)) == JK_FALSE)
+ ajp_close_endpoint(ae, l);
+
+ JK_TRACE_EXIT(l);
+ return rc;
+}
+
+/* -------------------- Method -------------------- */
+static int JK_METHOD validate(jk_worker_t *pThis,
+ jk_map_t *props,
+ jk_worker_env_t *we, jk_logger_t *l)
+{
+ ajp_worker_t *aw;
+ const char *secret_key;
+
+ JK_TRACE_ENTER(l);
+ if (ajp_validate(pThis, props, we, l, AJP14_PROTO) == JK_FALSE) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ aw = pThis->worker_private;
+
+ secret_key = jk_get_worker_secret_key(props, aw->name);
+
+ if ((!secret_key) || (!strlen(secret_key))) {
+ jk_log(l, JK_LOG_ERROR,
+ "validate error, empty or missing secretkey");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ /* jk_log(l, JK_LOG_DEBUG, "Into ajp14:validate - secret_key=%s", secret_key); */
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+static int JK_METHOD get_endpoint(jk_worker_t *pThis,
+ jk_endpoint_t **pend, jk_logger_t *l)
+{
+ int rc;
+ JK_TRACE_ENTER(l);
+ rc = ajp_get_endpoint(pThis, pend, l, AJP14_PROTO);
+ JK_TRACE_EXIT(l);
+ return rc;
+}
+
+static int JK_METHOD init(jk_worker_t *pThis,
+ jk_map_t *props,
+ jk_worker_env_t *we, jk_logger_t *l)
+{
+ ajp_worker_t *aw;
+ ajp_endpoint_t *ae;
+ jk_endpoint_t *je;
+ int rc;
+
+ JK_TRACE_EXIT(l);
+
+ if (ajp_init(pThis, props, we, l, AJP14_PROTO) == JK_FALSE) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ aw = pThis->worker_private;
+
+ /* Set Secret Key (used at logon time) */
+ aw->login->secret_key = jk_get_worker_secret_key(props, aw->name);
+
+ if (aw->login->secret_key == NULL) {
+ jk_log(l, JK_LOG_ERROR, "can't malloc secret_key");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ /* Set WebServerName (used at logon time) */
+ aw->login->web_server_name = strdup(we->server_name);
+
+ if (aw->login->web_server_name == NULL) {
+ jk_log(l, JK_LOG_ERROR, "can't malloc web_server_name");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ if (get_endpoint(pThis, &je, l) == JK_FALSE) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ ae = je->endpoint_private;
+
+ if (ajp_connect_to_endpoint(ae, l) == JK_TRUE) {
+
+ /* connection stage passed - try to get context info
+ * this is the long awaited autoconf feature :)
+ */
+ rc = discovery(ae, we, l);
+ ajp_close_endpoint(ae, l);
+ JK_TRACE_EXIT(l);
+ return rc;
+ }
+
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+
+static int JK_METHOD destroy(jk_worker_t **pThis, jk_logger_t *l)
+{
+ int rc;
+ ajp_worker_t *aw = (*pThis)->worker_private;
+
+ JK_TRACE_ENTER(l);
+
+ if (aw->login) {
+ free(aw->login);
+ aw->login = NULL;
+ }
+
+ rc = ajp_destroy(pThis, l, AJP14_PROTO);
+ JK_TRACE_EXIT(l);
+ return rc;
+}
+
+int JK_METHOD ajp14_worker_factory(jk_worker_t **w,
+ const char *name, jk_logger_t *l)
+{
+ ajp_worker_t *aw;
+
+ JK_TRACE_ENTER(l);
+ if (ajp_worker_factory(w, name, l) == JK_FALSE)
+ return 0;
+
+ aw = (*w)->worker_private;
+ aw->proto = AJP14_PROTO;
+
+ aw->login = (jk_login_service_t *)malloc(sizeof(jk_login_service_t));
+
+ if (aw->login == NULL) {
+ jk_log(l, JK_LOG_ERROR,
+ "malloc failed for login area");
+ JK_TRACE_EXIT(l);
+ return 0;
+ }
+
+ memset(aw->login, 0, sizeof(jk_login_service_t));
+
+ aw->login->negociation =
+ (AJP14_CONTEXT_INFO_NEG | AJP14_PROTO_SUPPORT_AJP14_NEG);
+ aw->login->web_server_name = NULL; /* must be set in init */
+
+ aw->worker.validate = validate;
+ aw->worker.init = init;
+ aw->worker.get_endpoint = get_endpoint;
+ aw->worker.destroy = destroy;
+
+ aw->logon = logon; /* LogOn Handler for AJP14 */
+
+ JK_TRACE_EXIT(l);
+ return JK_AJP14_WORKER_TYPE;
+}
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14_worker.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14_worker.h
new file mode 100644
index 00000000..3d5c7973
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14_worker.h
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: ajpv14 worker header file *
+ * Author: Henri Gomez <hgomez@apache.org> *
+ * Version: $Revision: 466585 $ *
+ ***************************************************************************/
+
+#ifndef JK_AJP14_WORKER_H
+#define JK_AJP14_WORKER_H
+
+#include "jk_pool.h"
+#include "jk_connect.h"
+#include "jk_util.h"
+#include "jk_msg_buff.h"
+#include "jk_ajp13.h"
+#include "jk_ajp14.h"
+#include "jk_logger.h"
+#include "jk_service.h"
+#include "jk_ajp13_worker.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+#define JK_AJP14_WORKER_NAME ("ajp14")
+#define JK_AJP14_WORKER_TYPE (3)
+
+int JK_METHOD ajp14_worker_factory(jk_worker_t **w,
+ const char *name, jk_logger_t *l);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* JK_AJP14_WORKER_H */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14_worker.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14_worker.lo
new file mode 100644
index 00000000..cfd049e1
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14_worker.lo
@@ -0,0 +1,12 @@
+# jk_ajp14_worker.lo - a libtool object file
+# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18)
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/jk_ajp14_worker.o'
+
+# Name of the non-PIC object.
+non_pic_object='jk_ajp14_worker.o'
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14_worker.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14_worker.o
new file mode 100644
index 00000000..604ad3b1
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp14_worker.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp_common.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp_common.c
new file mode 100644
index 00000000..7b083264
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp_common.c
@@ -0,0 +1,3383 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: common stuff for bi-directional protocols ajp13/ajp14. *
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Author: Henri Gomez <hgomez@apache.org> *
+ * Version: $Revision: 1137200 $ *
+ ***************************************************************************/
+
+
+#include "jk_global.h"
+#include "jk_util.h"
+#include "jk_ajp13.h"
+#include "jk_ajp14.h"
+#include "jk_ajp_common.h"
+#include "jk_connect.h"
+#if defined(AS400) && !defined(AS400_UTF8)
+#include "util_ebcdic.h"
+#endif
+#if defined(NETWARE) && defined(__NOVELL_LIBC__)
+#include "novsock2.h"
+#endif
+
+const char *response_trans_headers[] = {
+ "Content-Type",
+ "Content-Language",
+ "Content-Length",
+ "Date",
+ "Last-Modified",
+ "Location",
+ "Set-Cookie",
+ "Set-Cookie2",
+ "Servlet-Engine",
+ "Status",
+ "WWW-Authenticate"
+};
+
+static const char *long_res_header_for_sc(int sc)
+{
+ const char *rc = NULL;
+ sc = sc & 0X00FF;
+ if (sc <= SC_RES_HEADERS_NUM && sc > 0) {
+ rc = response_trans_headers[sc - 1];
+ }
+
+ return rc;
+}
+
+static const char *ajp_state_type[] = {
+ JK_AJP_STATE_TEXT_IDLE,
+ JK_AJP_STATE_TEXT_OK,
+ JK_AJP_STATE_TEXT_ERROR,
+ JK_AJP_STATE_TEXT_PROBE,
+ "unknown",
+ NULL
+};
+
+#define UNKNOWN_METHOD (-1)
+
+static int sc_for_req_method(const char *method, size_t len)
+{
+ /* Note: the following code was generated by the "shilka" tool from
+ the "cocom" parsing/compilation toolkit. It is an optimized lookup
+ based on analysis of the input keywords. Postprocessing was done
+ on the shilka output, but the basic structure and analysis is
+ from there. Should new HTTP methods be added, then manual insertion
+ into this code is fine, or simply re-running the shilka tool on
+ the appropriate input. */
+
+ /* Note: it is also quite reasonable to just use our method_registry,
+ but I'm assuming (probably incorrectly) we want more speed here
+ (based on the optimizations the previous code was doing). */
+
+ switch (len)
+ {
+ case 3:
+ switch (method[0])
+ {
+ case 'A':
+ return (method[1] == 'C'
+ && method[2] == 'L'
+ ? SC_M_ACL : UNKNOWN_METHOD);
+ case 'P':
+ return (method[1] == 'U'
+ && method[2] == 'T'
+ ? SC_M_PUT : UNKNOWN_METHOD);
+ case 'G':
+ return (method[1] == 'E'
+ && method[2] == 'T'
+ ? SC_M_GET : UNKNOWN_METHOD);
+ default:
+ return UNKNOWN_METHOD;
+ }
+
+ case 4:
+ switch (method[0])
+ {
+ case 'H':
+ return (method[1] == 'E'
+ && method[2] == 'A'
+ && method[3] == 'D'
+ ? SC_M_HEAD : UNKNOWN_METHOD);
+ case 'P':
+ return (method[1] == 'O'
+ && method[2] == 'S'
+ && method[3] == 'T'
+ ? SC_M_POST : UNKNOWN_METHOD);
+ case 'M':
+ return (method[1] == 'O'
+ && method[2] == 'V'
+ && method[3] == 'E'
+ ? SC_M_MOVE : UNKNOWN_METHOD);
+ case 'L':
+ return (method[1] == 'O'
+ && method[2] == 'C'
+ && method[3] == 'K'
+ ? SC_M_LOCK : UNKNOWN_METHOD);
+ case 'C':
+ return (method[1] == 'O'
+ && method[2] == 'P'
+ && method[3] == 'Y'
+ ? SC_M_COPY : UNKNOWN_METHOD);
+ default:
+ return UNKNOWN_METHOD;
+ }
+
+ case 5:
+ switch (method[2])
+ {
+ case 'R':
+ return (memcmp(method, "MERGE", 5) == 0
+ ? SC_M_MERGE : UNKNOWN_METHOD);
+ case 'C':
+ return (memcmp(method, "MKCOL", 5) == 0
+ ? SC_M_MKCOL : UNKNOWN_METHOD);
+ case 'B':
+ return (memcmp(method, "LABEL", 5) == 0
+ ? SC_M_LABEL : UNKNOWN_METHOD);
+ case 'A':
+ return (memcmp(method, "TRACE", 5) == 0
+ ? SC_M_TRACE : UNKNOWN_METHOD);
+ default:
+ return UNKNOWN_METHOD;
+ }
+
+ case 6:
+ switch (method[0])
+ {
+ case 'U':
+ switch (method[5])
+ {
+ case 'K':
+ return (memcmp(method, "UNLOCK", 6) == 0
+ ? SC_M_UNLOCK : UNKNOWN_METHOD);
+ case 'E':
+ return (memcmp(method, "UPDATE", 6) == 0
+ ? SC_M_UPDATE : UNKNOWN_METHOD);
+ default:
+ return UNKNOWN_METHOD;
+ }
+ case 'R':
+ return (memcmp(method, "REPORT", 6) == 0
+ ? SC_M_REPORT : UNKNOWN_METHOD);
+ case 'S':
+ return (memcmp(method, "SEARCH", 6) == 0
+ ? SC_M_SEARCH : UNKNOWN_METHOD);
+ case 'D':
+ return (memcmp(method, "DELETE", 6) == 0
+ ? SC_M_DELETE : UNKNOWN_METHOD);
+ default:
+ return UNKNOWN_METHOD;
+ }
+
+ case 7:
+ switch (method[1])
+ {
+ case 'P':
+ return (memcmp(method, "OPTIONS", 7) == 0
+ ? SC_M_OPTIONS : UNKNOWN_METHOD);
+ case 'H':
+ return (memcmp(method, "CHECKIN", 7) == 0
+ ? SC_M_CHECKIN : UNKNOWN_METHOD);
+ default:
+ return UNKNOWN_METHOD;
+ }
+
+ case 8:
+ switch (method[0])
+ {
+ case 'P':
+ return (memcmp(method, "PROPFIND", 8) == 0
+ ? SC_M_PROPFIND : UNKNOWN_METHOD);
+ case 'C':
+ return (memcmp(method, "CHECKOUT", 8) == 0
+ ? SC_M_CHECKOUT : UNKNOWN_METHOD);
+ default:
+ return UNKNOWN_METHOD;
+ }
+
+ case 9:
+ return (memcmp(method, "PROPPATCH", 9) == 0
+ ? SC_M_PROPPATCH : UNKNOWN_METHOD);
+
+ case 10:
+ switch (method[0])
+ {
+ case 'U':
+ return (memcmp(method, "UNCHECKOUT", 10) == 0
+ ? SC_M_UNCHECKOUT : UNKNOWN_METHOD);
+ case 'M':
+ return (memcmp(method, "MKACTIVITY", 10) == 0
+ ? SC_M_MKACTIVITY : UNKNOWN_METHOD);
+ default:
+ return UNKNOWN_METHOD;
+ }
+
+ case 11:
+ return (memcmp(method, "MKWORKSPACE", 11) == 0
+ ? SC_M_MKWORKSPACE : UNKNOWN_METHOD);
+
+ case 15:
+ return (memcmp(method, "VERSION-CONTROL", 15) == 0
+ ? SC_M_VERSION_CONTROL : UNKNOWN_METHOD);
+
+ case 16:
+ return (memcmp(method, "BASELINE-CONTROL", 16) == 0
+ ? SC_M_BASELINE_CONTROL : UNKNOWN_METHOD);
+
+ default:
+ return UNKNOWN_METHOD;
+ }
+
+ /* NOTREACHED */
+}
+
+static int sc_for_req_header(const char *header_name)
+{
+ char header[16];
+ size_t len = strlen(header_name);
+ const char *p = header_name;
+ int i = 0;
+
+ /* ACCEPT-LANGUAGE is the longest header
+ * that is of interest.
+ */
+ if (len < 4 || len > 15)
+ return UNKNOWN_METHOD;
+
+ while (*p) {
+ header[i++] = toupper((unsigned char)*p);
+ p++;
+ }
+
+ header[i] = '\0';
+ p = &header[1];
+
+/* Always do memcmp including the final \0-termination character.
+ */
+ switch (header[0]) {
+ case 'A':
+ if (memcmp(p, "CCEPT", 6) == 0) {
+ if (!header[6])
+ return SC_ACCEPT;
+ else if (header[6] == '-') {
+ p += 6;
+ if (memcmp(p, "CHARSET", 8) == 0)
+ return SC_ACCEPT_CHARSET;
+ else if (memcmp(p, "ENCODING", 9) == 0)
+ return SC_ACCEPT_ENCODING;
+ else if (memcmp(p, "LANGUAGE", 9) == 0)
+ return SC_ACCEPT_LANGUAGE;
+ else
+ return UNKNOWN_METHOD;
+ }
+ else
+ return UNKNOWN_METHOD;
+ }
+ else if (memcmp(p, "UTHORIZATION", 13) == 0)
+ return SC_AUTHORIZATION;
+ else
+ return UNKNOWN_METHOD;
+ break;
+ case 'C':
+ if(memcmp(p, "OOKIE2", 7) == 0)
+ return SC_COOKIE2;
+ else if (memcmp(p, "OOKIE", 6) == 0)
+ return SC_COOKIE;
+ else if(memcmp(p, "ONNECTION", 10) == 0)
+ return SC_CONNECTION;
+ else if(memcmp(p, "ONTENT-TYPE", 12) == 0)
+ return SC_CONTENT_TYPE;
+ else if(memcmp(p, "ONTENT-LENGTH", 14) == 0)
+ return SC_CONTENT_LENGTH;
+ else
+ return UNKNOWN_METHOD;
+ break;
+ case 'H':
+ if(memcmp(p, "OST", 4) == 0)
+ return SC_HOST;
+ else
+ return UNKNOWN_METHOD;
+ break;
+ case 'P':
+ if(memcmp(p, "RAGMA", 6) == 0)
+ return SC_PRAGMA;
+ else
+ return UNKNOWN_METHOD;
+ break;
+ case 'R':
+ if(memcmp(p, "EFERER", 7) == 0)
+ return SC_REFERER;
+ else
+ return UNKNOWN_METHOD;
+ break;
+ case 'U':
+ if(memcmp(p, "SER-AGENT", 10) == 0)
+ return SC_USER_AGENT;
+ else
+ return UNKNOWN_METHOD;
+ break;
+ default:
+ return UNKNOWN_METHOD;
+ }
+ /* NOTREACHED */
+}
+
+/* Return the string representation of the worker state */
+const char *jk_ajp_get_state(ajp_worker_t *aw, jk_logger_t *l)
+{
+ return ajp_state_type[aw->s->state];
+}
+
+/* Return the int representation of the worker state */
+int jk_ajp_get_state_code(const char *v)
+{
+ if (!v)
+ return JK_AJP_STATE_DEF;
+ else if (*v == 'i' || *v == 'I' || *v == 'n' || *v == 'N' || *v == '0')
+ return JK_AJP_STATE_IDLE;
+ else if (*v == 'o' || *v == 'O' || *v == '1')
+ return JK_AJP_STATE_OK;
+ else if (*v == 'e' || *v == 'E' || *v == '4')
+ return JK_AJP_STATE_ERROR;
+ else if (*v == 'p' || *v == 'P' || *v == '6')
+ return JK_AJP_STATE_PROBE;
+ else
+ return JK_AJP_STATE_DEF;
+}
+
+int jk_ajp_get_cping_mode(const char *m, int def)
+{
+ int mv = def;
+ if (!m)
+ return mv;
+ while (*m != '\0') {
+ if (*m == 'C' || *m == 'c')
+ mv |= AJP_CPING_CONNECT;
+ else if (*m == 'P' || *m == 'p')
+ mv |= AJP_CPING_PREPOST;
+ else if (*m == 'I' || *m == 'i')
+ mv |= AJP_CPING_INTERVAL;
+ else if (*m == 'A' || *m == 'a') {
+ mv = AJP_CPING_CONNECT | AJP_CPING_PREPOST | AJP_CPING_INTERVAL;
+ break;
+ }
+ m++;
+ }
+ return mv;
+}
+
+/*
+ * Message structure
+ *
+ *
+AJPV13_REQUEST/AJPV14_REQUEST=
+ request_prefix (1) (byte)
+ method (byte)
+ protocol (string)
+ req_uri (string)
+ remote_addr (string)
+ remote_host (string)
+ server_name (string)
+ server_port (short)
+ is_ssl (boolean)
+ num_headers (short)
+ num_headers*(req_header_name header_value)
+
+ ?context (byte)(string)
+ ?servlet_path (byte)(string)
+ ?remote_user (byte)(string)
+ ?auth_type (byte)(string)
+ ?query_string (byte)(string)
+ ?route (byte)(string)
+ ?ssl_cert (byte)(string)
+ ?ssl_cipher (byte)(string)
+ ?ssl_session (byte)(string)
+ ?ssl_key_size (byte)(int) via JkOptions +ForwardKeySize
+ request_terminator (byte)
+ ?body content_length*(var binary)
+
+ */
+
+static int ajp_marshal_into_msgb(jk_msg_buf_t *msg,
+ jk_ws_service_t *s,
+ jk_logger_t *l, ajp_endpoint_t * ae)
+{
+ int method;
+ unsigned int i;
+
+ JK_TRACE_ENTER(l);
+
+ if ((method = sc_for_req_method(s->method,
+ strlen(s->method))) == UNKNOWN_METHOD)
+ method = SC_M_JK_STORED;
+
+ if (jk_b_append_byte(msg, JK_AJP13_FORWARD_REQUEST) ||
+ jk_b_append_byte(msg, (unsigned char)method) ||
+ jk_b_append_string(msg, s->protocol) ||
+ jk_b_append_string(msg, s->req_uri) ||
+ jk_b_append_string(msg, s->remote_addr) ||
+ jk_b_append_string(msg, s->remote_host) ||
+ jk_b_append_string(msg, s->server_name) ||
+ jk_b_append_int(msg, (unsigned short)s->server_port) ||
+ jk_b_append_byte(msg, (unsigned char)(s->is_ssl)) ||
+ jk_b_append_int(msg, (unsigned short)(s->num_headers))) {
+
+ jk_log(l, JK_LOG_ERROR,
+ "failed appending the message begining");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ for (i = 0; i < s->num_headers; i++) {
+ int sc;
+
+ if ((sc = sc_for_req_header(s->headers_names[i])) != UNKNOWN_METHOD) {
+ if (jk_b_append_int(msg, (unsigned short)sc)) {
+ jk_log(l, JK_LOG_ERROR,
+ "failed appending the header name");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ }
+ else {
+ if (jk_b_append_string(msg, s->headers_names[i])) {
+ jk_log(l, JK_LOG_ERROR,
+ "failed appending the header name");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ }
+
+ if (jk_b_append_string(msg, s->headers_values[i])) {
+ jk_log(l, JK_LOG_ERROR,
+ "failed appending the header value");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ }
+
+ if (s->secret) {
+ if (jk_b_append_byte(msg, SC_A_SECRET) ||
+ jk_b_append_string(msg, s->secret)) {
+ jk_log(l, JK_LOG_ERROR,
+ "failed appending secret");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ }
+
+ if (s->remote_user) {
+ if (jk_b_append_byte(msg, SC_A_REMOTE_USER) ||
+ jk_b_append_string(msg, s->remote_user)) {
+ jk_log(l, JK_LOG_ERROR,
+ "failed appending the remote user");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ }
+ if (s->auth_type) {
+ if (jk_b_append_byte(msg, SC_A_AUTH_TYPE) ||
+ jk_b_append_string(msg, s->auth_type)) {
+ jk_log(l, JK_LOG_ERROR,
+ "failed appending the auth type");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ }
+ if (s->query_string) {
+ if (jk_b_append_byte(msg, SC_A_QUERY_STRING) ||
+#if defined(AS400) && !defined(AS400_UTF8)
+ jk_b_append_asciistring(msg, s->query_string)) {
+#else
+ jk_b_append_string(msg, s->query_string)) {
+#endif
+ jk_log(l, JK_LOG_ERROR,
+ "failed appending the query string");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ }
+ if (s->route) {
+ if (jk_b_append_byte(msg, SC_A_ROUTE) ||
+ jk_b_append_string(msg, s->route)) {
+ jk_log(l, JK_LOG_ERROR,
+ "failed appending the route");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ }
+ if (s->ssl_cert_len) {
+ if (jk_b_append_byte(msg, SC_A_SSL_CERT) ||
+ jk_b_append_string(msg, s->ssl_cert)) {
+ jk_log(l, JK_LOG_ERROR,
+ "failed appending the SSL certificates");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ }
+
+ if (s->ssl_cipher) {
+ if (jk_b_append_byte(msg, SC_A_SSL_CIPHER) ||
+ jk_b_append_string(msg, s->ssl_cipher)) {
+ jk_log(l, JK_LOG_ERROR,
+ "failed appending the SSL ciphers");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ }
+ if (s->ssl_session) {
+ if (jk_b_append_byte(msg, SC_A_SSL_SESSION) ||
+ jk_b_append_string(msg, s->ssl_session)) {
+ jk_log(l, JK_LOG_ERROR,
+ "failed appending the SSL session");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ }
+
+ /*
+ * ssl_key_size is required by Servlet 2.3 API
+ * added support only in ajp14 mode
+ * JFC removed: ae->proto == AJP14_PROTO
+ */
+ if (s->ssl_key_size != -1) {
+ if (jk_b_append_byte(msg, SC_A_SSL_KEY_SIZE) ||
+ jk_b_append_int(msg, (unsigned short)s->ssl_key_size)) {
+ jk_log(l, JK_LOG_ERROR,
+ "failed appending the SSL key size");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ }
+
+ /* If the method was unrecognized, encode it as an attribute */
+ if (method == SC_M_JK_STORED) {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG, "unknown method %s", s->method);
+ if (jk_b_append_byte(msg, SC_A_STORED_METHOD) ||
+ jk_b_append_string(msg, s->method)) {
+ jk_log(l, JK_LOG_ERROR,
+ "failed appending the request method");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ }
+
+ /* Forward the remote port information, which was forgotten
+ * from the builtin data of the AJP 13 protocol.
+ * Since the servlet spec allows to retrieve it via getRemotePort(),
+ * we provide the port to the Tomcat connector as a request
+ * attribute. Modern Tomcat versions know how to retrieve
+ * the remote port from this attribute.
+ */
+ {
+ if (jk_b_append_byte(msg, SC_A_REQ_ATTRIBUTE) ||
+ jk_b_append_string(msg, SC_A_REQ_REMOTE_PORT) ||
+ jk_b_append_string(msg, s->remote_port)) {
+ jk_log(l, JK_LOG_ERROR,
+ "failed appending the remote port %s",
+ s->remote_port);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ }
+
+ /* Forward activation information from the load balancer.
+ * It can be used by the backend to deny access by requests,
+ * which come with a session id but for an invalid session.
+ * Such requests get forwarded to backends even if they
+ * are disabled" in the load balancer, because the balancer
+ * does not know, which sessions are valid.
+ * If the backend can check, that is was "disabled" it can
+ * delete the session cookie and respond with a self-referential
+ * redirect. The new request will then be balanced to some
+ * other node that is not disabled.
+ */
+ {
+ if (jk_b_append_byte(msg, SC_A_REQ_ATTRIBUTE) ||
+ jk_b_append_string(msg, SC_A_JK_LB_ACTIVATION) ||
+ jk_b_append_string(msg, s->activation)) {
+ jk_log(l, JK_LOG_ERROR,
+ "failed appending the activation state %s",
+ s->activation);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ }
+
+ if (s->num_attributes > 0) {
+ for (i = 0; i < s->num_attributes; i++) {
+ if (jk_b_append_byte(msg, SC_A_REQ_ATTRIBUTE) ||
+ jk_b_append_string(msg, s->attributes_names[i]) ||
+ jk_b_append_string(msg, s->attributes_values[i])) {
+ jk_log(l, JK_LOG_ERROR,
+ "failed appending attribute %s=%s",
+ s->attributes_names[i], s->attributes_values[i]);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ }
+ }
+
+ if (jk_b_append_byte(msg, SC_A_ARE_DONE)) {
+ jk_log(l, JK_LOG_ERROR,
+ "failed appending the message end");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG, "ajp marshaling done");
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+/*
+AJPV13_RESPONSE/AJPV14_RESPONSE:=
+ response_prefix (2)
+ status (short)
+ status_msg (short)
+ num_headers (short)
+ num_headers*(res_header_name header_value)
+ *body_chunk
+ terminator boolean <! -- recycle connection or not -->
+
+req_header_name :=
+ sc_req_header_name | (string)
+
+res_header_name :=
+ sc_res_header_name | (string)
+
+header_value :=
+ (string)
+
+body_chunk :=
+ length (short)
+ body length*(var binary)
+
+ */
+
+
+static int ajp_unmarshal_response(jk_msg_buf_t *msg,
+ jk_res_data_t * d,
+ ajp_endpoint_t * ae, jk_logger_t *l)
+{
+ jk_pool_t *p = &ae->pool;
+
+ JK_TRACE_ENTER(l);
+
+ d->status = jk_b_get_int(msg);
+ if (!d->status) {
+ jk_log(l, JK_LOG_ERROR,
+ "NULL status");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ d->msg = (char *)jk_b_get_string(msg);
+ if (d->msg) {
+#if (defined(AS400) && !defined(AS400_UTF8)) || defined(_OSD_POSIX)
+ jk_xlate_from_ascii(d->msg, strlen(d->msg));
+#endif
+ }
+
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "status = %d", d->status);
+
+ d->num_headers = jk_b_get_int(msg);
+ d->header_names = d->header_values = NULL;
+
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Number of headers is = %d",
+ d->num_headers);
+
+ if (d->num_headers) {
+ d->header_names = jk_pool_alloc(p, sizeof(char *) * d->num_headers);
+ d->header_values = jk_pool_alloc(p, sizeof(char *) * d->num_headers);
+
+ if (d->header_names && d->header_values) {
+ unsigned int i;
+ for (i = 0; i < d->num_headers; i++) {
+ unsigned short name = jk_b_pget_int(msg, msg->pos);
+
+ if ((name & 0XFF00) == 0XA000) {
+ jk_b_get_int(msg);
+ name = name & 0X00FF;
+ if (name <= SC_RES_HEADERS_NUM) {
+ d->header_names[i] =
+ (char *)long_res_header_for_sc(name);
+ }
+ else {
+ jk_log(l, JK_LOG_ERROR,
+ "No such sc (%d)", name);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ }
+ else {
+ d->header_names[i] = (char *)jk_b_get_string(msg);
+ if (!d->header_names[i]) {
+ jk_log(l, JK_LOG_ERROR,
+ "NULL header name");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+#if (defined(AS400) && !defined(AS400_UTF8)) || defined(_OSD_POSIX)
+ jk_xlate_from_ascii(d->header_names[i],
+ strlen(d->header_names[i]));
+#endif
+
+ }
+
+ d->header_values[i] = (char *)jk_b_get_string(msg);
+ if (!d->header_values[i]) {
+ jk_log(l, JK_LOG_ERROR,
+ "NULL header value");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+#if (defined(AS400) && !defined(AS400_UTF8)) || defined(_OSD_POSIX)
+ jk_xlate_from_ascii(d->header_values[i],
+ strlen(d->header_values[i]));
+#endif
+
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Header[%d] [%s] = [%s]",
+ i, d->header_names[i], d->header_values[i]);
+ }
+ }
+ }
+
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+/*
+ * Abort endpoint use
+ */
+static void ajp_abort_endpoint(ajp_endpoint_t * ae, int shutdown, jk_logger_t *l)
+{
+ JK_TRACE_ENTER(l);
+ if (shutdown == JK_TRUE && IS_VALID_SOCKET(ae->sd)) {
+ if (ae->hard_close) {
+ /* Force unclean connection close to communicate client write errors
+ * back to Tomcat by aborting AJP response writes.
+ */
+ jk_close_socket(ae->sd, l);
+ }
+ else {
+ jk_shutdown_socket(ae->sd, l);
+ }
+ }
+ ae->worker->s->connected--;
+ ae->sd = JK_INVALID_SOCKET;
+ ae->last_op = JK_AJP13_END_RESPONSE;
+ JK_TRACE_EXIT(l);
+}
+
+/*
+ * Reset the endpoint (clean buf and close socket)
+ */
+static void ajp_reset_endpoint(ajp_endpoint_t * ae, jk_logger_t *l)
+{
+ JK_TRACE_ENTER(l);
+
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "(%s) resetting endpoint with socket %d%s",
+ ae->worker->name, ae->sd, ae->reuse? "" : " (socket shutdown)");
+ if (!ae->reuse) {
+ ajp_abort_endpoint(ae, JK_TRUE, l);
+ }
+ jk_reset_pool(&(ae->pool));
+ JK_TRACE_EXIT(l);
+}
+
+/*
+ * Close the endpoint (close pool and close socket)
+ */
+void ajp_close_endpoint(ajp_endpoint_t * ae, jk_logger_t *l)
+{
+ JK_TRACE_ENTER(l);
+
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "(%s) closing endpoint with socket %d%s",
+ ae->worker->name, ae->sd, ae->reuse ? "" : " (socket shutdown)");
+ if (IS_VALID_SOCKET(ae->sd)) {
+ jk_shutdown_socket(ae->sd, l);
+ }
+ ae->sd = JK_INVALID_SOCKET;
+ jk_close_pool(&(ae->pool));
+ free(ae);
+ JK_TRACE_EXIT(l);
+}
+
+
+/** Steal a connection from an idle cache endpoint
+ * @param ae endpoint that needs a new connection
+ * @param l logger
+ * @return JK_FALSE: failure
+ * JK_TRUE: success
+ * @remark Always closes old socket endpoint
+ */
+static int ajp_next_connection(ajp_endpoint_t *ae, jk_logger_t *l)
+{
+ int rc;
+ int ret = JK_FALSE;
+ ajp_worker_t *aw = ae->worker;
+
+ JK_TRACE_ENTER(l);
+
+ /* Close previous socket */
+ if (IS_VALID_SOCKET(ae->sd))
+ jk_shutdown_socket(ae->sd, l);
+ /* Mark existing endpoint socket as closed */
+ ae->sd = JK_INVALID_SOCKET;
+ JK_ENTER_CS(&aw->cs, rc);
+ if (rc) {
+ unsigned int i;
+ for (i = 0; i < aw->ep_cache_sz; i++) {
+ /* Find cache slot with usable socket */
+ if (aw->ep_cache[i] && IS_VALID_SOCKET(aw->ep_cache[i]->sd)) {
+ ae->sd = aw->ep_cache[i]->sd;
+ aw->ep_cache[i]->sd = JK_INVALID_SOCKET;
+ break;
+ }
+ }
+ JK_LEAVE_CS(&aw->cs, rc);
+ if (IS_VALID_SOCKET(ae->sd)) {
+ ret = JK_TRUE;
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "(%s) Will try pooled connection socket %d from slot %d",
+ ae->worker->name, ae->sd, i);
+ }
+ }
+ JK_TRACE_EXIT(l);
+ return ret;
+}
+
+/** Handle the cping/cpong query
+ * @param ae endpoint
+ * @param timeout wait timeout in milliseconds
+ * @param l logger
+ * @return JK_FALSE: failure
+ * JK_TRUE: success
+ * @remark Always closes socket in case of
+ * a socket error
+ */
+static int ajp_handle_cping_cpong(ajp_endpoint_t * ae, int timeout, jk_logger_t *l)
+{
+ int i;
+ int cmd;
+ jk_msg_buf_t *msg;
+
+ JK_TRACE_ENTER(l);
+
+ ae->last_errno = 0;
+ msg = jk_b_new(&ae->pool);
+ if (!msg) {
+ jk_log(l, JK_LOG_ERROR,
+ "Failed allocating AJP message");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ if (jk_b_set_buffer_size(msg, 16)) {
+ jk_log(l, JK_LOG_ERROR,
+ "Failed allocating AJP message buffer");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ jk_b_reset(msg);
+ jk_b_append_byte(msg, AJP13_CPING_REQUEST);
+
+ /* Send CPing query */
+ if (ajp_connection_tcp_send_message(ae, msg, l) != JK_TRUE) {
+ jk_log(l, JK_LOG_INFO,
+ "can't send cping query");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ for (i = 0; i < 2; i++) {
+ /* wait for Pong reply for timeout milliseconds
+ */
+ if (jk_is_input_event(ae->sd, timeout, l) == JK_FALSE) {
+ ae->last_errno = errno;
+ jk_log(l, JK_LOG_INFO, "timeout in reply cpong");
+ /* We can't trust this connection any more. */
+ ajp_abort_endpoint(ae, JK_TRUE, l);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ /* Read and check for Pong reply
+ */
+ if (ajp_connection_tcp_get_message(ae, msg, l) != JK_TRUE) {
+ jk_log(l, JK_LOG_INFO,
+ "awaited reply cpong, not received");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ if ((cmd = jk_b_get_byte(msg)) != AJP13_CPONG_REPLY) {
+ /* If the respose was not CPONG it means that
+ * the previous response was not consumed by the
+ * client but the AJP messages was already in
+ * the network buffer.
+ * silently drop this single extra packet instead
+ * recycling the connection
+ */
+ if (i || ae->last_op == JK_AJP13_END_RESPONSE ||
+ cmd < JK_AJP13_SEND_BODY_CHUNK ||
+ cmd > AJP13_CPONG_REPLY) {
+ jk_log(l, JK_LOG_WARNING,
+ "awaited reply cpong, received %d instead. "
+ "Closing connection",
+ cmd);
+ /* We can't trust this connection any more. */
+ ajp_abort_endpoint(ae, JK_TRUE, l);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ else {
+ jk_log(l, JK_LOG_INFO,
+ "awaited reply cpong, received %d instead. "
+ "Retrying next packet",
+ cmd);
+
+ }
+ }
+ else {
+ ae->last_op = AJP13_CPONG_REPLY;
+ /* We have received Pong reply */
+ break;
+ }
+ }
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+/** Connect an endpoint to a backend
+ * @param ae endpoint
+ * @param l logger
+ * @return JK_FALSE: failure
+ * JK_TRUE: success
+ * @remark Always closes socket in case of
+ * a socket error
+ * @remark Cares about ae->last_errno
+ */
+int ajp_connect_to_endpoint(ajp_endpoint_t * ae, jk_logger_t *l)
+{
+ char buf[32];
+ int rc = JK_TRUE;
+
+ JK_TRACE_ENTER(l);
+
+ ae->last_errno = 0;
+ ae->sd = jk_open_socket(&ae->worker->worker_inet_addr,
+ ae->worker->keepalive,
+ ae->worker->socket_timeout,
+ ae->worker->socket_connect_timeout,
+ ae->worker->socket_buf, l);
+
+ if (!IS_VALID_SOCKET(ae->sd)) {
+ ae->last_errno = errno;
+ jk_log(l, JK_LOG_INFO,
+ "Failed opening socket to (%s) (errno=%d)",
+ jk_dump_hinfo(&ae->worker->worker_inet_addr, buf), ae->last_errno);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ ae->worker->s->connected++;
+ /* set last_access only if needed */
+ if (ae->worker->cache_timeout > 0)
+ ae->last_access = time(NULL);
+ /* Check if we must execute a logon after the physical connect */
+ /* XXX: Not sure, if we really should do logon before cping/cpong */
+ /* XXX: and if no cping/cpong is allowed before or after logon. */
+ if (ae->worker->logon != NULL) {
+ rc = ae->worker->logon(ae, l);
+ if (rc == JK_FALSE) {
+ jk_log(l, JK_LOG_ERROR,
+ "(%s) ajp14 worker logon to the backend server failed",
+ ae->worker->name);
+ /* Close the socket if unable to logon */
+ ajp_abort_endpoint(ae, JK_TRUE, l);
+ }
+ }
+ /* XXX: Should we send a cping also after logon to validate the connection? */
+ else if (ae->worker->connect_timeout > 0) {
+ rc = ajp_handle_cping_cpong(ae, ae->worker->connect_timeout, l);
+ if (rc == JK_FALSE)
+ jk_log(l, JK_LOG_ERROR,
+ "(%s) cping/cpong after connecting to the backend server failed (errno=%d)",
+ ae->worker->name, ae->last_errno);
+ }
+ JK_TRACE_EXIT(l);
+ return rc;
+}
+
+/* Syncing config values from shm */
+void jk_ajp_pull(ajp_worker_t * aw, int locked, jk_logger_t *l)
+{
+ int address_change = JK_FALSE;
+ int port = 0;
+ char host[JK_SHM_STR_SIZ+1];
+ struct sockaddr_in inet_addr;
+ JK_TRACE_ENTER(l);
+
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "syncing mem for ajp worker '%s' from shm (%u -> %u) [%u->%u]",
+ aw->name, aw->sequence, aw->s->h.sequence, aw->addr_sequence, aw->s->addr_sequence);
+ if (locked == JK_FALSE)
+ jk_shm_lock();
+
+ aw->cache_timeout = aw->s->cache_timeout;
+ aw->connect_timeout = aw->s->connect_timeout;
+ aw->ping_timeout = aw->s->ping_timeout;
+ aw->reply_timeout = aw->s->reply_timeout;
+ aw->prepost_timeout = aw->s->prepost_timeout;
+ aw->recovery_opts = aw->s->recovery_opts;
+ aw->retries = aw->s->retries;
+ aw->retry_interval = aw->s->retry_interval;
+ aw->max_packet_size = aw->s->max_packet_size;
+ aw->sequence = aw->s->h.sequence;
+ if (aw->addr_sequence != aw->s->addr_sequence) {
+ address_change = JK_TRUE;
+ aw->addr_sequence = aw->s->addr_sequence;
+ strncpy(host, aw->s->host, JK_SHM_STR_SIZ);
+ port = aw->s->port;
+ }
+ if (locked == JK_FALSE)
+ jk_shm_unlock();
+
+ if (address_change == JK_TRUE) {
+ if (!jk_resolve(host, port, &inet_addr,
+ aw->worker.we->pool, l)) {
+ jk_log(l, JK_LOG_ERROR,
+ "Failed resolving address '%s:%d' for worker '%s'.",
+ host, port, aw->name);
+ }
+ else {
+ int rc;
+ JK_ENTER_CS(&aw->cs, rc);
+ if (rc) {
+ unsigned int i;
+ for (i = 0; i < aw->ep_cache_sz; i++) {
+ /* Close all connections in the cache */
+ if (aw->ep_cache[i] && IS_VALID_SOCKET(aw->ep_cache[i]->sd)) {
+ int sd = aw->ep_cache[i]->sd;
+ aw->ep_cache[i]->sd = JK_INVALID_SOCKET;
+ aw->ep_cache[i]->addr_sequence = aw->addr_sequence;
+ jk_shutdown_socket(sd, l);
+ aw->s->connected--;
+ }
+ }
+ }
+ aw->port = port;
+ strncpy(aw->host, host, JK_SHM_STR_SIZ);
+ memcpy(&(aw->worker_inet_addr), &inet_addr, sizeof(inet_addr));
+ if (rc) {
+ JK_LEAVE_CS(&aw->cs, rc);
+ } else {
+ jk_log(l, JK_LOG_ERROR,
+ "locking thread (errno=%d)", errno);
+ }
+ }
+ }
+
+ JK_TRACE_EXIT(l);
+}
+
+/* Syncing config values to shm */
+void jk_ajp_push(ajp_worker_t * aw, int locked, jk_logger_t *l)
+{
+ int address_change = JK_FALSE;
+
+ JK_TRACE_ENTER(l);
+
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "syncing shm for ajp worker '%s' from mem (%u -> %u) [%u->%u]",
+ aw->name, aw->s->h.sequence, aw->sequence, aw->s->addr_sequence, aw->addr_sequence);
+ if (locked == JK_FALSE)
+ jk_shm_lock();
+
+ aw->s->cache_timeout = aw->cache_timeout;
+ aw->s->connect_timeout = aw->connect_timeout;
+ aw->s->ping_timeout = aw->ping_timeout;
+ aw->s->reply_timeout = aw->reply_timeout;
+ aw->s->prepost_timeout = aw->prepost_timeout;
+ aw->s->recovery_opts = aw->recovery_opts;
+ aw->s->retries = aw->retries;
+ aw->s->retry_interval = aw->retry_interval;
+ aw->s->max_packet_size = aw->max_packet_size;
+ aw->s->h.sequence = aw->sequence;
+ if (aw->s->addr_sequence != aw->addr_sequence) {
+ address_change = JK_TRUE;
+ strncpy(aw->s->host, aw->host, JK_SHM_STR_SIZ);
+ aw->s->port = aw->port;
+ aw->s->addr_sequence = aw->addr_sequence;
+ }
+ if (locked == JK_FALSE)
+ jk_shm_unlock();
+
+ if (address_change == JK_TRUE) {
+ int rc;
+ JK_ENTER_CS(&aw->cs, rc);
+ if (rc) {
+ unsigned int i;
+ for (i = 0; i < aw->ep_cache_sz; i++) {
+ /* Close all connections in the cache */
+ if (aw->ep_cache[i] && IS_VALID_SOCKET(aw->ep_cache[i]->sd)) {
+ int sd = aw->ep_cache[i]->sd;
+ aw->ep_cache[i]->sd = JK_INVALID_SOCKET;
+ aw->ep_cache[i]->addr_sequence = aw->addr_sequence;
+ jk_shutdown_socket(sd, l);
+ aw->s->connected--;
+ }
+ }
+ JK_LEAVE_CS(&aw->cs, rc);
+ } else {
+ jk_log(l, JK_LOG_ERROR,
+ "locking thread (errno=%d)", errno);
+ }
+ }
+ JK_TRACE_EXIT(l);
+}
+
+/** Send a message to an endpoint, using corresponding PROTO HEADER
+ * @param ae endpoint
+ * @param msg message to send
+ * @param l logger
+ * @return JK_FATAL_ERROR: endpoint contains unknown protocol
+ * JK_FALSE: other failure
+ * JK_TRUE: success
+ * @remark Always closes socket in case of
+ * a socket error, or JK_FATAL_ERROR
+ * @remark Cares about ae->last_errno
+ */
+int ajp_connection_tcp_send_message(ajp_endpoint_t * ae,
+ jk_msg_buf_t *msg, jk_logger_t *l)
+{
+ int rc;
+
+ JK_TRACE_ENTER(l);
+
+ ae->last_errno = 0;
+ if (ae->proto == AJP13_PROTO) {
+ jk_b_end(msg, AJP13_WS_HEADER);
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_dump_buff(l, JK_LOG_DEBUG, "sending to ajp13", msg);
+ }
+ else if (ae->proto == AJP14_PROTO) {
+ jk_b_end(msg, AJP14_WS_HEADER);
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_dump_buff(l, JK_LOG_DEBUG, "sending to ajp14", msg);
+ }
+ else {
+ jk_log(l, JK_LOG_ERROR,
+ "(%s) unknown protocol %d, supported are AJP13/AJP14",
+ ae->worker->name, ae->proto);
+ /* We've got a protocol error. */
+ /* We can't trust this connection any more, */
+ /* because we might have send already parts of the request. */
+ ajp_abort_endpoint(ae, JK_TRUE, l);
+ JK_TRACE_EXIT(l);
+ return JK_FATAL_ERROR;
+ }
+
+ /* This is the only place in this function where we use the socket. */
+ /* If sendfull gets an error, it implicitely closes the socket. */
+ /* So any socket error inside ajp_connection_tcp_send_message */
+ /* results in a socket close and invalidated endpoint connection. */
+ if ((rc = jk_tcp_socket_sendfull(ae->sd, msg->buf,
+ msg->len, l)) > 0) {
+ ae->endpoint.wr += (jk_uint64_t)rc;
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+ ae->last_errno = errno;
+ jk_log(l, JK_LOG_INFO,
+ "sendfull for socket %d returned %d (errno=%d)",
+ ae->sd, rc, ae->last_errno);
+ ajp_abort_endpoint(ae, JK_FALSE, l);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+}
+
+/** Receive a message from an endpoint, checking PROTO HEADER
+ * @param ae endpoint
+ * @param msg message to send
+ * @param l logger
+ * @return JK_TRUE: success
+ * JK_FALSE: could not read the AJP packet header
+ * JK_AJP_PROTOCOL_ERROR: failure after reading
+ * the AJP packet header
+ * @remark Always closes socket in case of
+ * a socket error
+ * @remark Cares about ae->last_errno
+ */
+int ajp_connection_tcp_get_message(ajp_endpoint_t * ae,
+ jk_msg_buf_t *msg, jk_logger_t *l)
+{
+ unsigned char head[AJP_HEADER_LEN];
+ int rc;
+ int msglen;
+ unsigned int header;
+ char buf[32];
+
+ JK_TRACE_ENTER(l);
+
+ ae->last_errno = 0;
+ /* If recvfull gets an error, it implicitely closes the socket. */
+ /* We will invalidate the endpoint connection. */
+ rc = jk_tcp_socket_recvfull(ae->sd, head, AJP_HEADER_LEN, l);
+
+ /* If the return code is not negative */
+ /* then we always get back the correct number of bytes. */
+ if (rc < 0) {
+ if (rc == JK_SOCKET_EOF) {
+ ae->last_errno = EPIPE;
+ jk_log(l, JK_LOG_INFO,
+ "(%s) can't receive the response header message from tomcat, "
+ "tomcat (%s) has forced a connection close for socket %d",
+ ae->worker->name, jk_dump_hinfo(&ae->worker->worker_inet_addr, buf),
+ ae->sd);
+ }
+ else {
+ ae->last_errno = -rc;
+ jk_log(l, JK_LOG_INFO,
+ "(%s) can't receive the response header message from tomcat, "
+ "network problems or tomcat (%s) is down (errno=%d)",
+ ae->worker->name, jk_dump_hinfo(&ae->worker->worker_inet_addr, buf),
+ ae->last_errno);
+ }
+ ajp_abort_endpoint(ae, JK_FALSE, l);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ ae->endpoint.rd += (jk_uint64_t)rc;
+ header = ((unsigned int)head[0] << 8) | head[1];
+
+ if (ae->proto == AJP13_PROTO) {
+ if (header != AJP13_SW_HEADER) {
+
+ if (header == AJP14_SW_HEADER) {
+ jk_log(l, JK_LOG_ERROR,
+ "received AJP14 reply on an AJP13 connection from %s",
+ jk_dump_hinfo(&ae->worker->worker_inet_addr, buf));
+ }
+ else {
+ jk_log(l, JK_LOG_ERROR,
+ "wrong message format 0x%04x from %s",
+ header, jk_dump_hinfo(&ae->worker->worker_inet_addr,
+ buf));
+ }
+ /* We've got a protocol error. */
+ /* We can't trust this connection any more. */
+ ajp_abort_endpoint(ae, JK_TRUE, l);
+ JK_TRACE_EXIT(l);
+ return JK_AJP_PROTOCOL_ERROR;
+ }
+ }
+ else if (ae->proto == AJP14_PROTO) {
+ if (header != AJP14_SW_HEADER) {
+
+ if (header == AJP13_SW_HEADER) {
+ jk_log(l, JK_LOG_ERROR,
+ "received AJP13 reply on an AJP14 connection from %s",
+ jk_dump_hinfo(&ae->worker->worker_inet_addr, buf));
+ }
+ else {
+ jk_log(l, JK_LOG_ERROR,
+ "wrong message format 0x%04x from %s",
+ header, jk_dump_hinfo(&ae->worker->worker_inet_addr,
+ buf));
+ }
+ /* We've got a protocol error. */
+ /* We can't trust this connection any more. */
+ ajp_abort_endpoint(ae, JK_TRUE, l);
+ JK_TRACE_EXIT(l);
+ return JK_AJP_PROTOCOL_ERROR;
+ }
+ }
+
+ msglen = ((head[2] & 0xff) << 8);
+ msglen += (head[3] & 0xFF);
+
+ if (msglen > msg->maxlen) {
+ jk_log(l, JK_LOG_ERROR,
+ "wrong message size %d %d from %s",
+ msglen, msg->maxlen,
+ jk_dump_hinfo(&ae->worker->worker_inet_addr, buf));
+ /* We've got a protocol error. */
+ /* We can't trust this connection any more. */
+ ajp_abort_endpoint(ae, JK_TRUE, l);
+ JK_TRACE_EXIT(l);
+ return JK_AJP_PROTOCOL_ERROR;
+ }
+
+ msg->len = msglen;
+ msg->pos = 0;
+
+ /* If recvfull gets an error, it implicitely closes the socket. */
+ /* We will invalidate the endpoint connection. */
+ rc = jk_tcp_socket_recvfull(ae->sd, msg->buf, msglen, l);
+ /* If the return code is not negative */
+ /* then we always get back the correct number of bytes. */
+ if (rc < 0) {
+ if (rc == JK_SOCKET_EOF) {
+ ae->last_errno = EPIPE;
+ jk_log(l, JK_LOG_ERROR,
+ "(%s) can't receive the response body message from tomcat, "
+ "tomcat (%s) has forced a connection close for socket %d",
+ ae->worker->name, jk_dump_hinfo(&ae->worker->worker_inet_addr, buf),
+ ae->sd);
+ }
+ else {
+ ae->last_errno = -rc;
+ jk_log(l, JK_LOG_ERROR,
+ "(%s) can't receive the response body message from tomcat, "
+ "network problems or tomcat (%s) is down (errno=%d)",
+ ae->worker->name, jk_dump_hinfo(&ae->worker->worker_inet_addr, buf),
+ ae->last_errno);
+ }
+ ajp_abort_endpoint(ae, JK_FALSE, l);
+ JK_TRACE_EXIT(l);
+ /* Although we have a connection, this is effectively a protocol error.
+ * We received the AJP header packet, but not the packet payload
+ */
+ return JK_AJP_PROTOCOL_ERROR;
+ }
+ ae->endpoint.rd += (jk_uint64_t)rc;
+
+ if (JK_IS_DEBUG_LEVEL(l)) {
+ if (ae->proto == AJP13_PROTO)
+ jk_dump_buff(l, JK_LOG_DEBUG, "received from ajp13", msg);
+ else if (ae->proto == AJP14_PROTO)
+ jk_dump_buff(l, JK_LOG_DEBUG, "received from ajp14", msg);
+ }
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+/*
+ * Read all the data from the socket.
+ *
+ * Socket API doesn't guaranty that all the data will be kept in a
+ * single read, so we must loop until all awaited data is received
+ */
+
+static int ajp_read_fully_from_server(jk_ws_service_t *s, jk_logger_t *l,
+ unsigned char *buf, unsigned int len)
+{
+ unsigned int rdlen = 0;
+ unsigned int padded_len = len;
+
+ JK_TRACE_ENTER(l);
+
+ if (s->is_chunked && s->no_more_chunks) {
+ JK_TRACE_EXIT(l);
+ return 0;
+ }
+ if (s->is_chunked) {
+ /* Corner case: buf must be large enough to hold next
+ * chunk size (if we're on or near a chunk border).
+ * Pad the length to a reasonable value, otherwise the
+ * read fails and the remaining chunks are tossed.
+ */
+ padded_len = (len < CHUNK_BUFFER_PAD) ? len : len - CHUNK_BUFFER_PAD;
+ }
+
+ while (rdlen < padded_len) {
+ unsigned int this_time = 0;
+ if (!s->read(s, buf + rdlen, len - rdlen, &this_time)) {
+ /* Remote Client read failed. */
+ JK_TRACE_EXIT(l);
+ return JK_CLIENT_RD_ERROR;
+ }
+
+ if (0 == this_time) {
+ if (s->is_chunked) {
+ s->no_more_chunks = 1; /* read no more */
+ }
+ break;
+ }
+ rdlen += this_time;
+ }
+
+ JK_TRACE_EXIT(l);
+ return (int)rdlen;
+}
+
+
+/*
+ * Read data from AJP13/AJP14 protocol
+ * Returns -1 on error, else number of bytes read
+ */
+
+static int ajp_read_into_msg_buff(ajp_endpoint_t * ae,
+ jk_ws_service_t *r,
+ jk_msg_buf_t *msg, int len, jk_logger_t *l)
+{
+ unsigned char *read_buf = msg->buf;
+
+ JK_TRACE_ENTER(l);
+
+ jk_b_reset(msg);
+
+ read_buf += AJP_HEADER_LEN; /* leave some space for the buffer headers */
+ read_buf += AJP_HEADER_SZ_LEN; /* leave some space for the read length */
+
+ /* Pick the max size since we don't know the content_length */
+ if (r->is_chunked && len == 0) {
+ len = AJP13_MAX_SEND_BODY_SZ;
+ }
+
+ if ((len = ajp_read_fully_from_server(r, l, read_buf, len)) < 0) {
+ jk_log(l, JK_LOG_INFO,
+ "(%s) receiving data from client failed. "
+ "Connection aborted or network problems",
+ ae->worker->name);
+ JK_TRACE_EXIT(l);
+ return JK_CLIENT_RD_ERROR;
+ }
+
+ if (!r->is_chunked) {
+ ae->left_bytes_to_send -= len;
+ }
+
+ if (len > 0) {
+ /* Recipient recognizes empty packet as end of stream, not
+ an empty body packet */
+ if (0 != jk_b_append_int(msg, (unsigned short)len)) {
+ jk_log(l, JK_LOG_INFO,
+ "Failed appending message length");
+ JK_TRACE_EXIT(l);
+ return JK_CLIENT_RD_ERROR;
+ }
+ }
+
+ msg->len += len;
+
+ JK_TRACE_EXIT(l);
+ return len;
+}
+
+
+/*
+ * send request to Tomcat via Ajp13
+ * - first try to find reuseable socket
+ * - if no such available, try to connect
+ * - send request, but send must be seen as asynchronous,
+ * since send() call will return noerror about 95% of time
+ * Hopefully we'll get more information on next read.
+ *
+ * nb: op->request is the original request msg buffer
+ * op->reply is the reply msg buffer which could be scratched
+ *
+ * Return values of ajp_send_request() function:
+ * return value op->recoverable reason
+ * JK_FATAL_ERROR JK_FALSE ajp_connection_tcp_send_message() returns JK_FATAL_ERROR
+ * Endpoint belongs to unknown protocol.
+ * JK_FATAL_ERROR JK_TRUE ajp_connection_tcp_send_message() returns JK_FALSE
+ * Sending request or request body in jk_tcp_socket_sendfull() returns with error.
+ * JK_FATAL_ERROR JK_TRUE Could not connect to backend
+ * JK_CLIENT_RD_ERROR JK_FALSE Error during reading parts of POST body from client
+ * JK_TRUE JK_TRUE All other cases (OK)
+ */
+static int ajp_send_request(jk_endpoint_t *e,
+ jk_ws_service_t *s,
+ jk_logger_t *l,
+ ajp_endpoint_t * ae, ajp_operation_t * op)
+{
+ int err_conn = 0;
+ int err_cping = 0;
+ int err_send = 0;
+ int rc;
+ int postlen;
+
+ JK_TRACE_ENTER(l);
+
+ ae->last_errno = 0;
+ /* Up to now, we can recover */
+ op->recoverable = JK_TRUE;
+
+ /* Check if the previous request really ended
+ */
+ if (ae->last_op != JK_AJP13_END_RESPONSE &&
+ ae->last_op != AJP13_CPONG_REPLY) {
+ jk_log(l, JK_LOG_INFO,
+ "(%s) did not receive END_RESPONSE, "
+ "closing socket %d",
+ ae->worker->name, ae->sd);
+ ajp_abort_endpoint(ae, JK_TRUE, l);
+ }
+ /*
+ * First try to check open connections...
+ */
+ while (IS_VALID_SOCKET(ae->sd)) {
+ int err = JK_FALSE;
+ if (jk_is_socket_connected(ae->sd, l) == JK_FALSE) {
+ ae->last_errno = errno;
+ jk_log(l, JK_LOG_DEBUG,
+ "(%s) failed sending request, "
+ "socket %d is not connected any more (errno=%d)",
+ ae->worker->name, ae->sd, ae->last_errno);
+ ajp_abort_endpoint(ae, JK_FALSE, l);
+ err = JK_TRUE;
+ err_conn++;
+ }
+ if (ae->worker->prepost_timeout > 0 && !err) {
+ /* handle cping/cpong if prepost_timeout is set
+ * If the socket is disconnected no need to handle
+ * the cping/cpong
+ */
+ if (ajp_handle_cping_cpong(ae,
+ ae->worker->prepost_timeout, l) == JK_FALSE) {
+ jk_log(l, JK_LOG_INFO,
+ "(%s) failed sending request, "
+ "socket %d prepost cping/cpong failure (errno=%d)",
+ ae->worker->name, ae->sd, ae->last_errno);
+ /* XXX: Is there any reason to try other
+ * connections to the node if one of them fails
+ * the cping/cpong heartbeat?
+ * Tomcat can be either too busy or simply dead, so
+ * there is a chance that all other connections would
+ * fail as well.
+ */
+ err = JK_TRUE;
+ err_cping++;
+ }
+ }
+
+ /* We've got a connected socket and the optional
+ * cping/cpong worked, so let's send the request now.
+ */
+ if (err == JK_FALSE) {
+ rc = ajp_connection_tcp_send_message(ae, op->request, l);
+ /* If this worked, we can break out of the loop
+ * and proceed with the request.
+ */
+ if (rc == JK_TRUE) {
+ ae->last_op = JK_AJP13_FORWARD_REQUEST;
+ break;
+ }
+ /* Error during sending the request.
+ */
+ err_send++;
+ if (rc == JK_FATAL_ERROR)
+ op->recoverable = JK_FALSE;
+ jk_log(l, JK_LOG_INFO,
+ "(%s) failed sending request (%srecoverable) "
+ "(errno=%d)",
+ ae->worker->name,
+ op->recoverable ? "" : "un",
+ ae->last_errno);
+ JK_TRACE_EXIT(l);
+ return JK_FATAL_ERROR;
+ }
+ /* If we got an error or can't send data, then try to steal another pooled
+ * connection and try again. If we are not successful, break out of this
+ * loop and try to open a new connection after the loop.
+ */
+ if (ajp_next_connection(ae, l) == JK_FALSE)
+ break;
+ }
+
+ /*
+ * If we failed to reuse a connection, try to reconnect.
+ */
+ if (!IS_VALID_SOCKET(ae->sd)) {
+ /* Could not steal any connection from an endpoint - backend is disconnected */
+ if (err_conn + err_cping + err_send > 0)
+ jk_log(l, JK_LOG_INFO,
+ "(%s) all endpoints are disconnected, "
+ "detected by connect check (%d), cping (%d), send (%d)",
+ ae->worker->name, err_conn, err_cping, err_send);
+ else if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "(%s) all endpoints are disconnected.",
+ ae->worker->name);
+ /* Connect to the backend.
+ */
+ if (ajp_connect_to_endpoint(ae, l) != JK_TRUE) {
+ jk_log(l, JK_LOG_ERROR,
+ "(%s) connecting to backend failed. Tomcat is probably not started "
+ "or is listening on the wrong port (errno=%d)",
+ ae->worker->name, ae->last_errno);
+ JK_TRACE_EXIT(l);
+ return JK_FATAL_ERROR;
+ }
+ if (ae->worker->connect_timeout <= 0 &&
+ ae->worker->prepost_timeout > 0) {
+ /* handle cping/cpong if prepost_timeout is set
+ * and we didn't already do a connect cping/cpong.
+ */
+ if (ajp_handle_cping_cpong(ae,
+ ae->worker->prepost_timeout, l) == JK_FALSE) {
+ jk_log(l, JK_LOG_INFO,
+ "(%s) failed sending request, "
+ "socket %d prepost cping/cpong failure (errno=%d)",
+ ae->worker->name, ae->sd, ae->last_errno);
+ JK_TRACE_EXIT(l);
+ return JK_FATAL_ERROR;
+ }
+ }
+
+ /* We've got a connected socket and the optional
+ * cping/cpong worked, so let's send the request now.
+ */
+ rc = ajp_connection_tcp_send_message(ae, op->request, l);
+ /* Error during sending the request.
+ */
+ if (rc != JK_TRUE) {
+ if (rc == JK_FATAL_ERROR)
+ op->recoverable = JK_FALSE;
+ jk_log(l, JK_LOG_ERROR,
+ "(%s) failed sending request on a fresh connection (%srecoverable), "
+ "socket %d (errno=%d)",
+ ae->worker->name, op->recoverable ? "" : "un",
+ ae->sd, ae->last_errno);
+ JK_TRACE_EXIT(l);
+ return JK_FATAL_ERROR;
+ }
+ ae->last_op = JK_AJP13_FORWARD_REQUEST;
+ }
+ else if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "(%s) Statistics about invalid connections: "
+ "connect check (%d), cping (%d), send (%d)",
+ ae->worker->name, err_conn, err_cping, err_send);
+
+ /*
+ * From now on an error means that we have an internal server error
+ * or Tomcat crashed.
+ */
+
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "(%s) request body to send %" JK_UINT64_T_FMT " - request body to resend %d",
+ ae->worker->name, ae->left_bytes_to_send,
+ op->reply->len - AJP_HEADER_LEN);
+
+ /*
+ * POST recovery job is done here and will work when data to
+ * POST are less than 8k, since it's the maximum size of op-post buffer.
+ * We send here the first part of data which was sent previously to the
+ * remote Tomcat
+ */
+
+ /* Did we have something to resend (ie the op-post has been feeded previously */
+
+ postlen = op->post->len;
+ if (postlen > AJP_HEADER_LEN) {
+ rc = ajp_connection_tcp_send_message(ae, op->post, l);
+ /* Error during sending the request body.
+ */
+ if (rc != JK_TRUE) {
+ if (rc == JK_FATAL_ERROR)
+ op->recoverable = JK_FALSE;
+ jk_log(l, JK_LOG_ERROR,
+ "(%s) failed sending request body of size %d (%srecoverable), "
+ "socket %d (errno=%d)",
+ ae->worker->name, postlen, op->recoverable ? "" : "un",
+ ae->sd, ae->last_errno);
+ JK_TRACE_EXIT(l);
+ return JK_FATAL_ERROR;
+ }
+ else {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG, "Resent the request body (%d)",
+ postlen);
+ }
+ }
+ else if (s->reco_status == RECO_FILLED) {
+ /* Recovery in LB MODE */
+ postlen = s->reco_buf->len;
+
+ if (postlen > AJP_HEADER_LEN) {
+ rc = ajp_connection_tcp_send_message(ae, s->reco_buf, l);
+ /* Error during sending the request body.
+ */
+ if (rc != JK_TRUE) {
+ if (rc == JK_FATAL_ERROR)
+ op->recoverable = JK_FALSE;
+ jk_log(l, JK_LOG_ERROR,
+ "(%s) failed sending request body of size %d (lb mode) (%srecoverable), "
+ "socket %d (errno=%d)",
+ ae->worker->name, postlen, op->recoverable ? "" : "un",
+ ae->sd, ae->last_errno);
+ JK_TRACE_EXIT(l);
+ return JK_FATAL_ERROR;
+ }
+ }
+ else {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Resent the request body (lb mode) (%d)", postlen);
+ }
+ }
+ else {
+ /* We never sent any POST data and we check if we have to send at
+ * least one block of data (max 8k). These data will be kept in reply
+ * for resend if the remote Tomcat is down, a fact we will learn only
+ * doing a read (not yet)
+ */
+ /* || s->is_chunked - this can't be done here. The original protocol
+ sends the first chunk of post data ( based on Content-Length ),
+ and that's what the java side expects.
+ Sending this data for chunked would break other ajp13 servers.
+
+ Note that chunking will continue to work - using the normal read.
+ */
+
+ if (ae->left_bytes_to_send > 0) {
+ int len = AJP13_MAX_SEND_BODY_SZ;
+ if (ae->left_bytes_to_send < (jk_uint64_t)AJP13_MAX_SEND_BODY_SZ) {
+ len = (int)ae->left_bytes_to_send;
+ }
+ if ((len = ajp_read_into_msg_buff(ae, s, op->post, len, l)) <= 0) {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "(%s) browser stop sending data, no need to recover",
+ ae->worker->name);
+ op->recoverable = JK_FALSE;
+ /* Send an empty POST message since per AJP protocol
+ * spec whenever we have content length the message
+ * packet must be followed with initial POST packet.
+ * Size zero will be handled as error in container.
+ */
+ jk_b_reset(op->post);
+ jk_b_append_int(op->post, 0);
+ ajp_connection_tcp_send_message(ae, op->post, l);
+ JK_TRACE_EXIT(l);
+ return JK_CLIENT_RD_ERROR;
+ }
+
+ /* If a RECOVERY buffer is available in LB mode, fill it */
+ if (s->reco_status == RECO_INITED) {
+ jk_b_copy(op->post, s->reco_buf);
+ s->reco_status = RECO_FILLED;
+ }
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "(%s) sending %d bytes of request body",
+ ae->worker->name, len);
+
+ s->content_read = (jk_uint64_t)len;
+ rc = ajp_connection_tcp_send_message(ae, op->post, l);
+ /* Error during sending the request body.
+ */
+ if (rc != JK_TRUE) {
+ if (rc == JK_FATAL_ERROR)
+ op->recoverable = JK_FALSE;
+ jk_log(l, JK_LOG_ERROR,
+ "(%s) failed sending request body of size %d (%srecoverable), "
+ "socket %d (errno=%d)",
+ ae->worker->name, len, op->recoverable ? "" : "un",
+ ae->sd, ae->last_errno);
+ JK_TRACE_EXIT(l);
+ return JK_FATAL_ERROR;
+ }
+ }
+ }
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+
+/*
+ * What to do with incoming data (dispatcher)
+ */
+
+static int ajp_process_callback(jk_msg_buf_t *msg,
+ jk_msg_buf_t *pmsg,
+ ajp_endpoint_t * ae,
+ jk_ws_service_t *r, jk_logger_t *l)
+{
+ int code = (int)jk_b_get_byte(msg);
+
+ JK_TRACE_ENTER(l);
+
+ switch (code) {
+ case JK_AJP13_SEND_HEADERS:
+ {
+ int rc;
+ jk_res_data_t res;
+ if (ae->last_op == JK_AJP13_SEND_HEADERS) {
+ /* Do not send anything to the client.
+ * Backend already send us the headers.
+ */
+ if (JK_IS_DEBUG_LEVEL(l)) {
+ jk_log(l, JK_LOG_DEBUG,
+ "Already received AJP13_SEND HEADERS");
+ }
+ JK_TRACE_EXIT(l);
+ return JK_AJP13_ERROR;
+ }
+ if (!ajp_unmarshal_response(msg, &res, ae, l)) {
+ jk_log(l, JK_LOG_ERROR,
+ "ajp_unmarshal_response failed");
+ JK_TRACE_EXIT(l);
+ return JK_AJP13_ERROR;
+ }
+ r->http_response_status = res.status;
+ if (r->extension.fail_on_status_size > 0)
+ rc = is_http_status_fail(r->extension.fail_on_status_size,
+ r->extension.fail_on_status, res.status);
+ else
+ rc = is_http_status_fail(ae->worker->http_status_fail_num,
+ ae->worker->http_status_fail, res.status);
+ if (rc > 0) {
+ JK_TRACE_EXIT(l);
+ return JK_STATUS_FATAL_ERROR;
+ }
+ else if (rc < 0) {
+ JK_TRACE_EXIT(l);
+ return JK_STATUS_ERROR;
+ }
+
+ if (r->extension.use_server_error_pages &&
+ r->http_response_status >= r->extension.use_server_error_pages)
+ r->response_blocked = JK_TRUE;
+
+ /*
+ * Call even if response is blocked, since it also handles
+ * forwarding some headers for special http status codes
+ * even if the server uses an own error page.
+ * Example: The WWW-Authenticate header in case of
+ * HTTP_UNAUTHORIZED (401).
+ */
+ r->start_response(r, res.status, res.msg,
+ (const char *const *)res.header_names,
+ (const char *const *)res.header_values,
+ res.num_headers);
+
+ if (!r->response_blocked) {
+ if (r->flush && r->flush_header)
+ r->flush(r);
+ }
+ }
+ return JK_AJP13_SEND_HEADERS;
+
+ case JK_AJP13_SEND_BODY_CHUNK:
+ if (ae->last_op == JK_AJP13_FORWARD_REQUEST) {
+ /* AJP13_SEND_BODY_CHUNK with length 0 is
+ * explicit flush packet message.
+ * Ignore those if they are left over from previous responses.
+ * Reportedly some versions of JBoss suffer from that problem.
+ */
+ if (jk_b_get_int(msg) == 0) {
+ jk_log(l, JK_LOG_DEBUG,
+ "Ignoring flush message received while sending the request");
+ return ae->last_op;
+ }
+ /* We have just send a request but received something
+ * that probably originates from buffered response.
+ */
+ if (JK_IS_DEBUG_LEVEL(l)) {
+ jk_log(l, JK_LOG_DEBUG,
+ "Unexpected AJP13_SEND_BODY_CHUNK");
+ }
+ JK_TRACE_EXIT(l);
+ return JK_AJP13_ERROR;
+ }
+ if (!r->response_blocked) {
+ unsigned int len = (unsigned int)jk_b_get_int(msg);
+ /*
+ * Do a sanity check on len to prevent write reading beyond buffer
+ * boundaries and thus revealing possible sensitive memory
+ * contents to the client.
+ * len cannot be larger than msg->len - 3 because the ajp message
+ * contains the magic byte for JK_AJP13_SEND_BODY_CHUNK (1 byte)
+ * and the length of the chunk (2 bytes). The remaining part of
+ * the message is the chunk.
+ */
+ if (len > (unsigned int)(msg->len - 3)) {
+ jk_log(l, JK_LOG_ERROR,
+ "Chunk length too large. Length of AJP message is %i,"
+ " chunk length is %i.", msg->len, len);
+ JK_TRACE_EXIT(l);
+ return JK_INTERNAL_ERROR;
+ }
+ if (len == 0) {
+ /* AJP13_SEND_BODY_CHUNK with length 0 is
+ * explicit flush packet message.
+ */
+ if (r->response_started) {
+ if (r->flush) {
+ r->flush(r);
+ }
+ }
+ else {
+ jk_log(l, JK_LOG_DEBUG,
+ "Ignoring flush message received before headers");
+ }
+ }
+ else {
+ if (!r->write(r, msg->buf + msg->pos, len)) {
+ jk_log(l, JK_LOG_INFO,
+ "Writing to client aborted or client network problems");
+ JK_TRACE_EXIT(l);
+ return JK_CLIENT_WR_ERROR;
+ }
+ if (r->flush && r->flush_packets)
+ r->flush(r);
+ }
+ }
+ break;
+
+ case JK_AJP13_GET_BODY_CHUNK:
+ {
+ int len = (int)jk_b_get_int(msg);
+
+ if (len < 0) {
+ len = 0;
+ }
+ if (len > AJP13_MAX_SEND_BODY_SZ) {
+ len = AJP13_MAX_SEND_BODY_SZ;
+ }
+ if ((jk_uint64_t)len > ae->left_bytes_to_send) {
+ len = (int)ae->left_bytes_to_send;
+ }
+
+ /* the right place to add file storage for upload */
+ if ((len = ajp_read_into_msg_buff(ae, r, pmsg, len, l)) >= 0) {
+ r->content_read += (jk_uint64_t)len;
+ JK_TRACE_EXIT(l);
+ return JK_AJP13_HAS_RESPONSE;
+ }
+
+ jk_log(l, JK_LOG_INFO,
+ "Reading from client aborted or client network problems");
+
+ JK_TRACE_EXIT(l);
+ return JK_CLIENT_RD_ERROR;
+ }
+ break;
+
+ case JK_AJP13_END_RESPONSE:
+ ae->reuse = (int)jk_b_get_byte(msg);
+ if (!ae->reuse) {
+ /*
+ * AJP13 protocol reuse flag set to false.
+ * Tomcat will close its side of the connection.
+ */
+ jk_log(l, JK_LOG_WARNING, "AJP13 protocol: Reuse is set to false");
+ }
+ else if (r->disable_reuse) {
+ if (JK_IS_DEBUG_LEVEL(l)) {
+ jk_log(l, JK_LOG_DEBUG, "AJP13 protocol: Reuse is disabled");
+ }
+ ae->reuse = JK_FALSE;
+ }
+ else {
+ /* Reuse in all cases */
+ if (JK_IS_DEBUG_LEVEL(l)) {
+ jk_log(l, JK_LOG_DEBUG, "AJP13 protocol: Reuse is OK");
+ }
+ ae->reuse = JK_TRUE;
+ }
+ if (!r->response_blocked) {
+ if (r->done) {
+ /* Done with response */
+ r->done(r);
+ }
+ else if (r->flush && !r->flush_packets) {
+ /* Flush after the last write */
+ r->flush(r);
+ }
+ }
+ JK_TRACE_EXIT(l);
+ return JK_AJP13_END_RESPONSE;
+ break;
+
+ default:
+ jk_log(l, JK_LOG_ERROR,
+ "Unknown AJP protocol code: %02X", code);
+ JK_TRACE_EXIT(l);
+ return JK_AJP13_ERROR;
+ }
+
+ JK_TRACE_EXIT(l);
+ return JK_AJP13_NO_RESPONSE;
+}
+
+/*
+ * get replies from Tomcat via Ajp13/Ajp14
+ * ajp13/ajp14 is async but handling read/send this way prevent nice recovery
+ * In fact if tomcat link is broken during upload (browser -> apache -> tomcat)
+ * we'll loose data and we'll have to abort the whole request.
+ *
+ * Return values of ajp_get_reply() function:
+ * return value op->recoverable reason
+ * JK_REPLY_TIMEOUT ?recovery_options Reply timeout while waiting for response packet
+ * JK_FALSE ?recovery_options Error during ajp_connection_tcp_get_message()
+ * Could not read the AJP packet header
+ * JK_AJP_PROTOCOL_ERROR: ?recovery_options Error during ajp_connection_tcp_get_message()
+ * Failure after reading the AJP packet header
+ * JK_STATUS_ERROR mostly JK_TRUE ajp_process_callback() returns JK_STATUS_ERROR
+ * Recoverable, if callback didn't return with a JK_HAS_RESPONSE before.
+ * JK_HAS_RESPONSE: parts of the post buffer are consumed.
+ * JK_STATUS_FATAL_ERROR mostly JK_TRUE ajp_process_callback() returns JK_STATUS_FATAL_ERROR
+ * Recoverable, if callback didn't return with a JK_HAS_RESPONSE before.
+ * JK_HAS_RESPONSE: parts of the post buffer are consumed.
+ * JK_FATAL_ERROR ? ajp_process_callback() returns JK_AJP13_ERROR
+ * JK_AJP13_ERROR: protocol error, or JK_INTERNAL_ERROR: chunk size to large
+ * JK_CLIENT_RD_ERROR ? ajp_process_callback() returns JK_CLIENT_RD_ERROR
+ * JK_CLIENT_RD_ERROR: could not read post from client.
+ * JK_CLIENT_WR_ERROR ? ajp_process_callback() returns JK_CLIENT_WR_ERROR
+ * JK_CLIENT_WR_ERROR: could not write back result to client
+ * JK_TRUE ? ajp_process_callback() returns JK_AJP13_END_RESPONSE
+ * JK_FALSE ? Other unhandled cases (unknown return codes)
+ */
+static int ajp_get_reply(jk_endpoint_t *e,
+ jk_ws_service_t *s,
+ jk_logger_t *l,
+ ajp_endpoint_t * p, ajp_operation_t * op)
+{
+ /* Don't get header from tomcat yet */
+ int headeratclient = JK_FALSE;
+
+ JK_TRACE_ENTER(l);
+
+ p->last_errno = 0;
+ /* Start read all reply message */
+ while (1) {
+ int rc = 0;
+ /* Allow to overwrite reply_timeout on a per URL basis via service struct */
+ int reply_timeout = s->extension.reply_timeout;
+ if (reply_timeout < 0)
+ reply_timeout = p->worker->reply_timeout;
+ /* If we set a reply timeout, check if something is available */
+ if (reply_timeout > 0) {
+ if (jk_is_input_event(p->sd, reply_timeout, l) ==
+ JK_FALSE) {
+ p->last_errno = errno;
+ jk_log(l, JK_LOG_ERROR,
+ "(%s) Timeout with waiting reply from tomcat. "
+ "Tomcat is down, stopped or network problems (errno=%d)",
+ p->worker->name, p->last_errno);
+ /* We can't trust this connection any more. */
+ ajp_abort_endpoint(p, JK_TRUE, l);
+ if (headeratclient == JK_FALSE) {
+ if (p->worker->recovery_opts & RECOVER_ABORT_IF_TCGETREQUEST)
+ op->recoverable = JK_FALSE;
+ /*
+ * We revert back to recoverable, if recovery_opts allow it for GET or HEAD
+ */
+ if (op->recoverable == JK_FALSE) {
+ if (p->worker->recovery_opts & RECOVER_ALWAYS_HTTP_HEAD) {
+ if (!strcmp(s->method, "HEAD"))
+ op->recoverable = JK_TRUE;
+ }
+ else if (p->worker->recovery_opts & RECOVER_ALWAYS_HTTP_GET) {
+ if (!strcmp(s->method, "GET"))
+ op->recoverable = JK_TRUE;
+ }
+ }
+ }
+ else {
+ if (p->worker->recovery_opts & RECOVER_ABORT_IF_TCSENDHEADER)
+ op->recoverable = JK_FALSE;
+ }
+
+ JK_TRACE_EXIT(l);
+ return JK_REPLY_TIMEOUT;
+ }
+ }
+
+ if ((rc = ajp_connection_tcp_get_message(p, op->reply, l)) != JK_TRUE) {
+ if (headeratclient == JK_FALSE) {
+ jk_log(l, JK_LOG_ERROR,
+ "(%s) Tomcat is down or refused connection. "
+ "No response has been sent to the client (yet)",
+ p->worker->name);
+ /*
+ * communication with tomcat has been interrupted BEFORE
+ * headers have been sent to the client.
+ */
+
+ /*
+ * We mark it unrecoverable if recovery_opts set to RECOVER_ABORT_IF_TCGETREQUEST
+ */
+ if (p->worker->recovery_opts & RECOVER_ABORT_IF_TCGETREQUEST)
+ op->recoverable = JK_FALSE;
+ /*
+ * We revert back to recoverable, if recovery_opts allow it for GET or HEAD
+ */
+ if (op->recoverable == JK_FALSE) {
+ if (p->worker->recovery_opts & RECOVER_ALWAYS_HTTP_HEAD) {
+ if (!strcmp(s->method, "HEAD"))
+ op->recoverable = JK_TRUE;
+ }
+ else if (p->worker->recovery_opts & RECOVER_ALWAYS_HTTP_GET) {
+ if (!strcmp(s->method, "GET"))
+ op->recoverable = JK_TRUE;
+ }
+ }
+
+ }
+ else {
+ jk_log(l, JK_LOG_ERROR,
+ "(%s) Tomcat is down or network problems. "
+ "Part of the response has already been sent to the client",
+ p->worker->name);
+
+ /* communication with tomcat has been interrupted AFTER
+ * headers have been sent to the client.
+ * headers (and maybe parts of the body) have already been
+ * sent, therefore the response is "complete" in a sense
+ * that nobody should append any data, especially no 500 error
+ * page of the webserver!
+ */
+
+ /*
+ * We mark it unrecoverable if recovery_opts set to RECOVER_ABORT_IF_TCSENDHEADER
+ */
+ if (p->worker->recovery_opts & RECOVER_ABORT_IF_TCSENDHEADER)
+ op->recoverable = JK_FALSE;
+
+ }
+
+ JK_TRACE_EXIT(l);
+ return rc;
+ }
+
+ rc = ajp_process_callback(op->reply, op->post, p, s, l);
+ p->last_op = rc;
+ /* no more data to be sent, fine we have finish here */
+ if (JK_AJP13_END_RESPONSE == rc) {
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+ else if (JK_AJP13_SEND_HEADERS == rc) {
+ if (headeratclient == JK_FALSE)
+ headeratclient = JK_TRUE;
+ else {
+ /* Backend send headers twice?
+ * This is protocol violation
+ */
+ jk_log(l, JK_LOG_ERROR,
+ "(%s) Tomcat already send headers",
+ p->worker->name);
+ op->recoverable = JK_FALSE;
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ }
+ else if (JK_STATUS_ERROR == rc || JK_STATUS_FATAL_ERROR == rc) {
+ jk_log(l, JK_LOG_INFO,
+ "(%s) request failed%s, "
+ "because of response status %d, ",
+ p->worker->name,
+ rc == JK_STATUS_FATAL_ERROR ? "" : " (soft)",
+ s->http_response_status);
+ JK_TRACE_EXIT(l);
+ return rc;
+ }
+ else if (JK_AJP13_HAS_RESPONSE == rc) {
+ /*
+ * in upload-mode there is no second chance since
+ * we may have already sent part of the uploaded data
+ * to Tomcat.
+ * In this case if Tomcat connection is broken we must
+ * abort request and indicate error.
+ * A possible work-around could be to store the uploaded
+ * data to file and replay for it
+ */
+ op->recoverable = JK_FALSE;
+ rc = ajp_connection_tcp_send_message(p, op->post, l);
+ if (rc < 0) {
+ jk_log(l, JK_LOG_ERROR,
+ "(%s) Tomcat is down or network problems",
+ p->worker->name);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ }
+ else if (JK_AJP13_ERROR == rc) {
+ /*
+ * Tomcat has send invalid AJP message.
+ * Loadbalancer if present will decide if
+ * failover is possible.
+ */
+ JK_TRACE_EXIT(l);
+ return JK_FATAL_ERROR;
+ }
+ else if (JK_CLIENT_RD_ERROR == rc) {
+ /*
+ * Client has stop sending to us, so get out.
+ * We assume this isn't our fault, so just a normal exit.
+ */
+ JK_TRACE_EXIT(l);
+ return JK_CLIENT_RD_ERROR;
+ }
+ else if (JK_CLIENT_WR_ERROR == rc) {
+ /*
+ * Client has stop receiving to us, so get out.
+ * We assume this isn't our fault, so just a normal exit.
+ */
+ JK_TRACE_EXIT(l);
+ return JK_CLIENT_WR_ERROR;
+ }
+ else if (JK_INTERNAL_ERROR == rc) {
+ /*
+ * Internal error, like memory allocation or invalid packet lengths.
+ */
+ JK_TRACE_EXIT(l);
+ return JK_FATAL_ERROR;
+ }
+ else if (JK_AJP13_NO_RESPONSE == rc) {
+ /*
+ * This is fine, loop again, more data to send.
+ */
+ continue;
+ }
+ else if (rc < 0) {
+ op->recoverable = JK_FALSE;
+ jk_log(l, JK_LOG_ERROR,
+ "(%s) Callback returns with unknown value %d",
+ p->worker->name, rc);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ }
+ /* XXX: Not reached? */
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+}
+
+static void ajp_update_stats(jk_endpoint_t *e, ajp_worker_t *aw, int rc, jk_logger_t *l)
+{
+ aw->s->readed += e->rd;
+ aw->s->transferred += e->wr;
+ if (aw->s->busy)
+ aw->s->busy--;
+ if (rc == JK_TRUE) {
+ aw->s->state = JK_AJP_STATE_OK;
+ }
+ else if (rc == JK_CLIENT_ERROR) {
+ aw->s->state = JK_AJP_STATE_OK;
+ aw->s->client_errors++;
+ }
+ else {
+ aw->s->state = JK_AJP_STATE_ERROR;
+ aw->s->errors++;
+ aw->s->error_time = time(NULL);
+ }
+}
+
+/*
+ * service is now splitted in ajp_send_request and ajp_get_reply
+ * much more easier to do errors recovery
+ *
+ * We serve here the request, using AJP13/AJP14 (e->proto)
+ *
+ * Return values of service() method for ajp13/ajp14 worker:
+ * return value is_error e->recoverable reason
+ * JK_FALSE JK_HTTP_SERVER_ERROR TRUE Invalid Parameters (null values)
+ * JK_SERVER_ERROR JK_HTTP_SERVER_ERROR TRUE Error during initializing empty request, response or post body objects
+ * JK_CLIENT_ERROR JK_HTTP_REQUEST_TOO_LARGE JK_TRUE Request doesn't fit into buffer (error during ajp_marshal_into_msgb())
+ * JK_CLIENT_ERROR JK_HTTP_BAD_REQUEST JK_FALSE Error during reading parts of POST body from client
+ * JK_FATAL_ERROR JK_HTTP_SERVER_ERROR JK_FALSE If ajp_send_request() returns JK_FATAL_ERROR and !op->recoverable.
+ * JK_FATAL_ERROR JK_HTTP_SERVER_ERROR JK_FALSE If ajp_send_request() returns JK_TRUE but !op->recoverable.
+ * This should never happen.
+ * JK_CLIENT_ERROR JK_HTTP_BAD_REQUEST ? ajp_get_reply() returns JK_CLIENT_RD_ERROR
+ * JK_CLIENT_ERROR JK_HTTP_OK ? ajp_get_reply() returns JK_CLIENT_WR_ERROR
+ * JK_FATAL_ERROR JK_HTTP_SERVER_ERROR JK_TRUE ajp_get_reply() returns JK_FATAL_ERROR
+ * JK_FATAL_ERROR: protocol error or internal error
+ * JK_FATAL_ERROR JK_HTTP_SERVER_ERROR JK_FALSE ajp_get_reply() returns JK_FATAL_ERROR
+ * JK_FATAL_ERROR: protocol error or internal error
+ * JK_STATUS_ERROR JK_HTTP_SERVER_BUSY JK_TRUE ajp_get_reply() returns JK_STATUS_ERROR
+ * Only if op->recoverable and no more ajp13/ajp14 direct retries
+ * JK_STATUS_ERROR JK_HTTP_SERVER_BUSY JK_FALSE ajp_get_reply() returns JK_STATUS_ERROR
+ * Only if !op->recoverable
+ * JK_STATUS_FATAL_ERROR JK_HTTP_SERVER_BUSY JK_TRUE ajp_get_reply() returns JK_STATUS_ERROR
+ * Only if op->recoverable and no more ajp13/ajp14 direct retries
+ * JK_STATUS_FATAL_ERROR JK_HTTP_SERVER_BUSY JK_FALSE ajp_get_reply() returns JK_STATUS_FATAL_ERROR
+ * Only if !op->recoverable
+ * JK_REPLY_TIMEOUT JK_HTTP_GATEWAY_TIME_OUT JK_TRUE ajp_get_reply() returns JK_REPLY_TIMEOUT
+ * JK_AJP_PROTOCOL_ERROR JK_HTTP_GATEWAY_TIME_OUT ? ajp_get_reply() returns JK_AJP_PROTOCOL_ERROR
+ * ??? JK_FATAL_ERROR JK_HTTP_GATEWAY_TIME_OUT JK_FALSE ajp_get_reply() returns something else
+ * Only if !op->recoverable
+ * ??? JK_FALSE JK_HTTP_SERVER_BUSY JK_TRUE ajp_get_reply() returns JK_FALSE
+ * Only if op->recoverable and no more ajp13/ajp14 direct retries
+ * JK_TRUE JK_HTTP_OK ? OK
+ */
+static int JK_METHOD ajp_service(jk_endpoint_t *e,
+ jk_ws_service_t *s,
+ jk_logger_t *l, int *is_error)
+{
+ int i;
+ int err = JK_TRUE;
+ ajp_operation_t oper;
+ ajp_operation_t *op = &oper;
+ ajp_endpoint_t *p;
+ ajp_worker_t *aw;
+ int log_error;
+ int rc = JK_UNSET;
+ char *msg = "";
+ int retry_interval;
+
+ JK_TRACE_ENTER(l);
+
+ if (!e || !e->endpoint_private || !s || !is_error) {
+ JK_LOG_NULL_PARAMS(l);
+ if (is_error)
+ *is_error = JK_HTTP_SERVER_ERROR;
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ p = e->endpoint_private;
+ aw = p->worker;
+
+ if (aw->sequence != aw->s->h.sequence)
+ jk_ajp_pull(aw, JK_FALSE, l);
+
+ aw->s->used++;
+
+ /* Set returned error to SERVER ERROR */
+ *is_error = JK_HTTP_SERVER_ERROR;
+
+ op->request = jk_b_new(&(p->pool));
+ if (!op->request) {
+ jk_log(l, JK_LOG_ERROR,
+ "Failed allocating AJP message");
+ JK_TRACE_EXIT(l);
+ return JK_SERVER_ERROR;
+ }
+ if (jk_b_set_buffer_size(op->request, aw->max_packet_size)) {
+ jk_log(l, JK_LOG_ERROR,
+ "Failed allocating AJP message buffer");
+ JK_TRACE_EXIT(l);
+ return JK_SERVER_ERROR;
+ }
+ jk_b_reset(op->request);
+
+ op->reply = jk_b_new(&(p->pool));
+ if (!op->reply) {
+ jk_log(l, JK_LOG_ERROR,
+ "Failed allocating AJP message");
+ JK_TRACE_EXIT(l);
+ return JK_SERVER_ERROR;
+ }
+ if (jk_b_set_buffer_size(op->reply, aw->max_packet_size)) {
+ jk_log(l, JK_LOG_ERROR,
+ "Failed allocating AJP message buffer");
+ JK_TRACE_EXIT(l);
+ return JK_SERVER_ERROR;
+ }
+
+ op->post = jk_b_new(&(p->pool));
+ if (!op->post) {
+ jk_log(l, JK_LOG_ERROR,
+ "Failed allocating AJP message");
+ JK_TRACE_EXIT(l);
+ return JK_SERVER_ERROR;
+ }
+ if (jk_b_set_buffer_size(op->post, aw->max_packet_size)) {
+ jk_log(l, JK_LOG_ERROR,
+ "Failed allocating AJP message buffer");
+ JK_TRACE_EXIT(l);
+ return JK_SERVER_ERROR;
+ }
+ jk_b_reset(op->post);
+
+ /* Set returned error to OK */
+ *is_error = JK_HTTP_OK;
+
+ op->recoverable = JK_TRUE;
+ op->uploadfd = -1; /* not yet used, later ;) */
+
+ p->left_bytes_to_send = s->content_length;
+ p->reuse = JK_FALSE;
+ p->hard_close = JK_FALSE;
+
+ s->secret = aw->secret;
+
+ /*
+ * We get here initial request (in op->request)
+ */
+ if (!ajp_marshal_into_msgb(op->request, s, l, p)) {
+ *is_error = JK_HTTP_REQUEST_TOO_LARGE;
+ jk_log(l, JK_LOG_INFO,
+ "Creating AJP message failed, "
+ "without recovery");
+ aw->s->client_errors++;
+ JK_TRACE_EXIT(l);
+ return JK_CLIENT_ERROR;
+ }
+
+ if (JK_IS_DEBUG_LEVEL(l)) {
+ jk_log(l, JK_LOG_DEBUG, "processing %s with %d retries",
+ aw->name, aw->retries);
+ }
+ aw->s->busy++;
+ if (aw->s->state == JK_AJP_STATE_ERROR)
+ aw->s->state = JK_AJP_STATE_PROBE;
+ if (aw->s->busy > aw->s->max_busy)
+ aw->s->max_busy = aw->s->busy;
+ retry_interval = p->worker->retry_interval;
+ for (i = 0; i < aw->retries; i++) {
+ /* Reset reply message buffer for each retry */
+ jk_b_reset(op->reply);
+
+ /*
+ * ajp_send_request() already locally handles
+ * reconnecting and broken connection detection.
+ * So if we already failed in it, wait a bit before
+ * retrying the same backend.
+ */
+ if (i > 0 && retry_interval >= 0) {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "retry %d, sleeping for %d ms before retrying",
+ i, retry_interval);
+ jk_sleep(retry_interval);
+ /* Pull shared memory if something changed during sleep */
+ if (aw->sequence != aw->s->h.sequence)
+ jk_ajp_pull(aw, JK_FALSE, l);
+ }
+ /*
+ * We're using op->request which hold initial request
+ * if Tomcat is stopped or restarted, we will pass op->request
+ * to next valid tomcat.
+ */
+ log_error = JK_TRUE;
+ rc = JK_UNSET;
+ msg = "";
+ err = ajp_send_request(e, s, l, p, op);
+ e->recoverable = op->recoverable;
+ if (err == JK_CLIENT_RD_ERROR) {
+ *is_error = JK_HTTP_BAD_REQUEST;
+ msg = "because of client read error";
+ aw->s->client_errors++;
+ rc = JK_CLIENT_ERROR;
+ log_error = JK_FALSE;
+ e->recoverable = JK_FALSE;
+ /* Ajp message set reuse to TRUE in END_REQUEST message
+ * However due to client bad request if the recovery
+ * RECOVER_ABORT_IF_CLIENTERROR is set the physical connection
+ * will be closed and application in Tomcat can catch that
+ * generated exception, knowing the client aborted the
+ * connection. This AJP protocol limitation, where we
+ * should actually send some packet informing the backend
+ * that client broke the connection in a middle of
+ * request/response cycle.
+ */
+ if (aw->recovery_opts & RECOVER_ABORT_IF_CLIENTERROR) {
+ /* Mark the endpoint for shutdown */
+ p->reuse = JK_FALSE;
+ p->hard_close = JK_TRUE;
+ }
+ }
+ else if (err == JK_FATAL_ERROR) {
+ *is_error = JK_HTTP_SERVER_BUSY;
+ msg = "because of error during request sending";
+ rc = err;
+ if (!op->recoverable) {
+ *is_error = JK_HTTP_SERVER_ERROR;
+ msg = "because of protocol error during request sending";
+ }
+ }
+ else if (err == JK_TRUE && op->recoverable) {
+ /* Up to there we can recover */
+
+ err = ajp_get_reply(e, s, l, p, op);
+ e->recoverable = op->recoverable;
+ if (err == JK_TRUE) {
+ *is_error = JK_HTTP_OK;
+ /* Done with the request */
+ ajp_update_stats(e, aw, JK_TRUE, l);
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+
+ if (err == JK_CLIENT_RD_ERROR) {
+ *is_error = JK_HTTP_BAD_REQUEST;
+ msg = "because of client read error";
+ aw->s->client_errors++;
+ rc = JK_CLIENT_ERROR;
+ log_error = JK_FALSE;
+ e->recoverable = JK_FALSE;
+ op->recoverable = JK_FALSE;
+ if (aw->recovery_opts & RECOVER_ABORT_IF_CLIENTERROR) {
+ /* Mark the endpoint for shutdown */
+ p->reuse = JK_FALSE;
+ p->hard_close = JK_TRUE;
+ }
+ }
+ else if (err == JK_CLIENT_WR_ERROR) {
+ /* XXX: Is this correct to log this as 200? */
+ *is_error = JK_HTTP_OK;
+ msg = "because of client write error";
+ aw->s->client_errors++;
+ rc = JK_CLIENT_ERROR;
+ log_error = JK_FALSE;
+ e->recoverable = JK_FALSE;
+ op->recoverable = JK_FALSE;
+ if (aw->recovery_opts & RECOVER_ABORT_IF_CLIENTERROR) {
+ /* Mark the endpoint for shutdown */
+ p->reuse = JK_FALSE;
+ p->hard_close = JK_TRUE;
+ }
+ }
+ else if (err == JK_FATAL_ERROR) {
+ *is_error = JK_HTTP_SERVER_ERROR;
+ msg = "because of server error";
+ rc = err;
+ }
+ else if (err == JK_REPLY_TIMEOUT) {
+ *is_error = JK_HTTP_GATEWAY_TIME_OUT;
+ msg = "because of reply timeout";
+ aw->s->reply_timeouts++;
+ rc = err;
+ }
+ else if (err == JK_STATUS_ERROR || err == JK_STATUS_FATAL_ERROR) {
+ *is_error = JK_HTTP_SERVER_BUSY;
+ msg = "because of response status";
+ rc = err;
+ }
+ else if (err == JK_AJP_PROTOCOL_ERROR) {
+ *is_error = JK_HTTP_BAD_GATEWAY;
+ msg = "because of protocol error";
+ rc = err;
+ }
+ /* This should only be the cases err == JK_FALSE */
+ else {
+ /* if we can't get reply, check if unrecoverable flag was set
+ * if is_recoverable_error is cleared, we have started
+ * receiving upload data and we must consider that
+ * operation is no more recoverable
+ */
+ *is_error = JK_HTTP_BAD_GATEWAY;
+ msg = "";
+ rc = JK_FALSE;
+ }
+ }
+ else {
+ /* XXX: this should never happen:
+ * ajp_send_request() never returns JK_TRUE if !op->recoverable.
+ * and all other return values have already been handled.
+ */
+ e->recoverable = JK_FALSE;
+ *is_error = JK_HTTP_SERVER_ERROR;
+ msg = "because of an unknown reason";
+ rc = JK_FATAL_ERROR;
+ jk_log(l, JK_LOG_ERROR,
+ "(%s) unexpected condition err=%d recoverable=%d",
+ aw->name, err, op->recoverable);
+ }
+ if (!op->recoverable && log_error == JK_TRUE) {
+ jk_log(l, JK_LOG_ERROR,
+ "(%s) sending request to tomcat failed (unrecoverable), "
+ "%s "
+ "(attempt=%d)",
+ aw->name, msg, i + 1);
+ }
+ else {
+ jk_log(l, JK_LOG_INFO,
+ "(%s) sending request to tomcat failed (%srecoverable), "
+ "%s "
+ "(attempt=%d)",
+ aw->name,
+ op->recoverable ? "" : "un",
+ msg, i + 1);
+ }
+ if (!op->recoverable) {
+ ajp_update_stats(e, aw, rc, l);
+ JK_TRACE_EXIT(l);
+ return rc;
+ }
+ /* Get another connection from the pool and try again.
+ * Note: All sockets are probably closed already.
+ */
+ ajp_next_connection(p, l);
+ }
+ /* Log the error only once per failed request. */
+ jk_log(l, JK_LOG_ERROR,
+ "(%s) connecting to tomcat failed.",
+ aw->name);
+
+ ajp_update_stats(e, aw, rc, l);
+ JK_TRACE_EXIT(l);
+ return rc;
+}
+
+/*
+ * Validate the worker (ajp13/ajp14)
+ */
+
+int ajp_validate(jk_worker_t *pThis,
+ jk_map_t *props,
+ jk_worker_env_t *we, jk_logger_t *l, int proto)
+{
+ int port;
+ const char *host;
+
+ JK_TRACE_ENTER(l);
+
+ if (proto == AJP13_PROTO) {
+ port = AJP13_DEF_PORT;
+ host = AJP13_DEF_HOST;
+ }
+ else if (proto == AJP14_PROTO) {
+ port = AJP14_DEF_PORT;
+ host = AJP14_DEF_HOST;
+ }
+ else {
+ jk_log(l, JK_LOG_ERROR,
+ "unknown protocol %d", proto);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ if (pThis && pThis->worker_private) {
+ ajp_worker_t *p = pThis->worker_private;
+ p->port = jk_get_worker_port(props, p->name, port);
+ if (!host) {
+ host = "undefined";
+ }
+ strncpy(p->host, jk_get_worker_host(props, p->name, host), JK_SHM_STR_SIZ);
+
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "worker %s contact is '%s:%d'",
+ p->name, p->host, p->port);
+ /* Copy the contact to shm */
+ strncpy(p->s->host, p->host, JK_SHM_STR_SIZ);
+ p->s->port = p->port;
+ p->s->addr_sequence = p->addr_sequence = 0;
+ /* Resolve if port > 0.
+ */
+ if (p->port > 0) {
+ if (jk_resolve(p->host, p->port, &p->worker_inet_addr, we->pool, l)) {
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+ jk_log(l, JK_LOG_ERROR,
+ "worker %s can't resolve tomcat address %s",
+ p->name, p->host);
+ p->s->port = p->port = 0;
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "worker %s contact is disabled",
+ p->name);
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+ else {
+ p->s->port = p->port = 0;
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "worker %s contact is disabled",
+ p->name);
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+ }
+ else {
+ JK_LOG_NULL_PARAMS(l);
+ }
+
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+}
+
+static int ajp_create_endpoint_cache(ajp_worker_t *p, int proto, jk_logger_t *l)
+{
+ unsigned int i;
+ time_t now = time(NULL);
+
+ JK_TRACE_ENTER(l);
+
+ p->ep_cache = (ajp_endpoint_t **)calloc(1, sizeof(ajp_endpoint_t *) *
+ p->ep_cache_sz);
+ if (!p->ep_cache) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "setting connection pool size to %u with min %u and acquire timeout %d",
+ p->ep_cache_sz, p->ep_mincache_sz, p->cache_acquire_timeout);
+ for (i = 0; i < p->ep_cache_sz; i++) {
+ p->ep_cache[i] = (ajp_endpoint_t *)calloc(1, sizeof(ajp_endpoint_t));
+ if (!p->ep_cache[i]) {
+ jk_log(l, JK_LOG_ERROR,
+ "allocating endpoint slot %d (errno=%d)",
+ i, errno);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ p->ep_cache[i]->sd = JK_INVALID_SOCKET;
+ p->ep_cache[i]->reuse = JK_FALSE;
+ p->ep_cache[i]->hard_close = JK_FALSE;
+ p->ep_cache[i]->last_access = now;
+ jk_open_pool(&(p->ep_cache[i]->pool), p->ep_cache[i]->buf,
+ sizeof(p->ep_cache[i]->buf));
+ p->ep_cache[i]->worker = p;
+ p->ep_cache[i]->endpoint.endpoint_private = p->ep_cache[i];
+ p->ep_cache[i]->proto = proto;
+ p->ep_cache[i]->endpoint.service = ajp_service;
+ p->ep_cache[i]->endpoint.done = ajp_done;
+ p->ep_cache[i]->last_op = JK_AJP13_END_RESPONSE;
+ p->ep_cache[i]->addr_sequence = 0;
+ }
+
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+int ajp_init(jk_worker_t *pThis,
+ jk_map_t *props, jk_worker_env_t *we, jk_logger_t *l, int proto)
+{
+ int rc = JK_FALSE;
+ int cache;
+ /*
+ * start the connection cache
+ */
+ JK_TRACE_ENTER(l);
+
+ cache = jk_get_worker_def_cache_size(proto);
+
+ if (pThis && pThis->worker_private) {
+ ajp_worker_t *p = pThis->worker_private;
+ p->worker.we = we;
+ p->ep_cache_sz = jk_get_worker_cache_size(props, p->name, cache);
+ p->ep_mincache_sz = jk_get_worker_cache_size_min(props, p->name,
+ (p->ep_cache_sz+1) / 2);
+ p->socket_timeout =
+ jk_get_worker_socket_timeout(props, p->name, AJP_DEF_SOCKET_TIMEOUT);
+
+ p->socket_connect_timeout =
+ jk_get_worker_socket_connect_timeout(props, p->name,
+ p->socket_timeout * 1000);
+
+ p->keepalive =
+ jk_get_worker_socket_keepalive(props, p->name, JK_FALSE);
+
+ p->cache_timeout =
+ jk_get_worker_cache_timeout(props, p->name,
+ AJP_DEF_CACHE_TIMEOUT);
+
+ p->ping_timeout =
+ jk_get_worker_ping_timeout(props, p->name,
+ AJP_DEF_PING_TIMEOUT);
+ p->ping_mode =
+ jk_get_worker_ping_mode(props, p->name,
+ AJP_CPING_NONE);
+
+ p->connect_timeout =
+ jk_get_worker_connect_timeout(props, p->name,
+ AJP_DEF_CONNECT_TIMEOUT);
+
+ p->prepost_timeout =
+ jk_get_worker_prepost_timeout(props, p->name,
+ AJP_DEF_PREPOST_TIMEOUT);
+
+ if ((p->ping_mode & AJP_CPING_CONNECT) &&
+ p->connect_timeout == AJP_DEF_CONNECT_TIMEOUT)
+ p->connect_timeout = p->ping_timeout;
+
+ if ((p->ping_mode & AJP_CPING_PREPOST) &&
+ p->prepost_timeout == AJP_DEF_PREPOST_TIMEOUT)
+ p->prepost_timeout = p->ping_timeout;
+
+ p->conn_ping_interval =
+ jk_get_worker_conn_ping_interval(props, p->name, 0);
+ if ((p->ping_mode & AJP_CPING_INTERVAL) &&
+ p->conn_ping_interval == 0) {
+ /* XXX: Ping timeout is in miliseconds
+ * and ping_interval is in seconds.
+ * Use 10 times larger value for ping interval
+ * (ping_timeout / 1000) * 10
+ */
+ p->conn_ping_interval = p->ping_timeout / 100;
+ }
+ p->reply_timeout =
+ jk_get_worker_reply_timeout(props, p->name,
+ AJP_DEF_REPLY_TIMEOUT);
+
+ p->recovery_opts =
+ jk_get_worker_recovery_opts(props, p->name,
+ AJP_DEF_RECOVERY_OPTS);
+
+ p->retries =
+ jk_get_worker_retries(props, p->name,
+ JK_RETRIES);
+
+ p->max_packet_size =
+ jk_get_max_packet_size(props, p->name);
+
+ p->socket_buf =
+ jk_get_worker_socket_buffer(props, p->name, p->max_packet_size);
+
+ p->retry_interval =
+ jk_get_worker_retry_interval(props, p->name,
+ JK_SLEEP_DEF);
+ p->cache_acquire_timeout = jk_get_worker_cache_acquire_timeout(props,
+ p->name, p->retries * p->retry_interval);
+ p->http_status_fail_num = jk_get_worker_fail_on_status(props, p->name,
+ &p->http_status_fail[0],
+ JK_MAX_HTTP_STATUS_FAILS);
+
+ if (p->retries < 1) {
+ jk_log(l, JK_LOG_INFO,
+ "number of retries must be greater then 1. Setting to default=%d",
+ JK_RETRIES);
+ p->retries = JK_RETRIES;
+ }
+
+ p->maintain_time = jk_get_worker_maintain_time(props);
+ if(p->maintain_time < 0)
+ p->maintain_time = 0;
+ p->s->last_maintain_time = time(NULL);
+ p->s->last_reset = p->s->last_maintain_time;
+
+ if (JK_IS_DEBUG_LEVEL(l)) {
+
+ jk_log(l, JK_LOG_DEBUG,
+ "setting endpoint options:",
+ p->keepalive);
+ jk_log(l, JK_LOG_DEBUG,
+ "keepalive: %d",
+ p->keepalive);
+
+ jk_log(l, JK_LOG_DEBUG,
+ "socket timeout: %d",
+ p->socket_timeout);
+
+ jk_log(l, JK_LOG_DEBUG,
+ "socket connect timeout: %d",
+ p->socket_connect_timeout);
+
+ jk_log(l, JK_LOG_DEBUG,
+ "buffer size: %d",
+ p->socket_buf);
+
+ jk_log(l, JK_LOG_DEBUG,
+ "pool timeout: %d",
+ p->cache_timeout);
+
+ jk_log(l, JK_LOG_DEBUG,
+ "ping timeout: %d",
+ p->ping_timeout);
+
+ jk_log(l, JK_LOG_DEBUG,
+ "connect timeout: %d",
+ p->connect_timeout);
+
+ jk_log(l, JK_LOG_DEBUG,
+ "reply timeout: %d",
+ p->reply_timeout);
+
+ jk_log(l, JK_LOG_DEBUG,
+ "prepost timeout: %d",
+ p->prepost_timeout);
+
+ jk_log(l, JK_LOG_DEBUG,
+ "recovery options: %d",
+ p->recovery_opts);
+
+ jk_log(l, JK_LOG_DEBUG,
+ "retries: %d",
+ p->retries);
+
+ jk_log(l, JK_LOG_DEBUG,
+ "max packet size: %d",
+ p->max_packet_size);
+
+ jk_log(l, JK_LOG_DEBUG,
+ "retry interval: %d",
+ p->retry_interval);
+ }
+ /*
+ * Need to initialize secret here since we could return from inside
+ * of the following loop
+ */
+
+ p->secret = jk_get_worker_secret(props, p->name);
+ /* Initialize cache slots */
+ JK_INIT_CS(&(p->cs), rc);
+ if (!rc) {
+ jk_log(l, JK_LOG_ERROR,
+ "creating thread lock (errno=%d)",
+ errno);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ if (!ajp_create_endpoint_cache(p, proto, l)) {
+ jk_log(l, JK_LOG_ERROR,
+ "allocating connection pool of size %u",
+ p->ep_cache_sz);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ rc = JK_TRUE;
+ }
+ else {
+ JK_LOG_NULL_PARAMS(l);
+ }
+
+ JK_TRACE_EXIT(l);
+ return rc;
+}
+
+int JK_METHOD ajp_worker_factory(jk_worker_t **w,
+ const char *name, jk_logger_t *l)
+{
+ ajp_worker_t *aw;
+
+ JK_TRACE_ENTER(l);
+ if (name == NULL || w == NULL) {
+ JK_LOG_NULL_PARAMS(l);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ aw = (ajp_worker_t *) calloc(1, sizeof(ajp_worker_t));
+ if (!aw) {
+ jk_log(l, JK_LOG_ERROR,
+ "malloc of private_data failed");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ jk_open_pool(&aw->p,
+ aw->buf,
+ sizeof(jk_pool_atom_t) * TINY_POOL_SIZE);
+
+ strncpy(aw->name, name, JK_SHM_STR_SIZ);
+ aw->login = NULL;
+
+ aw->ep_cache_sz = 0;
+ aw->ep_cache = NULL;
+ aw->connect_retry_attempts = AJP_DEF_RETRY_ATTEMPTS;
+ aw->worker.worker_private = aw;
+
+ aw->worker.maintain = ajp_maintain;
+
+ aw->logon = NULL;
+
+ *w = &aw->worker;
+
+ aw->s = jk_shm_alloc_ajp_worker(&aw->p);
+ if (!aw->s) {
+ jk_close_pool(&aw->p);
+ free(aw);
+ jk_log(l, JK_LOG_ERROR,
+ "allocating ajp worker record from shared memory");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+int ajp_destroy(jk_worker_t **pThis, jk_logger_t *l, int proto)
+{
+ JK_TRACE_ENTER(l);
+
+ if (pThis && *pThis && (*pThis)->worker_private) {
+ unsigned int i;
+ ajp_worker_t *aw = (*pThis)->worker_private;
+
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "up to %u endpoints to close",
+ aw->ep_cache_sz);
+
+ for (i = 0; i < aw->ep_cache_sz; i++) {
+ if (aw->ep_cache[i])
+ ajp_close_endpoint(aw->ep_cache[i], l);
+ }
+ free(aw->ep_cache);
+ JK_DELETE_CS(&(aw->cs), i);
+
+ if (aw->login) {
+ /* take care of removing previously allocated data */
+ if (aw->login->servlet_engine_name)
+ free(aw->login->servlet_engine_name);
+
+ free(aw->login);
+ aw->login = NULL;
+ }
+
+ jk_close_pool(&aw->p);
+ free(aw);
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+
+ JK_LOG_NULL_PARAMS(l);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+}
+
+int JK_METHOD ajp_done(jk_endpoint_t **e, jk_logger_t *l)
+{
+ JK_TRACE_ENTER(l);
+
+ if (e && *e && (*e)->endpoint_private) {
+ ajp_endpoint_t *p = (*e)->endpoint_private;
+ int rc;
+ ajp_worker_t *w = p->worker;
+
+ /* set last_access only if needed */
+ if (w->cache_timeout > 0)
+ p->last_access = time(NULL);
+ if (w->s->addr_sequence != p->addr_sequence) {
+ p->reuse = JK_FALSE;
+ p->addr_sequence = w->s->addr_sequence;
+ }
+ ajp_reset_endpoint(p, l);
+ *e = NULL;
+ JK_ENTER_CS(&w->cs, rc);
+ if (rc) {
+ int i;
+
+ for (i = w->ep_cache_sz - 1; i >= 0; i--) {
+ if (w->ep_cache[i] == NULL) {
+ w->ep_cache[i] = p;
+ break;
+ }
+ }
+ JK_LEAVE_CS(&w->cs, rc);
+
+ if (i >= 0) {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "recycling connection pool slot=%u for worker %s",
+ i, p->worker->name);
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+ /* This should never hapen because
+ * there is always free empty cache slot
+ */
+ jk_log(l, JK_LOG_ERROR,
+ "could not find empty connection pool slot from %u for worker %s",
+ w->ep_cache_sz, w->name);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ jk_log(l, JK_LOG_ERROR,
+ "locking thread (errno=%d)", errno);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ JK_LOG_NULL_PARAMS(l);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+}
+
+int ajp_get_endpoint(jk_worker_t *pThis,
+ jk_endpoint_t **je, jk_logger_t *l, int proto)
+{
+ JK_TRACE_ENTER(l);
+
+ if (pThis && pThis->worker_private && je) {
+ ajp_worker_t *aw = pThis->worker_private;
+ ajp_endpoint_t *ae = NULL;
+ int rc;
+ int retry = 0;
+
+ *je = NULL;
+ /* Loop until cache_acquire_timeout interval elapses */
+ while ((retry * JK_SLEEP_DEF) < aw->cache_acquire_timeout) {
+
+ JK_ENTER_CS(&aw->cs, rc);
+ if (rc) {
+ unsigned int slot;
+ /* Try to find connected socket cache entry */
+ for (slot = 0; slot < aw->ep_cache_sz; slot++) {
+ if (aw->ep_cache[slot] &&
+ IS_VALID_SOCKET(aw->ep_cache[slot]->sd)) {
+ ae = aw->ep_cache[slot];
+ if (ae->reuse) {
+ aw->ep_cache[slot] = NULL;
+ break;
+ }
+ else {
+ /* XXX: We shouldn't have non reusable
+ * opened socket in the cache
+ */
+ ajp_reset_endpoint(ae, l);
+ ae = NULL;
+ jk_log(l, JK_LOG_WARNING,
+ "closing non reusable pool slot=%d", slot);
+ }
+ }
+ }
+ if (!ae) {
+ /* No connected cache entry found.
+ * Use the first free one.
+ */
+ for (slot = 0; slot < aw->ep_cache_sz; slot++) {
+ if (aw->ep_cache[slot]) {
+ ae = aw->ep_cache[slot];
+ aw->ep_cache[slot] = NULL;
+ break;
+ }
+ }
+ }
+ JK_LEAVE_CS(&aw->cs, rc);
+ if (ae) {
+ if (aw->cache_timeout > 0)
+ ae->last_access = time(NULL);
+ *je = &ae->endpoint;
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "acquired connection pool slot=%u after %d retries",
+ slot, retry);
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+ else {
+ retry++;
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "could not get free endpoint for worker %s"
+ " (retry %d, sleeping for %d ms)",
+ aw->name, retry, JK_SLEEP_DEF);
+ jk_sleep(JK_SLEEP_DEF);
+ }
+ }
+ else {
+ jk_log(l, JK_LOG_ERROR,
+ "locking thread (errno=%d)", errno);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+
+ }
+ }
+ jk_log(l, JK_LOG_WARNING,
+ "Unable to get the free endpoint for worker %s from %u slots",
+ aw->name, aw->ep_cache_sz);
+ }
+ else {
+ JK_LOG_NULL_PARAMS(l);
+ }
+
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+}
+
+int JK_METHOD ajp_maintain(jk_worker_t *pThis, time_t mstarted, jk_logger_t *l)
+{
+ JK_TRACE_ENTER(l);
+
+ if (pThis && pThis->worker_private) {
+ ajp_worker_t *aw = pThis->worker_private;
+ time_t now = mstarted;
+ int rc;
+ long delta;
+
+ jk_shm_lock();
+
+ /* Now we check for global maintenance (once for all processes).
+ * Checking workers for idleness.
+ * Therefore we globally sync and we use a global timestamp.
+ * Since it's possible that we come here a few milliseconds
+ * before the interval has passed, we allow a little tolerance.
+ */
+ delta = (long)difftime(mstarted, aw->s->last_maintain_time) + JK_AJP_MAINTAIN_TOLERANCE;
+ if (delta >= aw->maintain_time) {
+ aw->s->last_maintain_time = mstarted;
+ if (aw->s->state == JK_AJP_STATE_OK &&
+ aw->s->used == aw->s->used_snapshot)
+ aw->s->state = JK_AJP_STATE_IDLE;
+ aw->s->used_snapshot = aw->s->used;
+ }
+
+ jk_shm_unlock();
+
+ /* Do connection pool maintenance only if timeouts or keepalives are set */
+ if (aw->cache_timeout <= 0 &&
+ aw->conn_ping_interval <= 0) {
+ /* Nothing to do. */
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+
+ JK_ENTER_CS(&aw->cs, rc);
+ if (rc) {
+ unsigned int n = 0, k = 0, cnt = 0;
+ int i;
+ unsigned int m, m_count = 0;
+ jk_sock_t *m_sock;
+ /* Count open slots */
+ for (i = (int)aw->ep_cache_sz - 1; i >= 0; i--) {
+ if (aw->ep_cache[i] && IS_VALID_SOCKET(aw->ep_cache[i]->sd))
+ cnt++;
+ }
+ m_sock = (jk_sock_t *)malloc((cnt + 1) * sizeof(jk_sock_t));
+ /* Handle worker cache timeouts */
+ if (aw->cache_timeout > 0) {
+ for (i = (int)aw->ep_cache_sz - 1;
+ i >= 0; i--) {
+ /* Skip the closed sockets */
+ if (aw->ep_cache[i] && IS_VALID_SOCKET(aw->ep_cache[i]->sd)) {
+ int elapsed = (int)difftime(mstarted, aw->ep_cache[i]->last_access);
+ if (elapsed > aw->cache_timeout) {
+ time_t rt = 0;
+ n++;
+ if (JK_IS_DEBUG_LEVEL(l))
+ rt = time(NULL);
+ aw->ep_cache[i]->reuse = JK_FALSE;
+ m_sock[m_count++] = aw->ep_cache[i]->sd;
+ aw->ep_cache[i]->sd = JK_INVALID_SOCKET;
+ ajp_reset_endpoint(aw->ep_cache[i], l);
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "cleaning pool slot=%d elapsed %d in %d",
+ i, elapsed, (int)(difftime(time(NULL), rt)));
+ }
+ }
+ if (cnt <= aw->ep_mincache_sz + n) {
+ if (JK_IS_DEBUG_LEVEL(l)) {
+ jk_log(l, JK_LOG_DEBUG,
+ "reached pool min size %u from %u cache slots",
+ aw->ep_mincache_sz, aw->ep_cache_sz);
+ }
+ break;
+ }
+ }
+ }
+ /* Handle worker connection keepalive */
+ if (aw->conn_ping_interval > 0 && aw->ping_timeout > 0) {
+ for (i = (int)aw->ep_cache_sz - 1; i >= 0; i--) {
+ /* Skip the closed sockets */
+ if (aw->ep_cache[i] && IS_VALID_SOCKET(aw->ep_cache[i]->sd)) {
+ int elapsed = (int)difftime(now, aw->ep_cache[i]->last_access);
+ if (elapsed > aw->conn_ping_interval) {
+ k++;
+ /* handle cping/cpong.
+ */
+ if (ajp_handle_cping_cpong(aw->ep_cache[i],
+ aw->ping_timeout, l) == JK_FALSE) {
+ jk_log(l, JK_LOG_INFO,
+ "(%s) failed sending request, "
+ "socket %d keepalive cping/cpong "
+ "failure (errno=%d)",
+ aw->name,
+ aw->ep_cache[i]->sd,
+ aw->ep_cache[i]->last_errno);
+ aw->ep_cache[i]->reuse = JK_FALSE;
+ m_sock[m_count++] = aw->ep_cache[i]->sd;
+ aw->ep_cache[i]->sd = JK_INVALID_SOCKET;
+ ajp_reset_endpoint(aw->ep_cache[i], l);
+ }
+ else {
+ now = time(NULL);
+ aw->ep_cache[i]->last_access = now;
+ }
+ }
+ }
+ }
+ }
+ JK_LEAVE_CS(&aw->cs, rc);
+ /* Shutdown sockets outside of the lock.
+ * This has benefits only if maintain was
+ * called from the watchdog thread.
+ */
+ for (m = 0; m < m_count; m++) {
+ jk_shutdown_socket(m_sock[m], l);
+ }
+ free(m_sock);
+ if (n && JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "recycled %u sockets in %d seconds from %u pool slots",
+ n, (int)(difftime(time(NULL), mstarted)),
+ aw->ep_cache_sz);
+ if (k && JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "pinged %u sockets in %d seconds from %u pool slots",
+ k, (int)(difftime(time(NULL), mstarted)),
+ aw->ep_cache_sz);
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+ else {
+ jk_log(l, JK_LOG_ERROR,
+ "locking thread (errno=%d)",
+ errno);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+
+ }
+ }
+ else {
+ JK_LOG_NULL_PARAMS(l);
+ }
+
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+}
+
+int ajp_has_endpoint(jk_worker_t *pThis,
+ jk_logger_t *l)
+{
+ JK_TRACE_ENTER(l);
+
+ if (pThis && pThis->worker_private) {
+ ajp_worker_t *aw = pThis->worker_private;
+ int rc;
+
+ JK_ENTER_CS(&aw->cs, rc);
+ if (rc) {
+ unsigned int slot;
+ /* Try to find connected socket cache entry */
+ for (slot = 0; slot < aw->ep_cache_sz; slot++) {
+ if (aw->ep_cache[slot]) {
+ JK_LEAVE_CS(&aw->cs, rc);
+ return JK_TRUE;
+ }
+ }
+ JK_LEAVE_CS(&aw->cs, rc);
+ }
+ else {
+ jk_log(l, JK_LOG_ERROR,
+ "locking thread (errno=%d)", errno);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ }
+ else {
+ JK_LOG_NULL_PARAMS(l);
+ }
+
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+}
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp_common.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp_common.h
new file mode 100644
index 00000000..09940fd9
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp_common.h
@@ -0,0 +1,467 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: common stuff for bi-directional protocol ajp13/ajp14. *
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Author: Henri Gomez <hgomez@apache.org> *
+ * Version: $Revision: 1137200 $ *
+ ***************************************************************************/
+
+#ifndef JK_AJP_COMMON_H
+#define JK_AJP_COMMON_H
+
+#include "jk_service.h"
+#include "jk_msg_buff.h"
+#include "jk_shm.h"
+#include "jk_mt.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+#define JK_AJP_STATE_IDLE (0)
+#define JK_AJP_STATE_OK (1)
+#define JK_AJP_STATE_ERROR (2)
+#define JK_AJP_STATE_PROBE (3)
+#define JK_AJP_STATE_DEF (JK_AJP_STATE_IDLE)
+#define JK_AJP_STATE_TEXT_IDLE ("OK/IDLE")
+#define JK_AJP_STATE_TEXT_OK ("OK")
+#define JK_AJP_STATE_TEXT_ERROR ("ERR")
+#define JK_AJP_STATE_TEXT_PROBE ("ERR/PRB")
+#define JK_AJP_STATE_TEXT_MAX (JK_AJP_STATE_PROBE)
+#define JK_AJP_STATE_TEXT_DEF (JK_AJP_STATE_TEXT_IDLE)
+
+/* We accept doing global maintenance if we are */
+/* JK_AJP_MAINTAIN_TOLERANCE seconds early. */
+#define JK_AJP_MAINTAIN_TOLERANCE (2)
+
+/*
+ * Conditional request attributes
+ *
+ */
+#define SC_A_CONTEXT (unsigned char)1
+#define SC_A_SERVLET_PATH (unsigned char)2
+#define SC_A_REMOTE_USER (unsigned char)3
+#define SC_A_AUTH_TYPE (unsigned char)4
+#define SC_A_QUERY_STRING (unsigned char)5
+#define SC_A_ROUTE (unsigned char)6
+#define SC_A_SSL_CERT (unsigned char)7
+#define SC_A_SSL_CIPHER (unsigned char)8
+#define SC_A_SSL_SESSION (unsigned char)9
+#define SC_A_REQ_ATTRIBUTE (unsigned char)10
+#define SC_A_SSL_KEY_SIZE (unsigned char)11 /* only in if JkOptions +ForwardKeySize */
+#define SC_A_SECRET (unsigned char)12
+#define SC_A_STORED_METHOD (unsigned char)13
+#define SC_A_ARE_DONE (unsigned char)0xFF
+
+/*
+ * AJP private request attributes
+ *
+ * The following request attribute is recognized by Tomcat
+ * to contain the forwarded remote port.
+ */
+#define SC_A_REQ_REMOTE_PORT ("AJP_REMOTE_PORT")
+
+/*
+ * JK public request attributes
+ *
+ * Activation state of the worker in the load balancer.
+ * Can be any of the JK_LB_ACTIVATION_TEXT_* strings
+ * from jk_lb_worker.h.
+ */
+#define SC_A_JK_LB_ACTIVATION ("JK_LB_ACTIVATION")
+
+/*
+ * Request methods, coded as numbers instead of strings.
+ * The list of methods was taken from Section 5.1.1 of RFC 2616,
+ * RFC 2518, the ACL IETF draft, and the DeltaV IESG Proposed Standard.
+ * Method = "OPTIONS"
+ * | "GET"
+ * | "HEAD"
+ * | "POST"
+ * | "PUT"
+ * | "DELETE"
+ * | "TRACE"
+ * | "PROPFIND"
+ * | "PROPPATCH"
+ * | "MKCOL"
+ * | "COPY"
+ * | "MOVE"
+ * | "LOCK"
+ * | "UNLOCK"
+ * | "ACL"
+ * | "REPORT"
+ * | "VERSION-CONTROL"
+ * | "CHECKIN"
+ * | "CHECKOUT"
+ * | "UNCHECKOUT"
+ * | "SEARCH"
+ * | "MKWORKSPACE"
+ * | "UPDATE"
+ * | "LABEL"
+ * | "MERGE"
+ * | "BASELINE-CONTROL"
+ * | "MKACTIVITY"
+ *
+ */
+#define SC_M_OPTIONS (unsigned char)1
+#define SC_M_GET (unsigned char)2
+#define SC_M_HEAD (unsigned char)3
+#define SC_M_POST (unsigned char)4
+#define SC_M_PUT (unsigned char)5
+#define SC_M_DELETE (unsigned char)6
+#define SC_M_TRACE (unsigned char)7
+#define SC_M_PROPFIND (unsigned char)8
+#define SC_M_PROPPATCH (unsigned char)9
+#define SC_M_MKCOL (unsigned char)10
+#define SC_M_COPY (unsigned char)11
+#define SC_M_MOVE (unsigned char)12
+#define SC_M_LOCK (unsigned char)13
+#define SC_M_UNLOCK (unsigned char)14
+#define SC_M_ACL (unsigned char)15
+#define SC_M_REPORT (unsigned char)16
+#define SC_M_VERSION_CONTROL (unsigned char)17
+#define SC_M_CHECKIN (unsigned char)18
+#define SC_M_CHECKOUT (unsigned char)19
+#define SC_M_UNCHECKOUT (unsigned char)20
+#define SC_M_SEARCH (unsigned char)21
+#define SC_M_MKWORKSPACE (unsigned char)22
+#define SC_M_UPDATE (unsigned char)23
+#define SC_M_LABEL (unsigned char)24
+#define SC_M_MERGE (unsigned char)25
+#define SC_M_BASELINE_CONTROL (unsigned char)26
+#define SC_M_MKACTIVITY (unsigned char)27
+#define SC_M_JK_STORED (unsigned char)0xFF
+
+/*
+ * Frequent request headers, these headers are coded as numbers
+ * instead of strings.
+ *
+ * Accept
+ * Accept-Charset
+ * Accept-Encoding
+ * Accept-Language
+ * Authorization
+ * Connection
+ * Content-Type
+ * Content-Length
+ * Cookie
+ * Cookie2
+ * Host
+ * Pragma
+ * Referer
+ * User-Agent
+ *
+ */
+
+#define SC_ACCEPT (unsigned short)0xA001
+#define SC_ACCEPT_CHARSET (unsigned short)0xA002
+#define SC_ACCEPT_ENCODING (unsigned short)0xA003
+#define SC_ACCEPT_LANGUAGE (unsigned short)0xA004
+#define SC_AUTHORIZATION (unsigned short)0xA005
+#define SC_CONNECTION (unsigned short)0xA006
+#define SC_CONTENT_TYPE (unsigned short)0xA007
+#define SC_CONTENT_LENGTH (unsigned short)0xA008
+#define SC_COOKIE (unsigned short)0xA009
+#define SC_COOKIE2 (unsigned short)0xA00A
+#define SC_HOST (unsigned short)0xA00B
+#define SC_PRAGMA (unsigned short)0xA00C
+#define SC_REFERER (unsigned short)0xA00D
+#define SC_USER_AGENT (unsigned short)0xA00E
+
+/*
+ * Frequent response headers, these headers are coded as numbers
+ * instead of strings.
+ *
+ * Content-Type
+ * Content-Language
+ * Content-Length
+ * Date
+ * Last-Modified
+ * Location
+ * Set-Cookie
+ * Servlet-Engine
+ * Status
+ * WWW-Authenticate
+ *
+ */
+
+#define SC_RESP_CONTENT_TYPE (unsigned short)0xA001
+#define SC_RESP_CONTENT_LANGUAGE (unsigned short)0xA002
+#define SC_RESP_CONTENT_LENGTH (unsigned short)0xA003
+#define SC_RESP_DATE (unsigned short)0xA004
+#define SC_RESP_LAST_MODIFIED (unsigned short)0xA005
+#define SC_RESP_LOCATION (unsigned short)0xA006
+#define SC_RESP_SET_COOKIE (unsigned short)0xA007
+#define SC_RESP_SET_COOKIE2 (unsigned short)0xA008
+#define SC_RESP_SERVLET_ENGINE (unsigned short)0xA009
+#define SC_RESP_STATUS (unsigned short)0xA00A
+#define SC_RESP_WWW_AUTHENTICATE (unsigned short)0xA00B
+#define SC_RES_HEADERS_NUM 11
+
+/*
+ * AJP13/AJP14 use same message structure
+ */
+
+#define AJP_DEF_RETRY_ATTEMPTS (1)
+
+#define AJP_HEADER_LEN (4)
+#define AJP_HEADER_SZ_LEN (2)
+#define CHUNK_BUFFER_PAD (12)
+#define AJP_DEF_CACHE_TIMEOUT (0)
+#define AJP_DEF_CONNECT_TIMEOUT (0) /* NO CONNECTION TIMEOUT => NO CPING/CPONG */
+#define AJP_DEF_REPLY_TIMEOUT (0) /* NO REPLY TIMEOUT */
+#define AJP_DEF_PREPOST_TIMEOUT (0) /* NO PREPOST TIMEOUT => NO CPING/CPONG */
+#define AJP_DEF_RECOVERY_OPTS (0) /* NO RECOVERY / NO */
+#define AJP_DEF_SOCKET_TIMEOUT (0) /* No timeout */
+#define AJP_DEF_PING_TIMEOUT (10000) /* Default CPING/CPONG timeout (10 seconds) */
+
+#define AJP_CPING_NONE (0) /* Do not send cping packets */
+#define AJP_CPING_CONNECT (1) /* Send cping on fresh connection */
+#define AJP_CPING_PREPOST (2) /* Send cping before sending request */
+#define AJP_CPING_INTERVAL (4) /* Send cping on regular intervals */
+
+
+#define RECOVER_ABORT_IF_TCGETREQUEST 0x0001 /* DON'T RECOVER IF TOMCAT FAILS AFTER RECEIVING REQUEST */
+#define RECOVER_ABORT_IF_TCSENDHEADER 0x0002 /* DON'T RECOVER IF TOMCAT FAILS AFTER SENDING HEADERS */
+#define RECOVER_ABORT_IF_CLIENTERROR 0x0004 /* CLOSE THE SOCKET IN CASE OF CLIENT ERROR */
+#define RECOVER_ALWAYS_HTTP_HEAD 0x0008 /* RECOVER HTTP HEAD REQUESTS, EVEN IF ABORT OPTIONS ARE SET */
+#define RECOVER_ALWAYS_HTTP_GET 0x0010 /* RECOVER HTTP GET REQUESTS, EVEN IF ABORT OPTIONS ARE SET */
+
+#define JK_MAX_HTTP_STATUS_FAILS 32 /* Should be enough for most 400 and 500 statuses */
+
+struct jk_res_data
+{
+ int status;
+#ifdef AS400
+ char *msg;
+#else
+ const char *msg;
+#endif
+ unsigned num_headers;
+ char **header_names;
+ char **header_values;
+};
+typedef struct jk_res_data jk_res_data_t;
+
+#include "jk_ajp14.h"
+
+struct ajp_operation;
+typedef struct ajp_operation ajp_operation_t;
+
+struct ajp_endpoint;
+typedef struct ajp_endpoint ajp_endpoint_t;
+
+struct ajp_worker;
+typedef struct ajp_worker ajp_worker_t;
+
+struct ajp_worker
+{
+ jk_worker_t worker;
+ /* Shared memory worker data */
+ jk_shm_ajp_worker_t *s;
+
+ char name[JK_SHM_STR_SIZ+1];
+ /* Sequence counter starting at 0 and increasing
+ * every time we change the config
+ */
+ volatile unsigned int sequence;
+
+ jk_pool_t p;
+ jk_pool_atom_t buf[TINY_POOL_SIZE];
+
+ JK_CRIT_SEC cs;
+
+ struct sockaddr_in worker_inet_addr; /* Contains host and port */
+ unsigned connect_retry_attempts;
+ char host[JK_SHM_STR_SIZ+1];
+ int port;
+ int addr_sequence; /* Whether the address is resolved */
+ int maintain_time;
+ /*
+ * Open connections cache...
+ *
+ * 1. Critical section object to protect the cache.
+ * 2. Cache size.
+ * 3. An array of "open" endpoints.
+ */
+ unsigned int ep_cache_sz;
+ unsigned int ep_mincache_sz;
+ unsigned int ep_maxcache_sz;
+ int cache_acquire_timeout;
+ ajp_endpoint_t **ep_cache;
+
+ int proto; /* PROTOCOL USED AJP13/AJP14 */
+
+ jk_login_service_t *login;
+
+ /* Weak secret similar with ajp12, used in ajp13 */
+ const char *secret;
+
+ /*
+ * Post physical connect handler.
+ * AJP14 will set here its login handler
+ */
+ int (*logon) (ajp_endpoint_t * ae, jk_logger_t *l);
+
+ /*
+ * Handle Socket Timeouts
+ */
+ int socket_timeout;
+ int socket_connect_timeout;
+ int keepalive;
+ int socket_buf;
+ /*
+ * Handle Cache Timeouts
+ */
+ int cache_timeout;
+
+ /*
+ * Handle Connection/Reply Timeouts
+ */
+ int connect_timeout; /* connect cping/cpong delay in ms (0 means disabled) */
+ int reply_timeout; /* reply timeout delay in ms (0 means disabled) */
+ int prepost_timeout; /* before sending a request cping/cpong timeout delay in ms (0 means disabled) */
+ int conn_ping_interval; /* interval for sending keepalive cping packets on
+ * unused connection */
+ int ping_timeout; /* generic cping/cpong timeout. Used for keepalive packets or
+ * as default for boolean valued connect and prepost timeouts.
+ */
+ unsigned int ping_mode; /* Ping mode flags (which types of cpings should be used) */
+ /*
+ * Recovery options
+ */
+ unsigned int recovery_opts;
+
+ /*
+ * Public property to enable the number of retry attempts
+ * on this worker.
+ */
+ int retries;
+
+ unsigned int max_packet_size; /* Maximum AJP Packet size */
+
+ int retry_interval; /* Number of milliseconds to sleep before doing a retry */
+
+ /*
+ * HTTP status that will cause failover (0 means disabled)
+ */
+ unsigned int http_status_fail_num;
+ int http_status_fail[JK_MAX_HTTP_STATUS_FAILS];
+};
+
+
+/*
+ * endpoint, the remote connector which does the work
+ */
+struct ajp_endpoint
+{
+ ajp_worker_t *worker;
+
+ jk_pool_t pool;
+ jk_pool_atom_t buf[BIG_POOL_SIZE];
+
+ int proto; /* PROTOCOL USED AJP13/AJP14 */
+
+ jk_sock_t sd;
+ int reuse;
+
+ /* Used with RECOVER_ABORT_IF_CLIENTERROR to hard abort
+ write of AJP response on client write errors */
+ int hard_close;
+
+ jk_endpoint_t endpoint;
+
+ jk_uint64_t left_bytes_to_send;
+
+ /* time of the last request
+ handled by this endpoint */
+ time_t last_access;
+ int last_errno;
+ /* Last operation performed via this endpoint */
+ int last_op;
+ int addr_sequence; /* Whether the address is resolved */
+};
+
+/*
+ * little struct to avoid multiples ptr passing
+ * this struct is ready to hold upload file fd
+ * to add upload persistant storage
+ */
+struct ajp_operation
+{
+ jk_msg_buf_t *request; /* original request storage */
+ jk_msg_buf_t *reply; /* reply storage (chuncked by ajp13 */
+ jk_msg_buf_t *post; /* small post data storage area */
+ int uploadfd; /* future persistant storage id */
+ int recoverable; /* if exchange could be conducted on another TC */
+};
+
+/*
+ * Functions
+ */
+
+
+const char *jk_ajp_get_state(ajp_worker_t *aw, jk_logger_t *l);
+
+int jk_ajp_get_state_code(const char *v);
+
+int ajp_validate(jk_worker_t *pThis,
+ jk_map_t *props,
+ jk_worker_env_t *we, jk_logger_t *l, int proto);
+
+int ajp_init(jk_worker_t *pThis,
+ jk_map_t *props,
+ jk_worker_env_t *we, jk_logger_t *l, int proto);
+
+int JK_METHOD ajp_worker_factory(jk_worker_t **w,
+ const char *name, jk_logger_t *l);
+
+int ajp_destroy(jk_worker_t **pThis, jk_logger_t *l, int proto);
+
+int JK_METHOD ajp_done(jk_endpoint_t **e, jk_logger_t *l);
+
+int ajp_get_endpoint(jk_worker_t *pThis,
+ jk_endpoint_t **pend, jk_logger_t *l, int proto);
+
+int ajp_connect_to_endpoint(ajp_endpoint_t * ae, jk_logger_t *l);
+
+void ajp_close_endpoint(ajp_endpoint_t * ae, jk_logger_t *l);
+
+void jk_ajp_pull(ajp_worker_t * aw, int locked, jk_logger_t *l);
+
+void jk_ajp_push(ajp_worker_t * aw, int locked, jk_logger_t *l);
+
+int ajp_connection_tcp_send_message(ajp_endpoint_t * ae,
+ jk_msg_buf_t *msg, jk_logger_t *l);
+
+int ajp_connection_tcp_get_message(ajp_endpoint_t * ae,
+ jk_msg_buf_t *msg, jk_logger_t *l);
+
+int JK_METHOD ajp_maintain(jk_worker_t *pThis, time_t now, jk_logger_t *l);
+
+int jk_ajp_get_cping_mode(const char *m, int def);
+
+int ajp_has_endpoint(jk_worker_t *pThis, jk_logger_t *l);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* JK_AJP_COMMON_H */
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp_common.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp_common.lo
new file mode 100644
index 00000000..9d02a8f0
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp_common.lo
@@ -0,0 +1,12 @@
+# jk_ajp_common.lo - a libtool object file
+# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18)
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/jk_ajp_common.o'
+
+# Name of the non-PIC object.
+non_pic_object='jk_ajp_common.o'
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp_common.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp_common.o
new file mode 100644
index 00000000..2e6679aa
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_ajp_common.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_connect.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_connect.c
new file mode 100644
index 00000000..edf8c33b
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_connect.c
@@ -0,0 +1,1190 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * Description: Socket/Naming manipulation functions
+ * Based on: Various Jserv files
+ */
+/**
+ * @package jk_connect
+ * @author Gal Shachor <shachor@il.ibm.com>
+ * @author Mladen Turk <mturk@apache.org>
+ * @version $Revision: 1125651 $
+ */
+
+
+#include "jk_connect.h"
+#include "jk_util.h"
+
+#ifdef HAVE_APR
+#include "apr_network_io.h"
+#include "apr_errno.h"
+#include "apr_general.h"
+#include "apr_pools.h"
+static apr_pool_t *jk_apr_pool = NULL;
+#endif
+
+#ifdef HAVE_SYS_FILIO_H
+/* FIONREAD on Solaris et al. */
+#include <sys/filio.h>
+#endif
+#ifdef HAVE_POLL_H
+/* Use poll instead select */
+#include <poll.h>
+#endif
+
+#if defined(WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__))
+#define JK_IS_SOCKET_ERROR(x) ((x) == SOCKET_ERROR)
+#define JK_GET_SOCKET_ERRNO() errno = WSAGetLastError() - WSABASEERR
+#else
+#define JK_IS_SOCKET_ERROR(x) ((x) == -1)
+#define JK_GET_SOCKET_ERRNO() ((void)0)
+#endif /* WIN32 */
+
+#if defined(NETWARE) && defined(__NOVELL_LIBC__)
+#define USE_SOCK_CLOEXEC
+#endif
+
+/* our compiler cant deal with char* <-> const char* ... */
+#if defined(NETWARE) && !defined(__NOVELL_LIBC__)
+typedef char* SET_TYPE;
+#else
+typedef const char* SET_TYPE;
+#endif
+
+/** Set socket to blocking
+ * @param sd socket to manipulate
+ * @return errno: fcntl returns -1 (!WIN32)
+ * pseudo errno: ioctlsocket returns SOCKET_ERROR (WIN32)
+ * 0: success
+ */
+static int soblock(jk_sock_t sd)
+{
+/* BeOS uses setsockopt at present for non blocking... */
+#if defined (WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__))
+ u_long on = 0;
+ if (JK_IS_SOCKET_ERROR(ioctlsocket(sd, FIONBIO, &on))) {
+ JK_GET_SOCKET_ERRNO();
+ return errno;
+ }
+#else
+ int fd_flags;
+
+ fd_flags = fcntl(sd, F_GETFL, 0);
+#if defined(O_NONBLOCK)
+ fd_flags &= ~O_NONBLOCK;
+#elif defined(O_NDELAY)
+ fd_flags &= ~O_NDELAY;
+#elif defined(FNDELAY)
+ fd_flags &= ~FNDELAY;
+#else
+#error Please teach JK how to make sockets blocking on your platform.
+#endif
+ if (fcntl(sd, F_SETFL, fd_flags) == -1) {
+ return errno;
+ }
+#endif /* WIN32 || (NETWARE && __NOVELL_LIBC__) */
+ return 0;
+}
+
+/** Set socket to non-blocking
+ * @param sd socket to manipulate
+ * @return errno: fcntl returns -1 (!WIN32)
+ * pseudo errno: ioctlsocket returns SOCKET_ERROR (WIN32)
+ * 0: success
+ */
+static int sononblock(jk_sock_t sd)
+{
+#if defined (WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__))
+ u_long on = 1;
+ if (JK_IS_SOCKET_ERROR(ioctlsocket(sd, FIONBIO, &on))) {
+ JK_GET_SOCKET_ERRNO();
+ return errno;
+ }
+#else
+ int fd_flags;
+
+ fd_flags = fcntl(sd, F_GETFL, 0);
+#if defined(O_NONBLOCK)
+ fd_flags |= O_NONBLOCK;
+#elif defined(O_NDELAY)
+ fd_flags |= O_NDELAY;
+#elif defined(FNDELAY)
+ fd_flags |= FNDELAY;
+#else
+#error Please teach JK how to make sockets non-blocking on your platform.
+#endif
+ if (fcntl(sd, F_SETFL, fd_flags) == -1) {
+ return errno;
+ }
+#endif /* WIN32 || (NETWARE && __NOVELL_LIBC__) */
+ return 0;
+}
+
+#if defined (WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__))
+/* WIN32 implementation */
+/** Non-blocking socket connect
+ * @param sd socket to connect
+ * @param addr address to connect to
+ * @param timeout connect timeout in seconds
+ * (<=0: no timeout=blocking)
+ * @param l logger
+ * @return -1: some kind of error occured
+ * SOCKET_ERROR: no timeout given and error
+ * during blocking connect
+ * 0: success
+ */
+static int nb_connect(jk_sock_t sd, struct sockaddr *addr, int timeout, jk_logger_t *l)
+{
+ int rc;
+
+ JK_TRACE_ENTER(l);
+
+ if (timeout <= 0) {
+ rc = connect(sd, addr, sizeof(struct sockaddr_in));
+ JK_TRACE_EXIT(l);
+ return rc;
+ }
+
+ if ((rc = sononblock(sd))) {
+ JK_TRACE_EXIT(l);
+ return -1;
+ }
+ if (JK_IS_SOCKET_ERROR(connect(sd, addr, sizeof(struct sockaddr_in)))) {
+ struct timeval tv;
+ fd_set wfdset, efdset;
+
+ if ((rc = WSAGetLastError()) != WSAEWOULDBLOCK) {
+ soblock(sd);
+ WSASetLastError(rc);
+ JK_TRACE_EXIT(l);
+ return -1;
+ }
+ /* wait for the connect to complete or timeout */
+ FD_ZERO(&wfdset);
+ FD_SET(sd, &wfdset);
+ FD_ZERO(&efdset);
+ FD_SET(sd, &efdset);
+
+ tv.tv_sec = timeout / 1000;
+ tv.tv_usec = (timeout % 1000) * 1000;
+
+ rc = select((int)sd + 1, NULL, &wfdset, &efdset, &tv);
+ if (JK_IS_SOCKET_ERROR(rc) || rc == 0) {
+ rc = WSAGetLastError();
+ soblock(sd);
+ WSASetLastError(rc);
+ JK_TRACE_EXIT(l);
+ return -1;
+ }
+ /* Evaluate the efdset */
+ if (FD_ISSET(sd, &efdset)) {
+ /* The connect failed. */
+ int rclen = (int)sizeof(rc);
+ if (getsockopt(sd, SOL_SOCKET, SO_ERROR, (char*) &rc, &rclen))
+ rc = 0;
+ soblock(sd);
+ if (rc)
+ WSASetLastError(rc);
+ JK_TRACE_EXIT(l);
+ return -1;
+ }
+ }
+ soblock(sd);
+ JK_TRACE_EXIT(l);
+ return 0;
+}
+
+#elif !defined(NETWARE)
+/* POSIX implementation */
+/** Non-blocking socket connect
+ * @param sd socket to connect
+ * @param addr address to connect to
+ * @param timeout connect timeout in seconds
+ * (<=0: no timeout=blocking)
+ * @param l logger
+ * @return -1: some kind of error occured
+ * 0: success
+ */
+static int nb_connect(jk_sock_t sd, struct sockaddr *addr, int timeout, jk_logger_t *l)
+{
+ int rc = 0;
+
+ JK_TRACE_ENTER(l);
+
+ if (timeout > 0) {
+ if (sononblock(sd)) {
+ JK_TRACE_EXIT(l);
+ return -1;
+ }
+ }
+ do {
+ rc = connect(sd, addr, sizeof(struct sockaddr_in));
+ } while (rc == -1 && errno == EINTR);
+
+ if ((rc == -1) && (errno == EINPROGRESS || errno == EALREADY)
+ && (timeout > 0)) {
+ fd_set wfdset;
+ struct timeval tv;
+ socklen_t rclen = (socklen_t)sizeof(rc);
+
+ FD_ZERO(&wfdset);
+ FD_SET(sd, &wfdset);
+ tv.tv_sec = timeout / 1000;
+ tv.tv_usec = (timeout % 1000) * 1000;
+ rc = select(sd + 1, NULL, &wfdset, NULL, &tv);
+ if (rc <= 0) {
+ /* Save errno */
+ int err = errno;
+ soblock(sd);
+ errno = err;
+ JK_TRACE_EXIT(l);
+ return -1;
+ }
+ rc = 0;
+#ifdef SO_ERROR
+ if (!FD_ISSET(sd, &wfdset) ||
+ (getsockopt(sd, SOL_SOCKET, SO_ERROR,
+ (char *)&rc, &rclen) < 0) || rc) {
+ if (rc)
+ errno = rc;
+ rc = -1;
+ }
+#endif /* SO_ERROR */
+ }
+ /* Not sure we can be already connected */
+ if (rc == -1 && errno == EISCONN)
+ rc = 0;
+ soblock(sd);
+ JK_TRACE_EXIT(l);
+ return rc;
+}
+#else
+/* NETWARE implementation - blocking for now */
+/** Non-blocking socket connect
+ * @param sd socket to connect
+ * @param addr address to connect to
+ * @param timeout connect timeout in seconds (ignored!)
+ * @param l logger
+ * @return -1: some kind of error occured
+ * 0: success
+ */
+static int nb_connect(jk_sock_t sd, struct sockaddr *addr, int timeout, jk_logger_t *l)
+{
+ int rc;
+
+ JK_TRACE_ENTER(l);
+
+ rc = connect(sd, addr, sizeof(struct sockaddr_in));
+ JK_TRACE_EXIT(l);
+ return rc;
+}
+#endif
+
+
+#ifdef AS400_UTF8
+
+/*
+ * i5/OS V5R4 need EBCDIC for its runtime calls but APR/APACHE works in UTF
+ */
+in_addr_t jk_inet_addr(const char * addrstr)
+{
+ in_addr_t addr;
+ char *ptr;
+
+ ptr = (char *)malloc(strlen(addrstr) + 1);
+ jk_ascii2ebcdic((char *)addrstr, ptr);
+ addr = inet_addr(ptr);
+ free(ptr);
+
+ return(addr);
+}
+
+#endif
+
+/** Resolve the host IP
+ * @param host host or ip address
+ * @param port port
+ * @param rc return value pointer
+ * @param l logger
+ * @return JK_FALSE: some kind of error occured
+ * JK_TRUE: success
+ */
+int jk_resolve(const char *host, int port, struct sockaddr_in *rc,
+ void *pool, jk_logger_t *l)
+{
+ int x;
+ struct in_addr laddr;
+
+ JK_TRACE_ENTER(l);
+
+ memset(rc, 0, sizeof(struct sockaddr_in));
+
+ rc->sin_port = htons((short)port);
+ rc->sin_family = AF_INET;
+
+ /* Check if we only have digits in the string */
+ for (x = 0; host[x] != '\0'; x++) {
+ if (!isdigit((int)(host[x])) && host[x] != '.') {
+ break;
+ }
+ }
+
+ /* If we found also characters we should make name to IP resolution */
+ if (host[x] != '\0') {
+
+#ifdef HAVE_APR
+ apr_sockaddr_t *remote_sa, *temp_sa;
+ char *remote_ipaddr;
+
+ if (!jk_apr_pool) {
+ if (apr_pool_create(&jk_apr_pool, (apr_pool_t *)pool) != APR_SUCCESS) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ }
+ apr_pool_clear(jk_apr_pool);
+ if (apr_sockaddr_info_get
+ (&remote_sa, host, APR_UNSPEC, (apr_port_t) port, 0, jk_apr_pool)
+ != APR_SUCCESS) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ /* Since we are only handling AF_INET (IPV4) address (in_addr_t) */
+ /* make sure we find one of those. */
+ temp_sa = remote_sa;
+ while ((NULL != temp_sa) && (AF_INET != temp_sa->family))
+ temp_sa = temp_sa->next;
+
+ /* if temp_sa is set, we have a valid address otherwise, just return */
+ if (NULL != temp_sa)
+ remote_sa = temp_sa;
+ else {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ apr_sockaddr_ip_get(&remote_ipaddr, remote_sa);
+
+ laddr.s_addr = jk_inet_addr(remote_ipaddr);
+
+#else /* HAVE_APR */
+
+ /* XXX : WARNING : We should really use gethostbyname_r in multi-threaded env */
+ /* Fortunatly when APR is available, ie under Apache 2.0, we use it */
+#if defined(NETWARE) && !defined(__NOVELL_LIBC__)
+ struct hostent *hoste = gethostbyname((char*)host);
+#else
+ struct hostent *hoste = gethostbyname(host);
+#endif
+ if (!hoste) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ laddr = *((struct in_addr *)hoste->h_addr_list[0]);
+
+#endif /* HAVE_APR */
+ }
+ else {
+ /* If we found only digits we use inet_addr() */
+ laddr.s_addr = jk_inet_addr(host);
+ }
+ memcpy(&(rc->sin_addr), &laddr, sizeof(laddr));
+
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+/** Connect to Tomcat
+ * @param addr address to connect to
+ * @param keepalive should we set SO_KEEPALIVE (if !=0)
+ * @param timeout connect timeout in seconds
+ * (<=0: no timeout=blocking)
+ * @param sock_buf size of send and recv buffer
+ * (<=0: use default)
+ * @param l logger
+ * @return JK_INVALID_SOCKET: some kind of error occured
+ * created socket: success
+ * @remark Cares about errno
+ */
+jk_sock_t jk_open_socket(struct sockaddr_in *addr, int keepalive,
+ int timeout, int connect_timeout,
+ int sock_buf, jk_logger_t *l)
+{
+ char buf[64];
+ jk_sock_t sd;
+ int set = 1;
+ int ret = 0;
+ int flags = 0;
+#ifdef SO_LINGER
+ struct linger li;
+#endif
+
+ JK_TRACE_ENTER(l);
+
+ errno = 0;
+#if defined(SOCK_CLOEXEC) && defined(USE_SOCK_CLOEXEC)
+ flags |= SOCK_CLOEXEC;
+#endif
+ sd = socket(AF_INET, SOCK_STREAM | flags, 0);
+ if (!IS_VALID_SOCKET(sd)) {
+ JK_GET_SOCKET_ERRNO();
+ jk_log(l, JK_LOG_ERROR,
+ "socket() failed (errno=%d)", errno);
+ JK_TRACE_EXIT(l);
+ return JK_INVALID_SOCKET;
+ }
+#if defined(FD_CLOEXEC) && !defined(USE_SOCK_CLOEXEC)
+ if ((flags = fcntl(sd, F_GETFD)) == -1) {
+ JK_GET_SOCKET_ERRNO();
+ jk_log(l, JK_LOG_ERROR,
+ "fcntl() failed (errno=%d)", errno);
+ jk_close_socket(sd, l);
+ JK_TRACE_EXIT(l);
+ return JK_INVALID_SOCKET;
+ }
+ flags |= FD_CLOEXEC;
+ if (fcntl(sd, F_SETFD, flags) == -1) {
+ JK_GET_SOCKET_ERRNO();
+ jk_log(l, JK_LOG_ERROR,
+ "fcntl() failed (errno=%d)", errno);
+ jk_close_socket(sd, l);
+ JK_TRACE_EXIT(l);
+ return JK_INVALID_SOCKET;
+ }
+#endif
+
+ /* Disable Nagle algorithm */
+ if (setsockopt(sd, IPPROTO_TCP, TCP_NODELAY, (SET_TYPE)&set,
+ sizeof(set))) {
+ JK_GET_SOCKET_ERRNO();
+ jk_log(l, JK_LOG_ERROR,
+ "failed setting TCP_NODELAY (errno=%d)", errno);
+ jk_close_socket(sd, l);
+ JK_TRACE_EXIT(l);
+ return JK_INVALID_SOCKET;
+ }
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "socket TCP_NODELAY set to On");
+ if (keepalive) {
+#if defined(WIN32) && !defined(NETWARE)
+ DWORD dw;
+ struct tcp_keepalive ka = { 0 }, ks = { 0 };
+ if (timeout)
+ ka.keepalivetime = timeout * 10000;
+ else
+ ka.keepalivetime = 60 * 10000; /* 10 minutes */
+ ka.keepaliveinterval = 1000;
+ ka.onoff = 1;
+ if (WSAIoctl(sd, SIO_KEEPALIVE_VALS, &ka, sizeof(ka),
+ &ks, sizeof(ks), &dw, NULL, NULL)) {
+ JK_GET_SOCKET_ERRNO();
+ jk_log(l, JK_LOG_ERROR,
+ "failed setting SIO_KEEPALIVE_VALS (errno=%d)", errno);
+ jk_close_socket(sd, l);
+ JK_TRACE_EXIT(l);
+ return JK_INVALID_SOCKET;
+ }
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "socket SO_KEEPALIVE set to %d seconds",
+ ka.keepalivetime / 1000);
+#else
+ set = 1;
+ if (setsockopt(sd, SOL_SOCKET, SO_KEEPALIVE, (SET_TYPE)&set,
+ sizeof(set))) {
+ JK_GET_SOCKET_ERRNO();
+ jk_log(l, JK_LOG_ERROR,
+ "failed setting SO_KEEPALIVE (errno=%d)", errno);
+ jk_close_socket(sd, l);
+ JK_TRACE_EXIT(l);
+ return JK_INVALID_SOCKET;
+ }
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "socket SO_KEEPALIVE set to On");
+#endif
+ }
+
+ if (sock_buf > 0) {
+ set = sock_buf;
+ /* Set socket send buffer size */
+ if (setsockopt(sd, SOL_SOCKET, SO_SNDBUF, (SET_TYPE)&set,
+ sizeof(set))) {
+ JK_GET_SOCKET_ERRNO();
+ jk_log(l, JK_LOG_ERROR,
+ "failed setting SO_SNDBUF (errno=%d)", errno);
+ jk_close_socket(sd, l);
+ JK_TRACE_EXIT(l);
+ return JK_INVALID_SOCKET;
+ }
+ set = sock_buf;
+ /* Set socket receive buffer size */
+ if (setsockopt(sd, SOL_SOCKET, SO_RCVBUF, (SET_TYPE)&set,
+ sizeof(set))) {
+ JK_GET_SOCKET_ERRNO();
+ jk_log(l, JK_LOG_ERROR,
+ "failed setting SO_RCVBUF (errno=%d)", errno);
+ jk_close_socket(sd, l);
+ JK_TRACE_EXIT(l);
+ return JK_INVALID_SOCKET;
+ }
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "socket SO_SNDBUF and SO_RCVBUF set to %d",
+ sock_buf);
+ }
+
+ if (timeout > 0) {
+#if defined(WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__))
+ int tmout = timeout * 1000;
+ setsockopt(sd, SOL_SOCKET, SO_RCVTIMEO,
+ (const char *) &tmout, sizeof(int));
+ setsockopt(sd, SOL_SOCKET, SO_SNDTIMEO,
+ (const char *) &tmout, sizeof(int));
+ JK_GET_SOCKET_ERRNO();
+#elif defined(SO_RCVTIMEO) && defined(USE_SO_RCVTIMEO) && defined(SO_SNDTIMEO) && defined(USE_SO_SNDTIMEO)
+ struct timeval tv;
+ tv.tv_sec = timeout;
+ tv.tv_usec = 0;
+ setsockopt(sd, SOL_SOCKET, SO_RCVTIMEO,
+ (const void *) &tv, sizeof(tv));
+ setsockopt(sd, SOL_SOCKET, SO_SNDTIMEO,
+ (const void *) &tv, sizeof(tv));
+#endif
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "timeout %d set for socket=%d",
+ timeout, sd);
+ }
+#ifdef SO_NOSIGPIPE
+ /* The preferred method on Mac OS X (10.2 and later) to prevent SIGPIPEs when
+ * sending data to a dead peer. Possibly also existing and in use on other BSD
+ * systems?
+ */
+ set = 1;
+ if (setsockopt(sd, SOL_SOCKET, SO_NOSIGPIPE, (const char *)&set,
+ sizeof(int))) {
+ JK_GET_SOCKET_ERRNO();
+ jk_log(l, JK_LOG_ERROR,
+ "failed setting SO_NOSIGPIPE (errno=%d)", errno);
+ jk_close_socket(sd, l);
+ JK_TRACE_EXIT(l);
+ return JK_INVALID_SOCKET;
+ }
+#endif
+#ifdef SO_LINGER
+ /* Make hard closesocket by disabling lingering */
+ li.l_linger = li.l_onoff = 0;
+ if (setsockopt(sd, SOL_SOCKET, SO_LINGER, (SET_TYPE)&li,
+ sizeof(li))) {
+ JK_GET_SOCKET_ERRNO();
+ jk_log(l, JK_LOG_ERROR,
+ "failed setting SO_LINGER (errno=%d)", errno);
+ jk_close_socket(sd, l);
+ JK_TRACE_EXIT(l);
+ return JK_INVALID_SOCKET;
+ }
+#endif
+ /* Tries to connect to Tomcat (continues trying while error is EINTR) */
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "trying to connect socket %d to %s", sd,
+ jk_dump_hinfo(addr, buf));
+
+/* Need more infos for BSD 4.4 and Unix 98 defines, for now only
+iSeries when Unix98 is required at compil time */
+#if (_XOPEN_SOURCE >= 520) && defined(AS400)
+ ((struct sockaddr *)addr)->sa_len = sizeof(struct sockaddr_in);
+#endif
+ ret = nb_connect(sd, (struct sockaddr *)addr, connect_timeout, l);
+#if defined(WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__))
+ if (JK_IS_SOCKET_ERROR(ret)) {
+ JK_GET_SOCKET_ERRNO();
+ }
+#endif /* WIN32 */
+
+ /* Check if we are connected */
+ if (ret) {
+ jk_log(l, JK_LOG_INFO,
+ "connect to %s failed (errno=%d)",
+ jk_dump_hinfo(addr, buf), errno);
+ jk_close_socket(sd, l);
+ sd = JK_INVALID_SOCKET;
+ }
+ else {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG, "socket %d [%s] connected",
+ sd, jk_dump_sinfo(sd, buf));
+ }
+ JK_TRACE_EXIT(l);
+ return sd;
+}
+
+/** Close the socket
+ * @param sd socket to close
+ * @param l logger
+ * @return -1: some kind of error occured (!WIN32)
+ * SOCKET_ERROR: some kind of error occured (WIN32)
+ * 0: success
+ * @remark Does not change errno
+ */
+int jk_close_socket(jk_sock_t sd, jk_logger_t *l)
+{
+ int rc;
+ int save_errno;
+
+ JK_TRACE_ENTER(l);
+
+ if (!IS_VALID_SOCKET(sd)) {
+ JK_TRACE_EXIT(l);
+ return -1;
+ }
+
+ save_errno = errno;
+#if defined(WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__))
+ rc = closesocket(sd) ? -1 : 0;
+#else
+ do {
+ rc = close(sd);
+ } while (JK_IS_SOCKET_ERROR(rc) && (errno == EINTR || errno == EAGAIN));
+#endif
+ JK_TRACE_EXIT(l);
+ errno = save_errno;
+ return rc;
+}
+
+#ifndef MAX_SECS_TO_LINGER
+#define MAX_SECS_TO_LINGER 2
+#endif
+#define MS_TO_LINGER 500
+#define MS_TO_LINGER_LAST 2
+
+#ifndef MAX_LINGER_BYTES
+#define MAX_LINGER_BYTES 32768
+#endif
+
+#ifndef SHUT_WR
+#ifdef SD_SEND
+#define SHUT_WR SD_SEND
+#else
+#define SHUT_WR 0x01
+#endif
+#endif
+
+#ifndef SHUT_RD
+#ifdef SD_RECEIVE
+#define SHUT_RD SD_RECEIVE
+#else
+#define SHUT_RD 0x00
+#endif
+#endif
+
+/** Drain and close the socket
+ * @param sd socket to close
+ * @param l logger
+ * @return -1: socket to close is invalid
+ * -1: some kind of error occured (!WIN32)
+ * SOCKET_ERROR: some kind of error occured (WIN32)
+ * 0: success
+ * @remark Does not change errno
+ */
+int jk_shutdown_socket(jk_sock_t sd, jk_logger_t *l)
+{
+ char dummy[512];
+ char buf[64];
+ char *sb = NULL;
+ int rc = 0;
+ size_t rd = 0;
+ size_t rp = 0;
+ int save_errno;
+ int timeout = MS_TO_LINGER;
+ time_t start = time(NULL);
+
+ JK_TRACE_ENTER(l);
+
+ if (!IS_VALID_SOCKET(sd)) {
+ JK_TRACE_EXIT(l);
+ return -1;
+ }
+
+ save_errno = errno;
+ if (JK_IS_DEBUG_LEVEL(l)) {
+ sb = jk_dump_sinfo(sd, buf);
+ jk_log(l, JK_LOG_DEBUG, "About to shutdown socket %d [%s]",
+ sd, sb);
+ }
+ /* Shut down the socket for write, which will send a FIN
+ * to the peer.
+ */
+ if (shutdown(sd, SHUT_WR)) {
+ rc = jk_close_socket(sd, l);
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Failed sending SHUT_WR for socket %d [%s]",
+ sd, sb);
+ errno = save_errno;
+ JK_TRACE_EXIT(l);
+ return rc;
+ }
+
+ do {
+ rp = 0;
+ if (jk_is_input_event(sd, timeout, l)) {
+ /* Do a restartable read on the socket
+ * draining out all the data currently in the socket buffer.
+ */
+ do {
+#if defined(WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__))
+ rc = recv(sd, &dummy[0], sizeof(dummy), 0);
+ if (JK_IS_SOCKET_ERROR(rc))
+ JK_GET_SOCKET_ERRNO();
+#else
+ rc = read(sd, &dummy[0], sizeof(dummy));
+#endif
+ if (rc > 0)
+ rp += rc;
+ } while (JK_IS_SOCKET_ERROR(rc) && (errno == EINTR || errno == EAGAIN));
+
+ if (rc < 0) {
+ /* Read failed.
+ * Bail out from the loop.
+ */
+ break;
+ }
+ }
+ else {
+ /* Error or timeout (reason is logged within jk_is_input_event)
+ * Exit the drain loop
+ */
+ break;
+ }
+ rd += rp;
+ if (rp < sizeof(dummy)) {
+ if (timeout > MS_TO_LINGER_LAST) {
+ /* Try one last time with a short timeout
+ */
+ timeout = MS_TO_LINGER_LAST;
+ continue;
+ }
+ /* We have read less then size of buffer
+ * It's a good chance there will be no more data
+ * to read.
+ */
+ if ((rc = sononblock(sd))) {
+ rc = jk_close_socket(sd, l);
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "error setting socket %d [%s] to nonblocking",
+ sd, sb);
+ errno = save_errno;
+ JK_TRACE_EXIT(l);
+ return rc;
+ }
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "shutting down the read side of socket %d [%s]",
+ sd, sb);
+ shutdown(sd, SHUT_RD);
+ break;
+ }
+ timeout = MS_TO_LINGER;
+ } while ((rd < MAX_LINGER_BYTES) && (difftime(time(NULL), start) < MAX_SECS_TO_LINGER));
+
+ rc = jk_close_socket(sd, l);
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Shutdown socket %d [%s] and read %d lingering bytes in %d sec.",
+ sd, sb, rd, (int)difftime(time(NULL), start));
+ errno = save_errno;
+ JK_TRACE_EXIT(l);
+ return rc;
+}
+
+/** send a message
+ * @param sd socket to use
+ * @param b buffer containing the data
+ * @param len length to send
+ * @param l logger
+ * @return negative errno: write returns a fatal -1 (!WIN32)
+ * negative pseudo errno: send returns SOCKET_ERROR (WIN32)
+ * JK_SOCKET_EOF: no bytes could be sent
+ * >0: success, provided number of bytes send
+ * @remark Always closes socket in case of error
+ * @remark Cares about errno
+ * @bug this fails on Unixes if len is too big for the underlying
+ * protocol
+ */
+int jk_tcp_socket_sendfull(jk_sock_t sd, const unsigned char *b, int len, jk_logger_t *l)
+{
+ int sent = 0;
+ int wr;
+
+ JK_TRACE_ENTER(l);
+
+ errno = 0;
+ while (sent < len) {
+ do {
+#if defined(WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__))
+ wr = send(sd, (const char*)(b + sent),
+ len - sent, 0);
+ if (JK_IS_SOCKET_ERROR(wr))
+ JK_GET_SOCKET_ERRNO();
+#else
+ wr = write(sd, b + sent, len - sent);
+#endif
+ } while (JK_IS_SOCKET_ERROR(wr) && (errno == EINTR || errno == EAGAIN));
+
+ if (JK_IS_SOCKET_ERROR(wr)) {
+ int err;
+ jk_shutdown_socket(sd, l);
+ err = (errno > 0) ? -errno : errno;
+ JK_TRACE_EXIT(l);
+ return err;
+ }
+ else if (wr == 0) {
+ jk_shutdown_socket(sd, l);
+ JK_TRACE_EXIT(l);
+ return JK_SOCKET_EOF;
+ }
+ sent += wr;
+ }
+
+ JK_TRACE_EXIT(l);
+ return sent;
+}
+
+/** receive a message
+ * @param sd socket to use
+ * @param b buffer to store the data
+ * @param len length to receive
+ * @param l logger
+ * @return negative errno: read returns a fatal -1 (!WIN32)
+ * negative pseudo errno: recv returns SOCKET_ERROR (WIN32)
+ * JK_SOCKET_EOF: no bytes could be read
+ * >0: success, requested number of bytes received
+ * @remark Always closes socket in case of error
+ * @remark Cares about errno
+ */
+int jk_tcp_socket_recvfull(jk_sock_t sd, unsigned char *b, int len, jk_logger_t *l)
+{
+ int rdlen = 0;
+ int rd;
+
+ JK_TRACE_ENTER(l);
+
+ errno = 0;
+ while (rdlen < len) {
+ do {
+#if defined(WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__))
+ rd = recv(sd, (char *)b + rdlen,
+ len - rdlen, 0);
+ if (JK_IS_SOCKET_ERROR(rd))
+ JK_GET_SOCKET_ERRNO();
+#else
+ rd = read(sd, (char *)b + rdlen, len - rdlen);
+#endif
+ } while (JK_IS_SOCKET_ERROR(rd) && errno == EINTR);
+
+ if (JK_IS_SOCKET_ERROR(rd)) {
+ int err = (errno > 0) ? -errno : errno;
+ jk_shutdown_socket(sd, l);
+ JK_TRACE_EXIT(l);
+ return (err == 0) ? JK_SOCKET_EOF : err;
+ }
+ else if (rd == 0) {
+ jk_shutdown_socket(sd, l);
+ JK_TRACE_EXIT(l);
+ return JK_SOCKET_EOF;
+ }
+ rdlen += rd;
+ }
+
+ JK_TRACE_EXIT(l);
+ return rdlen;
+}
+
+/**
+ * dump a sockaddr_in in A.B.C.D:P in ASCII buffer
+ *
+ */
+char *jk_dump_hinfo(struct sockaddr_in *saddr, char *buf)
+{
+ unsigned long laddr = (unsigned long)htonl(saddr->sin_addr.s_addr);
+ unsigned short lport = (unsigned short)htons(saddr->sin_port);
+
+ sprintf(buf, "%d.%d.%d.%d:%d",
+ (int)(laddr >> 24), (int)((laddr >> 16) & 0xff),
+ (int)((laddr >> 8) & 0xff), (int)(laddr & 0xff), (int)lport);
+
+ return buf;
+}
+
+char *jk_dump_sinfo(jk_sock_t sd, char *buf)
+{
+ struct sockaddr_in rsaddr;
+ struct sockaddr_in lsaddr;
+ socklen_t salen;
+
+ salen = sizeof(struct sockaddr);
+ if (getsockname(sd, (struct sockaddr *)&lsaddr, &salen) == 0) {
+ salen = sizeof(struct sockaddr);
+ if (getpeername(sd, (struct sockaddr *)&rsaddr, &salen) == 0) {
+ unsigned long laddr = (unsigned long)htonl(lsaddr.sin_addr.s_addr);
+ unsigned short lport = (unsigned short)htons(lsaddr.sin_port);
+ unsigned long raddr = (unsigned long)htonl(rsaddr.sin_addr.s_addr);
+ unsigned short rport = (unsigned short)htons(rsaddr.sin_port);
+ sprintf(buf, "%d.%d.%d.%d:%d -> %d.%d.%d.%d:%d",
+ (int)(laddr >> 24), (int)((laddr >> 16) & 0xff),
+ (int)((laddr >> 8) & 0xff), (int)(laddr & 0xff), (int)lport,
+ (int)(raddr >> 24), (int)((raddr >> 16) & 0xff),
+ (int)((raddr >> 8) & 0xff), (int)(raddr & 0xff), (int)rport);
+ return buf;
+ }
+ }
+ sprintf(buf, "error=%d", errno);
+ return buf;
+}
+
+/** Wait for input event on socket until timeout
+ * @param sd socket to use
+ * @param timeout wait timeout in milliseconds
+ * @param l logger
+ * @return JK_FALSE: Timeout expired without something to read
+ * JK_FALSE: Error during waiting
+ * JK_TRUE: success
+ * @remark Does not close socket in case of error
+ * to allow for iterative waiting
+ * @remark Cares about errno
+ */
+#ifdef HAVE_POLL
+int jk_is_input_event(jk_sock_t sd, int timeout, jk_logger_t *l)
+{
+ struct pollfd fds;
+ int rc;
+ int save_errno;
+ char buf[64];
+
+ JK_TRACE_ENTER(l);
+
+ errno = 0;
+ fds.fd = sd;
+ fds.events = POLLIN;
+ fds.revents = 0;
+
+ do {
+ rc = poll(&fds, 1, timeout);
+ } while (rc < 0 && errno == EINTR);
+
+ if (rc == 0) {
+ if (JK_IS_DEBUG_LEVEL(l)) {
+ jk_log(l, JK_LOG_DEBUG,
+ "timeout during poll on socket %d [%s] (timeout=%d)",
+ sd, jk_dump_sinfo(sd, buf), timeout);
+ }
+ /* Timeout. Set the errno to timeout */
+ errno = ETIMEDOUT;
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ else if (rc < 0) {
+ save_errno = errno;
+ if (JK_IS_DEBUG_LEVEL(l)) {
+ jk_log(l, JK_LOG_DEBUG,
+ "error during poll on socket %d [%s] (errno=%d)",
+ sd, jk_dump_sinfo(sd, buf), errno);
+ }
+ errno = save_errno;
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ if ((fds.revents & (POLLERR | POLLHUP))) {
+ save_errno = fds.revents & (POLLERR | POLLHUP);
+ if (JK_IS_DEBUG_LEVEL(l)) {
+ jk_log(l, JK_LOG_DEBUG,
+ "error event during poll on socket %d [%s] (event=%d)",
+ sd, jk_dump_sinfo(sd, buf), save_errno);
+ }
+ errno = save_errno;
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ errno = 0;
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+#else
+int jk_is_input_event(jk_sock_t sd, int timeout, jk_logger_t *l)
+{
+ fd_set rset;
+ struct timeval tv;
+ int rc;
+ int save_errno;
+ char buf[64];
+
+ JK_TRACE_ENTER(l);
+
+ errno = 0;
+ FD_ZERO(&rset);
+ FD_SET(sd, &rset);
+ tv.tv_sec = timeout / 1000;
+ tv.tv_usec = (timeout % 1000) * 1000;
+
+ do {
+ rc = select((int)sd + 1, &rset, NULL, NULL, &tv);
+ } while (rc < 0 && errno == EINTR);
+
+ if (rc == 0) {
+ if (JK_IS_DEBUG_LEVEL(l)) {
+ jk_log(l, JK_LOG_DEBUG,
+ "timeout during select on socket %d [%s] (timeout=%d)",
+ sd, jk_dump_sinfo(sd, buf), timeout);
+ }
+ /* Timeout. Set the errno to timeout */
+#if defined(WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__))
+ errno = WSAETIMEDOUT - WSABASEERR;
+#else
+ errno = ETIMEDOUT;
+#endif
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ else if (rc < 0) {
+ save_errno = errno;
+ if (JK_IS_DEBUG_LEVEL(l)) {
+ jk_log(l, JK_LOG_DEBUG,
+ "error during select on socket %d [%s] (errno=%d)",
+ sd, jk_dump_sinfo(sd, buf), errno);
+ }
+ errno = save_errno;
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ errno = 0;
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+#endif
+
+/** Test if a socket is still connected
+ * @param sd socket to use
+ * @param l logger
+ * @return JK_FALSE: failure
+ * JK_TRUE: success
+ * @remark Always closes socket in case of error
+ * @remark Cares about errno
+ */
+#ifdef HAVE_POLL
+int jk_is_socket_connected(jk_sock_t sd, jk_logger_t *l)
+{
+ struct pollfd fds;
+ int rc;
+
+ JK_TRACE_ENTER(l);
+
+ errno = 0;
+ fds.fd = sd;
+ fds.events = POLLIN;
+
+ do {
+ rc = poll(&fds, 1, 0);
+ } while (rc < 0 && errno == EINTR);
+
+ if (rc == 0) {
+ /* If we get a timeout, then we are still connected */
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+ else if (rc == 1 && fds.revents == POLLIN) {
+ char buf;
+ do {
+ rc = (int)recvfrom(sd, &buf, 1, MSG_PEEK, NULL, NULL);
+ } while (rc < 0 && errno == EINTR);
+ if (rc == 1) {
+ /* There is at least one byte to read. */
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+ }
+ jk_shutdown_socket(sd, l);
+
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+}
+
+#else
+int jk_is_socket_connected(jk_sock_t sd, jk_logger_t *l)
+{
+ fd_set fd;
+ struct timeval tv;
+ int rc;
+
+ JK_TRACE_ENTER(l);
+
+ errno = 0;
+ FD_ZERO(&fd);
+ FD_SET(sd, &fd);
+
+ /* Initially test the socket without any blocking.
+ */
+ tv.tv_sec = 0;
+ tv.tv_usec = 0;
+
+ do {
+ rc = select((int)sd + 1, &fd, NULL, NULL, &tv);
+ JK_GET_SOCKET_ERRNO();
+ /* Wait one microsecond on next select, if EINTR */
+ tv.tv_sec = 0;
+ tv.tv_usec = 1;
+ } while (JK_IS_SOCKET_ERROR(rc) && errno == EINTR);
+
+ errno = 0;
+ if (rc == 0) {
+ /* If we get a timeout, then we are still connected */
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+ else if (rc == 1) {
+#if defined(WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__))
+ u_long nr;
+ rc = ioctlsocket(sd, FIONREAD, &nr);
+ if (rc == 0) {
+ if (WSAGetLastError() == 0)
+ errno = 0;
+ else
+ JK_GET_SOCKET_ERRNO();
+ }
+#else
+ int nr;
+ rc = ioctl(sd, FIONREAD, (void*)&nr);
+#endif
+ if (rc == 0 && nr != 0) {
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+ JK_GET_SOCKET_ERRNO();
+ }
+ jk_shutdown_socket(sd, l);
+
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+}
+#endif
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_connect.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_connect.h
new file mode 100644
index 00000000..04edde23
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_connect.h
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: Socket connections header file *
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Version: $Revision: 995751 $ *
+ ***************************************************************************/
+
+#ifndef JK_CONNECT_H
+#define JK_CONNECT_H
+
+#include "jk_logger.h"
+#include "jk_global.h"
+
+#if !defined(WIN32) && !(defined(NETWARE) && defined(__NOVELL_LIBC__))
+#define closesocket close
+#endif
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+#define JK_SOCKET_EOF (-2)
+
+int jk_resolve(const char *host, int port, struct sockaddr_in *rc, void *pool, jk_logger_t *l);
+
+jk_sock_t jk_open_socket(struct sockaddr_in *addr, int keepalive,
+ int timeout, int connect_timeout,
+ int sock_buf, jk_logger_t *l);
+
+int jk_close_socket(jk_sock_t sd, jk_logger_t *l);
+
+int jk_shutdown_socket(jk_sock_t sd, jk_logger_t *l);
+
+int jk_tcp_socket_sendfull(jk_sock_t sd, const unsigned char *b, int len, jk_logger_t *l);
+
+int jk_tcp_socket_recvfull(jk_sock_t sd, unsigned char *b, int len, jk_logger_t *l);
+
+char *jk_dump_hinfo(struct sockaddr_in *saddr, char *buf);
+
+char *jk_dump_sinfo(jk_sock_t sd, char *buf);
+
+int jk_is_input_event(jk_sock_t sd, int timeout, jk_logger_t *l);
+
+int jk_is_socket_connected(jk_sock_t sd, jk_logger_t *l);
+
+
+/***
+ * i5/OS V5R4 need ASCII<->EBCDIC translation for inet_addr() call
+ */
+#if !defined(AS400_UTF8)
+
+#define jk_inet_addr inet_addr
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* JK_CONNECT_H */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_connect.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_connect.lo
new file mode 100644
index 00000000..d1cf96e4
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_connect.lo
@@ -0,0 +1,12 @@
+# jk_connect.lo - a libtool object file
+# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18)
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/jk_connect.o'
+
+# Name of the non-PIC object.
+non_pic_object='jk_connect.o'
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_connect.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_connect.o
new file mode 100644
index 00000000..d33c04e2
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_connect.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.c
new file mode 100644
index 00000000..f65ba836
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.c
@@ -0,0 +1,296 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: Context handling (Autoconf) *
+ * Author: Henri Gomez <hgomez@apache.org> *
+ * Version: $Revision: 466585 $ *
+ ***************************************************************************/
+
+#include "jk_global.h"
+#include "jk_context.h"
+#include "jk_ajp_common.h"
+
+
+/*
+ * Set the virtual name of the context
+ */
+
+int context_set_virtual(jk_context_t *c, char *virt)
+{
+ if (c) {
+
+ if (virt) {
+ c->virt = jk_pool_strdup(&c->p, virt);
+
+ if (!c->virt)
+ return JK_FALSE;
+ }
+
+ return JK_TRUE;
+ }
+
+ return JK_FALSE;
+}
+
+/*
+ * Init the context info struct
+ */
+
+int context_open(jk_context_t *c, char *virt)
+{
+ if (c) {
+ jk_open_pool(&c->p, c->buf, sizeof(jk_pool_atom_t) * SMALL_POOL_SIZE);
+ c->size = 0;
+ c->capacity = 0;
+ c->contexts = NULL;
+
+ return context_set_virtual(c, virt);
+ }
+
+ return JK_FALSE;
+}
+
+/*
+ * Close the context info struct
+ */
+
+int context_close(jk_context_t *c)
+{
+ if (c) {
+
+ jk_close_pool(&c->p);
+ return JK_TRUE;
+ }
+
+ return JK_FALSE;
+}
+
+/*
+ * Allocate and open context
+ */
+
+int context_alloc(jk_context_t **c, char *virt)
+{
+ if (c)
+ return context_open(*c =
+ (jk_context_t *)calloc(1, sizeof(jk_context_t)),
+ virt);
+
+ return JK_FALSE;
+}
+
+/*
+ * Close and destroy context
+ */
+
+int context_free(jk_context_t **c)
+{
+ if (c && *c) {
+ context_close(*c);
+ free(*c);
+ *c = NULL;
+ return JK_TRUE;
+ }
+
+ return JK_FALSE;
+}
+
+
+/*
+ * Ensure there will be memory in context info to store Context Bases
+ */
+
+static int context_realloc(jk_context_t *c)
+{
+ if (c->size == c->capacity) {
+ jk_context_item_t **contexts;
+ int capacity = c->capacity + CBASE_INC_SIZE;
+
+ contexts =
+ (jk_context_item_t **)jk_pool_alloc(&c->p,
+ sizeof(jk_context_item_t *) *
+ capacity);
+
+ if (!contexts)
+ return JK_FALSE;
+
+ if (c->capacity && c->contexts)
+ memcpy(contexts, c->contexts,
+ sizeof(jk_context_item_t *) * c->capacity);
+
+ c->contexts = contexts;
+ c->capacity = capacity;
+ }
+
+ return JK_TRUE;
+}
+
+/*
+ * Ensure there will be memory in context info to URIS
+ */
+
+static int context_item_realloc(jk_context_t *c, jk_context_item_t *ci)
+{
+ if (ci->size == ci->capacity) {
+ char **uris;
+ int capacity = ci->capacity + URI_INC_SIZE;
+
+ uris = (char **)jk_pool_alloc(&c->p, sizeof(char *) * capacity);
+
+ if (!uris)
+ return JK_FALSE;
+
+ memcpy(uris, ci->uris, sizeof(char *) * ci->capacity);
+
+ ci->uris = uris;
+ ci->capacity = capacity;
+ }
+
+ return JK_TRUE;
+}
+
+
+/*
+ * Locate a context base in context list
+ */
+
+jk_context_item_t *context_find_base(jk_context_t *c, char *cbase)
+{
+ int i;
+ jk_context_item_t *ci;
+
+ if (!c || !cbase)
+ return NULL;
+
+ for (i = 0; i < c->size; i++) {
+
+ ci = c->contexts[i];
+
+ if (!ci)
+ continue;
+
+ if (!strcmp(ci->cbase, cbase))
+ return ci;
+ }
+
+ return NULL;
+}
+
+/*
+ * Locate an URI in a context item
+ */
+
+char *context_item_find_uri(jk_context_item_t *ci, char *uri)
+{
+ int i;
+
+ if (!ci || !uri)
+ return NULL;
+
+ for (i = 0; i < ci->size; i++) {
+ if (!strcmp(ci->uris[i], uri))
+ return ci->uris[i];
+ }
+
+ return NULL;
+}
+
+void context_dump_uris(jk_context_t *c, char *cbase, FILE * f)
+{
+ jk_context_item_t *ci;
+ int i;
+
+ ci = context_find_base(c, cbase);
+
+ if (!ci)
+ return;
+
+ for (i = 0; i < ci->size; i++)
+ fprintf(f, "/%s/%s\n", ci->cbase, ci->uris[i]);
+
+ fflush(f);
+}
+
+
+/*
+ * Add a new context item to context
+ */
+
+jk_context_item_t *context_add_base(jk_context_t *c, char *cbase)
+{
+ jk_context_item_t *ci;
+
+ if (!c || !cbase)
+ return NULL;
+
+ /* Check if the context base was not allready created */
+ ci = context_find_base(c, cbase);
+
+ if (ci)
+ return ci;
+
+ if (context_realloc(c) != JK_TRUE)
+ return NULL;
+
+ ci = (jk_context_item_t *)jk_pool_alloc(&c->p, sizeof(jk_context_item_t));
+
+ if (!ci)
+ return NULL;
+
+ c->contexts[c->size] = ci;
+ c->size++;
+ ci->cbase = jk_pool_strdup(&c->p, cbase);
+ ci->status = 0;
+ ci->size = 0;
+ ci->capacity = 0;
+ ci->uris = NULL;
+
+ return ci;
+}
+
+/*
+ * Add a new URI to a context item
+ */
+
+int context_add_uri(jk_context_t *c, char *cbase, char *uri)
+{
+ jk_context_item_t *ci;
+
+ if (!uri)
+ return JK_FALSE;
+
+ /* Get/Create the context base */
+ ci = context_add_base(c, cbase);
+
+ if (!ci)
+ return JK_FALSE;
+
+ if (context_item_find_uri(ci, uri) != NULL)
+ return JK_TRUE;
+
+ if (context_item_realloc(c, ci) == JK_FALSE)
+ return JK_FALSE;
+
+ ci->uris[ci->size] = jk_pool_strdup(&c->p, uri);
+
+ if (ci->uris[ci->size] == NULL)
+ return JK_FALSE;
+
+ ci->size++;
+ return JK_TRUE;
+}
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.h
new file mode 100644
index 00000000..7c872f58
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.h
@@ -0,0 +1,138 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: Context Stuff (Autoconf) *
+ * Author: Henri Gomez <hgomez@apache.org> *
+ * Version: $Revision: 466585 $ *
+ ***************************************************************************/
+#ifndef JK_CONTEXT_H
+#define JK_CONTEXT_H
+
+#include "jk_pool.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+#define CBASE_INC_SIZE (8) /* Allocate memory by step of 8 URIs : ie 8 URI by context */
+#define URI_INC_SIZE (8) /* Allocate memory by step of 8 CONTEXTs : ie 8 contexts by worker */
+
+typedef struct
+{
+
+ /*
+ * Context base (ie examples)
+ */
+
+ char *cbase;
+
+ /*
+ * Status (Up/Down)
+ */
+
+ int status;
+
+ /*
+ * Num of URI handled
+ */
+
+ int size;
+
+ /*
+ * Capacity
+ */
+
+ int capacity;
+
+ /*
+ * URL/URIs (autoconf)
+ */
+
+ char **uris;
+}
+jk_context_item_t;
+
+
+typedef struct
+{
+
+ /*
+ * Memory Pool
+ */
+
+ jk_pool_t p;
+ jk_pool_atom_t buf[SMALL_POOL_SIZE];
+
+ /*
+ * Virtual Server (if use)
+ */
+
+ char *virt;
+
+ /*
+ * Num of context handled (ie: examples, admin...)
+ */
+
+ int size;
+
+ /*
+ * Capacity
+ */
+
+ int capacity;
+
+ /*
+ * Context list, context / URIs
+ */
+
+ jk_context_item_t **contexts;
+}
+jk_context_t;
+
+
+/*
+ * functions defined here
+ */
+
+int context_set_virtual(jk_context_t *c, char *virt);
+
+int context_open(jk_context_t *c, char *virt);
+
+int context_close(jk_context_t *c);
+
+int context_alloc(jk_context_t **c, char *virt);
+
+int context_free(jk_context_t **c);
+
+jk_context_item_t *context_find_base(jk_context_t *c, char *cbase);
+
+char *context_item_find_uri(jk_context_item_t *ci, char *uri);
+
+void context_dump_uris(jk_context_t *c, char *cbase, FILE * f);
+
+jk_context_item_t *context_add_base(jk_context_t *c, char *cbase);
+
+int context_add_uri(jk_context_t *c, char *cbase, char *uri);
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* JK_CONTEXT_H */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.lo
new file mode 100644
index 00000000..a03a50c6
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.lo
@@ -0,0 +1,12 @@
+# jk_context.lo - a libtool object file
+# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18)
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/jk_context.o'
+
+# Name of the non-PIC object.
+non_pic_object='jk_context.o'
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.o
new file mode 100644
index 00000000..88da42a1
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_context.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_global.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_global.h
new file mode 100644
index 00000000..c041b49a
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_global.h
@@ -0,0 +1,405 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: Global definitions and include files that should exist *
+ * anywhere *
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Version: $Revision: 1126561 $ *
+ ***************************************************************************/
+
+#ifndef JK_GLOBAL_H
+#define JK_GLOBAL_H
+
+#if defined(HAVE_CONFIG_H)
+#include "config.h"
+#endif
+
+#if defined(WIN32)
+
+/* Ignore most warnings (back down to /W3) for poorly constructed headers
+ */
+#if defined(_MSC_VER) && _MSC_VER >= 1200
+#pragma warning(push, 3)
+#endif
+
+/* disable or reduce the frequency of...
+ * C4057: indirection to slightly different base types
+ * C4075: slight indirection changes (unsigned short* vs short[])
+ * C4100: unreferenced formal parameter
+ * C4127: conditional expression is constant
+ * C4163: '_rotl64' : not available as an intrinsic function
+ * C4201: nonstandard extension nameless struct/unions
+ * C4244: int to char/short - precision loss
+ * C4514: unreferenced inline function removed
+ */
+#pragma warning(disable: 4100 4127 4163 4201 4514; once: 4057 4075 4244)
+
+/* Ignore Microsoft's interpretation of secure development
+ * and the POSIX string handling API
+ */
+#if defined(_MSC_VER) && _MSC_VER >= 1400
+#ifndef _CRT_SECURE_NO_DEPRECATE
+#define _CRT_SECURE_NO_DEPRECATE
+#endif
+#pragma warning(disable: 4996)
+#endif /* defined(_MSC_VER) && _MSC_VER >= 1400 */
+#endif /* defined(WIN32) */
+
+#include "jk_version.h"
+
+#ifdef HAVE_APR
+#include "apr_lib.h"
+#include "apr_strings.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include <errno.h>
+#include <time.h>
+#include <ctype.h>
+#include <limits.h>
+
+#ifdef _OSD_POSIX
+#include "ap_config.h"
+#endif
+
+#ifdef AS400
+#include "ap_config.h"
+extern char *strdup(const char *str);
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#ifdef WIN32
+#ifndef _WINDOWS_
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#endif
+#ifndef _WIN32_WINNT
+
+/* Restrict the server to a subset of Windows NT 4.0 header files by default
+ */
+#define _WIN32_WINNT 0x0500
+#endif
+#ifndef NOUSER
+#define NOUSER
+#endif
+#ifndef NOMCX
+#define NOMCX
+#endif
+#ifndef NOIME
+#define NOIME
+#endif
+#include <windows.h>
+/*
+ * Add a _very_few_ declarations missing from the restricted set of headers
+ * (If this list becomes extensive, re-enable the required headers above!)
+ * winsock headers were excluded by WIN32_LEAN_AND_MEAN, so include them now
+ */
+#include <winsock2.h>
+#include <mswsock.h>
+#include <mstcpip.h>
+#endif /* _WINDOWS_ */
+#ifdef _WINDOWS_
+#ifndef SIO_RCVALL
+#include <mstcpip.h>
+#endif
+#endif
+#include <sys/timeb.h>
+#include <process.h>
+#include <io.h>
+#include <ws2tcpip.h>
+#else /* WIN32 */
+#include <unistd.h>
+#if defined(NETWARE) && defined(__NOVELL_LIBC__)
+#include <novsock2.h>
+#define __sys_socket_h__
+#define __netdb_h__
+#define __netinet_in_h__
+#define HAVE_VSNPRINTF
+#define HAVE_SNPRINTF
+#endif
+#include <netdb.h>
+#include <netinet/in.h>
+#include <sys/socket.h>
+#include <fcntl.h>
+#ifdef NETWARE
+#ifndef _SOCKLEN_T
+#define _SOCKLEN_T
+typedef int socklen_t;
+#endif
+#else
+#include <netinet/tcp.h>
+#include <arpa/inet.h>
+#include <sys/un.h>
+#if !defined(_OSD_POSIX) && !defined(AS400) && !defined(__CYGWIN__) && !defined(HPUX11)
+#include <sys/socketvar.h>
+#endif
+#if !defined(HPUX11) && !defined(AS400)
+#include <sys/select.h>
+#endif
+#endif /* NETWARE */
+
+#include <sys/time.h>
+#include <sys/ioctl.h>
+#endif /* WIN32 */
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+#define JK_WORKER_FILE_TAG ("worker_file")
+#define JK_MOUNT_FILE_TAG ("worker_mount_file")
+#define JK_LOG_LEVEL_TAG ("log_level")
+#define JK_LOG_FILE_TAG ("log_file")
+#define JK_SHM_FILE_TAG ("shm_file")
+#define JK_WORKER_NAME_TAG ("worker")
+
+#define JK_WORKER_FILE_DEF ("workers.properties")
+
+/* Urimap reload check time. Use 60 seconds by default.
+ */
+#define JK_URIMAP_DEF_RELOAD (60)
+
+#define JK_TRUE (1)
+#define JK_FALSE (0)
+
+#define JK_UNSET (-1)
+
+#define JK_LF (10)
+#define JK_CR (13)
+
+#define JK_SESSION_IDENTIFIER "JSESSIONID"
+#define JK_PATH_SESSION_IDENTIFIER ";jsessionid"
+
+#if defined(WIN32) || defined(NETWARE)
+#ifdef __GNUC__
+#define JK_METHOD
+#define C_LEVEL_TRY_START
+#define C_LEVEL_TRY_END
+#define C_LEVEL_FINALLY_START
+#define C_LEVEL_FINALLY_END
+#else
+#define JK_METHOD __stdcall
+#define C_LEVEL_TRY_START __try {
+#define C_LEVEL_TRY_END }
+#define C_LEVEL_FINALLY_START __finally {
+#define C_LEVEL_FINALLY_END }
+#endif
+#define PATH_SEPERATOR (';')
+#define FILE_SEPERATOR ('\\')
+#define PATH_ENV_VARIABLE ("PATH")
+
+ /* incompatible names... */
+#ifndef strcasecmp
+#define strcasecmp stricmp
+#endif
+#else /* defined(WIN32) || defined(NETWARE) */
+#define JK_METHOD
+#define C_LEVEL_TRY_START
+#define C_LEVEL_TRY_END
+#define C_LEVEL_FINALLY_START
+#define C_LEVEL_FINALLY_END
+#define PATH_SEPERATOR (':')
+#define FILE_SEPERATOR ('/')
+#define PATH_ENV_VARIABLE ("LD_LIBRARY_PATH")
+#endif /* defined(WIN32) || defined(NETWARE) */
+
+/* HTTP Error codes
+ */
+
+#define JK_HTTP_OK 200
+#define JK_HTTP_BAD_REQUEST 400
+#define JK_HTTP_UNAUTHORIZED 401
+#define JK_HTTP_REQUEST_TOO_LARGE 413
+#define JK_HTTP_SERVER_ERROR 500
+#define JK_HTTP_NOT_IMPLEMENTED 501
+#define JK_HTTP_BAD_GATEWAY 502
+#define JK_HTTP_SERVER_BUSY 503
+#define JK_HTTP_GATEWAY_TIME_OUT 504
+
+
+/*
+ * RECO STATUS
+ */
+
+#define RECO_NONE 0x00
+#define RECO_INITED 0x01
+#define RECO_FILLED 0x02
+
+/*
+ * JK options
+ */
+
+#define JK_OPT_FWDURIMASK 0x0007
+
+#define JK_OPT_FWDURICOMPAT 0x0001
+#define JK_OPT_FWDURICOMPATUNPARSED 0x0002
+#define JK_OPT_FWDURIESCAPED 0x0003
+#define JK_OPT_FWDURIPROXY 0x0004
+
+#define JK_OPT_FWDURIDEFAULT JK_OPT_FWDURIPROXY
+
+#define JK_OPT_FWDDIRS 0x0008
+/* Forward local instead remote address */
+#define JK_OPT_FWDLOCAL 0x0010
+#define JK_OPT_FLUSHPACKETS 0x0020
+#define JK_OPT_FLUSHEADER 0x0040
+#define JK_OPT_DISABLEREUSE 0x0080
+#define JK_OPT_FWDCERTCHAIN 0x0100
+#define JK_OPT_FWDKEYSIZE 0x0200
+#define JK_OPT_REJECTUNSAFE 0x0400
+
+#define JK_OPT_DEFAULT (JK_OPT_FWDURIDEFAULT | JK_OPT_FWDKEYSIZE)
+
+/* Check for EBCDIC systems */
+
+/* Check for Apache 2.0 running on an EBCDIC system */
+#if APR_CHARSET_EBCDIC
+
+#include <util_ebcdic.h>
+
+#define USE_CHARSET_EBCDIC
+#define jk_xlate_to_ascii(b, l) ap_xlate_proto_to_ascii(b, l)
+#define jk_xlate_from_ascii(b, l) ap_xlate_proto_from_ascii(b, l)
+
+#else /* APR_CHARSET_EBCDIC */
+
+/* Check for Apache 1.3 running on an EBCDIC system */
+#ifdef CHARSET_EBCDIC
+
+#define USE_CHARSET_EBCDIC
+#define jk_xlate_to_ascii(b, l) ebcdic2ascii(b, b, l)
+#define jk_xlate_from_ascii(b, l) ascii2ebcdic(b, b, l)
+
+#else /* CHARSET_EBCDIC */
+
+/* We're in on an ASCII system */
+
+#define jk_xlate_to_ascii(b, l) /* NOOP */
+#define jk_xlate_from_ascii(b, l) /* NOOP */
+
+#endif /* CHARSET_EBCDIC */
+
+#endif /* APR_CHARSET_EBCDIC */
+
+/* on i5/OS V5R4 HTTP/APR APIs and Datas are in UTF */
+#if defined(AS400_UTF8)
+#undef USE_CHARSET_EBCDIC
+#define jk_xlate_to_ascii(b, l) /* NOOP */
+#define jk_xlate_from_ascii(b, l) /* NOOP */
+#endif
+
+/* jk_uint32_t defines a four byte word */
+/* jk_uint64_t defines a eight byte word */
+#if defined (WIN32)
+ typedef unsigned int jk_uint32_t;
+#define JK_UINT32_T_FMT "u"
+#define JK_UINT32_T_HEX_FMT "x"
+ typedef unsigned __int64 jk_uint64_t;
+#define JK_UINT64_T_FMT "I64u"
+#define JK_UINT64_T_HEX_FMT "I64x"
+#define JK_PID_T_FMT "d"
+#define JK_PTHREAD_T_FMT "d"
+#elif defined(AS400) || defined(NETWARE)
+ typedef unsigned int jk_uint32_t;
+#define JK_UINT32_T_FMT "u"
+#define JK_UINT32_T_HEX_FMT "x"
+ typedef unsigned long long jk_uint64_t;
+#define JK_UINT64_T_FMT "llu"
+#define JK_UINT64_T_HEX_FMT "llx"
+#define JK_PID_T_FMT "d"
+#define JK_PTHREAD_T_FMT "d"
+#else
+#include "jk_types.h"
+#endif
+
+#define JK_UINT32_T_FMT_LEN (sizeof(JK_UINT32_T_FMT) - 1)
+#define JK_UINT32_T_HEX_FMT_LEN (sizeof(JK_UINT32_T_HEX_FMT) - 1)
+#define JK_UINT64_T_FMT_LEN (sizeof(JK_UINT64_T_FMT) - 1)
+#define JK_UINT64_T_HEX_FMT_LEN (sizeof(JK_UINT64_T_HEX_FMT) - 1)
+
+#ifdef WIN32
+/* For WIN32, emulate gettimeofday() using _ftime() */
+#define gettimeofday(tv, tz) { struct _timeb tb; _ftime(&tb); \
+ (tv)->tv_sec = (long)tb.time; \
+ (tv)->tv_usec = tb.millitm * 1000; }
+#define HAVE_VSNPRINTF
+#define HAVE_SNPRINTF
+#ifdef HAVE_APR
+#define snprintf apr_snprintf
+#define vsnprintf apr_vsnprintf
+#else
+/* define snprint to match windows version */
+#define snprintf _snprintf
+#define vsnprintf _vsnprintf
+#endif
+#endif /* WIN32" */
+
+/* Use apr snprintf() and vsnprintf() when needed */
+#if defined(HAVE_APR)
+#if !defined(HAVE_SNPRINTF)
+#define snprintf apr_snprintf
+#endif
+#if !defined(HAVE_VSNPRINTF)
+#define vsnprintf apr_vsnprintf
+#endif
+#endif
+
+/* Use ap snprintf() and vsnprintf() when needed */
+#if !defined(HAVE_APR)
+#if !defined(HAVE_SNPRINTF)
+#define snprintf ap_snprintf
+#endif
+#if !defined(HAVE_VSNPRINTF)
+#define vsnprintf ap_vsnprintf
+#endif
+#endif
+
+#if defined(WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__))
+typedef SOCKET jk_sock_t;
+#define IS_VALID_SOCKET(s) ((s) != INVALID_SOCKET)
+#define JK_INVALID_SOCKET INVALID_SOCKET
+#else
+typedef int jk_sock_t;
+#define IS_VALID_SOCKET(s) ((s) > 0)
+#define JK_INVALID_SOCKET (-1)
+#endif
+
+#ifdef NETWARE
+#ifdef __NOVELL_LIBC__
+#define MAX_PATH 511
+#else
+#define MAX_PATH 255
+#endif
+#endif
+
+#ifdef AS400_UTF8
+#define strcasecmp(a,b) apr_strnatcasecmp(a,b)
+#endif
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* JK_GLOBAL_H */
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_jni_worker.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_jni_worker.c
new file mode 100644
index 00000000..048f4435
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_jni_worker.c
@@ -0,0 +1,1267 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: In process JNI worker *
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Based on: *
+ * Version: $Revision: 750428 $ *
+ ***************************************************************************/
+
+#if !defined(WIN32) && !defined(NETWARE) && !defined(AS400)
+#include <dlfcn.h>
+#endif
+
+#include <jni.h>
+
+#include "jk_pool.h"
+#include "jk_jni_worker.h"
+#include "jk_util.h"
+
+#if !defined(JNI_VERSION_1_6)
+#if defined LINUX && defined APACHE2_SIGHACK
+#include <pthread.h>
+#include <signal.h>
+#include <bits/signum.h>
+#endif
+
+#ifdef NETWARE
+#ifdef __NOVELL_LIBC__
+#include <dlfcn.h>
+#else
+#include <nwthread.h>
+#include <nwadv.h>
+#endif
+#endif
+
+#ifndef JNI_VERSION_1_1
+#define JNI_VERSION_1_1 0x00010001
+#endif
+
+/* probably on an older system that doesn't support RTLD_NOW or RTLD_LAZY.
+ * The below define is a lie since we are really doing RTLD_LAZY since the
+ * system doesn't support RTLD_NOW.
+ */
+#ifndef RTLD_NOW
+#define RTLD_NOW 1
+#endif
+
+#ifndef RTLD_GLOBAL
+#define RTLD_GLOBAL 0
+#endif
+
+#define null_check(e) if ((e) == 0) return JK_FALSE
+
+jint(JNICALL * jni_get_default_java_vm_init_args) (void *) = NULL;
+jint(JNICALL * jni_create_java_vm) (JavaVM **, JNIEnv **, void *) = NULL;
+#ifdef AS400
+jint(JNICALL * jni_get_created_java_vms) (JavaVM **, long, long *) = NULL;
+#else
+jint(JNICALL * jni_get_created_java_vms) (JavaVM **, int, int *) = NULL;
+#endif
+
+#define TC33_JAVA_BRIDGE_CLASS_NAME ("org/apache/tomcat/modules/server/JNIEndpoint")
+#define TC32_JAVA_BRIDGE_CLASS_NAME ("org/apache/tomcat/service/JNIEndpoint")
+
+static jk_worker_t *the_singleton_jni_worker = NULL;
+
+struct jni_worker
+{
+
+ int was_verified;
+ int was_initialized;
+
+ jk_pool_t p;
+ jk_pool_atom_t buf[TINY_POOL_SIZE];
+
+ /*
+ * JVM Object pointer.
+ */
+ JavaVM *jvm;
+
+ /*
+ * [V] JNIEnv used for boostraping from validate -> init w/o an attach
+ */
+ JNIEnv *tmp_env;
+
+ /*
+ * Web Server to Java bridge, instance and class.
+ */
+ jobject jk_java_bridge_object;
+ jclass jk_java_bridge_class;
+
+ /*
+ * Java methods ids, to jump into the JVM
+ */
+ jmethodID jk_startup_method;
+ jmethodID jk_service_method;
+ jmethodID jk_shutdown_method;
+
+ /*
+ * Command line for tomcat startup
+ */
+ char *tomcat_cmd_line;
+
+ /*
+ * Bridge Type, Tomcat 32/33/40/41/5
+ */
+ unsigned bridge_type;
+
+ /*
+ * Classpath
+ */
+ char *tomcat_classpath;
+
+ /*
+ * Full path to the jni javai/jvm dll
+ */
+ char *jvm_dll_path;
+
+ /*
+ * Initial Java heap size
+ */
+ unsigned tomcat_ms;
+
+ /*
+ * Max Java heap size
+ */
+ unsigned tomcat_mx;
+
+ /*
+ * Java system properties
+ */
+ char **sysprops;
+
+#ifdef JNI_VERSION_1_2
+ /*
+ * Java 2 initialization options (-X... , -verbose etc.)
+ */
+ char **java2opts;
+
+ /*
+ * Java 2 lax/strict option checking (bool)
+ */
+ int java2lax;
+#endif
+
+ /*
+ * stdout and stderr file names for Java
+ */
+ char *stdout_name;
+ char *stderr_name;
+
+ char *name;
+ jk_worker_t worker;
+};
+typedef struct jni_worker jni_worker_t;
+
+struct jni_endpoint
+{
+ int attached;
+ JNIEnv *env;
+ jni_worker_t *worker;
+
+ jk_endpoint_t endpoint;
+};
+typedef struct jni_endpoint jni_endpoint_t;
+
+
+static int load_jvm_dll(jni_worker_t * p, jk_logger_t *l);
+
+static int open_jvm(jni_worker_t * p, JNIEnv ** env, jk_logger_t *l);
+
+static int open_jvm1(jni_worker_t * p, JNIEnv ** env, jk_logger_t *l);
+
+#ifdef JNI_VERSION_1_2
+static int detect_jvm_version(jk_logger_t *l);
+
+static int open_jvm2(jni_worker_t * p, JNIEnv ** env, jk_logger_t *l);
+#endif
+
+
+static int get_bridge_object(jni_worker_t * p, JNIEnv * env, jk_logger_t *l);
+
+static int get_method_ids(jni_worker_t * p, JNIEnv * env, jk_logger_t *l);
+
+static JNIEnv *attach_to_jvm(jni_worker_t * p, jk_logger_t *l);
+
+static void detach_from_jvm(jni_worker_t * p, jk_logger_t *l);
+
+
+/*
+ Duplicate string and convert it to ASCII on EBDIC based systems
+ Needed for at least AS/400 (before V5R4 ?) and BS2000 but what about other EBDIC systems ?
+*/
+static void *strdup_ascii(jk_pool_t *p, char *s)
+{
+ char *rc;
+ rc = jk_pool_strdup(p, s);
+
+#if defined(AS400) || defined(_OSD_POSIX)
+ jk_xlate_to_ascii(rc, strlen(rc));
+#endif
+
+ return rc;
+}
+
+#if defined LINUX && defined APACHE2_SIGHACK
+static void linux_signal_hack()
+{
+ sigset_t newM;
+ sigset_t old;
+
+ sigemptyset(&newM);
+ pthread_sigmask(SIG_SETMASK, &newM, &old);
+
+ sigdelset(&old, SIGUSR1);
+ sigdelset(&old, SIGUSR2);
+ sigdelset(&old, SIGUNUSED);
+ sigdelset(&old, SIGRTMIN);
+ sigdelset(&old, SIGRTMIN + 1);
+ sigdelset(&old, SIGRTMIN + 2);
+ pthread_sigmask(SIG_SETMASK, &old, NULL);
+}
+
+static void print_signals(sigset_t * sset)
+{
+ int sig;
+ for (sig = 1; sig < 20; sig++) {
+ if (sigismember(sset, sig)) {
+ printf(" %d", sig);
+ }
+ }
+ printf("\n");
+}
+#endif
+
+/*
+ * Return values of service() method for jni worker:
+ * return value is_error reason
+ * JK_FALSE JK_HTTP_SERVER_ERROR Invalid parameters (null values)
+ * Error during attach to the JNI backend
+ * Error during JNI call
+ * JK_TRUE JK_HTTP_OK All other cases
+ */
+static int JK_METHOD service(jk_endpoint_t *e,
+ jk_ws_service_t *s,
+ jk_logger_t *l, int *is_error)
+{
+ jni_endpoint_t *p;
+ jint rc;
+
+ JK_TRACE_ENTER(l);
+
+ if (!e || !e->endpoint_private || !s || !is_error) {
+ JK_LOG_NULL_PARAMS(l);
+ if (is_error)
+ *is_error = JK_HTTP_SERVER_ERROR;
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ p = e->endpoint_private;
+
+ /* Set returned error to OK */
+ *is_error = JK_HTTP_OK;
+
+ if (!p->attached) {
+ /* Try to attach */
+ if (!(p->env = attach_to_jvm(p->worker, l))) {
+ jk_log(l, JK_LOG_EMERG, "Attach failed");
+ *is_error = JK_HTTP_SERVER_ERROR;
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ p->attached = JK_TRUE;
+ }
+
+ /* we are attached now */
+
+ /*
+ * When we call the JVM we cannot know what happens
+ * So we can not recover !!!
+ */
+ jk_log(l, JK_LOG_DEBUG, "In service, calling Tomcat...");
+
+ rc = (*(p->env))->CallIntMethod(p->env,
+ p->worker->jk_java_bridge_object,
+ p->worker->jk_service_method,
+ /* [V] For some reason gcc likes this pointer -> int -> jlong conversion, */
+ /* but not the direct pointer -> jlong conversion. I hope it's okay. */
+#ifdef AS400
+ s, l
+#else
+ (jlong) (int)s, (jlong) (int)l
+#endif
+ );
+
+ /* [V] Righ now JNIEndpoint::service() only returns 1 or 0 */
+ if (rc) {
+ jk_log(l, JK_LOG_DEBUG, "Tomcat returned OK, done");
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+ else {
+ jk_log(l, JK_LOG_ERROR, "Tomcat FAILED!");
+ *is_error = JK_HTTP_SERVER_ERROR;
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+}
+
+static int JK_METHOD done(jk_endpoint_t **e, jk_logger_t *l)
+{
+ jni_endpoint_t *p;
+
+ JK_TRACE_ENTER(l);
+ if (!e || !*e || !(*e)->endpoint_private) {
+ JK_LOG_NULL_PARAMS(l);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ p = (*e)->endpoint_private;
+
+ if (p->attached) {
+ detach_from_jvm(p->worker, l);
+ }
+
+ free(p);
+ *e = NULL;
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+static int JK_METHOD validate(jk_worker_t *pThis,
+ jk_map_t *props,
+ jk_worker_env_t *we, jk_logger_t *l)
+{
+ jni_worker_t *p;
+ int mem_config = 0;
+ int btype = 0;
+ const char *str_config = NULL;
+ JNIEnv *env;
+
+ JK_TRACE_ENTER(l);
+
+ if (!pThis || !pThis->worker_private) {
+ JK_LOG_NULL_PARAMS(l);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ p = pThis->worker_private;
+
+ if (p->was_verified) {
+ jk_log(l, JK_LOG_DEBUG, "been here before, done");
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+
+ if (jk_get_worker_mx(props, p->name, (unsigned int *)&mem_config)) {
+ p->tomcat_mx = mem_config;
+ }
+
+ if (jk_get_worker_ms(props, p->name, (unsigned int *)&mem_config)) {
+ p->tomcat_ms = mem_config;
+ }
+
+ if (jk_get_worker_classpath(props, p->name, &str_config)) {
+ p->tomcat_classpath = jk_pool_strdup(&p->p, str_config);
+ }
+
+ if (!p->tomcat_classpath) {
+ jk_log(l, JK_LOG_EMERG, "no classpath");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ if (jk_get_worker_bridge_type(props, p->name, (unsigned int *)&btype)) {
+ p->bridge_type = btype;
+ }
+
+ if (jk_get_worker_jvm_path(props, p->name, &str_config)) {
+ p->jvm_dll_path = jk_pool_strdup(&p->p, str_config);
+ }
+
+ if (!p->jvm_dll_path || !jk_file_exists(p->jvm_dll_path)) {
+ jk_log(l, JK_LOG_EMERG, "no jvm_dll_path");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ if (jk_get_worker_cmd_line(props, p->name, &str_config)) {
+ p->tomcat_cmd_line = jk_pool_strdup(&p->p, str_config);
+ }
+
+ if (jk_get_worker_stdout(props, p->name, &str_config)) {
+ p->stdout_name = jk_pool_strdup(&p->p, str_config);
+ }
+
+ if (jk_get_worker_stderr(props, p->name, &str_config)) {
+ p->stderr_name = jk_pool_strdup(&p->p, str_config);
+ }
+
+ if (jk_get_worker_sysprops(props, p->name, &str_config)) {
+ p->sysprops = jk_parse_sysprops(&p->p, str_config);
+ }
+
+#ifdef JNI_VERSION_1_2
+ if (jk_get_worker_str_prop(props, p->name, "java2opts", &str_config)) {
+ /* jk_log(l, JK_LOG_DEBUG, "Got opts: %s", str_config); */
+ p->java2opts = jk_parse_sysprops(&p->p, str_config);
+ }
+ if (jk_get_worker_int_prop(props, p->name, "java2lax", &mem_config)) {
+ p->java2lax = mem_config ? JK_TRUE : JK_FALSE;
+ }
+#endif
+
+ if (jk_get_worker_libpath(props, p->name, &str_config)) {
+ jk_append_libpath(&p->p, str_config);
+ }
+
+ if (!load_jvm_dll(p, l)) {
+ jk_log(l, JK_LOG_EMERG, "can't load jvm dll");
+ /* [V] no detach needed here */
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ if (!open_jvm(p, &env, l)) {
+ jk_log(l, JK_LOG_EMERG, "can't open jvm");
+ /* [V] no detach needed here */
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ if (!get_bridge_object(p, env, l)) {
+ jk_log(l, JK_LOG_EMERG, "can't get bridge object");
+ /* [V] the detach here may segfault on 1.1 JVM... */
+ detach_from_jvm(p, l);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ if (!get_method_ids(p, env, l)) {
+ jk_log(l, JK_LOG_EMERG, "can't get method ids");
+ /* [V] the detach here may segfault on 1.1 JVM... */
+ detach_from_jvm(p, l);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ p->was_verified = JK_TRUE;
+ p->tmp_env = env;
+
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+static int JK_METHOD init(jk_worker_t *pThis,
+ jk_map_t *props,
+ jk_worker_env_t *we, jk_logger_t *l)
+{
+ jni_worker_t *p;
+ JNIEnv *env;
+
+ JK_TRACE_ENTER(l);
+
+ if (!pThis || !pThis->worker_private) {
+ JK_LOG_NULL_PARAMS(l);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ p = pThis->worker_private;
+
+ if (p->was_initialized) {
+ jk_log(l, JK_LOG_DEBUG, "done (been here!)");
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+
+ if (!p->jvm ||
+ !p->jk_java_bridge_object ||
+ !p->jk_service_method ||
+ !p->jk_startup_method || !p->jk_shutdown_method) {
+ jk_log(l, JK_LOG_EMERG, "worker not set completely");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ /* [V] init is called from the same thread that called validate */
+ /* there is no need to attach to the JVM, just get the env */
+
+ /* if(env = attach_to_jvm(p,l)) { */
+ if ((env = p->tmp_env)) {
+ jstring cmd_line = (jstring) NULL;
+ jstring stdout_name = (jstring) NULL;
+ jstring stderr_name = (jstring) NULL;
+ jint rc = 0;
+
+ /* AS400/BS2000 need EBCDIC to ASCII conversion for JNI */
+
+ if (p->tomcat_cmd_line) {
+ cmd_line =
+ (*env)->NewStringUTF(env,
+ strdup_ascii(&p->p, p->tomcat_cmd_line));
+ }
+ if (p->stdout_name) {
+ stdout_name =
+ (*env)->NewStringUTF(env,
+ strdup_ascii(&p->p, p->stdout_name));
+ }
+ if (p->stderr_name) {
+ stderr_name =
+ (*env)->NewStringUTF(env,
+ strdup_ascii(&p->p, p->stderr_name));
+ }
+
+ jk_log(l, JK_LOG_DEBUG,
+ "calling Tomcat to intialize itself...");
+ rc = (*env)->CallIntMethod(env, p->jk_java_bridge_object,
+ p->jk_startup_method, cmd_line,
+ stdout_name, stderr_name);
+
+ detach_from_jvm(p, l);
+
+ if (rc) {
+ p->was_initialized = JK_TRUE;
+ jk_log(l, JK_LOG_DEBUG, "Tomcat initialized OK, done");
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+ else {
+ jk_log(l, JK_LOG_EMERG, "could not initialize Tomcat");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ }
+ else {
+ jk_log(l, JK_LOG_ERROR,
+ "In init, FIXME: init didn't gen env from validate!");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+}
+
+static int JK_METHOD get_endpoint(jk_worker_t *pThis,
+ jk_endpoint_t **pend, jk_logger_t *l)
+{
+ /* [V] This slow, needs replacement */
+ jni_endpoint_t *p;
+
+ JK_TRACE_ENTER(l);
+
+ if (!pThis || !pThis->worker_private || !pend) {
+ JK_LOG_NULL_PARAMS(l);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ p = (jni_endpoint_t *) calloc(1, sizeof(jni_endpoint_t));
+ if (p) {
+ p->attached = JK_FALSE;
+ p->env = NULL;
+ p->worker = pThis->worker_private;
+ p->endpoint.endpoint_private = p;
+ p->endpoint.service = service;
+ p->endpoint.done = done;
+ *pend = &p->endpoint;
+
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+ else {
+ jk_log(l, JK_LOG_ERROR,
+ "could not allocate endpoint");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+}
+
+static int JK_METHOD destroy(jk_worker_t **pThis, jk_logger_t *l)
+{
+ jni_worker_t *p;
+ JNIEnv *env;
+
+ JK_TRACE_ENTER(l);
+
+ if (!pThis || !*pThis || !(*pThis)->worker_private) {
+ JK_LOG_NULL_PARAMS(l);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ p = (*pThis)->worker_private;
+
+ if (!p->jvm) {
+ jk_log(l, JK_LOG_DEBUG, "JVM not intantiated");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ if (!p->jk_java_bridge_object || !p->jk_shutdown_method) {
+ jk_log(l, JK_LOG_DEBUG, "Tomcat not intantiated");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ if ((env = attach_to_jvm(p, l))) {
+ jk_log(l, JK_LOG_DEBUG, "shutting down Tomcat...");
+ (*env)->CallVoidMethod(env,
+ p->jk_java_bridge_object,
+ p->jk_shutdown_method);
+ detach_from_jvm(p, l);
+ }
+
+ jk_close_pool(&p->p);
+ free(p);
+
+ jk_log(l, JK_LOG_DEBUG, "destroyed");
+
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+int JK_METHOD jni_worker_factory(jk_worker_t **w,
+ const char *name, jk_logger_t *l)
+{
+ jni_worker_t *private_data;
+
+ JK_TRACE_ENTER(l);
+
+ jk_log(l, JK_LOG_WARNING,
+ "Worker '%s' is of type jni, which is deprecated "
+ "and will be removed in a future release.",
+ name ? name : "(null)");
+
+ if (!name || !w) {
+ JK_LOG_NULL_PARAMS(l);
+ JK_TRACE_EXIT(l);
+ return 0;
+ }
+
+ if (the_singleton_jni_worker) {
+ jk_log(l, JK_LOG_DEBUG,
+ "instance already created");
+ *w = the_singleton_jni_worker;
+ JK_TRACE_EXIT(l);
+ return JK_JNI_WORKER_TYPE;
+ }
+
+ private_data = (jni_worker_t *) malloc(sizeof(jni_worker_t));
+
+ if (!private_data) {
+ jk_log(l, JK_LOG_ERROR,
+ "memory allocation error");
+ JK_TRACE_EXIT(l);
+ return 0;
+ }
+
+ jk_open_pool(&private_data->p,
+ private_data->buf, sizeof(jk_pool_atom_t) * TINY_POOL_SIZE);
+
+ private_data->name = jk_pool_strdup(&private_data->p, name);
+
+ if (!private_data->name) {
+ jk_log(l, JK_LOG_ERROR,
+ "memory allocation error");
+ jk_close_pool(&private_data->p);
+ free(private_data);
+ JK_TRACE_EXIT(l);
+ return 0;
+ }
+
+ private_data->was_verified = JK_FALSE;
+ private_data->was_initialized = JK_FALSE;
+ private_data->jvm = NULL;
+ private_data->tmp_env = NULL;
+ private_data->jk_java_bridge_object = (jobject) NULL;
+ private_data->jk_java_bridge_class = (jclass) NULL;
+ private_data->jk_startup_method = (jmethodID) NULL;
+ private_data->jk_service_method = (jmethodID) NULL;
+ private_data->jk_shutdown_method = (jmethodID) NULL;
+ private_data->tomcat_cmd_line = NULL;
+ private_data->tomcat_classpath = NULL;
+ private_data->bridge_type = TC33_BRIDGE_TYPE;
+ private_data->jvm_dll_path = NULL;
+ private_data->tomcat_ms = 0;
+ private_data->tomcat_mx = 0;
+ private_data->sysprops = NULL;
+#ifdef JNI_VERSION_1_2
+ private_data->java2opts = NULL;
+ private_data->java2lax = JK_TRUE;
+#endif
+ private_data->stdout_name = NULL;
+ private_data->stderr_name = NULL;
+
+ private_data->worker.worker_private = private_data;
+ private_data->worker.validate = validate;
+ private_data->worker.init = init;
+ private_data->worker.get_endpoint = get_endpoint;
+ private_data->worker.destroy = destroy;
+
+ *w = &private_data->worker;
+ the_singleton_jni_worker = &private_data->worker;
+
+ JK_TRACE_EXIT(l);
+ return JK_JNI_WORKER_TYPE;
+}
+
+static int load_jvm_dll(jni_worker_t * p, jk_logger_t *l)
+{
+#ifdef WIN32
+ HINSTANCE hInst = LoadLibrary(p->jvm_dll_path);
+ if (hInst) {
+ (FARPROC) jni_create_java_vm =
+ GetProcAddress(hInst, "JNI_CreateJavaVM");
+
+ (FARPROC) jni_get_created_java_vms =
+ GetProcAddress(hInst, "JNI_GetCreatedJavaVMs");
+
+ (FARPROC) jni_get_default_java_vm_init_args =
+ GetProcAddress(hInst, "JNI_GetDefaultJavaVMInitArgs");
+
+ jk_log(l, JK_LOG_DEBUG, "Loaded all JNI procs");
+
+ if (jni_create_java_vm && jni_get_default_java_vm_init_args
+ && jni_get_created_java_vms) {
+ return JK_TRUE;
+ }
+
+ FreeLibrary(hInst);
+ }
+#elif defined(NETWARE) && !defined(__NOVELL_LIBC__)
+ int javaNlmHandle = FindNLMHandle("JVM");
+ if (0 == javaNlmHandle) {
+ /* if we didn't get a handle, try to load java and retry getting the */
+ /* handle */
+ spawnlp(P_NOWAIT, "JVM.NLM", NULL);
+ ThreadSwitchWithDelay();
+ javaNlmHandle = FindNLMHandle("JVM");
+ if (0 == javaNlmHandle)
+ printf("Error loading Java.");
+
+ }
+ if (0 != javaNlmHandle) {
+ jni_create_java_vm = ImportSymbol(GetNLMHandle(), "JNI_CreateJavaVM");
+ jni_get_created_java_vms =
+ ImportSymbol(GetNLMHandle(), "JNI_GetCreatedJavaVMs");
+ jni_get_default_java_vm_init_args =
+ ImportSymbol(GetNLMHandle(), "JNI_GetDefaultJavaVMInitArgs");
+ }
+ if (jni_create_java_vm && jni_get_default_java_vm_init_args
+ && jni_get_created_java_vms) {
+ return JK_TRUE;
+ }
+#elif defined(AS400)
+ jk_log(l, JK_LOG_DEBUG,
+ "Direct reference to JNI entry points (no SRVPGM)");
+ jni_create_java_vm = &JNI_CreateJavaVM;
+ jni_get_default_java_vm_init_args = &JNI_GetDefaultJavaVMInitArgs;
+ jni_get_created_java_vms = &JNI_GetCreatedJavaVMs;
+#else
+ void *handle;
+ jk_log(l, JK_LOG_DEBUG, "loading JVM %s", p->jvm_dll_path);
+
+ handle = dlopen(p->jvm_dll_path, RTLD_NOW | RTLD_GLOBAL);
+
+ if (!handle) {
+ jk_log(l, JK_LOG_EMERG,
+ "Can't load native library %s : %s", p->jvm_dll_path,
+ dlerror());
+ }
+ else {
+ jni_create_java_vm = dlsym(handle, "JNI_CreateJavaVM");
+ jni_get_default_java_vm_init_args =
+ dlsym(handle, "JNI_GetDefaultJavaVMInitArgs");
+ jni_get_created_java_vms = dlsym(handle, "JNI_GetCreatedJavaVMs");
+
+ if (jni_create_java_vm && jni_get_default_java_vm_init_args &&
+ jni_get_created_java_vms) {
+ jk_log(l, JK_LOG_DEBUG,
+ "In load_jvm_dll, symbols resolved, done");
+ return JK_TRUE;
+ }
+ jk_log(l, JK_LOG_EMERG,
+ "Can't resolve JNI_CreateJavaVM or JNI_GetDefaultJavaVMInitArgs");
+ dlclose(handle);
+ }
+#endif
+ return JK_FALSE;
+}
+
+static int open_jvm(jni_worker_t * p, JNIEnv ** env, jk_logger_t *l)
+{
+#ifdef JNI_VERSION_1_2
+ int jvm_version = detect_jvm_version(l);
+
+ switch (jvm_version) {
+ case JNI_VERSION_1_1:
+ return open_jvm1(p, env, l);
+ case JNI_VERSION_1_2:
+ return open_jvm2(p, env, l);
+ default:
+ return JK_FALSE;
+ }
+#else
+ /* [V] Make sure this is _really_ visible */
+#warning -------------------------------------------------------
+#warning NO JAVA 2 HEADERS! SUPPORT FOR JAVA 2 FEATURES DISABLED
+#warning -------------------------------------------------------
+ return open_jvm1(p, env, l);
+#endif
+}
+
+static int open_jvm1(jni_worker_t * p, JNIEnv ** env, jk_logger_t *l)
+{
+ JDK1_1InitArgs vm_args;
+ JNIEnv *penv;
+ int err;
+ *env = NULL;
+
+ JK_TRACE_ENTER(l);
+
+ vm_args.version = JNI_VERSION_1_1;
+
+ if (0 != jni_get_default_java_vm_init_args(&vm_args)) {
+ jk_log(l, JK_LOG_EMERG, "can't get default vm init args");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ jk_log(l, JK_LOG_DEBUG, "got default jvm args");
+
+ if (vm_args.classpath) {
+ size_t len = strlen(vm_args.classpath) +
+ strlen(p->tomcat_classpath) + 3;
+ char *tmp = jk_pool_alloc(&p->p, len);
+ if (tmp) {
+ sprintf(tmp, "%s%c%s",
+ strdup_ascii(&p->p, p->tomcat_classpath),
+ PATH_SEPERATOR, vm_args.classpath);
+ p->tomcat_classpath = tmp;
+ }
+ else {
+ jk_log(l, JK_LOG_EMERG,
+ "allocation error for classpath");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ }
+ vm_args.classpath = p->tomcat_classpath;
+
+ if (p->tomcat_mx) {
+ vm_args.maxHeapSize = p->tomcat_mx;
+ }
+
+ if (p->tomcat_ms) {
+ vm_args.minHeapSize = p->tomcat_ms;
+ }
+
+ if (p->sysprops) {
+ /* No EBCDIC to ASCII conversion here for AS/400 - later */
+ vm_args.properties = p->sysprops;
+ }
+
+ jk_log(l, JK_LOG_DEBUG, "In open_jvm1, about to create JVM...");
+ if ((err = jni_create_java_vm(&(p->jvm), &penv, &vm_args)) != 0) {
+ jk_log(l, JK_LOG_EMERG,
+ "could not create JVM, code: %d ", err);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ jk_log(l, JK_LOG_DEBUG, "JVM created, done");
+
+ *env = penv;
+
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+#ifdef JNI_VERSION_1_2
+static int detect_jvm_version(jk_logger_t *l)
+{
+ JNIEnv *env = NULL;
+ JDK1_1InitArgs vm_args;
+
+ JK_TRACE_ENTER(l);
+
+ /* [V] Idea: ask for 1.2. If the JVM is 1.1 it will return 1.1 instead */
+ /* Note: asking for 1.1 won't work, 'cause 1.2 JVMs will return 1.1 */
+ vm_args.version = JNI_VERSION_1_2;
+
+ if (0 != jni_get_default_java_vm_init_args(&vm_args)) {
+ jk_log(l, JK_LOG_EMERG, "can't get default vm init args");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ jk_log(l, JK_LOG_DEBUG,
+ "found version: %X, done", vm_args.version);
+
+ JK_TRACE_EXIT(l);
+ return vm_args.version;
+}
+
+static char *build_opt_str(jk_pool_t *p,
+ char *opt_name, char *opt_value, jk_logger_t *l)
+{
+ size_t len = strlen(opt_name) + strlen(opt_value) + 2;
+
+ /* [V] IMHO, these should not be deallocated as long as the JVM runs */
+ char *tmp = jk_pool_alloc(p, len);
+
+ if (tmp) {
+ sprintf(tmp, "%s%s", opt_name, opt_value);
+ return tmp;
+ }
+ else {
+ jk_log(l, JK_LOG_EMERG,
+ "allocation error for %s", opt_name);
+ return NULL;
+ }
+}
+
+static char *build_opt_int(jk_pool_t *p,
+ char *opt_name, int opt_value, jk_logger_t *l)
+{
+ /* [V] this should suffice even for 64-bit int */
+ size_t len = strlen(opt_name) + 20 + 2;
+ /* [V] IMHO, these should not be deallocated as long as the JVM runs */
+ char *tmp = jk_pool_alloc(p, len);
+
+ if (tmp) {
+ sprintf(tmp, "%s%d", opt_name, opt_value);
+ return tmp;
+ }
+ else {
+ jk_log(l, JK_LOG_EMERG,
+ "allocation error for %s", opt_name);
+ return NULL;
+ }
+}
+
+static int open_jvm2(jni_worker_t * p, JNIEnv ** env, jk_logger_t *l)
+{
+ JavaVMInitArgs vm_args;
+ JNIEnv *penv = NULL;
+ JavaVMOption options[100];
+ int optn = 0, err;
+ char *tmp;
+
+ *env = NULL;
+
+ JK_TRACE_ENTER(l);
+
+ vm_args.version = JNI_VERSION_1_2;
+ vm_args.options = options;
+
+/* AS/400 need EBCDIC to ASCII conversion to parameters passed to JNI */
+/* No conversion for ASCII based systems (what about BS2000 ?) */
+
+ if (p->tomcat_classpath) {
+ jk_log(l, JK_LOG_DEBUG, "setting classpath to %s",
+ p->tomcat_classpath);
+ tmp =
+ build_opt_str(&p->p, "-Djava.class.path=", p->tomcat_classpath,
+ l);
+ null_check(tmp);
+ options[optn++].optionString = strdup_ascii(&p->p, tmp);
+ }
+
+ if (p->tomcat_mx) {
+ jk_log(l, JK_LOG_DEBUG, "setting max heap to %d",
+ p->tomcat_mx);
+ tmp = build_opt_int(&p->p, "-Xmx", p->tomcat_mx, l);
+ null_check(tmp);
+ options[optn++].optionString = strdup_ascii(&p->p, tmp);
+ }
+
+ if (p->tomcat_ms) {
+ jk_log(l, JK_LOG_DEBUG, "setting start heap to %d",
+ p->tomcat_ms);
+ tmp = build_opt_int(&p->p, "-Xms", p->tomcat_ms, l);
+ null_check(tmp);
+ options[optn++].optionString = strdup_ascii(&p->p, tmp);
+ }
+
+ if (p->sysprops) {
+ int i = 0;
+ while (p->sysprops[i]) {
+ jk_log(l, JK_LOG_DEBUG, "setting %s",
+ p->sysprops[i]);
+ tmp = build_opt_str(&p->p, "-D", p->sysprops[i], l);
+ null_check(tmp);
+ options[optn++].optionString = strdup_ascii(&p->p, tmp);
+ i++;
+ }
+ }
+
+ if (p->java2opts) {
+ int i = 0;
+
+ while (p->java2opts[i]) {
+ jk_log(l, JK_LOG_DEBUG, "using option: %s",
+ p->java2opts[i]);
+ /* Pass it "as is" */
+ options[optn++].optionString =
+ strdup_ascii(&p->p, p->java2opts[i++]);
+ }
+ }
+
+ vm_args.nOptions = optn;
+
+ if (p->java2lax) {
+ jk_log(l, JK_LOG_DEBUG,
+ "the JVM will ignore unknown options");
+ vm_args.ignoreUnrecognized = JNI_TRUE;
+ }
+ else {
+ jk_log(l, JK_LOG_DEBUG,
+ "the JVM will FAIL if it finds unknown options");
+ vm_args.ignoreUnrecognized = JNI_FALSE;
+ }
+
+ jk_log(l, JK_LOG_DEBUG, "about to create JVM...");
+
+ err = jni_create_java_vm(&(p->jvm), &penv, &vm_args);
+
+ if (JNI_EEXIST == err) {
+#ifdef AS400
+ long vmCount;
+#else
+ int vmCount;
+#endif
+ jk_log(l, JK_LOG_DEBUG, "JVM alread instantiated."
+ "Trying to attach instead.");
+
+ jni_get_created_java_vms(&(p->jvm), 1, &vmCount);
+ if (NULL != p->jvm)
+ penv = attach_to_jvm(p, l);
+
+ if (NULL != penv)
+ err = 0;
+ }
+
+ if (err != 0) {
+ jk_log(l, JK_LOG_EMERG, "Fail-> could not create JVM, code: %d ",
+ err);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ *env = penv;
+ jk_log(l, JK_LOG_DEBUG, "JVM created");
+
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+#endif
+
+static int get_bridge_object(jni_worker_t * p, JNIEnv * env, jk_logger_t *l)
+{
+ char *btype;
+ char *ctype;
+
+ jmethodID constructor_method_id;
+
+ JK_TRACE_ENTER(l);
+
+ switch (p->bridge_type) {
+ case TC32_BRIDGE_TYPE:
+ btype = TC32_JAVA_BRIDGE_CLASS_NAME;
+ break;
+
+ case TC33_BRIDGE_TYPE:
+ btype = TC33_JAVA_BRIDGE_CLASS_NAME;
+ break;
+
+ case TC40_BRIDGE_TYPE:
+ case TC41_BRIDGE_TYPE:
+ case TC50_BRIDGE_TYPE:
+ jk_log(l, JK_LOG_EMERG, "Bridge type %d not supported",
+ p->bridge_type);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+/* AS400/BS2000 need conversion from EBCDIC to ASCII before passing to JNI */
+/* for others, strdup_ascii is just jk_pool_strdup */
+
+ ctype = strdup_ascii(&p->p, btype);
+
+ p->jk_java_bridge_class = (*env)->FindClass(env, ctype);
+
+ if (!p->jk_java_bridge_class) {
+ jk_log(l, JK_LOG_EMERG, "Can't find class %s", btype);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ jk_log(l, JK_LOG_DEBUG,
+ "In get_bridge_object, loaded %s bridge class", btype);
+
+ constructor_method_id = (*env)->GetMethodID(env, p->jk_java_bridge_class, strdup_ascii(&p->p, "<init>"), /* method name */
+ strdup_ascii(&p->p, "()V")); /* method sign */
+
+ if (!constructor_method_id) {
+ p->jk_java_bridge_class = (jclass) NULL;
+ jk_log(l, JK_LOG_EMERG, "Can't find constructor");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ p->jk_java_bridge_object = (*env)->NewObject(env,
+ p->jk_java_bridge_class,
+ constructor_method_id);
+ if (!p->jk_java_bridge_object) {
+ p->jk_java_bridge_class = (jclass) NULL;
+ jk_log(l, JK_LOG_EMERG, "Can't create new bridge object");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ p->jk_java_bridge_object =
+ (jobject) (*env)->NewGlobalRef(env, p->jk_java_bridge_object);
+ if (!p->jk_java_bridge_object) {
+ jk_log(l, JK_LOG_EMERG, "Can't create global ref to bridge object");
+ p->jk_java_bridge_class = (jclass) NULL;
+ p->jk_java_bridge_object = (jobject) NULL;
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+static int get_method_ids(jni_worker_t * p, JNIEnv * env, jk_logger_t *l)
+{
+
+/* AS400/BS2000 need conversion from EBCDIC to ASCII before passing to JNI */
+
+ p->jk_startup_method = (*env)->GetMethodID(env,
+ p->jk_java_bridge_class,
+ strdup_ascii(&p->p, "startup"),
+ strdup_ascii(&p->p,
+ "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I"));
+
+ if (!p->jk_startup_method) {
+ jk_log(l, JK_LOG_EMERG, "Can't find startup()");
+ return JK_FALSE;
+ }
+
+ p->jk_service_method = (*env)->GetMethodID(env,
+ p->jk_java_bridge_class,
+ strdup_ascii(&p->p, "service"),
+ strdup_ascii(&p->p, "(JJ)I"));
+
+ if (!p->jk_service_method) {
+ jk_log(l, JK_LOG_EMERG, "Can't find service()");
+ return JK_FALSE;
+ }
+
+ p->jk_shutdown_method = (*env)->GetMethodID(env,
+ p->jk_java_bridge_class,
+ strdup_ascii(&p->p,
+ "shutdown"),
+ strdup_ascii(&p->p, "()V"));
+
+ if (!p->jk_shutdown_method) {
+ jk_log(l, JK_LOG_EMERG, "Can't find shutdown()");
+ return JK_FALSE;
+ }
+
+ return JK_TRUE;
+}
+
+static JNIEnv *attach_to_jvm(jni_worker_t * p, jk_logger_t *l)
+{
+ JNIEnv *rc = NULL;
+ /* [V] This message is important. If there are signal mask issues, *
+ * the JVM usually hangs when a new thread tries to attach to it */
+ JK_TRACE_ENTER(l);
+
+#if defined LINUX && defined APACHE2_SIGHACK
+ linux_signal_hack();
+#endif
+
+ if (0 == (*(p->jvm))->AttachCurrentThread(p->jvm,
+#ifdef JNI_VERSION_1_2
+ (void **)
+#endif
+ &rc, NULL)) {
+ jk_log(l, JK_LOG_DEBUG, "In attach_to_jvm, attached ok");
+ JK_TRACE_EXIT(l);
+ return rc;
+ }
+ jk_log(l, JK_LOG_ERROR,
+ "In attach_to_jvm, cannot attach thread to JVM.");
+ JK_TRACE_EXIT(l);
+ return NULL;
+}
+
+/*
+static JNIEnv *attach_to_jvm(jni_worker_t *p)
+{
+ JNIEnv *rc = NULL;
+
+#ifdef LINUX
+ linux_signal_hack();
+#endif
+
+ if(0 == (*(p->jvm))->AttachCurrentThread(p->jvm,
+#ifdef JNI_VERSION_1_2
+ (void **)
+#endif
+ &rc,
+ NULL)) {
+ return rc;
+ }
+
+ return NULL;
+}
+*/
+static void detach_from_jvm(jni_worker_t * p, jk_logger_t *l)
+{
+ JK_TRACE_ENTER(l);
+ if (!p->jvm || !(*(p->jvm))) {
+ jk_log(l, JK_LOG_ERROR,
+ "cannot detach from NULL JVM.");
+ }
+
+ if (0 == (*(p->jvm))->DetachCurrentThread(p->jvm)) {
+ jk_log(l, JK_LOG_DEBUG, "detached ok");
+ }
+ else {
+ jk_log(l, JK_LOG_ERROR,
+ "cannot detach from JVM.");
+ }
+ JK_TRACE_EXIT(l);
+}
+#else
+int JK_METHOD jni_worker_factory(jk_worker_t **w,
+ const char *name, jk_logger_t *l)
+{
+ jk_log(l, JK_LOG_WARNING,
+ "Worker '%s' is of type jni, which is deprecated "
+ "and will be removed in a future release.",
+ name ? name : "(null)");
+ if (w)
+ *w = NULL;
+ return 0;
+}
+#endif /* JNI_VERSION_1_6 */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_jni_worker.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_jni_worker.h
new file mode 100644
index 00000000..0adef2ab
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_jni_worker.h
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: jni worker header file *
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Version: $Revision: 466585 $ *
+ ***************************************************************************/
+
+#ifndef JK_JNI_WORKER_H
+#define JK_JNI_WORKER_H
+
+#include "jk_logger.h"
+#include "jk_service.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+#define JK_JNI_WORKER_NAME ("jni")
+#define JK_JNI_WORKER_TYPE (4)
+
+int JK_METHOD jni_worker_factory(jk_worker_t **w,
+ const char *name, jk_logger_t *l);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* JK_JNI_WORKER_H */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_jni_worker.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_jni_worker.lo
new file mode 100644
index 00000000..b3a8ed60
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_jni_worker.lo
@@ -0,0 +1,12 @@
+# jk_jni_worker.lo - a libtool object file
+# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18)
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/jk_jni_worker.o'
+
+# Name of the non-PIC object.
+non_pic_object='jk_jni_worker.o'
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_jni_worker.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_jni_worker.o
new file mode 100644
index 00000000..9f00e3e5
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_jni_worker.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_lb_worker.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_lb_worker.c
new file mode 100644
index 00000000..3c0ce67a
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_lb_worker.c
@@ -0,0 +1,1823 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: Load balancer worker, knows how to load balance among *
+ * several workers. *
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Author: Mladen Turk <mturk@apache.org> *
+ * Author: Rainer Jung <rjung@apache.org> *
+ * Based on: *
+ * Version: $Revision: 1137200 $ *
+ ***************************************************************************/
+
+#include "jk_pool.h"
+#include "jk_service.h"
+#include "jk_util.h"
+#include "jk_worker.h"
+#include "jk_lb_worker.h"
+#include "jk_ajp13.h"
+#include "jk_ajp13_worker.h"
+#include "jk_ajp14_worker.h"
+#include "jk_mt.h"
+#include "jk_shm.h"
+
+/*
+ * The load balancing code in this
+ */
+
+/*
+ * The following two macros need to be kept in sync with
+ * the existing values for state and activation.
+ * Note: state <= JK_LB_STATE_FORCE is equivalent to
+ * state is none of JK_LB_STATE_BUSY, JK_LB_STATE_ERROR, JK_LB_STATE_PROBE
+ * Note: state <= JK_LB_STATE_BUSY is equivalent to
+ * state is none of JK_LB_STATE_ERROR, JK_LB_STATE_PROBE
+ * Note: activation == JK_LB_ACTIVATION_ACTIVE is equivalent to
+ * activation is none of JK_LB_ACTIVATION_STOPPED, JK_LB_ACTIVATION_DISABLED
+ */
+#define JK_WORKER_USABLE(s, activation) ((s) <= JK_LB_STATE_FORCE && activation == JK_LB_ACTIVATION_ACTIVE)
+#define JK_WORKER_USABLE_STICKY(s, activation) ((s) <= JK_LB_STATE_BUSY && activation != JK_LB_ACTIVATION_STOPPED)
+
+static const char *lb_locking_type[] = {
+ JK_LB_LOCK_TEXT_OPTIMISTIC,
+ JK_LB_LOCK_TEXT_PESSIMISTIC,
+ "unknown",
+ NULL
+};
+
+static const char *lb_method_type[] = {
+ JK_LB_METHOD_TEXT_REQUESTS,
+ JK_LB_METHOD_TEXT_TRAFFIC,
+ JK_LB_METHOD_TEXT_BUSYNESS,
+ JK_LB_METHOD_TEXT_SESSIONS,
+ "unknown",
+ NULL
+};
+
+static const char *lb_state_type[] = {
+ JK_LB_STATE_TEXT_IDLE,
+ JK_LB_STATE_TEXT_OK,
+ JK_LB_STATE_TEXT_RECOVER,
+ JK_LB_STATE_TEXT_FORCE,
+ JK_LB_STATE_TEXT_BUSY,
+ JK_LB_STATE_TEXT_ERROR,
+ JK_LB_STATE_TEXT_PROBE,
+ "unknown",
+ NULL
+};
+
+static const char *lb_activation_type[] = {
+ JK_LB_ACTIVATION_TEXT_ACTIVE,
+ JK_LB_ACTIVATION_TEXT_DISABLED,
+ JK_LB_ACTIVATION_TEXT_STOPPED,
+ "unknown",
+ NULL
+};
+
+static const char *lb_first_log_names[] = {
+ JK_NOTE_LB_FIRST_NAME,
+ JK_NOTE_LB_FIRST_VALUE,
+ JK_NOTE_LB_FIRST_ACCESSED,
+ JK_NOTE_LB_FIRST_READ,
+ JK_NOTE_LB_FIRST_TRANSFERRED,
+ JK_NOTE_LB_FIRST_ERRORS,
+ JK_NOTE_LB_FIRST_BUSY,
+ JK_NOTE_LB_FIRST_ACTIVATION,
+ JK_NOTE_LB_FIRST_STATE,
+ NULL
+};
+
+static const char *lb_last_log_names[] = {
+ JK_NOTE_LB_LAST_NAME,
+ JK_NOTE_LB_LAST_VALUE,
+ JK_NOTE_LB_LAST_ACCESSED,
+ JK_NOTE_LB_LAST_READ,
+ JK_NOTE_LB_LAST_TRANSFERRED,
+ JK_NOTE_LB_LAST_ERRORS,
+ JK_NOTE_LB_LAST_BUSY,
+ JK_NOTE_LB_LAST_ACTIVATION,
+ JK_NOTE_LB_LAST_STATE,
+ NULL
+};
+
+struct lb_endpoint
+{
+ lb_worker_t *worker;
+ jk_endpoint_t endpoint;
+ int *states;
+};
+typedef struct lb_endpoint lb_endpoint_t;
+
+
+/* Calculate the greatest common divisor of two positive integers */
+static jk_uint64_t gcd(jk_uint64_t a, jk_uint64_t b)
+{
+ jk_uint64_t r;
+ if (b > a) {
+ r = a;
+ a = b;
+ b = r;
+ }
+ while (b > 0) {
+ r = a % b;
+ a = b;
+ b = r;
+ }
+ return a;
+}
+
+/* Calculate the smallest common multiple of two positive integers */
+static jk_uint64_t scm(jk_uint64_t a, jk_uint64_t b)
+{
+ return a * b / gcd(a, b);
+}
+
+/* Return the string representation of the lb lock type */
+const char *jk_lb_get_lock(lb_worker_t *p, jk_logger_t *l)
+{
+ return lb_locking_type[p->lblock];
+}
+
+/* Return the int representation of the lb lock type */
+int jk_lb_get_lock_code(const char *v)
+{
+ if (!v)
+ return JK_LB_LOCK_DEF;
+ else if (*v == 'o' || *v == 'O' || *v == '0')
+ return JK_LB_LOCK_OPTIMISTIC;
+ else if (*v == 'p' || *v == 'P' || *v == '1')
+ return JK_LB_LOCK_PESSIMISTIC;
+ else
+ return JK_LB_LOCK_DEF;
+}
+
+/* Return the string representation of the lb method type */
+const char *jk_lb_get_method(lb_worker_t *p, jk_logger_t *l)
+{
+ return lb_method_type[p->lbmethod];
+}
+
+/* Return the int representation of the lb method type */
+int jk_lb_get_method_code(const char *v)
+{
+ if (!v)
+ return JK_LB_METHOD_DEF;
+ else if (*v == 'r' || *v == 'R' || *v == '0')
+ return JK_LB_METHOD_REQUESTS;
+ else if (*v == 't' || *v == 'T' || *v == '1')
+ return JK_LB_METHOD_TRAFFIC;
+ else if (*v == 'b' || *v == 'B' || *v == '2')
+ return JK_LB_METHOD_BUSYNESS;
+ else if (*v == 's' || *v == 'S' || *v == '3')
+ return JK_LB_METHOD_SESSIONS;
+ else
+ return JK_LB_METHOD_DEF;
+}
+
+/* Return the string representation of the balance worker state */
+const char *jk_lb_get_state(lb_sub_worker_t *p, jk_logger_t *l)
+{
+ return lb_state_type[p->s->state];
+}
+
+/* Return the int representation of the lb state */
+int jk_lb_get_state_code(const char *v)
+{
+ if (!v)
+ return JK_LB_STATE_DEF;
+ else if (*v == 'i' || *v == 'I' || *v == 'n' || *v == 'N' || *v == '0')
+ return JK_LB_STATE_IDLE;
+ else if (*v == 'o' || *v == 'O' || *v == '1')
+ return JK_LB_STATE_OK;
+ else if (*v == 'r' || *v == 'R' || *v == '2')
+ return JK_LB_STATE_RECOVER;
+ else if (*v == 'f' || *v == 'F' || *v == '3')
+ return JK_LB_STATE_FORCE;
+ else if (*v == 'b' || *v == 'B' || *v == '4')
+ return JK_LB_STATE_BUSY;
+ else if (*v == 'e' || *v == 'E' || *v == '5')
+ return JK_LB_STATE_ERROR;
+ else if (*v == 'p' || *v == 'P' || *v == '6')
+ return JK_LB_STATE_PROBE;
+ else
+ return JK_LB_STATE_DEF;
+}
+
+/* Return the string representation of the balance worker activation */
+/* based on the integer representation */
+const char *jk_lb_get_activation_direct(int activation, jk_logger_t *l)
+{
+ return lb_activation_type[activation];
+}
+
+/* Return the string representation of the balance worker activation */
+/* based on the sub worker struct */
+const char *jk_lb_get_activation(lb_sub_worker_t *p, jk_logger_t *l)
+{
+ return lb_activation_type[p->activation];
+}
+
+int jk_lb_get_activation_code(const char *v)
+{
+ if (!v)
+ return JK_LB_ACTIVATION_DEF;
+ else if (*v == 'a' || *v == 'A' || *v == '0')
+ return JK_LB_ACTIVATION_ACTIVE;
+ else if (*v == 'd' || *v == 'D' || *v == '1')
+ return JK_LB_ACTIVATION_DISABLED;
+ else if (*v == 's' || *v == 'S' || *v == '2')
+ return JK_LB_ACTIVATION_STOPPED;
+ else
+ return JK_LB_ACTIVATION_DEF;
+}
+
+/* Update the load multipliers wrt. lb_factor */
+void update_mult(lb_worker_t *p, jk_logger_t *l)
+{
+ unsigned int i = 0;
+ jk_uint64_t s = 1;
+ JK_TRACE_ENTER(l);
+ for (i = 0; i < p->num_of_workers; i++) {
+ s = scm(s, p->lb_workers[i].lb_factor);
+ }
+ for (i = 0; i < p->num_of_workers; i++) {
+ p->lb_workers[i].lb_mult = s / p->lb_workers[i].lb_factor;
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "worker %s gets multiplicity %"
+ JK_UINT64_T_FMT,
+ p->lb_workers[i].name,
+ p->lb_workers[i].lb_mult);
+ }
+ JK_TRACE_EXIT(l);
+}
+
+/* Reset all lb values.
+ */
+void reset_lb_values(lb_worker_t *p, jk_logger_t *l)
+{
+ unsigned int i = 0;
+ JK_TRACE_ENTER(l);
+ if (p->lbmethod != JK_LB_METHOD_BUSYNESS) {
+ for (i = 0; i < p->num_of_workers; i++) {
+ p->lb_workers[i].s->lb_value = 0;
+ }
+ }
+ JK_TRACE_EXIT(l);
+}
+
+/* Syncing config values from shm */
+void jk_lb_pull(lb_worker_t *p, int locked, jk_logger_t *l)
+{
+ unsigned int i = 0;
+
+ JK_TRACE_ENTER(l);
+
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "syncing mem for lb '%s' from shm (%u->%u)",
+ p->name, p->sequence, p->s->h.sequence);
+ if (locked == JK_FALSE)
+ jk_shm_lock();
+ p->sticky_session = p->s->sticky_session;
+ p->sticky_session_force = p->s->sticky_session_force;
+ p->recover_wait_time = p->s->recover_wait_time;
+ p->error_escalation_time = p->s->error_escalation_time;
+ p->max_reply_timeouts = p->s->max_reply_timeouts;
+ p->retries = p->s->retries;
+ p->retry_interval = p->s->retry_interval;
+ p->lbmethod = p->s->lbmethod;
+ p->lblock = p->s->lblock;
+ p->max_packet_size = p->s->max_packet_size;
+ p->sequence = p->s->h.sequence;
+ strncpy(p->session_cookie, p->s->session_cookie, JK_SHM_STR_SIZ);
+ strncpy(p->session_path, p->s->session_path, JK_SHM_STR_SIZ);
+
+ for (i = 0; i < p->num_of_workers; i++) {
+ lb_sub_worker_t *w = &p->lb_workers[i];
+ if (w->sequence != w->s->h.sequence) {
+ jk_worker_t *jw = w->worker;
+ ajp_worker_t *aw = (ajp_worker_t *)jw->worker_private;
+
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "syncing mem for member '%s' of lb '%s' from shm",
+ w->name, p->name);
+
+ jk_ajp_pull(aw, JK_TRUE, l);
+ strncpy(w->route, w->s->route, JK_SHM_STR_SIZ);
+ strncpy(w->domain, w->s->domain, JK_SHM_STR_SIZ);
+ strncpy(w->redirect, w->s->redirect, JK_SHM_STR_SIZ);
+ w->distance = w->s->distance;
+ w->activation = w->s->activation;
+ w->lb_factor = w->s->lb_factor;
+ w->lb_mult = w->s->lb_mult;
+ w->sequence = w->s->h.sequence;
+ }
+ }
+ if (locked == JK_FALSE)
+ jk_shm_unlock();
+
+ JK_TRACE_EXIT(l);
+}
+
+/* Syncing config values to shm */
+void jk_lb_push(lb_worker_t *p, int locked, jk_logger_t *l)
+{
+ unsigned int i = 0;
+
+ JK_TRACE_ENTER(l);
+
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "syncing shm for lb '%s' from mem (%u->%u)",
+ p->name, p->s->h.sequence, p->sequence);
+ if (locked == JK_FALSE)
+ jk_shm_lock();
+ p->s->sticky_session = p->sticky_session;
+ p->s->sticky_session_force = p->sticky_session_force;
+ p->s->recover_wait_time = p->recover_wait_time;
+ p->s->error_escalation_time = p->error_escalation_time;
+ p->s->max_reply_timeouts = p->max_reply_timeouts;
+ p->s->retries = p->retries;
+ p->s->retry_interval = p->retry_interval;
+ p->s->lbmethod = p->lbmethod;
+ p->s->lblock = p->lblock;
+ p->s->max_packet_size = p->max_packet_size;
+ p->s->h.sequence = p->sequence;
+ strncpy(p->s->session_cookie, p->session_cookie, JK_SHM_STR_SIZ);
+ strncpy(p->s->session_path, p->session_path, JK_SHM_STR_SIZ);
+
+ for (i = 0; i < p->num_of_workers; i++) {
+ lb_sub_worker_t *w = &p->lb_workers[i];
+ if (w->sequence != w->s->h.sequence) {
+ jk_worker_t *jw = w->worker;
+ ajp_worker_t *aw = (ajp_worker_t *)jw->worker_private;
+
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "syncing shm for member '%s' of lb '%s' from mem",
+ w->name, p->name);
+
+ jk_ajp_push(aw, JK_TRUE, l);
+ strncpy(w->s->route, w->route, JK_SHM_STR_SIZ);
+ strncpy(w->s->domain, w->domain, JK_SHM_STR_SIZ);
+ strncpy(w->s->redirect, w->redirect, JK_SHM_STR_SIZ);
+ w->s->distance = w->distance;
+ w->s->activation = w->activation;
+ w->s->lb_factor = w->lb_factor;
+ w->s->lb_mult = w->lb_mult;
+ w->s->h.sequence = w->sequence;
+ }
+ }
+ if (locked == JK_FALSE)
+ jk_shm_unlock();
+
+ JK_TRACE_EXIT(l);
+}
+
+/* Retrieve the parameter with the given name */
+static char *get_path_param(jk_ws_service_t *s, const char *name)
+{
+ char *id_start = NULL;
+ for (id_start = strstr(s->req_uri, name);
+ id_start; id_start = strstr(id_start + 1, name)) {
+ if (id_start[strlen(name)] == '=') {
+ /*
+ * Session path-cookie was found, get it's value
+ */
+ id_start += (1 + strlen(name));
+ if (strlen(id_start)) {
+ char *id_end;
+ id_start = jk_pool_strdup(s->pool, id_start);
+ /*
+ * The query string is not part of req_uri, however
+ * to be on the safe side lets remove the trailing query
+ * string if appended...
+ */
+ if ((id_end = strchr(id_start, '?')) != NULL) {
+ *id_end = '\0';
+ }
+ /*
+ * Remove any trailing path element.
+ */
+ if ((id_end = strchr(id_start, ';')) != NULL) {
+ *id_end = '\0';
+ }
+ return id_start;
+ }
+ }
+ }
+
+ return NULL;
+}
+
+/* Retrieve the cookie with the given name */
+static char *get_cookie(jk_ws_service_t *s, const char *name)
+{
+ unsigned i;
+ char *result = NULL;
+
+ for (i = 0; i < s->num_headers; i++) {
+ if (strcasecmp(s->headers_names[i], "cookie") == 0) {
+
+ char *id_start;
+ for (id_start = strstr(s->headers_values[i], name);
+ id_start; id_start = strstr(id_start + 1, name)) {
+ if (id_start == s->headers_values[i] ||
+ id_start[-1] == ';' ||
+ id_start[-1] == ',' || isspace((int)id_start[-1])) {
+ id_start += strlen(name);
+ while (*id_start && isspace((int)(*id_start)))
+ ++id_start;
+ if (*id_start == '=' && id_start[1]) {
+ /*
+ * Session cookie was found, get it's value
+ */
+ char *id_end;
+ size_t sz;
+ ++id_start;
+ if ((id_end = strpbrk(id_start, ";,")) != NULL)
+ sz = id_end - id_start;
+ else {
+ sz = strlen(id_start);
+ id_end = id_start + sz;
+ }
+ if (result == NULL) {
+ result = jk_pool_alloc(s->pool, sz + 1);
+ memcpy(result, id_start, sz);
+ result[sz] = '\0';
+ }
+ else {
+ size_t osz = strlen(result) + 1;
+ result =
+ jk_pool_realloc(s->pool, osz + sz + 1, result, osz);
+ strcat(result, ";");
+ strncat(result, id_start, sz);
+ }
+ id_start = id_end;
+ }
+ }
+ }
+ }
+ }
+
+ return result;
+}
+
+
+/* Retrieve session id from the cookie or the parameter
+ * (parameter first)
+ */
+static char *get_sessionid(jk_ws_service_t *s, lb_worker_t *p, jk_logger_t *l)
+{
+ char *val;
+ val = get_path_param(s, p->session_path);
+ if (!val) {
+ val = get_cookie(s, p->session_cookie);
+ }
+ if (val && !*val) {
+ /* TODO: For now only log the empty sessions.
+ * However we should probably return 400
+ * (BAD_REQUEST) in this case
+ */
+ jk_log(l, JK_LOG_INFO,
+ "Detected empty session identifier.");
+ return NULL;
+ }
+ return val;
+}
+
+static void close_workers(lb_worker_t *p, int num_of_workers, jk_logger_t *l)
+{
+ int i = 0;
+ for (i = 0; i < num_of_workers; i++) {
+ p->lb_workers[i].worker->destroy(&(p->lb_workers[i].worker), l);
+ }
+}
+
+/* If the worker is in error state run
+ * retry on that worker. It will be marked as
+ * operational if the retry timeout is elapsed.
+ * The worker might still be unusable, but we try
+ * anyway.
+ * If the worker is in ok state and got no requests
+ * since the last global maintenance, we mark its
+ * state as not available.
+ * Return the number of workers not in error state.
+ */
+static int recover_workers(lb_worker_t *p,
+ jk_uint64_t curmax,
+ time_t now,
+ jk_logger_t *l)
+{
+ unsigned int i;
+ int non_error = 0;
+ int elapsed;
+ lb_sub_worker_t *w = NULL;
+ ajp_worker_t *aw = NULL;
+ JK_TRACE_ENTER(l);
+
+ if (p->sequence != p->s->h.sequence)
+ jk_lb_pull(p, JK_TRUE, l);
+ for (i = 0; i < p->num_of_workers; i++) {
+ w = &p->lb_workers[i];
+ aw = (ajp_worker_t *)w->worker->worker_private;
+ if (w->s->state == JK_LB_STATE_ERROR) {
+ elapsed = (int)difftime(now, w->s->error_time);
+ if (elapsed <= p->recover_wait_time) {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "worker %s will recover in %d seconds",
+ w->name, p->recover_wait_time - elapsed);
+ }
+ else {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "worker %s is marked for recovery",
+ w->name);
+ if (p->lbmethod != JK_LB_METHOD_BUSYNESS)
+ w->s->lb_value = curmax;
+ aw->s->reply_timeouts = 0;
+ w->s->state = JK_LB_STATE_RECOVER;
+ non_error++;
+ }
+ }
+ else if (w->s->error_time > 0 &&
+ (int)difftime(now, w->s->error_time) >= p->error_escalation_time) {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "worker %s escalating local error to global error",
+ w->name);
+ w->s->state = JK_LB_STATE_ERROR;
+ }
+ else {
+ non_error++;
+ if (w->s->state == JK_LB_STATE_OK &&
+ aw->s->used == w->s->elected_snapshot)
+ w->s->state = JK_LB_STATE_IDLE;
+ }
+ w->s->elected_snapshot = aw->s->used;
+ }
+
+ JK_TRACE_EXIT(l);
+ return non_error;
+}
+
+static int force_recovery(lb_worker_t *p,
+ int *states,
+ jk_logger_t *l)
+{
+ unsigned int i;
+ int forced = 0;
+ lb_sub_worker_t *w = NULL;
+ ajp_worker_t *aw = NULL;
+ JK_TRACE_ENTER(l);
+
+ for (i = 0; i < p->num_of_workers; i++) {
+ w = &p->lb_workers[i];
+ if (w->s->state == JK_LB_STATE_ERROR) {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_INFO,
+ "worker %s is marked for forced recovery",
+ w->name);
+ aw = (ajp_worker_t *)w->worker->worker_private;
+ aw->s->reply_timeouts = 0;
+ w->s->state = JK_LB_STATE_FORCE;
+ if (states != NULL)
+ states[i] = JK_LB_STATE_FORCE;
+ forced++;
+ }
+ }
+
+ JK_TRACE_EXIT(l);
+ return forced;
+}
+
+/* Divide old load values by the decay factor,
+ * such that older values get less important
+ * for the routing decisions.
+ */
+static jk_uint64_t decay_load(lb_worker_t *p,
+ time_t exponent,
+ jk_logger_t *l)
+{
+ unsigned int i;
+ jk_uint64_t curmax = 0;
+ lb_sub_worker_t *w;
+ ajp_worker_t *aw;
+
+ JK_TRACE_ENTER(l);
+ for (i = 0; i < p->num_of_workers; i++) {
+ w = &p->lb_workers[i];
+ if (p->lbmethod != JK_LB_METHOD_BUSYNESS) {
+ w->s->lb_value >>= exponent;
+ if (w->s->lb_value > curmax) {
+ curmax = w->s->lb_value;
+ }
+ }
+ aw = (ajp_worker_t *)w->worker->worker_private;
+ aw->s->reply_timeouts >>= exponent;
+ }
+ JK_TRACE_EXIT(l);
+ return curmax;
+}
+
+static int JK_METHOD maintain_workers(jk_worker_t *p, time_t now, jk_logger_t *l)
+{
+ unsigned int i = 0;
+ jk_uint64_t curmax = 0;
+ long delta;
+
+ JK_TRACE_ENTER(l);
+ if (p && p->worker_private) {
+ lb_worker_t *lb = (lb_worker_t *)p->worker_private;
+
+ for (i = 0; i < lb->num_of_workers; i++) {
+ if (lb->lb_workers[i].worker->maintain) {
+ lb->lb_workers[i].worker->maintain(lb->lb_workers[i].worker, now, l);
+ }
+ }
+
+ jk_shm_lock();
+
+ /* Now we check for global maintenance (once for all processes).
+ * Checking workers for recovery and applying decay to the
+ * load values should not be done by each process individually.
+ * Therefore we globally sync and we use a global timestamp.
+ * Since it's possible that we come here a few milliseconds
+ * before the interval has passed, we allow a little tolerance.
+ */
+ delta = (long)difftime(now, lb->s->last_maintain_time) + JK_LB_MAINTAIN_TOLERANCE;
+ if (delta >= lb->maintain_time) {
+ lb->s->last_maintain_time = now;
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "decay with 2^%d",
+ JK_LB_DECAY_MULT * delta / lb->maintain_time);
+ curmax = decay_load(lb, JK_LB_DECAY_MULT * delta / lb->maintain_time, l);
+ if (!recover_workers(lb, curmax, now, l)) {
+ force_recovery(lb, NULL, l);
+ }
+ }
+
+ jk_shm_unlock();
+
+ }
+ else {
+ JK_LOG_NULL_PARAMS(l);
+ }
+
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+static int find_by_session(jk_ws_service_t *s,
+ lb_worker_t *p,
+ const char *session_route,
+ jk_logger_t *l)
+{
+
+ int rc = -1;
+ unsigned int i;
+
+ for (i = 0; i < p->num_of_workers; i++) {
+ if (strcmp(p->lb_workers[i].route, session_route) == 0) {
+ rc = i;
+ break;
+ }
+ }
+ return rc;
+}
+
+static int find_best_bydomain(jk_ws_service_t *s,
+ lb_worker_t *p,
+ const char *route_or_domain,
+ int *states,
+ jk_logger_t *l)
+{
+ unsigned int i;
+ int d = 0;
+ jk_uint64_t curmin = 0;
+ int candidate = -1;
+ int activation;
+ lb_sub_worker_t wr;
+ char *idpart = strchr(route_or_domain, '.');
+ size_t domain_len = 0;
+
+ if (idpart) {
+ domain_len = idpart - route_or_domain;
+ }
+ else {
+ domain_len = strlen(route_or_domain);
+ }
+ /* First try to see if we have available candidate */
+ for (i = 0; i < p->num_of_workers; i++) {
+ /* Skip all workers that are not member of domain */
+ wr = p->lb_workers[i];
+ if (strlen(wr.domain) == 0 ||
+ strlen(wr.domain) != domain_len ||
+ strncmp(wr.domain, route_or_domain, domain_len))
+ continue;
+ /* Take into calculation only the workers that are
+ * not in error state, stopped, disabled or busy.
+ */
+ activation = s->extension.activation ?
+ s->extension.activation[i] :
+ JK_LB_ACTIVATION_UNSET;
+ if (activation == JK_LB_ACTIVATION_UNSET)
+ activation = wr.activation;
+ if (JK_WORKER_USABLE(states[wr.i], activation)) {
+ if (candidate < 0 || wr.distance < d ||
+ (wr.s->lb_value < curmin &&
+ wr.distance == d)) {
+ candidate = i;
+ curmin = wr.s->lb_value;
+ d = wr.distance;
+ }
+ }
+ }
+ return candidate;
+}
+
+
+static int find_best_byvalue(jk_ws_service_t *s,
+ lb_worker_t *p,
+ int *states,
+ jk_logger_t *l)
+{
+ unsigned int i;
+ unsigned int j;
+ unsigned int offset;
+ int d = 0;
+ jk_uint64_t curmin = 0;
+
+ /* find the least busy worker */
+ int candidate = -1;
+ int activation;
+ lb_sub_worker_t wr;
+
+ offset = p->next_offset;
+
+ /* First try to see if we have available candidate */
+ for (j = offset; j < p->num_of_workers + offset; j++) {
+ i = j % p->num_of_workers;
+ wr = p->lb_workers[i];
+ activation = s->extension.activation ?
+ s->extension.activation[i] :
+ JK_LB_ACTIVATION_UNSET;
+ if (activation == JK_LB_ACTIVATION_UNSET)
+ activation = wr.activation;
+
+ /* Take into calculation only the workers that are
+ * not in error state, stopped, disabled or busy.
+ */
+ if (JK_WORKER_USABLE(states[wr.i], activation)) {
+ if (candidate < 0 || wr.distance < d ||
+ (wr.s->lb_value < curmin &&
+ wr.distance == d)) {
+ candidate = i;
+ curmin = wr.s->lb_value;
+ d = wr.distance;
+ p->next_offset = i + 1;
+ }
+ }
+ }
+ return candidate;
+}
+
+static int find_bysession_route(jk_ws_service_t *s,
+ lb_worker_t *p,
+ const char *session_route,
+ int *states,
+ jk_logger_t *l)
+{
+ int uses_domain = 0;
+ int candidate = -1;
+
+ candidate = find_by_session(s, p, session_route, l);
+ if (candidate < 0) {
+ uses_domain = 1;
+ candidate = find_best_bydomain(s, p, session_route, states, l);
+ }
+ if (candidate >= 0) {
+ lb_sub_worker_t wr = p->lb_workers[candidate];
+ int activation;
+ if (uses_domain)
+ s->route = wr.domain;
+ activation = s->extension.activation ?
+ s->extension.activation[candidate] :
+ JK_LB_ACTIVATION_UNSET;
+ if (activation == JK_LB_ACTIVATION_UNSET)
+ activation = wr.activation;
+ if (!JK_WORKER_USABLE_STICKY(states[wr.i], activation)) {
+ /* We have a worker that is error state or stopped.
+ * If it has a redirection set use that redirection worker.
+ * This enables to safely remove the member from the
+ * balancer. Of course you will need a some kind of
+ * session replication between those two remote.
+ */
+ if (p->sticky_session_force)
+ candidate = -1;
+ else if (*wr.redirect) {
+ candidate = find_by_session(s, p, wr.redirect, l);
+ s->route = NULL;
+ }
+ else if (*wr.domain && !uses_domain) {
+ candidate = find_best_bydomain(s, p, wr.domain, states, l);
+ if (candidate >= 0) {
+ s->route = wr.domain;
+ } else {
+ s->route = NULL;
+ }
+ }
+ if (candidate >= 0) {
+ wr = p->lb_workers[candidate];
+ activation = s->extension.activation ?
+ s->extension.activation[candidate] :
+ JK_LB_ACTIVATION_UNSET;
+ if (activation == JK_LB_ACTIVATION_UNSET)
+ activation = wr.activation;
+ if (!JK_WORKER_USABLE_STICKY(states[wr.i], activation))
+ candidate = -1;
+ }
+ }
+ }
+ return candidate;
+}
+
+static int find_failover_worker(jk_ws_service_t *s,
+ lb_worker_t *p,
+ int *states,
+ jk_logger_t *l)
+{
+ int rc = -1;
+ unsigned int i;
+ char *redirect = NULL;
+
+ for (i = 0; i < p->num_of_workers; i++) {
+ if (strlen(p->lb_workers[i].redirect)) {
+ redirect = p->lb_workers[i].redirect;
+ break;
+ }
+ }
+ if (redirect)
+ rc = find_bysession_route(s, p, redirect, states, l);
+ return rc;
+}
+
+static int find_best_worker(jk_ws_service_t *s,
+ lb_worker_t *p,
+ int *states,
+ jk_logger_t *l)
+{
+ int rc = -1;
+
+ rc = find_best_byvalue(s, p, states, l);
+ /* By default use worker route as session route */
+ if (rc < 0)
+ rc = find_failover_worker(s, p, states, l);
+ return rc;
+}
+
+static int get_most_suitable_worker(jk_ws_service_t *s,
+ lb_worker_t *p,
+ char *sessionid,
+ int *states,
+ jk_logger_t *l)
+{
+ int rc = -1;
+ int r;
+
+ JK_TRACE_ENTER(l);
+ if (p->num_of_workers == 1) {
+ /* No need to find the best worker
+ * if there is a single one
+ */
+ int activation = s->extension.activation ?
+ s->extension.activation[0] :
+ JK_LB_ACTIVATION_UNSET;
+ if (activation == JK_LB_ACTIVATION_UNSET)
+ activation = p->lb_workers[0].activation;
+ if (JK_WORKER_USABLE_STICKY(states[0], activation)) {
+ if (activation != JK_LB_ACTIVATION_DISABLED) {
+ JK_TRACE_EXIT(l);
+ return 0;
+ }
+ }
+ else {
+ JK_TRACE_EXIT(l);
+ return -1;
+ }
+ }
+ if (p->lblock == JK_LB_LOCK_PESSIMISTIC)
+ r = jk_shm_lock();
+ else {
+ JK_ENTER_CS(&(p->cs), r);
+ }
+ if (!r) {
+ jk_log(l, JK_LOG_ERROR,
+ "locking failed (errno=%d)",
+ errno);
+ }
+ if (sessionid) {
+ char *session = sessionid;
+ while (sessionid) {
+ char *next = strchr(sessionid, ';');
+ char *session_route = NULL;
+ if (next)
+ *next++ = '\0';
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "searching worker for partial sessionid %s",
+ sessionid);
+ session_route = strchr(sessionid, '.');
+ if (session_route) {
+ ++session_route;
+
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "searching worker for session route %s",
+ session_route);
+
+ /* We have a session route. Whow! */
+ rc = find_bysession_route(s, p, session_route, states, l);
+ if (rc >= 0) {
+ lb_sub_worker_t *wr = &(p->lb_workers[rc]);
+ if (p->lblock == JK_LB_LOCK_PESSIMISTIC)
+ jk_shm_unlock();
+ else {
+ JK_LEAVE_CS(&(p->cs), r);
+ }
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "found worker %s (%s) for route %s and partial sessionid %s",
+ wr->name, wr->route, session_route, sessionid);
+ JK_TRACE_EXIT(l);
+ return rc;
+ }
+ }
+ /* Try next partial sessionid if present */
+ sessionid = next;
+ rc = -1;
+ }
+ if (rc < 0 && p->sticky_session_force) {
+ if (p->lblock == JK_LB_LOCK_PESSIMISTIC)
+ jk_shm_unlock();
+ else {
+ JK_LEAVE_CS(&(p->cs), r);
+ }
+ jk_log(l, JK_LOG_INFO,
+ "all workers are in error state for session %s",
+ session);
+ JK_TRACE_EXIT(l);
+ return -1;
+ }
+ }
+ rc = find_best_worker(s, p, states, l);
+ if (p->lblock == JK_LB_LOCK_PESSIMISTIC)
+ jk_shm_unlock();
+ else {
+ JK_LEAVE_CS(&(p->cs), r);
+ }
+ if (rc >= 0) {
+ lb_sub_worker_t *wr = &(p->lb_workers[rc]);
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "found best worker %s (%s) using method '%s'",
+ wr->name, wr->route, jk_lb_get_method(p, l));
+ JK_TRACE_EXIT(l);
+ return rc;
+ }
+ JK_TRACE_EXIT(l);
+ return -1;
+}
+
+static void lb_add_log_items(jk_ws_service_t *s,
+ const char *const *log_names,
+ lb_sub_worker_t *w,
+ jk_logger_t *l)
+{
+ ajp_worker_t *aw = (ajp_worker_t *)w->worker->worker_private;
+ const char **log_values = jk_pool_alloc(s->pool, sizeof(char *) * JK_LB_NOTES_COUNT);
+ char *buf = jk_pool_alloc(s->pool, sizeof(char *) * JK_LB_NOTES_COUNT * JK_LB_UINT64_STR_SZ);
+ if (log_values && buf) {
+ /* JK_NOTE_LB_FIRST/LAST_NAME */
+ log_values[0] = w->name;
+ snprintf(buf, JK_LB_UINT64_STR_SZ, "%" JK_UINT64_T_FMT, w->s->lb_value);
+ /* JK_NOTE_LB_FIRST/LAST_VALUE */
+ log_values[1] = buf;
+ buf += JK_LB_UINT64_STR_SZ;
+ snprintf(buf, JK_LB_UINT64_STR_SZ, "%" JK_UINT64_T_FMT, aw->s->used);
+ /* JK_NOTE_LB_FIRST/LAST_ACCESSED */
+ log_values[2] = buf;
+ buf += JK_LB_UINT64_STR_SZ;
+ snprintf(buf, JK_LB_UINT64_STR_SZ, "%" JK_UINT64_T_FMT, aw->s->readed);
+ /* JK_NOTE_LB_FIRST/LAST_READ */
+ log_values[3] = buf;
+ buf += JK_LB_UINT64_STR_SZ;
+ snprintf(buf, JK_LB_UINT64_STR_SZ, "%" JK_UINT64_T_FMT, aw->s->transferred);
+ /* JK_NOTE_LB_FIRST/LAST_TRANSFERRED */
+ log_values[4] = buf;
+ buf += JK_LB_UINT64_STR_SZ;
+ snprintf(buf, JK_LB_UINT64_STR_SZ, "%" JK_UINT32_T_FMT, w->s->errors);
+ /* JK_NOTE_LB_FIRST/LAST_ERRORS */
+ log_values[5] = buf;
+ buf += JK_LB_UINT64_STR_SZ;
+ snprintf(buf, JK_LB_UINT64_STR_SZ, "%d", aw->s->busy);
+ /* JK_NOTE_LB_FIRST/LAST_BUSY */
+ log_values[6] = buf;
+ /* JK_NOTE_LB_FIRST/LAST_ACTIVATION */
+ log_values[7] = jk_lb_get_activation(w, l);
+ /* JK_NOTE_LB_FIRST/LAST_STATE */
+ log_values[8] = jk_lb_get_state(w, l);
+ s->add_log_items(s, log_names, log_values, JK_LB_NOTES_COUNT);
+ }
+}
+
+static int JK_METHOD service(jk_endpoint_t *e,
+ jk_ws_service_t *s,
+ jk_logger_t *l, int *is_error)
+{
+ lb_endpoint_t *p;
+ int attempt = 0;
+ lb_sub_worker_t *prec = NULL;
+ int num_of_workers;
+ int first = 1;
+ int was_forced = 0;
+ int recoverable = JK_TRUE;
+ int rc = JK_UNSET;
+ char *sessionid = NULL;
+ int i;
+ int retry = 0;
+
+ JK_TRACE_ENTER(l);
+
+ if (!e || !e->endpoint_private || !s || !is_error) {
+ JK_LOG_NULL_PARAMS(l);
+ if (is_error)
+ *is_error = JK_HTTP_SERVER_ERROR;
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ p = e->endpoint_private;
+ num_of_workers = p->worker->num_of_workers;
+
+ /* Set returned error to OK */
+ *is_error = JK_HTTP_OK;
+
+ if (p->worker->sequence != p->worker->s->h.sequence)
+ jk_lb_pull(p->worker, JK_FALSE, l);
+ for (i = 0; i < num_of_workers; i++) {
+ lb_sub_worker_t *rec = &(p->worker->lb_workers[i]);
+ if (rec->s->state == JK_LB_STATE_BUSY) {
+ if (ajp_has_endpoint(rec->worker, l)) {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "worker %s busy count fixed",
+ rec->name);
+ rec->s->state = JK_LB_STATE_OK;
+ }
+ }
+ /* Copy the shared state info */
+ p->states[i] = rec->s->state;
+ }
+
+ /* set the recovery post, for LB mode */
+ s->reco_buf = jk_b_new(s->pool);
+ if (!s->reco_buf) {
+ *is_error = JK_HTTP_SERVER_ERROR;
+ jk_log(l, JK_LOG_ERROR,
+ "Failed allocating AJP message");
+ JK_TRACE_EXIT(l);
+ return JK_SERVER_ERROR;
+ }
+ if (jk_b_set_buffer_size(s->reco_buf, p->worker->max_packet_size)) {
+ *is_error = JK_HTTP_SERVER_ERROR;
+ jk_log(l, JK_LOG_ERROR,
+ "Failed allocating AJP message buffer");
+ JK_TRACE_EXIT(l);
+ return JK_SERVER_ERROR;
+ }
+ jk_b_reset(s->reco_buf);
+ s->reco_status = RECO_INITED;
+
+ if (p->worker->sticky_session) {
+ /* Use sessionid only if sticky_session is
+ * defined for this load balancer
+ */
+ sessionid = get_sessionid(s, p->worker, l);
+ }
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "service sticky_session=%d id='%s'",
+ p->worker->sticky_session, sessionid ? sessionid : "empty");
+
+ while (recoverable == JK_TRUE) {
+ if (attempt >= num_of_workers) {
+ retry++;
+ if (retry >= p->worker->retries) {
+ /* Done with retrying */
+ break;
+ }
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "retry %d, sleeping for %d ms before retrying",
+ retry, p->worker->retry_interval);
+ jk_sleep(p->worker->retry_interval);
+ /* Pull shared memory if something changed during sleep */
+ if (p->worker->sequence != p->worker->s->h.sequence)
+ jk_lb_pull(p->worker, JK_FALSE, l);
+ for (i = 0; i < num_of_workers; i++) {
+ /* Copy the shared state info */
+ p->states[i] = p->worker->lb_workers[i].s->state;
+ }
+ attempt = 0;
+ }
+ rc = JK_FALSE;
+ *is_error = JK_HTTP_SERVER_BUSY;
+ i = get_most_suitable_worker(s, p->worker, sessionid, p->states, l);
+ if (i >= 0) {
+ int r;
+ int is_service_error = JK_HTTP_OK;
+ lb_sub_worker_t *rec = &(p->worker->lb_workers[i]);
+ ajp_worker_t *aw = (ajp_worker_t *)rec->worker->worker_private;
+ jk_endpoint_t *end = NULL;
+ int activation = s->extension.activation ?
+ s->extension.activation[i] :
+ JK_LB_ACTIVATION_UNSET;
+ if (activation == JK_LB_ACTIVATION_UNSET)
+ activation = rec->activation;
+ if (!s->route)
+ s->route = rec->route;
+ s->activation = jk_lb_get_activation_direct(activation, l);
+ prec = rec;
+
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "service worker=%s route=%s",
+ rec->name, s->route);
+
+ if (p->worker->lblock == JK_LB_LOCK_PESSIMISTIC)
+ jk_shm_lock();
+ if (rec->s->state == JK_LB_STATE_RECOVER) {
+ rec->s->state = JK_LB_STATE_PROBE;
+ p->states[rec->i] = JK_LB_STATE_PROBE;
+ }
+ if (p->worker->lblock == JK_LB_LOCK_PESSIMISTIC)
+ jk_shm_unlock();
+
+ r = rec->worker->get_endpoint(rec->worker, &end, l);
+ if (!r || !end) {
+ /* If we can not get the endpoint
+ * mark the worker as busy rather then
+ * as in error if the retry number is
+ * greater then the number of retries.
+ */
+ if (p->worker->lblock == JK_LB_LOCK_PESSIMISTIC)
+ jk_shm_lock();
+ if (rec->s->state != JK_LB_STATE_ERROR) {
+ rec->s->state = JK_LB_STATE_BUSY;
+ p->states[rec->i] = JK_LB_STATE_BUSY;
+ }
+ if (p->worker->lblock == JK_LB_LOCK_PESSIMISTIC)
+ jk_shm_unlock();
+ jk_log(l, JK_LOG_INFO,
+ "could not get free endpoint for worker %s (%d retries)",
+ rec->name, retry);
+ }
+ else {
+ int service_stat = JK_UNSET;
+ jk_uint64_t rd = 0;
+ jk_uint64_t wr = 0;
+ /* Reset endpoint read and write sizes for
+ * this request.
+ */
+ end->rd = end->wr = 0;
+ end->recoverable = JK_TRUE;
+ if (p->worker->lblock == JK_LB_LOCK_PESSIMISTIC)
+ jk_shm_lock();
+
+ /* Increment the number of workers serving request */
+ p->worker->s->busy++;
+ rec->s->busy++;
+ if (p->worker->s->busy > p->worker->s->max_busy)
+ p->worker->s->max_busy = p->worker->s->busy;
+ if ( (p->worker->lbmethod == JK_LB_METHOD_REQUESTS) ||
+ (p->worker->lbmethod == JK_LB_METHOD_BUSYNESS) ||
+ (p->worker->lbmethod == JK_LB_METHOD_SESSIONS &&
+ !sessionid) )
+ rec->s->lb_value += rec->lb_mult;
+ if (p->worker->lblock == JK_LB_LOCK_PESSIMISTIC)
+ jk_shm_unlock();
+
+ service_stat = end->service(end, s, l, &is_service_error);
+ rd = end->rd;
+ wr = end->wr;
+ recoverable = end->recoverable;
+ *is_error = is_service_error;
+ end->done(&end, l);
+
+ if (p->worker->lblock == JK_LB_LOCK_PESSIMISTIC)
+ jk_shm_lock();
+
+ /* Update partial reads and writes if any */
+ if (p->worker->lbmethod == JK_LB_METHOD_TRAFFIC) {
+ rec->s->lb_value += (rd+wr)*rec->lb_mult;
+ }
+ else if (p->worker->lbmethod == JK_LB_METHOD_BUSYNESS) {
+ if (rec->s->lb_value >= rec->lb_mult) {
+ rec->s->lb_value -= rec->lb_mult;
+ }
+ else {
+ rec->s->lb_value = 0;
+ if (JK_IS_DEBUG_LEVEL(l)) {
+ jk_log(l, JK_LOG_DEBUG,
+ "worker %s has load value to low (%"
+ JK_UINT64_T_FMT
+ " < %"
+ JK_UINT64_T_FMT
+ ") ",
+ "- correcting to 0",
+ rec->name,
+ rec->s->lb_value,
+ rec->lb_mult);
+ }
+ }
+ }
+
+ /* When have an endpoint and we ran a request, assume
+ * we are OK, unless we last were in error.
+ * We will below explicitely set OK or ERROR according
+ * to the returned service_stat.
+ */
+ if (rec->s->state != JK_LB_STATE_ERROR) {
+ rec->s->state = JK_LB_STATE_OK;
+ p->states[rec->i] = JK_LB_STATE_OK;
+ }
+ /* Decrement the busy worker count.
+ * Check if the busy was reset to zero by graceful
+ * restart of the server.
+ */
+ if (p->worker->s->busy)
+ p->worker->s->busy--;
+ if (rec->s->busy)
+ rec->s->busy--;
+ if (service_stat == JK_TRUE) {
+ /*
+ * Successful request.
+ */
+ rec->s->state = JK_LB_STATE_OK;
+ p->states[rec->i] = JK_LB_STATE_OK;
+ rec->s->error_time = 0;
+ rc = JK_TRUE;
+ recoverable = JK_UNSET;
+ }
+ else if (service_stat == JK_CLIENT_ERROR) {
+ /*
+ * Client error !!!
+ * Since this is bad request do not fail over.
+ */
+ rec->s->state = JK_LB_STATE_OK;
+ p->states[rec->i] = JK_LB_STATE_ERROR;
+ rec->s->error_time = 0;
+ rc = JK_CLIENT_ERROR;
+ recoverable = JK_FALSE;
+ }
+ else if (service_stat == JK_SERVER_ERROR) {
+ /*
+ * Internal JK server error.
+ * Keep previous global state.
+ * Do not try to reuse the same node for the same request.
+ * Failing over to another node could help.
+ */
+ p->states[rec->i] = JK_LB_STATE_ERROR;
+ rc = JK_FALSE;
+ }
+ else if (service_stat == JK_AJP_PROTOCOL_ERROR) {
+ /*
+ * We've received a bad AJP message from the backend.
+ * Keep previous global state.
+ * Do not try to reuse the same node for the same request.
+ * Failing over to another node could help.
+ */
+ p->states[rec->i] = JK_LB_STATE_ERROR;
+ rc = JK_FALSE;
+ }
+ else if (service_stat == JK_STATUS_ERROR) {
+ /*
+ * Status code configured as service is down.
+ * The node is fine.
+ * Do not try to reuse the same node for the same request.
+ * Failing over to another node could help.
+ */
+ rec->s->state = JK_LB_STATE_OK;
+ p->states[rec->i] = JK_LB_STATE_ERROR;
+ rec->s->error_time = 0;
+ rc = JK_FALSE;
+ }
+ else if (service_stat == JK_STATUS_FATAL_ERROR) {
+ /*
+ * Status code configured as service is down.
+ * Mark the node as bad.
+ * Do not try to reuse the same node for the same request.
+ * Failing over to another node could help.
+ */
+ rec->s->errors++;
+ rec->s->state = JK_LB_STATE_ERROR;
+ p->states[rec->i] = JK_LB_STATE_ERROR;
+ rec->s->error_time = time(NULL);
+ rc = JK_FALSE;
+ }
+ else if (service_stat == JK_REPLY_TIMEOUT) {
+ if (aw->s->reply_timeouts > (unsigned)p->worker->max_reply_timeouts) {
+ /*
+ * Service failed - to many reply timeouts
+ * Mark the node as bad.
+ * Do not try to reuse the same node for the same request.
+ * Failing over to another node could help.
+ */
+ rec->s->errors++;
+ rec->s->state = JK_LB_STATE_ERROR;
+ p->states[rec->i] = JK_LB_STATE_ERROR;
+ rec->s->error_time = time(NULL);
+ }
+ else {
+ /*
+ * Reply timeout, bot not yet too many of them.
+ * Keep previous global state.
+ * Do not try to reuse the same node for the same request.
+ * Failing over to another node could help.
+ */
+ p->states[rec->i] = JK_LB_STATE_ERROR;
+ }
+ rc = JK_FALSE;
+ }
+ else {
+ /*
+ * Various unspecific error cases.
+ * Keep previous global state, if we are not in local error since to long.
+ * Do not try to reuse the same node for the same request.
+ * Failing over to another node could help.
+ */
+ time_t now = time(NULL);
+ rec->s->errors++;
+ if (rec->s->busy == 0 ||
+ p->worker->error_escalation_time == 0 ||
+ (rec->s->error_time > 0 &&
+ (int)difftime(now, rec->s->error_time) >= p->worker->error_escalation_time)) {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "worker %s escalating local error to global error",
+ rec->name);
+ rec->s->state = JK_LB_STATE_ERROR;
+ }
+ p->states[rec->i] = JK_LB_STATE_ERROR;
+ if (rec->s->error_time == 0) {
+ rec->s->error_time = now;
+ }
+ rc = JK_FALSE;
+ }
+ if (p->worker->lblock == JK_LB_LOCK_PESSIMISTIC)
+ jk_shm_unlock();
+ if (p->states[rec->i] == JK_LB_STATE_ERROR)
+ jk_log(l, JK_LOG_INFO,
+ "service failed, worker %s is in %serror state",
+ rec->name,
+ rec->s->state == JK_LB_STATE_ERROR ? "" : "local ");
+ }
+ if (recoverable == JK_TRUE) {
+ /*
+ * Error is recoverable by submitting the request to
+ * another worker... Lets try to do that.
+ */
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "recoverable error... will try to recover on other worker");
+ }
+ else {
+ /*
+ * Error is not recoverable - break with an error.
+ */
+ if (rc == JK_CLIENT_ERROR)
+ jk_log(l, JK_LOG_INFO,
+ "unrecoverable error %d, request failed."
+ " Client failed in the middle of request,"
+ " we can't recover to another instance.",
+ *is_error);
+ else if (rc != JK_TRUE)
+ jk_log(l, JK_LOG_ERROR,
+ "unrecoverable error %d, request failed."
+ " Tomcat failed in the middle of request,"
+ " we can't recover to another instance.",
+ *is_error);
+ }
+ if (first == 1 && s->add_log_items) {
+ first = 0;
+ lb_add_log_items(s, lb_first_log_names, prec, l);
+ }
+ }
+ else {
+ /* No more workers left ... */
+ if (!was_forced) {
+ int nf;
+ /* Force recovery only once.
+ * If it still fails, Tomcat is still disconnected.
+ */
+ jk_shm_lock();
+ nf = force_recovery(p->worker, p->states, l);
+ jk_shm_unlock();
+ was_forced = 1;
+ if (nf) {
+ /* We have forced recovery.
+ * Reset the service loop and go again
+ */
+ prec = NULL;
+ jk_log(l, JK_LOG_INFO,
+ "Forcing recovery once for %d workers", nf);
+ continue;
+ }
+ else {
+ /* No workers in error state.
+ * Somebody set them all to disabled?
+ */
+ jk_log(l, JK_LOG_INFO,
+ "All tomcat instances failed, no more workers "
+ "left for recovery (attempt=%d, retry=%d)",
+ attempt, retry);
+ *is_error = JK_HTTP_SERVER_BUSY;
+ rc = JK_FALSE;
+ }
+ }
+ else {
+ jk_log(l, JK_LOG_INFO,
+ "All tomcat instances failed, no more workers "
+ "left (attempt=%d, retry=%d)",
+ attempt, retry);
+ *is_error = JK_HTTP_SERVER_BUSY;
+ rc = JK_FALSE;
+ }
+ }
+ attempt++;
+ }
+ if (recoverable == JK_TRUE) {
+ jk_log(l, JK_LOG_INFO,
+ "All tomcat instances are busy or in error state");
+ /* rc and http error must be set above */
+ }
+ if (rc == JK_FALSE) {
+ jk_log(l, JK_LOG_ERROR,
+ "All tomcat instances failed, no more workers left");
+ }
+ if (prec && s->add_log_items) {
+ lb_add_log_items(s, lb_last_log_names, prec, l);
+ }
+
+ JK_TRACE_EXIT(l);
+ return rc;
+}
+
+static int JK_METHOD done(jk_endpoint_t **e, jk_logger_t *l)
+{
+ JK_TRACE_ENTER(l);
+
+ if (e && *e && (*e)->endpoint_private) {
+ lb_endpoint_t *p = (*e)->endpoint_private;
+ free(p->states);
+ free(p);
+ *e = NULL;
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+
+ JK_LOG_NULL_PARAMS(l);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+}
+
+static int JK_METHOD validate(jk_worker_t *pThis,
+ jk_map_t *props,
+ jk_worker_env_t *we, jk_logger_t *l)
+{
+ JK_TRACE_ENTER(l);
+
+ if (pThis && pThis->worker_private) {
+ lb_worker_t *p = pThis->worker_private;
+ char **worker_names;
+ unsigned int num_of_workers;
+ const char *secret;
+
+ p->sticky_session = jk_get_is_sticky_session(props, p->name);
+ p->sticky_session_force = jk_get_is_sticky_session_force(props, p->name);
+ secret = jk_get_worker_secret(props, p->name);
+
+ if (jk_get_lb_worker_list(props,
+ p->name,
+ &worker_names,
+ &num_of_workers) && num_of_workers) {
+ unsigned int i = 0;
+ unsigned int j = 0;
+ p->max_packet_size = DEF_BUFFER_SZ;
+ p->lb_workers = jk_pool_alloc(&p->p,
+ num_of_workers *
+ sizeof(lb_sub_worker_t));
+ if (!p->lb_workers) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ memset(p->lb_workers, 0, num_of_workers * sizeof(lb_sub_worker_t));
+ for (i = 0; i < num_of_workers; i++) {
+ p->lb_workers[i].s = jk_shm_alloc_lb_sub_worker(&p->p);
+ if (p->lb_workers[i].s == NULL) {
+ jk_log(l, JK_LOG_ERROR,
+ "allocating lb sub worker record from shared memory");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ }
+
+ for (i = 0; i < num_of_workers; i++) {
+ const char *s;
+ unsigned int ms;
+
+ p->lb_workers[i].i = i;
+ strncpy(p->lb_workers[i].name, worker_names[i],
+ JK_SHM_STR_SIZ);
+ strncpy(p->lb_workers[i].s->h.name, worker_names[i],
+ JK_SHM_STR_SIZ);
+ p->lb_workers[i].sequence = 0;
+ p->lb_workers[i].s->h.sequence = 0;
+ p->lb_workers[i].lb_factor =
+ jk_get_lb_factor(props, worker_names[i]);
+ if (p->lb_workers[i].lb_factor < 1) {
+ p->lb_workers[i].lb_factor = 1;
+ }
+ /* Calculate the maximum packet size from all workers
+ * for the recovery buffer.
+ */
+ ms = jk_get_max_packet_size(props, worker_names[i]);
+ if (ms > p->max_packet_size)
+ p->max_packet_size = ms;
+ p->lb_workers[i].distance =
+ jk_get_distance(props, worker_names[i]);
+ if ((s = jk_get_worker_route(props, worker_names[i], NULL)))
+ strncpy(p->lb_workers[i].route, s, JK_SHM_STR_SIZ);
+ else
+ strncpy(p->lb_workers[i].route, worker_names[i], JK_SHM_STR_SIZ);
+ if ((s = jk_get_worker_domain(props, worker_names[i], NULL)))
+ strncpy(p->lb_workers[i].domain, s, JK_SHM_STR_SIZ);
+ if ((s = jk_get_worker_redirect(props, worker_names[i], NULL)))
+ strncpy(p->lb_workers[i].redirect, s, JK_SHM_STR_SIZ);
+
+ p->lb_workers[i].s->lb_value = 0;
+ p->lb_workers[i].s->state = JK_LB_STATE_IDLE;
+ p->lb_workers[i].s->error_time = 0;
+ p->lb_workers[i].activation =
+ jk_get_worker_activation(props, worker_names[i]);
+ if (!wc_create_worker(p->lb_workers[i].name, 0,
+ props,
+ &(p->lb_workers[i].worker),
+ we, l) || !p->lb_workers[i].worker) {
+ break;
+ }
+ if (secret && (p->lb_workers[i].worker->type == JK_AJP13_WORKER_TYPE ||
+ p->lb_workers[i].worker->type == JK_AJP14_WORKER_TYPE)) {
+ ajp_worker_t *aw = (ajp_worker_t *)p->lb_workers[i].worker->worker_private;
+ if (!aw->secret)
+ aw->secret = secret;
+ }
+ if (p->lb_workers[i].worker->type == JK_AJP13_WORKER_TYPE ||
+ p->lb_workers[i].worker->type == JK_AJP14_WORKER_TYPE) {
+ ajp_worker_t *aw = (ajp_worker_t *)p->lb_workers[i].worker->worker_private;
+ if (aw->port == 0) {
+ p->lb_workers[i].activation = JK_LB_ACTIVATION_STOPPED;
+ }
+ }
+ }
+
+ if (i != num_of_workers) {
+ jk_log(l, JK_LOG_ERROR,
+ "Failed creating worker %s",
+ p->lb_workers[i].name);
+ close_workers(p, i, l);
+ }
+ else {
+ /* Update domain names if route contains period '.' */
+ for (i = 0; i < num_of_workers; i++) {
+ if (!p->lb_workers[i].domain[0]) {
+ char *id_domain = strchr(p->lb_workers[i].route, '.');
+ if (id_domain) {
+ *id_domain = '\0';
+ strcpy(p->lb_workers[i].domain, p->lb_workers[i].route);
+ *id_domain = '.';
+ }
+ }
+ if (JK_IS_DEBUG_LEVEL(l)) {
+ jk_log(l, JK_LOG_DEBUG,
+ "Balanced worker %i has name %s and route %s in domain %s",
+ i,
+ p->lb_workers[i].name,
+ p->lb_workers[i].route,
+ p->lb_workers[i].domain);
+ }
+ }
+ p->num_of_workers = num_of_workers;
+ update_mult(p, l);
+ for (i = 0; i < num_of_workers; i++) {
+ for (j = 0; j < i; j++) {
+ if (strcmp(p->lb_workers[i].route, p->lb_workers[j].route) == 0) {
+ jk_log(l, JK_LOG_ERROR,
+ "Balanced workers number %i (%s) and %i (%s) share the same route %s - aborting configuration!",
+ i,
+ p->lb_workers[i].name,
+ j,
+ p->lb_workers[j].name,
+ p->lb_workers[i].route);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ }
+ }
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+ }
+ }
+
+ JK_LOG_NULL_PARAMS(l);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+}
+
+static int JK_METHOD init(jk_worker_t *pThis,
+ jk_map_t *props,
+ jk_worker_env_t *we, jk_logger_t *log)
+{
+ int i;
+
+ lb_worker_t *p = (lb_worker_t *)pThis->worker_private;
+ JK_TRACE_ENTER(log);
+
+ p->worker.we = we;
+ p->retries = jk_get_worker_retries(props, p->name,
+ JK_RETRIES);
+ p->retry_interval =
+ jk_get_worker_retry_interval(props, p->name,
+ JK_SLEEP_DEF);
+ p->recover_wait_time = jk_get_worker_recover_timeout(props, p->name,
+ WAIT_BEFORE_RECOVER);
+ if (p->recover_wait_time < 1)
+ p->recover_wait_time = 1;
+ p->error_escalation_time = jk_get_worker_error_escalation_time(props, p->name,
+ p->recover_wait_time / 2);
+ p->max_reply_timeouts = jk_get_worker_max_reply_timeouts(props, p->name,
+ 0);
+ p->maintain_time = jk_get_worker_maintain_time(props);
+ if(p->maintain_time < 0)
+ p->maintain_time = 0;
+ p->s->last_maintain_time = time(NULL);
+ p->s->last_reset = p->s->last_maintain_time;
+
+ p->lbmethod = jk_get_lb_method(props, p->name);
+ p->lblock = jk_get_lb_lock(props, p->name);
+ strncpy(p->session_cookie,
+ jk_get_lb_session_cookie(props, p->name, JK_SESSION_IDENTIFIER),
+ JK_SHM_STR_SIZ);
+ strncpy(p->session_path,
+ jk_get_lb_session_path(props, p->name, JK_PATH_SESSION_IDENTIFIER),
+ JK_SHM_STR_SIZ);
+ strcpy(p->s->session_cookie, p->session_cookie);
+ strcpy(p->s->session_path, p->session_path);
+
+ JK_INIT_CS(&(p->cs), i);
+ if (i == JK_FALSE) {
+ jk_log(log, JK_LOG_ERROR,
+ "creating thread lock (errno=%d)",
+ errno);
+ JK_TRACE_EXIT(log);
+ return JK_FALSE;
+ }
+
+ p->sequence++;
+ jk_lb_push(p, JK_FALSE, log);
+
+ JK_TRACE_EXIT(log);
+ return JK_TRUE;
+}
+
+static int JK_METHOD get_endpoint(jk_worker_t *pThis,
+ jk_endpoint_t **pend, jk_logger_t *l)
+{
+ JK_TRACE_ENTER(l);
+
+ if (pThis && pThis->worker_private && pend) {
+ lb_endpoint_t *p = (lb_endpoint_t *) malloc(sizeof(lb_endpoint_t));
+ p->worker = pThis->worker_private;
+ p->endpoint.endpoint_private = p;
+ p->endpoint.service = service;
+ p->endpoint.done = done;
+ p->states = (int *)malloc((p->worker->num_of_workers + 1) * sizeof(int));
+ if (!p->states) {
+ free(p);
+ jk_log(l, JK_LOG_ERROR,
+ "Failed allocating private worker state memory");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ *pend = &p->endpoint;
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+ else {
+ JK_LOG_NULL_PARAMS(l);
+ }
+
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+}
+
+static int JK_METHOD destroy(jk_worker_t **pThis, jk_logger_t *l)
+{
+ JK_TRACE_ENTER(l);
+
+ if (pThis && *pThis && (*pThis)->worker_private) {
+ unsigned int i;
+ lb_worker_t *private_data = (*pThis)->worker_private;
+
+ close_workers(private_data, private_data->num_of_workers, l);
+ JK_DELETE_CS(&(private_data->cs), i);
+ jk_close_pool(&private_data->p);
+ free(private_data);
+
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+
+ JK_LOG_NULL_PARAMS(l);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+}
+
+int JK_METHOD lb_worker_factory(jk_worker_t **w,
+ const char *name, jk_logger_t *l)
+{
+ JK_TRACE_ENTER(l);
+
+ if (NULL != name && NULL != w) {
+ lb_worker_t *private_data =
+ (lb_worker_t *) calloc(1, sizeof(lb_worker_t));
+
+
+ jk_open_pool(&private_data->p,
+ private_data->buf,
+ sizeof(jk_pool_atom_t) * TINY_POOL_SIZE);
+
+ private_data->s = jk_shm_alloc_lb_worker(&private_data->p);
+ if (!private_data->s) {
+ free(private_data);
+ JK_TRACE_EXIT(l);
+ return 0;
+ }
+ strncpy(private_data->name, name, JK_SHM_STR_SIZ);
+ strncpy(private_data->s->h.name, name, JK_SHM_STR_SIZ);
+ private_data->lb_workers = NULL;
+ private_data->num_of_workers = 0;
+ private_data->worker.worker_private = private_data;
+ private_data->worker.validate = validate;
+ private_data->worker.init = init;
+ private_data->worker.get_endpoint = get_endpoint;
+ private_data->worker.destroy = destroy;
+ private_data->worker.maintain = maintain_workers;
+ private_data->recover_wait_time = WAIT_BEFORE_RECOVER;
+ private_data->error_escalation_time = private_data->recover_wait_time / 2;
+ private_data->max_reply_timeouts = 0;
+ private_data->sequence = 0;
+ private_data->s->h.sequence = 0;
+ private_data->next_offset = 0;
+ *w = &private_data->worker;
+ JK_TRACE_EXIT(l);
+ return JK_LB_WORKER_TYPE;
+ }
+ else {
+ JK_LOG_NULL_PARAMS(l);
+ }
+
+ JK_TRACE_EXIT(l);
+ return 0;
+}
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_lb_worker.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_lb_worker.h
new file mode 100644
index 00000000..f0885e24
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_lb_worker.h
@@ -0,0 +1,222 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: load balance worker header file *
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Author: Rainer Jung <rjung@apache.org> *
+ * Version: $Revision: 751916 $ *
+ ***************************************************************************/
+
+#ifndef JK_LB_WORKER_H
+#define JK_LB_WORKER_H
+
+#include "jk_logger.h"
+#include "jk_service.h"
+#include "jk_mt.h"
+#include "jk_shm.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+#define JK_LB_WORKER_NAME ("lb")
+#define JK_LB_WORKER_TYPE (5)
+#define JK_LB_SUB_WORKER_TYPE (7)
+#define JK_LB_DEF_DOMAIN_NAME ("unknown")
+
+#define JK_LB_METHOD_REQUESTS (0)
+#define JK_LB_METHOD_TRAFFIC (1)
+#define JK_LB_METHOD_BUSYNESS (2)
+#define JK_LB_METHOD_SESSIONS (3)
+#define JK_LB_METHOD_DEF (JK_LB_METHOD_REQUESTS)
+#define JK_LB_METHOD_MAX (JK_LB_METHOD_SESSIONS)
+#define JK_LB_METHOD_TEXT_REQUESTS ("Request")
+#define JK_LB_METHOD_TEXT_TRAFFIC ("Traffic")
+#define JK_LB_METHOD_TEXT_BUSYNESS ("Busyness")
+#define JK_LB_METHOD_TEXT_SESSIONS ("Sessions")
+#define JK_LB_METHOD_TEXT_DEF (JK_LB_METHOD_TEXT_REQUESTS)
+#define JK_LB_LOCK_OPTIMISTIC (0)
+#define JK_LB_LOCK_PESSIMISTIC (1)
+#define JK_LB_LOCK_DEF (JK_LB_LOCK_OPTIMISTIC)
+#define JK_LB_LOCK_MAX (JK_LB_LOCK_PESSIMISTIC)
+#define JK_LB_LOCK_TEXT_OPTIMISTIC ("Optimistic")
+#define JK_LB_LOCK_TEXT_PESSIMISTIC ("Pessimistic")
+#define JK_LB_LOCK_TEXT_DEF (JK_LB_LOCK_TEXT_OPTIMISTIC)
+/*
+ * The following definitions for state and activation
+ * need to be kept in sync with the two macros
+ * JK_WORKER_USABLE() and JK_WORKER_USABLE_STICKY() in jk_lb_worker.c.
+ * Since we use ordered comparisons there instead of multiple
+ * equal/unequal compares, order of the values is critical here.
+ */
+#define JK_LB_STATE_IDLE (0)
+#define JK_LB_STATE_OK (1)
+#define JK_LB_STATE_RECOVER (2)
+#define JK_LB_STATE_FORCE (3)
+#define JK_LB_STATE_BUSY (4)
+#define JK_LB_STATE_ERROR (5)
+#define JK_LB_STATE_PROBE (6)
+#define JK_LB_STATE_DEF (JK_LB_STATE_IDLE)
+#define JK_LB_STATE_TEXT_IDLE ("OK/IDLE")
+#define JK_LB_STATE_TEXT_OK ("OK")
+#define JK_LB_STATE_TEXT_RECOVER ("ERR/REC")
+#define JK_LB_STATE_TEXT_FORCE ("ERR/FRC")
+#define JK_LB_STATE_TEXT_BUSY ("OK/BUSY")
+#define JK_LB_STATE_TEXT_ERROR ("ERR")
+#define JK_LB_STATE_TEXT_PROBE ("ERR/PRB")
+#define JK_LB_STATE_TEXT_MAX (JK_LB_STATE_PROBE)
+#define JK_LB_STATE_TEXT_DEF (JK_LB_STATE_TEXT_IDLE)
+/* All JK_LB_ACTIVATION_* values must be single digit. */
+/* Otherwise the string encoding of the activation array */
+/* fails e.g. in the isapi redirector. */
+/* JK_LB_ACTIVATION_UNSET is not allowed as an actual worker state. */
+/* It will not work e.g. when the status worker tries to show the state. */
+/* It is only used in rule extension data to indicate, that the */
+/* activation state should not be overwritten. */
+#define JK_LB_ACTIVATION_ACTIVE (0)
+#define JK_LB_ACTIVATION_DISABLED (1)
+#define JK_LB_ACTIVATION_STOPPED (2)
+#define JK_LB_ACTIVATION_UNSET (9)
+#define JK_LB_ACTIVATION_DEF (JK_LB_ACTIVATION_ACTIVE)
+#define JK_LB_ACTIVATION_MAX (JK_LB_ACTIVATION_STOPPED)
+#define JK_LB_ACTIVATION_TEXT_ACTIVE ("ACT")
+#define JK_LB_ACTIVATION_TEXT_DISABLED ("DIS")
+#define JK_LB_ACTIVATION_TEXT_STOPPED ("STP")
+#define JK_LB_ACTIVATION_TEXT_DEF (JK_LB_ACTIVATION_TEXT_ACTIVE)
+
+#define JK_LB_UINT64_STR_SZ (21)
+#define JK_LB_NOTES_COUNT (9)
+#define JK_NOTE_LB_FIRST_NAME ("JK_LB_FIRST_NAME")
+#define JK_NOTE_LB_FIRST_VALUE ("JK_LB_FIRST_VALUE")
+#define JK_NOTE_LB_FIRST_ACCESSED ("JK_LB_FIRST_ACCESSED")
+#define JK_NOTE_LB_FIRST_READ ("JK_LB_FIRST_READ")
+#define JK_NOTE_LB_FIRST_TRANSFERRED ("JK_LB_FIRST_TRANSFERRED")
+#define JK_NOTE_LB_FIRST_ERRORS ("JK_LB_FIRST_ERRORS")
+#define JK_NOTE_LB_FIRST_BUSY ("JK_LB_FIRST_BUSY")
+#define JK_NOTE_LB_FIRST_ACTIVATION ("JK_LB_FIRST_ACTIVATION")
+#define JK_NOTE_LB_FIRST_STATE ("JK_LB_FIRST_STATE")
+#define JK_NOTE_LB_LAST_NAME ("JK_LB_LAST_NAME")
+#define JK_NOTE_LB_LAST_VALUE ("JK_LB_LAST_VALUE")
+#define JK_NOTE_LB_LAST_ACCESSED ("JK_LB_LAST_ACCESSED")
+#define JK_NOTE_LB_LAST_READ ("JK_LB_LAST_READ")
+#define JK_NOTE_LB_LAST_TRANSFERRED ("JK_LB_LAST_TRANSFERRED")
+#define JK_NOTE_LB_LAST_ERRORS ("JK_LB_LAST_ERRORS")
+#define JK_NOTE_LB_LAST_BUSY ("JK_LB_LAST_BUSY")
+#define JK_NOTE_LB_LAST_ACTIVATION ("JK_LB_LAST_ACTIVATION")
+#define JK_NOTE_LB_LAST_STATE ("JK_LB_LAST_STATE")
+
+/* Time to wait before retry. */
+#define WAIT_BEFORE_RECOVER (60)
+/* We accept doing global maintenance if we are */
+/* JK_LB_MAINTAIN_TOLERANCE seconds early. */
+#define JK_LB_MAINTAIN_TOLERANCE (2)
+/* We divide load values by 2^x during global maintenance. */
+/* The exponent x is JK_LB_DECAY_MULT*#MAINT_INTV_SINCE_LAST_MAINT */
+#define JK_LB_DECAY_MULT (1)
+
+struct lb_sub_worker
+{
+ jk_worker_t *worker;
+ /* Shared memory worker data */
+ jk_shm_lb_sub_worker_t *s;
+
+ char name[JK_SHM_STR_SIZ+1];
+ /* Sequence counter starting at 0 and increasing
+ * every time we change the config
+ */
+ volatile unsigned int sequence;
+
+ /* route */
+ char route[JK_SHM_STR_SIZ+1];
+ /* worker domain */
+ char domain[JK_SHM_STR_SIZ+1];
+ /* worker redirect route */
+ char redirect[JK_SHM_STR_SIZ+1];
+ /* worker distance */
+ int distance;
+ /* current activation state (config) of the worker */
+ int activation;
+ /* Current lb factor */
+ int lb_factor;
+ /* Current worker index */
+ int i;
+ /* Current lb reciprocal factor */
+ jk_uint64_t lb_mult;
+};
+typedef struct lb_sub_worker lb_sub_worker_t;
+
+struct lb_worker
+{
+ jk_worker_t worker;
+ /* Shared memory worker data */
+ jk_shm_lb_worker_t *s;
+
+ char name[JK_SHM_STR_SIZ+1];
+ /* Sequence counter starting at 0 and increasing
+ * every time we change the config
+ */
+ volatile unsigned int sequence;
+
+ jk_pool_t p;
+ jk_pool_atom_t buf[TINY_POOL_SIZE];
+
+ JK_CRIT_SEC cs;
+
+ lb_sub_worker_t *lb_workers;
+ unsigned int num_of_workers;
+ int sticky_session;
+ int sticky_session_force;
+ int recover_wait_time;
+ int error_escalation_time;
+ int max_reply_timeouts;
+ int retries;
+ int retry_interval;
+ int lbmethod;
+ int lblock;
+ int maintain_time;
+ unsigned int max_packet_size;
+ unsigned int next_offset;
+ /* Session cookie */
+ char session_cookie[JK_SHM_STR_SIZ+1];
+ /* Session path */
+ char session_path[JK_SHM_STR_SIZ+1];
+};
+typedef struct lb_worker lb_worker_t;
+
+int JK_METHOD lb_worker_factory(jk_worker_t **w,
+ const char *name, jk_logger_t *l);
+
+const char *jk_lb_get_lock(lb_worker_t *p, jk_logger_t *l);
+int jk_lb_get_lock_code(const char *v);
+const char *jk_lb_get_method(lb_worker_t *p, jk_logger_t *l);
+int jk_lb_get_method_code(const char *v);
+const char *jk_lb_get_state(lb_sub_worker_t *p, jk_logger_t *l);
+int jk_lb_get_state_code(const char *v);
+const char *jk_lb_get_activation_direct(int activation, jk_logger_t *l);
+const char *jk_lb_get_activation(lb_sub_worker_t *p, jk_logger_t *l);
+int jk_lb_get_activation_code(const char *v);
+void reset_lb_values(lb_worker_t *p, jk_logger_t *l);
+void jk_lb_pull(lb_worker_t * p, int locked, jk_logger_t *l);
+void jk_lb_push(lb_worker_t * p, int locked, jk_logger_t *l);
+void update_mult(lb_worker_t * p, jk_logger_t *l);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* JK_LB_WORKER_H */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_lb_worker.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_lb_worker.lo
new file mode 100644
index 00000000..1a84f8f0
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_lb_worker.lo
@@ -0,0 +1,12 @@
+# jk_lb_worker.lo - a libtool object file
+# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18)
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/jk_lb_worker.o'
+
+# Name of the non-PIC object.
+non_pic_object='jk_lb_worker.o'
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_lb_worker.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_lb_worker.o
new file mode 100644
index 00000000..d8b71999
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_lb_worker.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_logger.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_logger.h
new file mode 100644
index 00000000..b3ba7c99
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_logger.h
@@ -0,0 +1,139 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: Logger object definitions *
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Version: $Revision: 1001219 $ *
+ ***************************************************************************/
+
+#ifndef JK_LOGGER_H
+#define JK_LOGGER_H
+
+#include "jk_global.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#define JK_TIME_MAX_SIZE (64)
+
+typedef struct jk_logger jk_logger_t;
+struct jk_logger
+{
+ void *logger_private;
+ int level;
+ const char *log_fmt; /* the configured timestamp format for logging */
+ char log_fmt_subsec[JK_TIME_MAX_SIZE]; /* like log_fmt, but milli/micro seconds marker
+ replaced, because strftime() doesn't handle those */
+ int log_fmt_type; /* do we want milli or microseconds */
+ size_t log_fmt_offset; /* at which position should we insert */
+ size_t log_fmt_size; /* how long is this format string */
+
+ int (JK_METHOD * log) (jk_logger_t *l, int level, int used, char *what);
+
+};
+
+typedef struct jk_file_logger_t jk_file_logger_t;
+struct jk_file_logger_t
+{
+ FILE *logfile;
+ /* For Apache 2 APR piped logging */
+ void *jklogfp;
+ /* For Apache 1.3 piped logging */
+ int log_fd;
+};
+
+/* Level like Java tracing, but available only
+ at compile time on DEBUG preproc define.
+ */
+#define JK_LOG_TRACE_LEVEL 0
+#define JK_LOG_DEBUG_LEVEL 1
+#define JK_LOG_INFO_LEVEL 2
+#define JK_LOG_WARNING_LEVEL 3
+#define JK_LOG_ERROR_LEVEL 4
+#define JK_LOG_EMERG_LEVEL 5
+#define JK_LOG_REQUEST_LEVEL 6
+#define JK_LOG_DEF_LEVEL JK_LOG_INFO_LEVEL
+
+#define JK_LOG_TRACE_VERB "trace"
+#define JK_LOG_DEBUG_VERB "debug"
+#define JK_LOG_INFO_VERB "info"
+#define JK_LOG_WARN_VERB "warn"
+#define JK_LOG_ERROR_VERB "error"
+#define JK_LOG_EMERG_VERB "emerg"
+#define JK_LOG_DEF_VERB JK_LOG_INFO_VERB
+
+#if defined(__GNUC__) || (defined(_MSC_VER) && (_MSC_VER > 1200))
+#define JK_LOG_TRACE __FILE__,__LINE__,__FUNCTION__,JK_LOG_TRACE_LEVEL
+#define JK_LOG_DEBUG __FILE__,__LINE__,__FUNCTION__,JK_LOG_DEBUG_LEVEL
+#define JK_LOG_ERROR __FILE__,__LINE__,__FUNCTION__,JK_LOG_ERROR_LEVEL
+#define JK_LOG_EMERG __FILE__,__LINE__,__FUNCTION__,JK_LOG_EMERG_LEVEL
+#define JK_LOG_INFO __FILE__,__LINE__,__FUNCTION__,JK_LOG_INFO_LEVEL
+#define JK_LOG_WARNING __FILE__,__LINE__,__FUNCTION__,JK_LOG_WARNING_LEVEL
+#else
+#define JK_LOG_TRACE __FILE__,__LINE__,NULL,JK_LOG_TRACE_LEVEL
+#define JK_LOG_DEBUG __FILE__,__LINE__,NULL,JK_LOG_DEBUG_LEVEL
+#define JK_LOG_ERROR __FILE__,__LINE__,NULL,JK_LOG_ERROR_LEVEL
+#define JK_LOG_EMERG __FILE__,__LINE__,NULL,JK_LOG_EMERG_LEVEL
+#define JK_LOG_INFO __FILE__,__LINE__,NULL,JK_LOG_INFO_LEVEL
+#define JK_LOG_WARNING __FILE__,__LINE__,NULL,JK_LOG_WARNING_LEVEL
+#endif
+
+#define JK_LOG_REQUEST __FILE__,0,NULL,JK_LOG_REQUEST_LEVEL
+
+#if defined(JK_PRODUCTION)
+/* TODO: all DEBUG messages should be compiled out
+ * when this define is in place.
+ */
+#define JK_IS_PRODUCTION 1
+#define JK_TRACE_ENTER(l)
+#define JK_TRACE_EXIT(l)
+#else
+#define JK_IS_PRODUCTION 0
+#define JK_TRACE_ENTER(l) \
+ do { \
+ if ((l) && (l)->level == JK_LOG_TRACE_LEVEL) { \
+ int tmp_errno = errno; \
+ jk_log((l), JK_LOG_TRACE, "enter"); \
+ errno = tmp_errno; \
+ } } while (0)
+
+#define JK_TRACE_EXIT(l) \
+ do { \
+ if ((l) && (l)->level == JK_LOG_TRACE_LEVEL) { \
+ int tmp_errno = errno; \
+ jk_log((l), JK_LOG_TRACE, "exit"); \
+ errno = tmp_errno; \
+ } } while (0)
+
+#endif /* JK_PRODUCTION */
+
+#define JK_LOG_NULL_PARAMS(l) jk_log((l), JK_LOG_ERROR, "NULL parameters")
+
+/* Debug level macro
+ * It is more efficient to check the level prior
+ * calling function that will not execute anyhow because of level
+ */
+#define JK_IS_DEBUG_LEVEL(l) ((l) && (l)->level < JK_LOG_INFO_LEVEL)
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* JK_LOGGER_H */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_map.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_map.c
new file mode 100644
index 00000000..4b025425
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_map.c
@@ -0,0 +1,889 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: General purpose map object *
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Author: Mladen Turk <mturk@apache.org> *
+ * Version: $Revision: 1042364 $ *
+ ***************************************************************************/
+#if defined(AS400) && !defined(AS400_UTF8)
+#include "apr_xlate.h"
+#endif
+
+#include "jk_global.h"
+#include "jk_pool.h"
+#include "jk_util.h"
+#include "jk_map.h"
+
+#define CAPACITY_INC_SIZE (50)
+#define LENGTH_OF_LINE (8192)
+#define JK_MAP_RECURSION (20)
+#define JK_MAP_REFERENCE (".reference")
+#define JK_MAP_REFERENCE_SZ (strlen(JK_MAP_REFERENCE))
+
+/* Compute the "checksum" for a key, consisting of the first
+ * 4 bytes, packed into an int.
+ * This checksum allows us to do a single integer
+ * comparison as a fast check to determine whether we can
+ * skip a strcmp
+ */
+#define COMPUTE_KEY_CHECKSUM(key, checksum) \
+{ \
+ const char *k = (key); \
+ unsigned int c = (unsigned int)*k; \
+ (checksum) = c; \
+ (checksum) <<= 8; \
+ if (c) { \
+ c = (unsigned int)*++k; \
+ checksum |= c; \
+ } \
+ (checksum) <<= 8; \
+ if (c) { \
+ c = (unsigned int)*++k; \
+ checksum |= c; \
+ } \
+ (checksum) <<= 8; \
+ if (c) { \
+ c = (unsigned int)*++k; \
+ checksum |= c; \
+ } \
+}
+
+struct jk_map
+{
+ jk_pool_t p;
+ jk_pool_atom_t buf[SMALL_POOL_SIZE];
+
+ const char **names;
+ const void **values;
+ unsigned int *keys;
+
+ unsigned int capacity;
+ unsigned int size;
+};
+
+static void trim_prp_comment(char *prp);
+static size_t trim(char *s);
+static int map_realloc(jk_map_t *m);
+static char *jk_map_replace_properties(jk_map_t *m, jk_map_t *env, char *value);
+
+int jk_map_alloc(jk_map_t **m)
+{
+ if (m) {
+ return jk_map_open(*m = (jk_map_t *)malloc(sizeof(jk_map_t)));
+ }
+
+ return JK_FALSE;
+}
+
+int jk_map_free(jk_map_t **m)
+{
+ int rc = JK_FALSE;
+
+ if (m && *m) {
+ jk_map_close(*m);
+ free(*m);
+ *m = NULL;
+ }
+
+ return rc;
+}
+
+int jk_map_open(jk_map_t *m)
+{
+ int rc = JK_FALSE;
+
+ if (m) {
+ jk_open_pool(&m->p, m->buf, sizeof(jk_pool_atom_t) * SMALL_POOL_SIZE);
+ m->capacity = 0;
+ m->size = 0;
+ m->keys = NULL;
+ m->names = NULL;
+ m->values = NULL;
+ rc = JK_TRUE;
+ }
+
+ return rc;
+}
+
+int jk_map_close(jk_map_t *m)
+{
+ int rc = JK_FALSE;
+
+ if (m) {
+ jk_close_pool(&m->p);
+ rc = JK_TRUE;
+ }
+
+ return rc;
+}
+
+void *jk_map_get(jk_map_t *m, const char *name, const void *def)
+{
+ const void *rc = (void *)def;
+
+ if (m && name) {
+ unsigned int i;
+ unsigned int key;
+ COMPUTE_KEY_CHECKSUM(name, key)
+ for (i = 0; i < m->size; i++) {
+ if (m->keys[i] == key && strcmp(m->names[i], name) == 0) {
+ rc = m->values[i];
+ break;
+ }
+ }
+ }
+
+ return (void *)rc; /* DIRTY */
+}
+
+int jk_map_get_id(jk_map_t *m, const char *name)
+{
+ int rc = -1;
+ if (m && name) {
+ unsigned int i;
+ unsigned int key;
+ COMPUTE_KEY_CHECKSUM(name, key)
+ for (i = 0; i < m->size; i++) {
+ if (m->keys[i] == key && strcmp(m->names[i], name) == 0) {
+ rc = i;
+ break;
+ }
+ }
+ }
+
+ return rc;
+}
+
+const char *jk_map_get_string(jk_map_t *m, const char *name, const char *def)
+{
+ const char *rc = def;
+
+ if (m && name) {
+ unsigned int i;
+ unsigned int key;
+ COMPUTE_KEY_CHECKSUM(name, key)
+ for (i = 0; i < m->size; i++) {
+ if (m->keys[i] == key && strcmp(m->names[i], name) == 0) {
+ rc = m->values[i];
+ break;
+ }
+ }
+ }
+
+ return rc;
+}
+
+
+int jk_map_get_int(jk_map_t *m, const char *name, int def)
+{
+ char buf[100];
+ const char *rc;
+ size_t len;
+ int int_res;
+ int multit = 1;
+
+ sprintf(buf, "%d", def);
+ rc = jk_map_get_string(m, name, buf);
+
+ len = strlen(rc);
+ if (len) {
+ char *lastchar = &buf[0] + len - 1;
+ strcpy(buf, rc);
+ if ('m' == *lastchar || 'M' == *lastchar) {
+ *lastchar = '\0';
+ multit = 1024 * 1024;
+ }
+ else if ('k' == *lastchar || 'K' == *lastchar) {
+ *lastchar = '\0';
+ multit = 1024;
+ }
+ int_res = atoi(buf);
+ }
+ else
+ int_res = def;
+
+ return int_res * multit;
+}
+
+double jk_map_get_double(jk_map_t *m, const char *name, double def)
+{
+ char buf[100];
+ const char *rc;
+
+ sprintf(buf, "%f", def);
+ rc = jk_map_get_string(m, name, buf);
+
+ return atof(rc);
+}
+
+int jk_map_get_bool(jk_map_t *m, const char *name, int def)
+{
+ char buf[100];
+ const char *rc;
+
+ sprintf(buf, "%d", def);
+ rc = jk_map_get_string(m, name, buf);
+
+ return jk_get_bool_code(rc, def);
+}
+
+char **jk_map_get_string_list(jk_map_t *m,
+ const char *name,
+ unsigned int *list_len, const char *def)
+{
+ const char *l = jk_map_get_string(m, name, def);
+ char **ar = NULL;
+
+#ifdef _MT_CODE_PTHREAD
+ char *lasts;
+#endif
+
+ *list_len = 0;
+
+ if (l) {
+ unsigned capacity = 0;
+ unsigned idex = 0;
+ char *p;
+ char *v = jk_pool_strdup(&m->p, l);
+
+ if (!v) {
+ return NULL;
+ }
+
+ /*
+ * GS, in addition to VG's patch, we now need to
+ * strtok also by a "*"
+ */
+#ifdef _MT_CODE_PTHREAD
+ for (p = strtok_r(v, " \t,", &lasts);
+ p; p = strtok_r(NULL, " \t,", &lasts))
+#else
+ for (p = strtok(v, " \t,"); p; p = strtok(NULL, " \t,"))
+#endif
+
+ {
+
+ if (idex == capacity) {
+ ar = jk_pool_realloc(&m->p,
+ sizeof(char *) * (capacity + 5),
+ ar, sizeof(char *) * capacity);
+ if (!ar) {
+ return JK_FALSE;
+ }
+ capacity += 5;
+ }
+ ar[idex] = jk_pool_strdup(&m->p, p);
+ idex++;
+ }
+
+ *list_len = idex;
+ }
+
+ return ar;
+}
+
+int jk_map_get_int_list(jk_map_t *m,
+ const char *name,
+ int *list,
+ unsigned int list_len,
+ const char *def)
+{
+ const char *l = jk_map_get_string(m, name, def);
+
+#ifdef _MT_CODE_PTHREAD
+ char *lasts;
+#endif
+
+ if (!list_len)
+ return 0;
+
+ if (l) {
+ unsigned int capacity = list_len;
+ unsigned int index = 0;
+ char *p;
+ char *v = jk_pool_strdup(&m->p, l);
+
+ if (!v) {
+ return 0;
+ }
+
+ /*
+ * GS, in addition to VG's patch, we now need to
+ * strtok also by a "*"
+ */
+#ifdef _MT_CODE_PTHREAD
+ for (p = strtok_r(v, " \t,", &lasts);
+ p; p = strtok_r(NULL, " \t,", &lasts))
+#else
+ for (p = strtok(v, " \t,"); p; p = strtok(NULL, " \t,"))
+#endif
+
+ {
+ if (index < capacity) {
+ list[index] = atoi(p);
+ index++;
+ }
+ else
+ break;
+ }
+ return index;
+ }
+ return 0;
+}
+
+int jk_map_add(jk_map_t *m, const char *name, const void *value)
+{
+ int rc = JK_FALSE;
+
+ if (m && name) {
+ unsigned int key;
+ COMPUTE_KEY_CHECKSUM(name, key)
+ map_realloc(m);
+
+ if (m->size < m->capacity) {
+ m->values[m->size] = value;
+ m->names[m->size] = jk_pool_strdup(&m->p, name);
+ m->keys[m->size] = key;
+ m->size++;
+ rc = JK_TRUE;
+ }
+ }
+
+ return rc;
+}
+
+int jk_map_put(jk_map_t *m, const char *name, const void *value, void **old)
+{
+ int rc = JK_FALSE;
+
+ if (m && name) {
+ unsigned int i;
+ unsigned int key;
+ COMPUTE_KEY_CHECKSUM(name, key)
+ for (i = 0; i < m->size; i++) {
+ if (m->keys[i] == key && strcmp(m->names[i], name) == 0) {
+ break;
+ }
+ }
+
+ if (i < m->size) {
+ if (old)
+ *old = (void *)m->values[i]; /* DIRTY */
+ m->values[i] = value;
+ rc = JK_TRUE;
+ }
+ else {
+ rc = jk_map_add(m, name, value);
+ }
+ }
+
+ return rc;
+}
+
+
+static int jk_map_validate_property(char *prp, jk_logger_t *l)
+{
+ /* check the worker properties */
+ if (!jk_is_valid_property(prp)) {
+ jk_log(l, JK_LOG_ERROR,
+ "The attribute '%s' is not supported - please check"
+ " the documentation for the supported attributes.",
+ prp);
+ return JK_FALSE;
+ }
+ if (jk_is_deprecated_property(prp)) {
+ jk_log(l, JK_LOG_WARNING,
+ "The attribute '%s' is deprecated - please check"
+ " the documentation for the correct replacement.",
+ prp);
+ }
+ return JK_TRUE;
+}
+
+static int jk_map_handle_duplicates(jk_map_t *m, const char *prp, char **v,
+ int treatment, jk_logger_t *l)
+{
+ const char *oldv = jk_map_get_string(m, prp, NULL);
+ if (oldv) {
+ if ((treatment == JK_MAP_HANDLE_DUPLICATES)
+ && jk_is_unique_property(prp) == JK_FALSE) {
+ char *tmpv = jk_pool_alloc(&m->p,
+ strlen(*v) + strlen(oldv) + 3);
+ if (tmpv) {
+ char sep = '*';
+ if (jk_is_path_property(prp))
+ sep = PATH_SEPERATOR;
+ else if (jk_is_cmd_line_property(prp))
+ sep = ' ';
+ else if (jk_is_list_property(prp))
+ sep = ',';
+ sprintf(tmpv, "%s%c%s", oldv, sep, *v);
+ }
+ *v = tmpv;
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Concatenated value is: %s -> %s",
+ prp, *v);
+ return JK_FALSE;
+ }
+ else {
+ jk_log(l, JK_LOG_WARNING,
+ "Duplicate key '%s' detected - previous value '%s'"
+ " will be overwritten with '%s'.",
+ prp, oldv ? oldv : "(null)", v ? *v : "(null)");
+ return JK_TRUE;
+ }
+ }
+ else {
+ return JK_TRUE;
+ }
+}
+
+int jk_map_read_property(jk_map_t *m, jk_map_t *env, const char *str,
+ int treatment, jk_logger_t *l)
+{
+ int rc = JK_TRUE;
+ char buf[LENGTH_OF_LINE + 1];
+ char *prp = &buf[0];
+
+ if (strlen(str) > LENGTH_OF_LINE) {
+ jk_log(l, JK_LOG_WARNING,
+ "Line to long (%d > %d), ignoring entry",
+ strlen(str), LENGTH_OF_LINE);
+ return JK_FALSE;
+ }
+
+ strcpy(prp, str);
+ if (trim(prp)) {
+ char *v = strchr(prp, '=');
+ if (v) {
+ *v = '\0';
+ v++;
+ if (trim(v) && trim(prp)) {
+ if (treatment == JK_MAP_HANDLE_RAW) {
+ v = jk_pool_strdup(&m->p, v);
+ }
+ else {
+ if (jk_map_validate_property(prp, l) == JK_FALSE)
+ return JK_FALSE;
+ v = jk_map_replace_properties(m, env, v);
+ if (jk_map_handle_duplicates(m, prp, &v, treatment, l) == JK_TRUE)
+ v = jk_pool_strdup(&m->p, v);
+ }
+ if (v) {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Adding property '%s' with value '%s' to map.",
+ prp, v);
+ jk_map_put(m, prp, v, NULL);
+ }
+ else {
+ JK_LOG_NULL_PARAMS(l);
+ rc = JK_FALSE;
+ }
+ }
+ }
+ }
+ return rc;
+}
+
+
+int jk_map_read_properties(jk_map_t *m, jk_map_t *env, const char *f, time_t *modified,
+ int treatment, jk_logger_t *l)
+{
+ int rc = JK_FALSE;
+
+ if (m && f) {
+ struct stat statbuf;
+ FILE *fp;
+ if (jk_stat(f, &statbuf) == -1)
+ return JK_FALSE;
+#if defined(AS400) && !defined(AS400_UTF8)
+ fp = fopen(f, "r, o_ccsid=0");
+#else
+ fp = fopen(f, "r");
+#endif
+
+ if (fp) {
+ char buf[LENGTH_OF_LINE + 1];
+ char *prp;
+
+ rc = JK_TRUE;
+
+ while (NULL != (prp = fgets(buf, LENGTH_OF_LINE, fp))) {
+ trim_prp_comment(prp);
+ if (*prp) {
+ if ((rc = jk_map_read_property(m, env, prp, treatment, l)) == JK_FALSE)
+ break;
+ }
+ }
+ fclose(fp);
+ if (modified)
+ *modified = statbuf.st_mtime;
+ }
+ }
+
+ return rc;
+}
+
+
+int jk_map_size(jk_map_t *m)
+{
+ if (m) {
+ return m->size;
+ }
+
+ return -1;
+}
+
+const char *jk_map_name_at(jk_map_t *m, int idex)
+{
+ if (m && idex >= 0) {
+ return m->names[idex]; /* DIRTY */
+ }
+
+ return NULL;
+}
+
+void *jk_map_value_at(jk_map_t *m, int idex)
+{
+ if (m && idex >= 0) {
+ return (void *)m->values[idex]; /* DIRTY */
+ }
+
+ return NULL;
+}
+
+void jk_map_dump(jk_map_t *m, jk_logger_t *l)
+{
+ if (m) {
+ int s = jk_map_size(m);
+ int i;
+ for (i=0;i<s;i++) {
+ if (!jk_map_name_at(m, i)) {
+ jk_log(l, JK_LOG_WARNING,
+ "Map contains empty name at index %d\n", i);
+ }
+ if (!jk_map_value_at(m, i)) {
+ jk_log(l, JK_LOG_WARNING,
+ "Map contains empty value for name '%s' at index %d\n",
+ jk_map_name_at(m, i), i);
+ }
+ if (JK_IS_DEBUG_LEVEL(l)) {
+ jk_log(l, JK_LOG_DEBUG,
+ "Dump of map: '%s' -> '%s'",
+ jk_map_name_at(m, i) ? jk_map_name_at(m, i) : "(null)",
+ jk_map_value_at(m, i) ? jk_map_value_at(m, i) : "(null)");
+ }
+ }
+ }
+}
+
+int jk_map_copy(jk_map_t *src, jk_map_t *dst)
+{
+ int sz = jk_map_size(src);
+ int i;
+ for (i = 0; i < sz; i++) {
+ const char *name = jk_map_name_at(src, i);
+ if (jk_map_get(dst, name, NULL) == NULL) {
+ if (!jk_map_put(dst, name,
+ jk_pool_strdup(&dst->p, jk_map_get_string(src, name, NULL)),
+ NULL)) {
+ return JK_FALSE;
+ }
+ }
+ }
+ return JK_TRUE;
+}
+
+
+static void trim_prp_comment(char *prp)
+{
+#if defined(AS400) && !defined(AS400_UTF8)
+ char *comment;
+ /* lots of lines that translate a '#' realtime deleted */
+ comment = strchr(prp, *APR_NUMBERSIGN);
+#else
+ char *comment = strchr(prp, '#');
+#endif
+ if (comment) {
+ *comment = '\0';
+ }
+}
+
+static size_t trim(char *s)
+{
+ size_t first;
+ size_t len;
+
+ /* check for empty strings */
+ if (!(len = strlen(s)))
+ return 0;
+ for (len = len - 1; (len > 0) &&
+ isspace((int)((unsigned char)s[len])); len--);
+ if ((len > 0) || !isspace((int)((unsigned char)s[len]))) {
+ len++;
+ }
+
+ s[len] = '\0';
+ len++;
+
+ for (first = 0; (s[first] != '\0') &&
+ isspace((int)((unsigned char)s[first])); first++);
+
+ if (first > 0) {
+ memmove(s, s + first, len - first);
+ }
+
+ return len;
+}
+
+static int map_realloc(jk_map_t *m)
+{
+ if (m->size == m->capacity) {
+ char **names;
+ void **values;
+ unsigned int *keys;
+ int capacity = m->capacity + CAPACITY_INC_SIZE;
+
+ names = (char **)jk_pool_alloc(&m->p, sizeof(char *) * capacity);
+ values = (void **)jk_pool_alloc(&m->p, sizeof(void *) * capacity);
+ keys = (unsigned int *)jk_pool_alloc(&m->p, sizeof(unsigned int) * capacity);
+
+ if (values && names) {
+ if (m->capacity && m->names)
+ memcpy(names, m->names, sizeof(char *) * m->capacity);
+
+ if (m->capacity && m->values)
+ memcpy(values, m->values, sizeof(void *) * m->capacity);
+
+ if (m->capacity && m->keys)
+ memcpy(keys, m->keys, sizeof(unsigned int) * m->capacity);
+
+ m->names = (const char **)names;
+ m->values = (const void **)values;
+ m->keys = keys;
+ m->capacity = capacity;
+
+ return JK_TRUE;
+ }
+ }
+
+ return JK_FALSE;
+}
+
+/**
+ * Replace $(property) in value.
+ *
+ */
+static char *jk_map_replace_properties(jk_map_t *m, jk_map_t *env, char *value)
+{
+ char *rc = value;
+ char *env_start = rc;
+ int rec = 0;
+
+ while ((env_start = strstr(env_start, "$(")) != NULL) {
+ char *env_end = strstr(env_start, ")");
+ if (rec++ > 20)
+ return rc;
+ if (env_end) {
+ char env_name[LENGTH_OF_LINE + 1] = "";
+ const char *env_value;
+#if defined(WIN32)
+ char env_buf[LENGTH_OF_LINE + 1];
+#endif
+ *env_end = '\0';
+ strcpy(env_name, env_start + 2);
+ *env_end = ')';
+
+ env_value = jk_map_get_string(m, env_name, NULL);
+ if (!env_value) {
+ env_value = getenv(env_name);
+ }
+ if (!env_value && env) {
+ /* Search inside local environment table */
+ env_value = jk_map_get_string(env, env_name, NULL);
+ }
+
+#if defined(WIN32)
+ if (!env_value) {
+ /* Try the env block from calling process */
+ if (GetEnvironmentVariable(env_name, env_buf,
+ sizeof(env_buf)))
+ env_value = &env_buf[0];
+ }
+#endif
+ if (env_value) {
+ size_t offset = 0;
+ char *new_value = jk_pool_alloc(&m->p,
+ (sizeof(char) *
+ (strlen(rc) +
+ strlen(env_value))));
+ if (!new_value) {
+ break;
+ }
+ *env_start = '\0';
+ strcpy(new_value, rc);
+ strcat(new_value, env_value);
+ strcat(new_value, env_end + 1);
+ offset = env_start - rc + strlen(env_value);
+ rc = new_value;
+ /* Avoid recursive subst */
+ env_start = rc + offset;
+ }
+ else {
+ env_start = env_end;
+ }
+ }
+ else {
+ break;
+ }
+ }
+
+ return rc;
+}
+
+/**
+ * Resolve references
+ *
+ */
+int jk_map_resolve_references(jk_map_t *m, const char *prefix,
+ int wildcard, int depth, jk_logger_t *l)
+{
+ int rc = JK_FALSE;
+
+ JK_TRACE_ENTER(l);
+
+ if (m && prefix) {
+ if (depth <= JK_MAP_RECURSION) {
+ size_t prelen = strlen(prefix);
+ unsigned int i;
+ rc = JK_TRUE;
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Checking for references with prefix %s with%s wildcard (recursion %d)",
+ prefix, wildcard? "" : "out", depth);
+ for (i = 0; i < m->size; i++) {
+ char *v = (char *)m->values[i];
+ if (v && *v &&
+ !strncmp(m->names[i], prefix, prelen)) {
+ size_t remain = strlen(m->names[i]) - prelen;
+ if ((remain == JK_MAP_REFERENCE_SZ ) || (wildcard && remain > JK_MAP_REFERENCE_SZ)) {
+ remain = strlen(m->names[i]) - JK_MAP_REFERENCE_SZ;
+ if (!strncmp(m->names[i] + remain, JK_MAP_REFERENCE, JK_MAP_REFERENCE_SZ)) {
+ char *from = jk_pool_alloc(&m->p,
+ (sizeof(char) *
+ (strlen(v) + 2)));
+ char *to = jk_pool_alloc(&m->p,
+ (sizeof(char) *
+ (remain + 2)));
+ if (!from || !to) {
+ jk_log(l, JK_LOG_ERROR,
+ "Error in string allocation");
+ rc = JK_FALSE;
+ break;
+ }
+ strcpy(from, v);
+ *(from+strlen(v)) = '.';
+ *(from+strlen(v)+1) = '\0';
+ strncpy(to, m->names[i], remain);
+ *(to+remain) = '.';
+ *(to+remain+1) = '\0';
+
+ rc = jk_map_resolve_references(m, v, 0, depth+1, l);
+ if (rc == JK_FALSE) {
+ break;
+ }
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Copying values from %s to %s",
+ from, to);
+ rc = jk_map_inherit_properties(m, from, to, l);
+ if (rc == JK_FALSE) {
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ else {
+ jk_log(l, JK_LOG_ERROR,
+ "Recursion limit %d for worker references with prefix '%s' reached",
+ JK_MAP_RECURSION, prefix);
+ }
+ }
+ else {
+ JK_LOG_NULL_PARAMS(l);
+ }
+ JK_TRACE_EXIT(l);
+ return rc;
+}
+
+/**
+ * Inherit properties
+ *
+ */
+int jk_map_inherit_properties(jk_map_t *m, const char *from, const char *to, jk_logger_t *l)
+{
+ int rc = JK_FALSE;
+ const char *prp;
+ char *to_prp;
+
+ if (m && from && to) {
+ unsigned int i;
+ for (i = 0; i < m->size; i++) {
+ if (!strncmp(m->names[i], from, strlen(from))) {
+ rc = JK_TRUE;
+ prp = m->names[i] + strlen(from);
+ to_prp = jk_pool_alloc(&m->p,
+ (sizeof(char) *
+ (strlen(to) +
+ strlen(prp) + 1)));
+ if (!to_prp) {
+ jk_log(l, JK_LOG_ERROR,
+ "Error in string allocation for attribute '%s.%s'",
+ to, prp);
+ rc = JK_FALSE;
+ break;
+ }
+ strcpy(to_prp, to);
+ strcat(to_prp, prp);
+ if (jk_map_get_id(m, to_prp) < 0 ) {
+ rc = jk_map_add(m, to_prp, m->values[i]);
+ if (rc == JK_FALSE) {
+ jk_log(l, JK_LOG_ERROR,
+ "Error when adding attribute '%s'",
+ to_prp);
+ break;
+ }
+ }
+ }
+ }
+ if ( rc == JK_FALSE) {
+ jk_log(l, JK_LOG_ERROR,
+ "Reference '%s' not found",
+ from);
+ }
+ }
+ else {
+ JK_LOG_NULL_PARAMS(l);
+ }
+ return rc;
+}
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_map.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_map.h
new file mode 100644
index 00000000..6e88861d
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_map.h
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: Map object header file *
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Version: $Revision: 756058 $ *
+ ***************************************************************************/
+
+#ifndef JK_MAP_H
+#define JK_MAP_H
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+#define JK_MAP_HANDLE_NORMAL 0
+#define JK_MAP_HANDLE_DUPLICATES 1
+#define JK_MAP_HANDLE_RAW 2
+
+struct jk_map;
+typedef struct jk_map jk_map_t;
+
+int jk_map_alloc(jk_map_t **m);
+
+int jk_map_free(jk_map_t **m);
+
+int jk_map_open(jk_map_t *m);
+
+int jk_map_close(jk_map_t *m);
+
+void *jk_map_get(jk_map_t *m, const char *name, const void *def);
+
+int jk_map_get_id(jk_map_t *m, const char *name);
+
+int jk_map_get_int(jk_map_t *m, const char *name, int def);
+
+double jk_map_get_double(jk_map_t *m, const char *name, double def);
+
+int jk_map_get_bool(jk_map_t *m, const char *name, int def);
+
+const char *jk_map_get_string(jk_map_t *m, const char *name, const char *def);
+
+char **jk_map_get_string_list(jk_map_t *m,
+ const char *name,
+ unsigned *list_len, const char *def);
+
+int jk_map_get_int_list(jk_map_t *m,
+ const char *name,
+ int *list, unsigned int list_len,
+ const char *def);
+
+int jk_map_add(jk_map_t *m, const char *name, const void *value);
+
+int jk_map_put(jk_map_t *m, const char *name, const void *value, void **old);
+
+int jk_map_read_property(jk_map_t *m, jk_map_t *env, const char *str, int treatment, jk_logger_t *l);
+
+int jk_map_read_properties(jk_map_t *m, jk_map_t *env, const char *f, time_t *modified, int treatment, jk_logger_t *l);
+
+int jk_map_size(jk_map_t *m);
+
+const char *jk_map_name_at(jk_map_t *m, int idex);
+
+void *jk_map_value_at(jk_map_t *m, int idex);
+
+void jk_map_dump(jk_map_t *m, jk_logger_t *l);
+
+int jk_map_copy(jk_map_t *src, jk_map_t *dst);
+
+int jk_map_resolve_references(jk_map_t *m, const char *prefix, int wildcard, int depth, jk_logger_t *l);
+
+int jk_map_inherit_properties(jk_map_t *m, const char *from, const char *to, jk_logger_t *l);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* JK_MAP_H */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_map.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_map.lo
new file mode 100644
index 00000000..137e8eac
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_map.lo
@@ -0,0 +1,12 @@
+# jk_map.lo - a libtool object file
+# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18)
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/jk_map.o'
+
+# Name of the non-PIC object.
+non_pic_object='jk_map.o'
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_map.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_map.o
new file mode 100644
index 00000000..5274ff78
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_map.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_md5.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_md5.c
new file mode 100644
index 00000000..1edcd073
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_md5.c
@@ -0,0 +1,475 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * This is work is derived from material Copyright RSA Data Security, Inc.
+ *
+ * The RSA copyright statement and Licence for that original material is
+ * included below. This is followed by the Apache copyright statement and
+ * licence for the modifications made to that material.
+ */
+
+/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm
+ */
+
+/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
+ rights reserved.
+
+ License to copy and use this software is granted provided that it
+ is identified as the "RSA Data Security, Inc. MD5 Message-Digest
+ Algorithm" in all material mentioning or referencing this software
+ or this function.
+
+ License is also granted to make and use derivative works provided
+ that such works are identified as "derived from the RSA Data
+ Security, Inc. MD5 Message-Digest Algorithm" in all material
+ mentioning or referencing the derived work.
+
+ RSA Data Security, Inc. makes no representations concerning either
+ the merchantability of this software or the suitability of this
+ software for any particular purpose. It is provided "as is"
+ without express or implied warranty of any kind.
+
+ These notices must be retained in any copies of any part of this
+ documentation and/or software.
+ */
+
+/*
+ * The ap_MD5Encode() routine uses much code obtained from the FreeBSD 3.0
+ * MD5 crypt() function, which is licenced as follows:
+ * ----------------------------------------------------------------------------
+ * "THE BEER-WARE LICENSE" (Revision 42):
+ * <phk@login.dknet.dk> wrote this file. As long as you retain this notice you
+ * can do whatever you want with this stuff. If we meet some day, and you think
+ * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
+ * ----------------------------------------------------------------------------
+ */
+
+/***************************************************************************
+ * Description: MD5 encoding wrapper *
+ * Author: Henri Gomez <hgomez@apache.org> *
+ * Version: $Revision: 466585 $ *
+ ***************************************************************************/
+
+/*
+ * JK MD5 Encoding function (jk_MD5Encode)
+ *
+ * Jk delegate MD5 encoding to ap_MD5Encode when used in Apache Web-Server.
+ * When another web-server is used like NES/IIS, we should use corresponding calls.
+ * NES/IIS specialists will add the necessary code but until that, I reused the code
+ * from Apache HTTP server.
+ *
+ * Nota: If you use an EBCDIC system without Apache, you'll have to use MD5 encoding
+ * corresponding call or have a ebcdic2ascii() functions somewhere.
+ * For example current AS/400 have MD5 encoding support APIs but olders not....
+ */
+
+#include "jk_global.h"
+#include "jk_md5.h"
+
+char *JK_METHOD jk_hextocstr(unsigned char *org, char *dst, int n)
+{
+ char *os = dst;
+ unsigned char v;
+ static unsigned char zitohex[] = "0123456789ABCDEF";
+
+ while (--n >= 0) {
+ v = *org++;
+ *dst++ = zitohex[v >> 4];
+ *dst++ = zitohex[v & 0x0f];
+ }
+ *dst = 0;
+
+ return (os);
+}
+
+#ifndef USE_APACHE_MD5
+
+/* Constants for MD5Transform routine.
+ */
+
+#define S11 7
+#define S12 12
+#define S13 17
+#define S14 22
+#define S21 5
+#define S22 9
+#define S23 14
+#define S24 20
+#define S31 4
+#define S32 11
+#define S33 16
+#define S34 23
+#define S41 6
+#define S42 10
+#define S43 15
+#define S44 21
+
+static void MD5Transform(jk_uint32_t state[4], const unsigned char block[64]);
+static void Encode(unsigned char *output, const jk_uint32_t * input, size_t len);
+static void Decode(jk_uint32_t * output, const unsigned char *input, size_t len);
+static void jk_MD5Init(JK_MD5_CTX * context);
+static void jk_MD5Update(JK_MD5_CTX * context, const unsigned char *input,
+ size_t inputLen);
+/*static void jk_MD5Final(unsigned char digest[JK_MD5_DIGESTSIZE], JK_MD5_CTX *context);*/
+
+static unsigned char PADDING[64] = {
+ 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+/* F, G, H and I are basic MD5 functions.
+ */
+#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
+#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
+#define H(x, y, z) ((x) ^ (y) ^ (z))
+#define I(x, y, z) ((y) ^ ((x) | (~z)))
+
+/* ROTATE_LEFT rotates x left n bits.
+ */
+#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
+
+/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
+ Rotation is separate from addition to prevent recomputation.
+ */
+#define FF(a, b, c, d, x, s, ac) { \
+ (a) += F ((b), (c), (d)) + (x) + (jk_uint32_t)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+ }
+#define GG(a, b, c, d, x, s, ac) { \
+ (a) += G ((b), (c), (d)) + (x) + (jk_uint32_t)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+ }
+#define HH(a, b, c, d, x, s, ac) { \
+ (a) += H ((b), (c), (d)) + (x) + (jk_uint32_t)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+ }
+#define II(a, b, c, d, x, s, ac) { \
+ (a) += I ((b), (c), (d)) + (x) + (jk_uint32_t)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+ }
+
+/* MD5 initialization. Begins an MD5 operation, writing a new context.
+ */
+static void jk_MD5Init(JK_MD5_CTX * context)
+{
+ context->count[0] = context->count[1] = 0;
+ /* Load magic initialization constants. */
+ context->state[0] = 0x67452301;
+ context->state[1] = 0xefcdab89;
+ context->state[2] = 0x98badcfe;
+ context->state[3] = 0x10325476;
+}
+
+/* MD5 block update operation. Continues an MD5 message-digest
+ operation, processing another message block, and updating the
+ context.
+ */
+static void jk_MD5Update(JK_MD5_CTX * context, const unsigned char *input,
+ size_t inputLen)
+{
+ size_t i, idx, partLen;
+
+ /* Compute number of bytes mod 64 */
+ idx = (size_t) ((context->count[0] >> 3) & 0x3F);
+
+ /* Update number of bits */
+ if ((context->count[0] += ((jk_uint32_t) inputLen << 3))
+ < ((jk_uint32_t) inputLen << 3)) {
+ context->count[1]++;
+ }
+ context->count[1] += (jk_uint32_t) inputLen >> 29;
+
+ partLen = 64 - idx;
+
+ /* Transform as many times as possible. */
+#ifndef CHARSET_EBCDIC
+ if (inputLen >= partLen) {
+ memcpy(&context->buffer[idx], input, partLen);
+ MD5Transform(context->state, context->buffer);
+
+ for (i = partLen; i + 63 < inputLen; i += 64) {
+ MD5Transform(context->state, &input[i]);
+ }
+
+ idx = 0;
+ }
+ else {
+ i = 0;
+ }
+
+ /* Buffer remaining input */
+ memcpy(&context->buffer[idx], &input[i], inputLen - i);
+#else /*CHARSET_EBCDIC */
+ if (inputLen >= partLen) {
+ ebcdic2ascii(&context->buffer[idx], input, partLen);
+ MD5Transform(context->state, context->buffer);
+
+ for (i = partLen; i + 63 < inputLen; i += 64) {
+ unsigned char inp_tmp[64];
+ ebcdic2ascii(inp_tmp, &input[i], 64);
+ MD5Transform(context->state, inp_tmp);
+ }
+
+ idx = 0;
+ }
+ else {
+ i = 0;
+ }
+
+ /* Buffer remaining input */
+ ebcdic2ascii(&context->buffer[idx], &input[i], inputLen - i);
+#endif /*CHARSET_EBCDIC */
+}
+
+/* MD5 finalization. Ends an MD5 message-digest operation, writing the
+ the message digest and zeroizing the context.
+ */
+static void JK_METHOD jk_MD5Final(unsigned char digest[16], JK_MD5_CTX * context)
+{
+ unsigned char bits[8];
+ size_t idx, padLen;
+
+
+ /* Save number of bits */
+ Encode(bits, context->count, 8);
+
+#ifdef CHARSET_EBCDIC
+ /* XXX: @@@: In order to make this no more complex than necessary,
+ * this kludge converts the bits[] array using the ascii-to-ebcdic
+ * table, because the following jk_MD5Update() re-translates
+ * its input (ebcdic-to-ascii).
+ * Otherwise, we would have to pass a "conversion" flag to jk_MD5Update()
+ */
+ ascii2ebcdic(bits, bits, 8);
+
+ /* Since everything is converted to ascii within jk_MD5Update(),
+ * the initial 0x80 (PADDING[0]) must be stored as 0x20
+ */
+ ascii2ebcdic(PADDING, PADDING, 1);
+#endif /*CHARSET_EBCDIC */
+
+ /* Pad out to 56 mod 64. */
+ idx = (size_t) ((context->count[0] >> 3) & 0x3f);
+ padLen = (idx < 56) ? (56 - idx) : (120 - idx);
+ jk_MD5Update(context, (const unsigned char *)PADDING, padLen);
+
+ /* Append length (before padding) */
+ jk_MD5Update(context, (const unsigned char *)bits, 8);
+
+ /* Store state in digest */
+ Encode(digest, context->state, 16);
+
+ /* Zeroize sensitive information. */
+ memset(context, 0, sizeof(*context));
+}
+
+/* MD5 basic transformation. Transforms state based on block. */
+static void MD5Transform(jk_uint32_t state[4], const unsigned char block[64])
+{
+ jk_uint32_t a = state[0], b = state[1], c = state[2], d = state[3], x[16];
+
+ Decode(x, block, 64);
+
+ /* Round 1 */
+ FF(a, b, c, d, x[0], S11, 0xd76aa478); /* 1 */
+ FF(d, a, b, c, x[1], S12, 0xe8c7b756); /* 2 */
+ FF(c, d, a, b, x[2], S13, 0x242070db); /* 3 */
+ FF(b, c, d, a, x[3], S14, 0xc1bdceee); /* 4 */
+ FF(a, b, c, d, x[4], S11, 0xf57c0faf); /* 5 */
+ FF(d, a, b, c, x[5], S12, 0x4787c62a); /* 6 */
+ FF(c, d, a, b, x[6], S13, 0xa8304613); /* 7 */
+ FF(b, c, d, a, x[7], S14, 0xfd469501); /* 8 */
+ FF(a, b, c, d, x[8], S11, 0x698098d8); /* 9 */
+ FF(d, a, b, c, x[9], S12, 0x8b44f7af); /* 10 */
+ FF(c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
+ FF(b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
+ FF(a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
+ FF(d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
+ FF(c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
+ FF(b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
+
+ /* Round 2 */
+ GG(a, b, c, d, x[1], S21, 0xf61e2562); /* 17 */
+ GG(d, a, b, c, x[6], S22, 0xc040b340); /* 18 */
+ GG(c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
+ GG(b, c, d, a, x[0], S24, 0xe9b6c7aa); /* 20 */
+ GG(a, b, c, d, x[5], S21, 0xd62f105d); /* 21 */
+ GG(d, a, b, c, x[10], S22, 0x2441453); /* 22 */
+ GG(c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
+ GG(b, c, d, a, x[4], S24, 0xe7d3fbc8); /* 24 */
+ GG(a, b, c, d, x[9], S21, 0x21e1cde6); /* 25 */
+ GG(d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
+ GG(c, d, a, b, x[3], S23, 0xf4d50d87); /* 27 */
+ GG(b, c, d, a, x[8], S24, 0x455a14ed); /* 28 */
+ GG(a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
+ GG(d, a, b, c, x[2], S22, 0xfcefa3f8); /* 30 */
+ GG(c, d, a, b, x[7], S23, 0x676f02d9); /* 31 */
+ GG(b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
+
+ /* Round 3 */
+ HH(a, b, c, d, x[5], S31, 0xfffa3942); /* 33 */
+ HH(d, a, b, c, x[8], S32, 0x8771f681); /* 34 */
+ HH(c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
+ HH(b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
+ HH(a, b, c, d, x[1], S31, 0xa4beea44); /* 37 */
+ HH(d, a, b, c, x[4], S32, 0x4bdecfa9); /* 38 */
+ HH(c, d, a, b, x[7], S33, 0xf6bb4b60); /* 39 */
+ HH(b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
+ HH(a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
+ HH(d, a, b, c, x[0], S32, 0xeaa127fa); /* 42 */
+ HH(c, d, a, b, x[3], S33, 0xd4ef3085); /* 43 */
+ HH(b, c, d, a, x[6], S34, 0x4881d05); /* 44 */
+ HH(a, b, c, d, x[9], S31, 0xd9d4d039); /* 45 */
+ HH(d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
+ HH(c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
+ HH(b, c, d, a, x[2], S34, 0xc4ac5665); /* 48 */
+
+ /* Round 4 */
+ II(a, b, c, d, x[0], S41, 0xf4292244); /* 49 */
+ II(d, a, b, c, x[7], S42, 0x432aff97); /* 50 */
+ II(c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
+ II(b, c, d, a, x[5], S44, 0xfc93a039); /* 52 */
+ II(a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
+ II(d, a, b, c, x[3], S42, 0x8f0ccc92); /* 54 */
+ II(c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
+ II(b, c, d, a, x[1], S44, 0x85845dd1); /* 56 */
+ II(a, b, c, d, x[8], S41, 0x6fa87e4f); /* 57 */
+ II(d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
+ II(c, d, a, b, x[6], S43, 0xa3014314); /* 59 */
+ II(b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
+ II(a, b, c, d, x[4], S41, 0xf7537e82); /* 61 */
+ II(d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
+ II(c, d, a, b, x[2], S43, 0x2ad7d2bb); /* 63 */
+ II(b, c, d, a, x[9], S44, 0xeb86d391); /* 64 */
+
+ state[0] += a;
+ state[1] += b;
+ state[2] += c;
+ state[3] += d;
+
+ /* Zeroize sensitive information. */
+ memset(x, 0, sizeof(x));
+}
+
+/* Encodes input (jk_uint32_t) into output (unsigned char). Assumes len is
+ a multiple of 4.
+ */
+static void Encode(unsigned char *output, const jk_uint32_t * input, size_t len)
+{
+ size_t i, j;
+ jk_uint32_t k;
+
+ for (i = 0, j = 0; j < len; i++, j += 4) {
+ k = input[i];
+ output[j] = (unsigned char)(k & 0xff);
+ output[j + 1] = (unsigned char)((k >> 8) & 0xff);
+ output[j + 2] = (unsigned char)((k >> 16) & 0xff);
+ output[j + 3] = (unsigned char)((k >> 24) & 0xff);
+ }
+}
+
+/* Decodes input (unsigned char) into output (jk_uint32_t). Assumes len is
+ * a multiple of 4.
+ */
+static void Decode(jk_uint32_t * output, const unsigned char *input, size_t len)
+{
+ size_t i, j;
+
+ for (i = 0, j = 0; j < len; i++, j += 4)
+ output[i] = ((jk_uint32_t) input[j]) | (((jk_uint32_t) input[j + 1]) << 8) |
+ (((jk_uint32_t) input[j + 2]) << 16) | (((jk_uint32_t) input[j + 3]) <<
+ 24);
+}
+
+char *JK_METHOD jk_md5(const unsigned char *org, const unsigned char *org2,
+ char *dst)
+{
+ JK_MD5_CTX ctx;
+ char buf[JK_MD5_DIGESTSIZE + 1];
+
+ jk_MD5Init(&ctx);
+ jk_MD5Update(&ctx, org, strlen((const char *)org));
+
+ if (org2 != NULL)
+ jk_MD5Update(&ctx, org2, strlen((const char *)org2));
+
+ jk_MD5Final((unsigned char *)buf, &ctx);
+ return (jk_hextocstr((unsigned char *)buf, dst, JK_MD5_DIGESTSIZE));
+}
+
+#else /* USE_APACHE_MD5 */
+
+#include "httpd.h"
+#include "http_config.h"
+
+#ifdef STANDARD20_MODULE_STUFF
+
+#include "apr_md5.h"
+#define AP_MD5_CTX apr_md5_ctx_t
+#define ap_MD5Init apr_md5_init
+#define ap_MD5Update apr_md5_update
+#define ap_MD5Final apr_md5_final
+
+#else /* STANDARD20_MODULE_STUFF */
+
+#include "ap_md5.h"
+
+#endif /* STANDARD20_MODULE_STUFF */
+
+char *JK_METHOD jk_md5(const unsigned char *org, const unsigned char *org2,
+ char *dst)
+{
+ AP_MD5_CTX ctx;
+ char buf[JK_MD5_DIGESTSIZE + 1];
+
+ ap_MD5Init(&ctx);
+ ap_MD5Update(&ctx, org, strlen((const char *)org));
+
+ if (org2 != NULL)
+ ap_MD5Update(&ctx, org2, strlen((const char *)org2));
+
+ ap_MD5Final((unsigned char *)buf, &ctx);
+ return (jk_hextocstr((unsigned char *)buf, dst, JK_MD5_DIGESTSIZE));
+}
+
+#endif /* USE_APACHE_MD5 */
+
+/* Test values:
+ * "" D4 1D 8C D9 8F 00 B2 04 E9 80 09 98 EC F8 42 7E
+ * "a" 0C C1 75 B9 C0 F1 B6 A8 31 C3 99 E2 69 77 26 61
+ * "abc 90 01 50 98 3C D2 4F B0 D6 96 3F 7D 28 E1 7F 72
+ * "message digest" F9 6B 69 7D 7C B7 93 8D 52 5A 2F 31 AA F1 61 D0
+ *
+ */
+
+#ifdef TEST_JKMD5
+
+main(int argc, char **argv)
+{
+ char xxx[(2 * JK_MD5_DIGESTSIZE) + 1];
+
+ if (argc > 1)
+ printf("%s => %s\n", argv[1], jk_md5(argv[1], NULL, xxx));
+}
+
+#endif
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_md5.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_md5.h
new file mode 100644
index 00000000..f740048b
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_md5.h
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * This is work is derived from material Copyright RSA Data Security, Inc.
+ *
+ * The RSA copyright statement and Licence for that original material is
+ * included below. This is followed by the Apache copyright statement and
+ * licence for the modifications made to that material.
+ */
+
+/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
+ rights reserved.
+
+ License to copy and use this software is granted provided that it
+ is identified as the "RSA Data Security, Inc. MD5 Message-Digest
+ Algorithm" in all material mentioning or referencing this software
+ or this function.
+
+ License is also granted to make and use derivative works provided
+ that such works are identified as "derived from the RSA Data
+ Security, Inc. MD5 Message-Digest Algorithm" in all material
+ mentioning or referencing the derived work.
+
+ RSA Data Security, Inc. makes no representations concerning either
+ the merchantability of this software or the suitability of this
+ software for any particular purpose. It is provided "as is"
+ without express or implied warranty of any kind.
+
+ These notices must be retained in any copies of any part of this
+ documentation and/or software.
+*/
+
+#ifndef JK_APACHE_MD5_H
+#define JK_APACHE_MD5_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/* MD5.H - header file for MD5.C */
+
+#define JK_MD5_DIGESTSIZE 16
+
+/* MD5 context. */
+typedef struct
+{
+ jk_uint32_t state[4]; /* state (ABCD) */
+ jk_uint32_t count[2]; /* number of bits, modulo 2^64 (lsb first) */
+ unsigned char buffer[64]; /* input buffer */
+} JK_MD5_CTX;
+
+/*
+ * Define the Magic String prefix that identifies a password as being
+ * hashed using our algorithm.
+ */
+#define JK_MD5PW_ID "$apr1$"
+#define JK_MD5PW_IDLEN 6
+
+char *JK_METHOD jk_hextocstr(unsigned char *org, char *dst, int n);
+char *JK_METHOD jk_md5(const unsigned char *org,
+ const unsigned char *org2, char *dst);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !JK_APACHE_MD5_H */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_md5.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_md5.lo
new file mode 100644
index 00000000..c6617e56
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_md5.lo
@@ -0,0 +1,12 @@
+# jk_md5.lo - a libtool object file
+# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18)
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/jk_md5.o'
+
+# Name of the non-PIC object.
+non_pic_object='jk_md5.o'
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_md5.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_md5.o
new file mode 100644
index 00000000..d3a98259
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_md5.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_msg_buff.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_msg_buff.c
new file mode 100644
index 00000000..955fd5ab
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_msg_buff.c
@@ -0,0 +1,382 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: Data marshaling. XDR like *
+ * Author: Costin <costin@costin.dnt.ro> *
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Author: Henri Gomez <hgomez@apache.org> *
+ * Version: $Revision: 705882 $ *
+ ***************************************************************************/
+
+#include "jk_pool.h"
+#include "jk_connect.h"
+#include "jk_util.h"
+#include "jk_sockbuf.h"
+#include "jk_msg_buff.h"
+#include "jk_logger.h"
+
+static char *jk_HEX = "0123456789ABCDEFX";
+
+/*
+ * Simple marshaling code.
+ */
+
+void jk_b_reset(jk_msg_buf_t *msg)
+{
+ msg->len = 4;
+ msg->pos = 4;
+ if (msg->buf && msg->maxlen) {
+ /* Clear the message buffer */
+ memset(msg->buf, 0, msg->maxlen);
+ }
+}
+
+int jk_b_append_long(jk_msg_buf_t *msg, unsigned long val)
+{
+ if (msg->len + 4 > msg->maxlen) {
+ return -1;
+ }
+
+ msg->buf[msg->len++] = (unsigned char)((val >> 24) & 0xFF);
+ msg->buf[msg->len++] = (unsigned char)((val >> 16) & 0xFF);
+ msg->buf[msg->len++] = (unsigned char)((val >> 8) & 0xFF);
+ msg->buf[msg->len++] = (unsigned char)((val) & 0xFF);
+
+ return 0;
+}
+
+
+int jk_b_append_int(jk_msg_buf_t *msg, unsigned short val)
+{
+ if (msg->len + 2 > msg->maxlen) {
+ return -1;
+ }
+
+ msg->buf[msg->len++] = (unsigned char)((val >> 8) & 0xFF);
+ msg->buf[msg->len++] = (unsigned char)((val) & 0xFF);
+
+ return 0;
+}
+
+
+int jk_b_append_byte(jk_msg_buf_t *msg, unsigned char val)
+{
+ if (msg->len + 1 > msg->maxlen) {
+ return -1;
+ }
+
+ msg->buf[msg->len++] = val;
+
+ return 0;
+}
+
+
+void jk_b_end(jk_msg_buf_t *msg, int protoh)
+{
+ /*
+ * Ugly way to set the size in the right position
+ */
+ int hlen = msg->len - 4;
+
+ msg->buf[0] = (unsigned char)((protoh >> 8) & 0xFF);
+ msg->buf[1] = (unsigned char)((protoh) & 0xFF);
+ msg->buf[2] = (unsigned char)((hlen >> 8) & 0xFF);
+ msg->buf[3] = (unsigned char)((hlen) & 0xFF);
+
+}
+
+
+jk_msg_buf_t *jk_b_new(jk_pool_t *p)
+{
+ jk_msg_buf_t *msg =
+ (jk_msg_buf_t *)jk_pool_alloc(p, sizeof(jk_msg_buf_t));
+
+ if (!msg) {
+ return NULL;
+ }
+ memset(msg, 0, sizeof(jk_msg_buf_t));
+ msg->pool = p;
+
+ return msg;
+}
+
+int jk_b_set_buffer(jk_msg_buf_t *msg, unsigned char *data, int buffSize)
+{
+ if (!msg) {
+ return -1;
+ }
+
+ msg->len = 0;
+ msg->buf = data;
+ msg->maxlen = buffSize;
+
+ return 0;
+}
+
+
+int jk_b_set_buffer_size(jk_msg_buf_t *msg, int buffSize)
+{
+ unsigned char *data = (unsigned char *)jk_pool_alloc(msg->pool, buffSize);
+
+ if (!data) {
+ return -1;
+ }
+
+ jk_b_set_buffer(msg, data, buffSize);
+ return 0;
+}
+
+#if defined(AS400) && !defined(AS400_UTF8)
+int jk_b_append_asciistring(jk_msg_buf_t *msg, const char *param)
+{
+ int len;
+
+ if (!param) {
+ jk_b_append_int(msg, 0xFFFF);
+ return 0;
+ }
+
+ len = strlen(param);
+ if (msg->len + len + 2 > msg->maxlen) {
+ return -1;
+ }
+
+ /* ignore error - we checked once */
+ jk_b_append_int(msg, (unsigned short)len);
+
+ /* We checked for space !! */
+ strncpy((char *)msg->buf + msg->len, param, len + 1); /* including \0 */
+ msg->len += len + 1;
+
+ return 0;
+}
+#endif
+
+int jk_b_append_string(jk_msg_buf_t *msg, const char *param)
+{
+ unsigned short len;
+
+ if (!param) {
+ jk_b_append_int(msg, 0xFFFF);
+ return 0;
+ }
+
+ len = (unsigned short)strlen(param);
+ if (msg->len + len + 3 > msg->maxlen) {
+ return -1;
+ }
+
+ /* ignore error - we checked once */
+ jk_b_append_int(msg, len);
+
+ /* We checked for space !! */
+ memcpy(msg->buf + msg->len, param, len + 1); /* including \0 */
+#if (defined(AS400) && !defined(AS400_UTF8)) || defined(_OSD_POSIX)
+ /* convert from EBCDIC if needed */
+ jk_xlate_to_ascii((char *)msg->buf + msg->len, len + 1);
+#endif
+ msg->len += len + 1;
+
+ return 0;
+}
+
+
+int jk_b_append_bytes(jk_msg_buf_t *msg, const unsigned char *param, int len)
+{
+ if (!len) {
+ return 0;
+ }
+
+ if (msg->len + len > msg->maxlen) {
+ return -1;
+ }
+
+ /* We checked for space !! */
+ memcpy((char *)msg->buf + msg->len, param, len);
+ msg->len += len;
+
+ return 0;
+}
+
+unsigned long jk_b_get_long(jk_msg_buf_t *msg)
+{
+ unsigned long i;
+ if (msg->pos + 3 > msg->len) {
+ return 0xFFFFFFFF;
+ }
+ i = ((msg->buf[(msg->pos++)] & 0xFF) << 24);
+ i |= ((msg->buf[(msg->pos++)] & 0xFF) << 16);
+ i |= ((msg->buf[(msg->pos++)] & 0xFF) << 8);
+ i |= ((msg->buf[(msg->pos++)] & 0xFF));
+ return i;
+}
+
+unsigned long jk_b_pget_long(jk_msg_buf_t *msg, int pos)
+{
+ unsigned long i;
+ i = ((msg->buf[(pos++)] & 0xFF) << 24);
+ i |= ((msg->buf[(pos++)] & 0xFF) << 16);
+ i |= ((msg->buf[(pos++)] & 0xFF) << 8);
+ i |= ((msg->buf[(pos)] & 0xFF));
+ return i;
+}
+
+
+unsigned short jk_b_get_int(jk_msg_buf_t *msg)
+{
+ unsigned short i;
+ if (msg->pos + 1 > msg->len) {
+ return 0xFFFF;
+ }
+ i = ((msg->buf[(msg->pos++)] & 0xFF) << 8);
+ i += ((msg->buf[(msg->pos++)] & 0xFF));
+ return i;
+}
+
+unsigned short jk_b_pget_int(jk_msg_buf_t *msg, int pos)
+{
+ unsigned short i;
+ i = ((msg->buf[pos++] & 0xFF) << 8);
+ i += ((msg->buf[pos] & 0xFF));
+ return i;
+}
+
+unsigned char jk_b_get_byte(jk_msg_buf_t *msg)
+{
+ unsigned char rc;
+ if (msg->pos > msg->len) {
+ return 0xFF;
+ }
+ rc = msg->buf[msg->pos++];
+
+ return rc;
+}
+
+unsigned char jk_b_pget_byte(jk_msg_buf_t *msg, int pos)
+{
+ return msg->buf[pos];
+}
+
+
+unsigned char *jk_b_get_string(jk_msg_buf_t *msg)
+{
+ unsigned short size = jk_b_get_int(msg);
+ int start = msg->pos;
+
+ if ((size == 0xFFFF) || (size + start > msg->maxlen)) {
+ /* Error of overflow in AJP packet.
+ * The complete message is probably invalid.
+ */
+ return NULL;
+ }
+
+ msg->pos += size;
+ msg->pos++; /* terminating NULL */
+
+ return (unsigned char *)(msg->buf + start);
+}
+
+int jk_b_get_bytes(jk_msg_buf_t *msg, unsigned char *buf, int len)
+{
+ int start = msg->pos;
+
+ if ((len < 0) || (len + start > msg->maxlen)) {
+ return (-1);
+ }
+
+ memcpy(buf, msg->buf + start, len);
+ msg->pos += len;
+ return (len);
+}
+
+
+
+/** Helpie dump function
+ */
+void jk_dump_buff(jk_logger_t *l,
+ const char *file,
+ int line, const char *funcname,
+ int level, char *what, jk_msg_buf_t *msg)
+{
+ int i = 0;
+ char lb[80];
+ char *current;
+ int j;
+ int len = msg->len;
+
+ if (l == NULL)
+ return;
+ if (l->level != JK_LOG_TRACE_LEVEL && len > 1024)
+ len = 1024;
+
+ jk_log(l, file, line, funcname, level,
+ "%s pos=%d len=%d max=%d",
+ what, msg->pos, msg->len, msg->maxlen);
+
+ for (i = 0; i < len; i += 16) {
+ current = &lb[0];
+
+ for (j = 0; j < 16; j++) {
+ unsigned char x = (msg->buf[i + j]);
+ if ((i + j) >= len)
+ x = 0;
+ *current++ = jk_HEX[x >> 4];
+ *current++ = jk_HEX[x & 0x0f];
+ *current++ = ' ';
+ }
+ *current++ = ' ';
+ *current++ = '-';
+ *current++ = ' ';
+ for (j = 0; j < 16; j++) {
+ unsigned char x = msg->buf[i + j];
+ if ((i + j) >= len)
+ x = 0;
+ if (x > 0x20 && x < 0x7F) {
+#ifdef USE_CHARSET_EBCDIC
+ *current = x;
+ jk_xlate_from_ascii(current, 1);
+ current++;
+#else
+ *current++ = x;
+#endif
+ }
+ else {
+ *current++ = '.';
+ }
+ }
+ *current++ = '\0';
+
+ jk_log(l, file, line, funcname, level,
+ "%.4x %s", i, lb);
+ }
+}
+
+
+int jk_b_copy(jk_msg_buf_t *smsg, jk_msg_buf_t *dmsg)
+{
+ if (smsg == NULL || dmsg == NULL)
+ return (-1);
+
+ if (dmsg->maxlen < smsg->len)
+ return (-2);
+
+ memcpy(dmsg->buf, smsg->buf, smsg->len);
+ dmsg->len = smsg->len;
+
+ return (smsg->len);
+}
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_msg_buff.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_msg_buff.h
new file mode 100644
index 00000000..3fdc006b
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_msg_buff.h
@@ -0,0 +1,154 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: Data marshaling. XDR like *
+ * Author: Costin <costin@costin.dnt.ro> *
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Version: $Revision: 530674 $ *
+ ***************************************************************************/
+
+#ifndef JK_MSG_BUF_H
+#define JK_MSG_BUF_H
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+#define DEF_BUFFER_SZ (8 * 1024)
+
+/* XXX replace all return values with error codes */
+#define ERR_BAD_PACKET -5
+
+/*
+RPC details:
+
+ - one parameter - use a structure for more. The method
+ is encoded as part of the request
+ - one or no result
+ -
+
+
+
+ */
+
+typedef struct jk_msg_buf_t jk_msg_buf_t;
+struct jk_msg_buf_t
+{
+ jk_pool_t *pool;
+ unsigned char *buf;
+ int pos;
+ int len;
+ int maxlen;
+};
+
+
+/* -------------------- Setup routines -------------------- */
+
+/** Allocate a buffer.
+ */
+jk_msg_buf_t *jk_b_new(jk_pool_t *p);
+
+/** Set up a buffer with an existing buffer
+ */
+int jk_b_set_buffer(jk_msg_buf_t *msg, unsigned char *data, int buffSize);
+
+/*
+ * Set up a buffer with a new buffer of buffSize
+ */
+int jk_b_set_buffer_size(jk_msg_buf_t *msg, int buffSize);
+
+/*
+ * Finalize the buffer before sending - set length fields, etc
+ */
+void jk_b_end(jk_msg_buf_t *msg, int protoh);
+
+/*
+ * Recycle the buffer - z for a new invocation
+ */
+void jk_b_reset(jk_msg_buf_t *msg);
+
+/* -------------------- Real encoding -------------------- */
+
+int jk_b_append_byte(jk_msg_buf_t *msg, unsigned char val);
+
+int jk_b_append_bytes(jk_msg_buf_t *msg,
+ const unsigned char *param, int len);
+
+int jk_b_append_int(jk_msg_buf_t *msg, unsigned short val);
+
+int jk_b_append_long(jk_msg_buf_t *msg, unsigned long val);
+
+int jk_b_append_string(jk_msg_buf_t *msg, const char *param);
+
+#if defined(AS400) && !defined(AS400_UTF8)
+int jk_b_append_asciistring(jk_msg_buf_t *msg, const char *param);
+#endif
+
+int jk_b_append_bytes(jk_msg_buf_t *msg,
+ const unsigned char *param, int len);
+
+/* -------------------- Decoding -------------------- */
+
+/** Get a byte from the current position
+ */
+unsigned char jk_b_get_byte(jk_msg_buf_t *msg);
+
+/** Get an int from the current position
+ */
+unsigned short jk_b_get_int(jk_msg_buf_t *msg);
+
+/** Get a long from the current position
+ */
+unsigned long jk_b_get_long(jk_msg_buf_t *msg);
+
+/** Get a String from the current position
+ */
+unsigned char *jk_b_get_string(jk_msg_buf_t *msg);
+
+/** Get Bytes from the current position
+ */
+int jk_b_get_bytes(jk_msg_buf_t *msg, unsigned char *buf, int len);
+
+/** Get a byte from an arbitrary position
+ */
+unsigned char jk_b_pget_byte(jk_msg_buf_t *msg, int pos);
+
+/** Get an int from an arbitrary position
+ */
+unsigned short jk_b_pget_int(jk_msg_buf_t *msg, int pos);
+
+/** Get a long from an arbitrary position
+ */
+unsigned long jk_b_pget_long(jk_msg_buf_t *msg, int pos);
+
+/* --------------------- Help ------------------------ */
+void jk_dump_buff(jk_logger_t *l,
+ const char *file,
+ int line, const char *funcname,
+ int level, char *what, jk_msg_buf_t *msg);
+
+/** Copy a msg buf into another one
+ */
+int jk_b_copy(jk_msg_buf_t *smsg, jk_msg_buf_t *dmsg);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* JK_MSG_BUF_H */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_msg_buff.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_msg_buff.lo
new file mode 100644
index 00000000..8ea86702
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_msg_buff.lo
@@ -0,0 +1,12 @@
+# jk_msg_buff.lo - a libtool object file
+# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18)
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/jk_msg_buff.o'
+
+# Name of the non-PIC object.
+non_pic_object='jk_msg_buff.o'
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_msg_buff.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_msg_buff.o
new file mode 100644
index 00000000..3f0a0391
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_msg_buff.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_mt.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_mt.h
new file mode 100644
index 00000000..b5525bb7
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_mt.h
@@ -0,0 +1,150 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: Multi thread portability code for JK *
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Version: $Revision: 918711 $ *
+ ***************************************************************************/
+
+#ifndef _JK_MT_H
+#define _JK_MT_H
+
+#include "jk_global.h"
+
+
+#if defined(WIN32)
+#define jk_gettid() ((jk_uint32_t)GetCurrentThreadId())
+#elif defined(NETWARE) && !defined(__NOVELL_LIBC__)
+#define getpid() ((int)GetThreadGroupID())
+#endif
+
+#ifdef JK_PREFORK
+#define _MT_CODE 0
+#else
+#define _MT_CODE 1
+#endif
+
+/*
+ * Marks execution under MT compilation
+ */
+#if _MT_CODE
+#ifdef WIN32
+#include <windows.h>
+
+typedef CRITICAL_SECTION JK_CRIT_SEC;
+#define JK_INIT_CS(x, rc) InitializeCriticalSection(x); rc = JK_TRUE
+#define JK_DELETE_CS(x, rc) DeleteCriticalSection(x); rc = JK_TRUE
+#define JK_ENTER_CS(x, rc) EnterCriticalSection(x); rc = JK_TRUE
+#define JK_LEAVE_CS(x, rc) LeaveCriticalSection(x); rc = JK_TRUE
+
+#else /* !WIN32 */
+#define _MT_CODE_PTHREAD
+#include <pthread.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+typedef pthread_mutex_t JK_CRIT_SEC;
+#define JK_INIT_CS(x, rc)\
+ if(pthread_mutex_init(x, NULL)) rc = JK_FALSE; else rc = JK_TRUE
+
+#define JK_DELETE_CS(x, rc)\
+ if(pthread_mutex_destroy(x)) rc = JK_FALSE; else rc = JK_TRUE
+
+#define JK_ENTER_CS(x, rc)\
+ if(pthread_mutex_lock(x)) rc = JK_FALSE; else rc = JK_TRUE
+
+#define JK_LEAVE_CS(x, rc)\
+ if(pthread_mutex_unlock(x)) rc = JK_FALSE; else rc = JK_TRUE
+
+#if defined(AS400) || defined(NETWARE)
+#define jk_pthread_t jk_uint32_t
+#endif /* AS400 || NETWARE */
+jk_pthread_t jk_gettid(void);
+#endif /* WIN32 */
+
+#else /* !_MT_CODE */
+
+typedef void *JK_CRIT_SEC;
+#define JK_INIT_CS(x, rc) rc = JK_TRUE
+#define JK_DELETE_CS(x, rc) rc = JK_TRUE
+#define JK_ENTER_CS(x, rc) rc = JK_TRUE
+#define JK_LEAVE_CS(x, rc) rc = JK_TRUE
+#define jk_gettid() 0
+#endif /* MT_CODE */
+
+#if !defined(WIN32) && !defined(NETWARE)
+#include <unistd.h>
+#include <fcntl.h>
+
+
+#define USE_FLOCK_LK 0
+#if HAVE_FLOCK
+#ifdef JK_USE_FLOCK
+#define USE_FLOCK_LK 1
+#endif
+#endif
+
+#if USE_FLOCK_LK
+#include <sys/file.h>
+
+#define JK_ENTER_LOCK(x, rc) \
+ do { \
+ while ((rc = flock((x), LOCK_EX) < 0) && (errno == EINTR)); \
+ rc = rc == 0 ? JK_TRUE : JK_FALSE; \
+ } while (0)
+
+#define JK_LEAVE_LOCK(x, rc) \
+ do { \
+ while ((rc = flock((x), LOCK_UN) < 0) && (errno == EINTR)); \
+ rc = rc == 0 ? JK_TRUE : JK_FALSE; \
+ } while (0)
+
+#else /* !USE_FLOCK_LK */
+
+#define JK_ENTER_LOCK(x, rc) \
+ do { \
+ struct flock _fl; \
+ _fl.l_type = F_WRLCK; \
+ _fl.l_whence = SEEK_SET; \
+ _fl.l_start = 0; \
+ _fl.l_len = 1L; \
+ _fl.l_pid = 0; \
+ while ((rc = fcntl((x), F_SETLKW, &_fl) < 0) && (errno == EINTR)); \
+ rc = rc == 0 ? JK_TRUE : JK_FALSE; \
+ } while (0)
+
+#define JK_LEAVE_LOCK(x, rc) \
+ do { \
+ struct flock _fl; \
+ _fl.l_type = F_UNLCK; \
+ _fl.l_whence = SEEK_SET; \
+ _fl.l_start = 0; \
+ _fl.l_len = 1L; \
+ _fl.l_pid = 0; \
+ while ((rc = fcntl((x), F_SETLKW, &_fl) < 0) && (errno == EINTR)); \
+ rc = rc == 0 ? JK_TRUE : JK_FALSE; \
+ } while (0)
+
+#endif /* USE_FLOCK_LK */
+
+#else /* WIN32 || NETWARE */
+#define JK_ENTER_LOCK(x, rc) rc = JK_TRUE
+#define JK_LEAVE_LOCK(x, rc) rc = JK_TRUE
+#endif
+
+#endif /* _JK_MT_H */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_nwmain.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_nwmain.c
new file mode 100644
index 00000000..804de00d
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_nwmain.c
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: Netware Wrapper *
+ * Author: Mike Anderson <mmander@novell.com> *
+ * Version: $Revision: 466585 $ *
+ ***************************************************************************/
+
+#ifdef NETWARE
+/*
+ * NATIVE_MAIN
+ */
+
+/*
+ * INCLUDES
+ */
+
+#include <stdio.h>
+
+/* Apache 2/APR uses NOVELL_LIBC which has a different way of handling
+ * "library" nlms. If we aren't on LIBC, use the old method
+ */
+
+#ifndef __NOVELL_LIBC__
+#include <nwthread.h>
+#include <netdb.h>
+
+NETDB_DEFINE_CONTEXT
+/*
+ * main ()
+ *
+ * Main entry point -- don't do much more than I've provided
+ *
+ * Entry:
+ *
+ * Exit:
+ * Nothing
+ */
+void main()
+{
+ ExitThread(TSR_THREAD, 0);
+}
+#else /* __NOVELL_LIBC__ */
+
+/* Since we are on LibC, we need to handle our own startup and shutdown */
+
+#include <netware.h>
+#include "novsock2.h"
+
+int _NonAppStart
+ (void *NLMHandle,
+ void *errorScreen,
+ const char *cmdLine,
+ const char *loadDirPath,
+ size_t uninitializedDataLength,
+ void *NLMFileHandle,
+ int (*readRoutineP) (int conn, void *fileHandle, size_t offset,
+ size_t nbytes, size_t * bytesRead, void *buffer),
+ size_t customDataOffset,
+ size_t customDataSize, int messageCount, const char **messages)
+{
+#pragma unused(cmdLine)
+#pragma unused(loadDirPath)
+#pragma unused(uninitializedDataLength)
+#pragma unused(NLMFileHandle)
+#pragma unused(readRoutineP)
+#pragma unused(customDataOffset)
+#pragma unused(customDataSize)
+#pragma unused(messageCount)
+#pragma unused(messages)
+
+ WSADATA wsaData;
+
+ return WSAStartup((WORD) MAKEWORD(2, 0), &wsaData);
+}
+
+void _NonAppStop(void)
+{
+ WSACleanup();
+}
+
+int _NonAppCheckUnload(void)
+{
+ return 0;
+}
+#endif /* __NOVELL_LIBC__ */
+
+#endif
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_pool.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_pool.c
new file mode 100644
index 00000000..685f75c6
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_pool.c
@@ -0,0 +1,165 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: Simple memory pool *
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Version: $Revision: 466585 $ *
+ ***************************************************************************/
+
+#include "jk_pool.h"
+
+#define DEFAULT_DYNAMIC 10
+
+
+static void *jk_pool_dyn_alloc(jk_pool_t *p, size_t size);
+
+
+void jk_open_pool(jk_pool_t *p, jk_pool_atom_t *buf, size_t size)
+{
+ p->pos = 0;
+ p->size = size;
+ p->buf = (char *)buf;
+
+ p->dyn_pos = 0;
+ p->dynamic = NULL;
+ p->dyn_size = 0;
+}
+
+void jk_close_pool(jk_pool_t *p)
+{
+ jk_reset_pool(p);
+ if (p->dynamic) {
+ free(p->dynamic);
+ }
+}
+
+void jk_reset_pool(jk_pool_t *p)
+{
+ if (p->dyn_pos && p->dynamic) {
+ size_t i;
+ for (i = 0; i < p->dyn_pos; i++) {
+ if (p->dynamic[i]) {
+ free(p->dynamic[i]);
+ }
+ }
+ }
+
+ p->dyn_pos = 0;
+ p->pos = 0;
+}
+
+void *jk_pool_alloc(jk_pool_t *p, size_t size)
+{
+ void *rc = NULL;
+
+ size = JK_ALIGN_DEFAULT(size);
+ if ((p->size - p->pos) >= size) {
+ rc = &(p->buf[p->pos]);
+ p->pos += size;
+ }
+ else {
+ rc = jk_pool_dyn_alloc(p, size);
+ }
+
+ return rc;
+}
+
+void *jk_pool_realloc(jk_pool_t *p, size_t sz, const void *old, size_t old_sz)
+{
+ void *rc;
+
+ if (!p || (!old && old_sz)) {
+ return NULL;
+ }
+
+ rc = jk_pool_alloc(p, sz);
+ if (rc) {
+ memcpy(rc, old, old_sz);
+ }
+
+ return rc;
+}
+
+void *jk_pool_strdup(jk_pool_t *p, const char *s)
+{
+ void *rc = NULL;
+ if (s && p) {
+ size_t size = strlen(s);
+
+ if (!size) {
+ return "";
+ }
+
+ size++;
+ rc = jk_pool_alloc(p, size);
+ if (rc) {
+ memcpy(rc, s, size);
+ }
+ }
+
+ return rc;
+}
+
+#if defined (DEBUG) || defined(_DEBUG)
+static void jk_dump_pool(jk_pool_t *p, FILE * f)
+{
+ fprintf(f, "Dumping for pool [%p]\n", p);
+ fprintf(f, "size [%ld]\n", p->size);
+ fprintf(f, "pos [%ld]\n", p->pos);
+ fprintf(f, "buf [%p]\n", p->buf);
+ fprintf(f, "dyn_size [%ld]\n", p->dyn_size);
+ fprintf(f, "dyn_pos [%ld]\n", p->dyn_pos);
+ fprintf(f, "dynamic [%p]\n", p->dynamic);
+
+ fflush(f);
+}
+#endif
+
+static void *jk_pool_dyn_alloc(jk_pool_t *p, size_t size)
+{
+ void *rc;
+
+ if (p->dyn_size == p->dyn_pos) {
+ size_t new_dyn_size = p->dyn_size * 2 + DEFAULT_DYNAMIC;
+ void **new_dynamic = (void **)malloc(new_dyn_size * sizeof(void *));
+ if (new_dynamic) {
+ if (p->dynamic) {
+ /* Copy old dynamic slots */
+ memcpy(new_dynamic, p->dynamic, p->dyn_size * sizeof(void *));
+
+ free(p->dynamic);
+ }
+
+ p->dynamic = new_dynamic;
+ p->dyn_size = new_dyn_size;
+ }
+ else {
+#if defined (DEBUG) || defined(_DEBUG)
+ jk_dump_pool(p, stderr);
+#endif
+ return NULL;
+ }
+ }
+
+ rc = p->dynamic[p->dyn_pos] = malloc(size);
+ if (p->dynamic[p->dyn_pos]) {
+ p->dyn_pos++;
+ }
+
+ return rc;
+}
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_pool.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_pool.h
new file mode 100644
index 00000000..b4c582df
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_pool.h
@@ -0,0 +1,126 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: Memory Pool object header file *
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Version: $Revision: 466585 $ *
+ ***************************************************************************/
+#ifndef _JK_POOL_H
+#define _JK_POOL_H
+
+#include "jk_global.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+/**
+ * @file jk_pool.h
+ * @brief Jk memory allocation
+ *
+ * Similar with apr_pools, but completely unsynchronized.
+ * XXX use same names
+ *
+ */
+
+/*
+ * The pool atom (basic pool alocation unit) is an 8 byte long.
+ * Each allocation (even for 1 byte) will return a round up to the
+ * number of atoms.
+ *
+ * This is to help in alignment of 32/64 bit machines ...
+ * G.S
+ */
+#ifdef WIN32
+ typedef __int64 jk_pool_atom_t;
+#elif defined(AIX)
+ typedef long long jk_pool_atom_t;
+#elif defined(SOLARIS)
+ typedef long long jk_pool_atom_t;
+#elif defined(LINUX)
+ typedef long long jk_pool_atom_t;
+#elif defined(FREEBSD)
+ typedef long long jk_pool_atom_t;
+#elif defined(OS2)
+ typedef long long jk_pool_atom_t;
+#elif defined(NETWARE)
+ typedef long long jk_pool_atom_t;
+#elif defined(HPUX11)
+ typedef long long jk_pool_atom_t;
+#elif defined(IRIX)
+ typedef long long jk_pool_atom_t;
+#elif defined(AS400)
+ typedef void *jk_pool_atom_t;
+#else
+ typedef long long jk_pool_atom_t;
+#endif
+
+/**
+ * Alignment macros
+ */
+
+/* JK_ALIGN() is only to be used to align on a power of 2 boundary */
+#define JK_ALIGN(size, boundary) \
+ (((size) + ((boundary) - 1)) & ~((boundary) - 1))
+
+/** Default alignment */
+#ifdef AS400
+#define JK_ALIGN_DEFAULT(size) JK_ALIGN(size, 16)
+#else
+#define JK_ALIGN_DEFAULT(size) JK_ALIGN(size, 8)
+#endif
+
+/*
+ * Pool size in number of pool atoms.
+ */
+#define TINY_POOL_SIZE 256 /* Tiny 1/4K atom pool. */
+#define SMALL_POOL_SIZE 512 /* Small 1/2K atom pool. */
+#define BIG_POOL_SIZE 2*SMALL_POOL_SIZE /* Bigger 1K atom pool. */
+#define HUGE_POOL_SIZE 2*BIG_POOL_SIZE /* Huge 2K atom pool. */
+
+/** jk pool structure */
+struct jk_pool
+{
+ size_t size;
+ size_t pos;
+ char *buf;
+ size_t dyn_size;
+ size_t dyn_pos;
+ void **dynamic;
+};
+
+typedef struct jk_pool jk_pool_t;
+
+void jk_open_pool(jk_pool_t *p, jk_pool_atom_t *buf, size_t size);
+
+void jk_close_pool(jk_pool_t *p);
+
+void jk_reset_pool(jk_pool_t *p);
+
+void *jk_pool_alloc(jk_pool_t *p, size_t sz);
+
+void *jk_pool_realloc(jk_pool_t *p,
+ size_t sz, const void *old, size_t old_sz);
+
+void *jk_pool_strdup(jk_pool_t *p, const char *s);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* _JK_POOL_H */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_pool.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_pool.lo
new file mode 100644
index 00000000..490290d5
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_pool.lo
@@ -0,0 +1,12 @@
+# jk_pool.lo - a libtool object file
+# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18)
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/jk_pool.o'
+
+# Name of the non-PIC object.
+non_pic_object='jk_pool.o'
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_pool.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_pool.o
new file mode 100644
index 00000000..e2e72173
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_pool.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_service.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_service.h
new file mode 100644
index 00000000..e99e774b
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_service.h
@@ -0,0 +1,546 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: Definitions of the objects used during the service step. *
+ * These are the web server (ws) the worker and the connection*
+ * JVM connection point *
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Author: Dan Milstein <danmil@shore.net> *
+ * Author: Henri Gomez <hgomez@apache.org> *
+ * Version: $Revision: 1078846 $ *
+ ***************************************************************************/
+
+#ifndef JK_SERVICE_H
+#define JK_SERVICE_H
+
+#include "jk_global.h"
+#include "jk_logger.h"
+#include "jk_pool.h"
+#include "jk_map.h"
+#include "jk_uri_worker_map.h"
+#include "jk_msg_buff.h"
+
+#define JK_RETRIES 2
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+/*
+ * Env Information to be provided to worker at init time
+ * With AJP14 support we need to have access to many informations
+ * about web-server, uri to worker map....
+ */
+
+struct jk_worker_env
+{
+
+ /* The original configuration map */
+ jk_map_t *init_data;
+
+ /* The URI to WORKER map, will be feeded by AJP14 autoconf feature */
+ jk_uri_worker_map_t *uri_to_worker;
+
+ unsigned int num_of_workers;
+ char **worker_list;
+
+ /* Web-Server we're running on (Apache/IIS/NES) */
+ char *server_name;
+
+ /* Virtual server handled - "*" is all virtual */
+ char *virtual;
+
+ /* Optional APR pool used for configuration */
+ void *pool;
+};
+typedef struct jk_worker_env jk_worker_env_t;
+
+struct jk_ws_service;
+struct jk_endpoint;
+struct jk_worker;
+typedef struct jk_ws_service jk_ws_service_t;
+typedef struct jk_endpoint jk_endpoint_t;
+typedef struct jk_worker jk_worker_t;
+
+struct svc_extension
+{
+ /* reply_timeout overwrite */
+ int reply_timeout;
+ /* activation state overwrites for load balancers */
+ /* Dynamically allocated array with one entry per lb member. */
+ int *activation;
+ /* fail_on_status overwrites */
+ /* Number of elements in the array fail_on_status. */
+ int fail_on_status_size;
+ /* Dynamically allocated array with one entry per status. */
+ int *fail_on_status;
+ /* Use server error pages for responses >= 400. */
+ int use_server_error_pages;
+};
+typedef struct svc_extension svc_extension_t;
+
+/*
+ * The web server service 'class'. An instance of this class is created
+ * for each request which is forwarded from the web server to the servlet
+ * container. Contains the basic information about the request
+ * (e.g. protocol, req_uri, etc), and also contains a series of methods
+ * which provide access to core web server functionality (start_response,
+ * read, write). This class might be more accurately called ws_request.
+ *
+ * As with all the core jk classes, this is essentially an abstract base
+ * class which is implemented/extended by classes which are specific to a
+ * particular web server. By using an abstract base class in this manner,
+ * workers can be written for different protocols (e.g. ajp12, ajp13, ajp14)
+ * without the workers having to worry about which web server they are
+ * talking to.
+ *
+ * This particular OO-in-C system uses a 'ws_private' pointer to point to
+ * the platform-specific data. So in the subclasses, the methods do most
+ * of their work by getting their hands on the ws_private pointer and then
+ * using that to get at the correctly formatted data and functions for
+ * their platform.
+ *
+ * Try imagining this as a 'public abstract class', and the ws_private
+ * pointer as a sort of extra 'this' reference. Or imagine that you are
+ * seeing the internal vtables of your favorite OO language. Whatever
+ * works for you.
+ *
+ * See apache1.3/mod_jk.c and iis/jk_isapi_plugin.c for examples.
+ */
+struct jk_ws_service
+{
+
+ /*
+ * A 'this' pointer which is used by the subclasses of this class to
+ * point to data which is specific to a given web server platform
+ * (e.g. Apache or IIS).
+ */
+ void *ws_private;
+
+ /*
+ * Provides memory management. All data specific to this request is
+ * allocated within this pool, which can then be reclaimed at the end
+ * of the request handling cycle.
+ *
+ * Alive as long as the request is alive.
+ */
+ jk_pool_t *pool;
+
+ /*
+ * CGI Environment needed by servlets
+ */
+ const char *method;
+ const char *protocol;
+ char *req_uri;
+ const char *remote_addr;
+ const char *remote_port;
+ const char *remote_host;
+ const char *remote_user;
+ const char *auth_type;
+ const char *query_string;
+ const char *server_name;
+ unsigned server_port;
+ char *server_software;
+ jk_uint64_t content_length; /* 64 bit integer that represents the content */
+ /* length should be 0 if unknown. */
+ unsigned is_chunked; /* 1 if content length is unknown (chunked rq) */
+ unsigned no_more_chunks; /* 1 if last chunk has been read */
+ jk_uint64_t content_read; /* number of bytes read */
+
+ /*
+ * SSL information
+ *
+ * is_ssl - True if request is in ssl connection
+ * ssl_cert - If available, base64 ASN.1 encoded client certificates.
+ * ssl_cert_len - Length of ssl_cert, 0 if certificates are not available.
+ * ssl_cipher - The ssl cipher suite in use.
+ * ssl_session - The ssl session string
+ *
+ * In some servers it is impossible to extract all this information, in this
+ * case, we are passing NULL.
+ */
+ int is_ssl;
+ char *ssl_cert;
+ unsigned ssl_cert_len;
+ char *ssl_cipher;
+ char *ssl_session;
+
+ /*
+ * SSL extra information for Servlet 2.3 API
+ *
+ * ssl_key_size - ssl key size in use
+ */
+ int ssl_key_size;
+
+ /*
+ * Headers, names and values.
+ */
+ char **headers_names; /* Names of the request headers */
+ char **headers_values; /* Values of the request headers */
+ unsigned num_headers; /* Number of request headers */
+
+
+ /*
+ * Request attributes.
+ *
+ * These attributes that were extracted from the web server and are
+ * sent to Tomcat.
+ *
+ * The developer should be able to read them from the ServletRequest
+ * attributes. Tomcat is required to append org.apache.tomcat. to
+ * these attrinbute names.
+ */
+ char **attributes_names; /* Names of the request attributes */
+ char **attributes_values; /* Values of the request attributes */
+ unsigned num_attributes; /* Number of request attributes */
+
+ /*
+ * The route is in use when the adapter load balance among
+ * several workers. It is the ID of a specific target in the load balance
+ * group. We are using this variable to implement target session
+ * affinity
+ */
+ const char *route;
+
+ /*
+ * Activation state of the worker in the load balancer.
+ * Will be forwarded as a request attribute.
+ */
+ const char *activation;
+
+ /* Temp solution for auth. For native1 it'll be sent on each request,
+ if an option is present. For native2 it'll be sent with the first
+ request. On java side, both cases will work. For tomcat3.2 or
+ a version that doesn't support secret - don't set the secret,
+ and it'll work.
+ */
+ const char *secret;
+
+ /*
+ * Area to get POST data for fail-over recovery in POST
+ */
+ jk_msg_buf_t *reco_buf;
+ int reco_status;
+
+ /*
+ * If set call flush after each write
+ */
+ int flush_packets;
+
+ /*
+ * If set call flush after AJP13_SEND_HEADERS.
+ */
+ int flush_header;
+
+ /*
+ * service extensions
+ */
+ svc_extension_t extension;
+
+ /*
+ * JK_TRUE if response headers have been sent back
+ */
+ int response_started;
+
+ /*
+ * JK_TRUE if response should not be send to the client
+ */
+ int response_blocked;
+
+ /*
+ * HTTP status sent from container.
+ */
+ int http_response_status;
+
+ /* Uri worker map. Added for virtual host support
+ */
+ jk_uri_worker_map_t *uw_map;
+
+ /*
+ * Callbacks into the web server. For each, the first argument is
+ * essentially a 'this' pointer. All return JK_TRUE on success
+ * and JK_FALSE on failure.
+ */
+ /*
+ * Send the response headers to the browser.
+ */
+ int (JK_METHOD * start_response) (jk_ws_service_t *s,
+ int status,
+ const char *reason,
+ const char *const *header_names,
+ const char *const *header_values,
+ unsigned num_of_headers);
+
+ /*
+ * Read a chunk of the request body into a buffer. Attempt to read len
+ * bytes into the buffer. Write the number of bytes actually read into
+ * actually_read.
+ */
+ int (JK_METHOD * read) (jk_ws_service_t *s,
+ void *buffer,
+ unsigned len, unsigned *actually_read);
+
+ /*
+ * Write a chunk of response data back to the browser.
+ */
+ int (JK_METHOD * write) (jk_ws_service_t *s,
+ const void *buffer, unsigned len);
+
+ /*
+ * Flush a chunk of response data back to the browser.
+ */
+ void (JK_METHOD * flush) (jk_ws_service_t *s);
+
+ /*
+ * Done with sending response back to the browser.
+ */
+ void (JK_METHOD * done) (jk_ws_service_t *s);
+
+ /*
+ * If set do not reuse socket after each full response
+ */
+ int disable_reuse;
+
+ /*
+ * Add more data to log facilities.
+ */
+ void (JK_METHOD * add_log_items) (jk_ws_service_t *s,
+ const char *const *log_names,
+ const char *const *log_values,
+ unsigned num_of_items);
+
+ /*
+ * Iterate through all vhosts
+ */
+ void *(JK_METHOD * next_vhost) (void *d);
+
+ /*
+ * String representation of a vhost
+ */
+ void (JK_METHOD * vhost_to_text) (void *d, char *buf, size_t len);
+
+ /*
+ * Get uw_map associated with a vhost
+ */
+ jk_uri_worker_map_t *(JK_METHOD * vhost_to_uw_map) (void *d);
+};
+
+/*
+ * The endpoint 'class', which represents one end of a connection to the
+ * servlet engine. Basically, supports nothing other than forwarding the
+ * request to the servlet engine. Endpoints can be persistent (as with
+ * ajp13/ajp14, where a single connection is reused many times), or can last for a
+ * single request (as with ajp12, where a new connection is created for
+ * every request).
+ *
+ * An endpoint for a given protocol is obtained by the web server plugin
+ * from a worker object for that protocol. See below for details.
+ *
+ * As with all the core jk classes, this is essentially an abstract base
+ * class which is implemented/extended by classes which are specific to a
+ * particular protocol. By using an abstract base class in this manner,
+ * plugins can be written for different servers (e.g. IIS, Apache) without
+ * the plugins having to worry about which protocol they are talking.
+ *
+ * This particular OO-in-C system uses a 'endpoint_private' pointer to
+ * point to the protocol-specific data/functions. So in the subclasses, the
+ * methods do most of their work by getting their hands on the
+ * endpoint_private pointer and then using that to get at the functions for
+ * their protocol.
+ *
+ * Try imagining this as a 'public abstract class', and the
+ * endpoint_private pointer as a sort of extra 'this' reference. Or
+ * imagine that you are seeing the internal vtables of your favorite OO
+ * language. Whatever works for you.
+ *
+ * See jk_ajp13_worker.c/jk_ajp14_worker.c and jk_ajp12_worker.c for examples.
+ */
+struct jk_endpoint
+{
+ jk_uint64_t rd;
+ jk_uint64_t wr;
+
+ /*
+ * Flag to pass back recoverability status from
+ * a load balancer member to the load balancer itself.
+ * Depending on the configuration and request status
+ * recovery is not allowed.
+ */
+ int recoverable;
+
+ /*
+ * A 'this' pointer which is used by the subclasses of this class to
+ * point to data/functions which are specific to a given protocol
+ * (e.g. ajp12 or ajp13 or ajp14).
+ */
+ void *endpoint_private;
+
+ /*
+ * Forward a request to the servlet engine. The request is described
+ * by the jk_ws_service_t object.
+ * is_error is either 0 meaning recoverable or set to
+ * the HTTP error code.
+ */
+ int (JK_METHOD * service) (jk_endpoint_t *e,
+ jk_ws_service_t *s,
+ jk_logger_t *l, int *is_error);
+
+ /*
+ * Called when this particular endpoint has finished processing a
+ * request. For some protocols (e.g. ajp12), this frees the memory
+ * associated with the endpoint. For others (e.g. ajp13/ajp14), this can
+ * return the endpoint to a cache of already opened endpoints.
+ *
+ * Note that the first argument is *not* a 'this' pointer, but is
+ * rather a pointer to a 'this' pointer. This is necessary, because
+ * we may need to free this object.
+ */
+ int (JK_METHOD * done) (jk_endpoint_t **p, jk_logger_t *l);
+};
+
+/*
+ * The worker 'class', which represents something to which the web server
+ * can delegate requests.
+ *
+ * This can mean communicating with a particular servlet engine instance,
+ * using a particular protocol. A single web server instance may have
+ * multiple workers communicating with a single servlet engine (it could be
+ * using ajp12 for some requests and ajp13/ajp14 for others). Or, a single web
+ * server instance could have multiple workers communicating with different
+ * servlet engines using the same protocol (it could be load balancing
+ * among many engines, using ajp13/ajp14 for all communication).
+ *
+ * There is also a load balancing worker (jk_lb_worker.c), which itself
+ * manages a group of workers.
+ *
+ * Web servers are configured to forward requests to a given worker. To
+ * handle those requests, the worker's get_endpoint method is called, and
+ * then the service() method of that endpoint is called.
+ *
+ * As with all the core jk classes, this is essentially an abstract base
+ * class which is implemented/extended by classes which are specific to a
+ * particular protocol (or request-handling system). By using an abstract
+ * base class in this manner, plugins can be written for different servers
+ * (e.g. IIS, Apache) without the plugins having to worry about which
+ * protocol they are talking.
+ *
+ * This particular OO-in-C system uses a 'worker_private' pointer to
+ * point to the protocol-specific data/functions. So in the subclasses, the
+ * methods do most of their work by getting their hands on the
+ * worker_private pointer and then using that to get at the functions for
+ * their protocol.
+ *
+ * Try imagining this as a 'public abstract class', and the
+ * worker_private pointer as a sort of extra 'this' reference. Or
+ * imagine that you are seeing the internal vtables of your favorite OO
+ * language. Whatever works for you.
+ *
+ * See jk_ajp14_worker.c, jk_ajp13_worker.c and jk_ajp12_worker.c for examples.
+ */
+struct jk_worker
+{
+
+ jk_worker_env_t *we;
+
+ /*
+ * A 'this' pointer which is used by the subclasses of this class to
+ * point to data/functions which are specific to a given protocol
+ * (e.g. ajp12 or ajp13 or ajp14).
+ */
+ void *worker_private;
+
+ int type;
+ /*
+ * For all of the below (except destroy), the first argument is
+ * essentially a 'this' pointer.
+ */
+
+ /*
+ * Given a worker which is in the process of being created, and a list
+ * of configuration options (or 'properties'), check to see if it the
+ * options are. This will always be called before the init() method.
+ * The init/validate distinction is a bit hazy to me.
+ * See jk_ajp13_worker.c/jk_ajp14_worker.c and jk_worker.c->wc_create_worker()
+ */
+ int (JK_METHOD * validate) (jk_worker_t *w,
+ jk_map_t *props,
+ jk_worker_env_t *we, jk_logger_t *l);
+
+ /*
+ * Update worker either from jk_status or reloading from workers.properties
+ */
+ int (JK_METHOD * update) (jk_worker_t *w,
+ jk_map_t *props,
+ jk_worker_env_t *we, jk_logger_t *l);
+
+ /*
+ * Do whatever initialization needs to be done to start this worker up.
+ * Configuration options are passed in via the props parameter.
+ */
+ int (JK_METHOD * init) (jk_worker_t *w,
+ jk_map_t *props,
+ jk_worker_env_t *we, jk_logger_t *l);
+
+
+ /*
+ * Obtain an endpoint to service a particular request. A pointer to
+ * the endpoint is stored in pend.
+ */
+ int (JK_METHOD * get_endpoint) (jk_worker_t *w,
+ jk_endpoint_t **pend, jk_logger_t *l);
+
+ /*
+ * Shutdown this worker. The first argument is not a 'this' pointer,
+ * but rather a pointer to 'this', so that the object can be free'd (I
+ * think -- though that doesn't seem to be happening. Hmmm).
+ */
+ int (JK_METHOD * destroy) (jk_worker_t **w, jk_logger_t *l);
+
+ /*
+ * Maintain this worker.
+ */
+ int (JK_METHOD * maintain) (jk_worker_t *w, time_t now, jk_logger_t *l);
+
+};
+
+/*
+ * Essentially, an abstract base class (or factory class) with a single
+ * method -- think of it as createWorker() or the Factory Method Design
+ * Pattern. There is a different worker_factory function for each of the
+ * different types of workers. The set of all these functions is created
+ * at startup from the list in jk_worker_list.h, and then the correct one
+ * is chosen in jk_worker.c->wc_create_worker(). See jk_worker.c and
+ * jk_ajp13_worker.c/jk_ajp14_worker.c for examples.
+ *
+ * This allows new workers to be written without modifing the plugin code
+ * for the various web servers (since the only link is through
+ * jk_worker_list.h).
+ */
+typedef int (JK_METHOD * worker_factory) (jk_worker_t **w,
+ const char *name,
+ jk_logger_t *l);
+
+void jk_init_ws_service(jk_ws_service_t *s);
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* JK_SERVICE_H */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_shm.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_shm.c
new file mode 100644
index 00000000..1640f474
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_shm.c
@@ -0,0 +1,812 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: Shared Memory support *
+ * Author: Mladen Turk <mturk@jboss.com> *
+ * Author: Rainer Jung <rjung@apache.org> *
+ * Version: $Revision: 704548 $ *
+ ***************************************************************************/
+
+#include "jk_global.h"
+#include "jk_pool.h"
+#include "jk_util.h"
+#include "jk_mt.h"
+#include "jk_lb_worker.h"
+#include "jk_ajp13_worker.h"
+#include "jk_ajp14_worker.h"
+#include "jk_shm.h"
+
+/** jk shm header core data structure */
+struct jk_shm_header_data
+{
+ /* Shared memory magic JK_SHM_MAGIC */
+ char magic[JK_SHM_MAGIC_SIZ];
+ size_t size;
+ size_t pos;
+ unsigned int childs;
+ unsigned int workers;
+ time_t modified;
+};
+
+typedef struct jk_shm_header_data jk_shm_header_data_t;
+
+/** jk shm header record structure */
+struct jk_shm_header
+{
+ union {
+ jk_shm_header_data_t data;
+ char alignbuf[JK_SHM_ALIGN(sizeof(jk_shm_header_data_t))];
+ } h;
+ char buf[1];
+};
+
+typedef struct jk_shm_header jk_shm_header_t;
+
+/** jk shm structure */
+struct jk_shm
+{
+ size_t size;
+ unsigned ajp_workers;
+ unsigned lb_sub_workers;
+ unsigned lb_workers;
+ char *filename;
+ char *lockname;
+ int fd;
+ int fd_lock;
+ int attached;
+ jk_shm_header_t *hdr;
+ JK_CRIT_SEC cs;
+};
+
+typedef struct jk_shm jk_shm_t;
+
+static const char shm_signature[] = { JK_SHM_MAGIC };
+static jk_shm_t jk_shmem = { 0, 0, 0, 0, NULL, NULL, -1, -1, 0, NULL};
+static time_t jk_workers_modified_time = 0;
+static time_t jk_workers_access_time = 0;
+#if defined (WIN32)
+static HANDLE jk_shm_map = NULL;
+static HANDLE jk_shm_hlock = NULL;
+#endif
+
+/* Calculate needed shm size */
+size_t jk_shm_calculate_size(jk_map_t *init_data, jk_logger_t *l)
+{
+ char **worker_list;
+ unsigned i;
+ unsigned num_of_workers;
+ int num_of_ajp_workers = 0;
+ int num_of_lb_sub_workers = 0;
+ int num_of_lb_workers = 0;
+
+ JK_TRACE_ENTER(l);
+
+ if (jk_get_worker_list(init_data, &worker_list,
+ &num_of_workers) == JK_FALSE) {
+ jk_log(l, JK_LOG_ERROR,
+ "Could not get worker list from map");
+ JK_TRACE_EXIT(l);
+ return 0;
+ }
+
+ for (i = 0; i < num_of_workers; i++) {
+ const char *type = jk_get_worker_type(init_data, worker_list[i]);
+
+ if (!strcmp(type, JK_AJP13_WORKER_NAME) ||
+ !strcmp(type, JK_AJP14_WORKER_NAME)) {
+ num_of_ajp_workers++;
+ }
+ else if (!strcmp(type, JK_LB_WORKER_NAME)) {
+ char **member_list;
+ unsigned num_of_members;
+ num_of_lb_workers++;
+ if (jk_get_lb_worker_list(init_data, worker_list[i],
+ &member_list, &num_of_members) == JK_FALSE) {
+ jk_log(l, JK_LOG_ERROR,
+ "Could not get member list for lb worker from map");
+ }
+ else {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG, "worker %s of type %s has %u members",
+ worker_list[i], JK_LB_WORKER_NAME, num_of_members);
+ num_of_lb_sub_workers += num_of_members;
+ }
+ }
+ }
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG, "shared memory will contain %d ajp workers of size %d and %d lb workers of size %d with %d members of size %d+%d",
+ num_of_ajp_workers, JK_SHM_AJP_SIZE(1),
+ num_of_lb_workers, JK_SHM_LB_SIZE(1),
+ num_of_lb_sub_workers, JK_SHM_LB_SUB_SIZE(1), JK_SHM_AJP_SIZE(1));
+ jk_shmem.ajp_workers = num_of_ajp_workers;
+ jk_shmem.lb_sub_workers = num_of_lb_sub_workers;
+ jk_shmem.lb_workers = num_of_lb_workers;
+ JK_TRACE_EXIT(l);
+ return JK_SHM_AJP_SIZE(jk_shmem.ajp_workers) +
+ JK_SHM_LB_SUB_SIZE(jk_shmem.lb_sub_workers) +
+ JK_SHM_AJP_SIZE(jk_shmem.lb_sub_workers) +
+ JK_SHM_LB_SIZE(jk_shmem.lb_workers);
+}
+
+
+#if defined (WIN32) || defined(NETWARE)
+
+/* Use plain memory */
+int jk_shm_open(const char *fname, size_t sz, jk_logger_t *l)
+{
+ int rc;
+ int attached = 0;
+ char lkname[MAX_PATH];
+ JK_TRACE_ENTER(l);
+ if (jk_shmem.hdr) {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG, "Shared memory is already opened");
+ JK_TRACE_EXIT(l);
+ return 0;
+ }
+
+ jk_shmem.size = JK_SHM_ALIGN(sizeof(jk_shm_header_t) + sz);
+
+#if defined (WIN32)
+ if (fname) {
+ jk_shm_map = CreateFileMapping(INVALID_HANDLE_VALUE,
+ NULL,
+ PAGE_READWRITE,
+ 0,
+ (DWORD)(sizeof(jk_shm_header_t) + sz),
+ fname);
+ if (GetLastError() == ERROR_ALREADY_EXISTS) {
+ attached = 1;
+ if (jk_shm_map == NULL || jk_shm_map == INVALID_HANDLE_VALUE) {
+ jk_shm_map = OpenFileMapping(PAGE_READWRITE, FALSE, fname);
+ }
+ }
+ if (jk_shm_map == NULL || jk_shm_map == INVALID_HANDLE_VALUE) {
+ JK_TRACE_EXIT(l);
+ return -1;
+ }
+ sprintf(lkname, "Global\\%s_MUTEX", fname);
+ if (attached) {
+ jk_shm_hlock = OpenMutex(MUTEX_ALL_ACCESS, FALSE, lkname);
+ }
+ else {
+ jk_shm_hlock = CreateMutex(NULL, FALSE, lkname);
+ }
+ if (jk_shm_hlock == NULL || jk_shm_hlock == INVALID_HANDLE_VALUE) {
+ CloseHandle(jk_shm_map);
+ jk_shm_map = NULL;
+ JK_TRACE_EXIT(l);
+ return -1;
+ }
+ jk_shmem.hdr = (jk_shm_header_t *)MapViewOfFile(jk_shm_map,
+ FILE_MAP_ALL_ACCESS,
+ 0,
+ 0,
+ 0);
+ }
+ else
+#endif
+ jk_shmem.hdr = (jk_shm_header_t *)calloc(1, jk_shmem.size);
+ if (!jk_shmem.hdr) {
+#if defined (WIN32)
+ if (jk_shm_map) {
+ CloseHandle(jk_shm_map);
+ jk_shm_map = NULL;
+ }
+ if (jk_shm_hlock) {
+ CloseHandle(jk_shm_hlock);
+ jk_shm_hlock = NULL;
+ }
+#endif
+ JK_TRACE_EXIT(l);
+ return -1;
+ }
+ if (!jk_shmem.filename) {
+ if (fname)
+ jk_shmem.filename = strdup(fname);
+ else
+ jk_shmem.filename = strdup("memory");
+ }
+ jk_shmem.fd = 0;
+ jk_shmem.attached = attached;
+ if (!attached) {
+ memcpy(jk_shmem.hdr->h.data.magic, shm_signature,
+ JK_SHM_MAGIC_SIZ);
+ jk_shmem.hdr->h.data.size = sz;
+ jk_shmem.hdr->h.data.childs = 1;
+ }
+ else {
+ jk_shmem.hdr->h.data.childs++;
+ /*
+ * Reset the shared memory so that
+ * alloc works even for attached memory.
+ * XXX: This might break already used memory
+ * if the number of workers change between
+ * open and attach or between two attach operations.
+ */
+ if (jk_shmem.hdr->h.data.childs > 1) {
+ if (JK_IS_DEBUG_LEVEL(l)) {
+ jk_log(l, JK_LOG_DEBUG,
+ "Resetting the shared memory for child %d",
+ jk_shmem.hdr->h.data.childs);
+ }
+ }
+ jk_shmem.hdr->h.data.pos = 0;
+ jk_shmem.hdr->h.data.workers = 0;
+ }
+ JK_INIT_CS(&(jk_shmem.cs), rc);
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "%s shared memory %s size=%u free=%u addr=%#lx",
+ attached ? "Attached" : "Initialized",
+ jk_shm_name(), jk_shmem.size,
+ jk_shmem.hdr->h.data.size - jk_shmem.hdr->h.data.pos,
+ jk_shmem.hdr);
+ JK_TRACE_EXIT(l);
+ return 0;
+}
+
+int jk_shm_attach(const char *fname, size_t sz, jk_logger_t *l)
+{
+ JK_TRACE_ENTER(l);
+ if (!jk_shm_open(fname, sz, l)) {
+ if (!jk_shmem.attached) {
+ jk_shmem.attached = 1;
+ if (JK_IS_DEBUG_LEVEL(l)) {
+ jk_log(l, JK_LOG_DEBUG,
+ "Attached shared memory %s [%d] size=%u free=%u addr=%#lx",
+ jk_shm_name(), jk_shmem.hdr->h.data.childs, jk_shmem.size,
+ jk_shmem.hdr->h.data.size - jk_shmem.hdr->h.data.pos,
+ jk_shmem.hdr);
+ }
+ }
+ JK_TRACE_EXIT(l);
+ return 0;
+ }
+ else {
+ JK_TRACE_EXIT(l);
+ return -1;
+ }
+}
+
+void jk_shm_close()
+{
+ if (jk_shmem.hdr) {
+ int rc;
+#if defined (WIN32)
+ if (jk_shm_hlock) {
+ CloseHandle(jk_shm_hlock);
+ jk_shm_hlock = NULL;
+ }
+ if (jk_shm_map) {
+ --jk_shmem.hdr->h.data.childs;
+ UnmapViewOfFile(jk_shmem.hdr);
+ CloseHandle(jk_shm_map);
+ jk_shm_map = NULL;
+ }
+ else
+#endif
+ free(jk_shmem.hdr);
+ JK_DELETE_CS(&(jk_shmem.cs), rc);
+ }
+ jk_shmem.hdr = NULL;
+ if (jk_shmem.filename) {
+ free(jk_shmem.filename);
+ jk_shmem.filename = NULL;
+ }
+}
+
+#else
+
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+#include <sys/uio.h>
+
+#ifndef MAP_FAILED
+#define MAP_FAILED (-1)
+#endif
+
+#ifndef MAP_FILE
+#define MAP_FILE (0)
+#endif
+
+static int do_shm_open_lock(const char *fname, int attached, jk_logger_t *l)
+{
+ int rc;
+ char flkname[256];
+#ifdef AS400_UTF8
+ char *wptr;
+#endif
+
+ JK_TRACE_ENTER(l);
+
+ if (attached && jk_shmem.lockname) {
+#ifdef JK_SHM_LOCK_REOPEN
+ jk_shmem.fd_lock = open(jk_shmem.lockname, O_RDWR, 0666);
+#else
+ errno = EINVAL;
+#endif
+ if (jk_shmem.fd_lock == -1) {
+ rc = errno;
+ JK_TRACE_EXIT(l);
+ return rc;
+ }
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Duplicated shared memory lock %s", jk_shmem.lockname);
+ JK_TRACE_EXIT(l);
+ return 0;
+ }
+
+ if (!jk_shmem.lockname) {
+#ifdef JK_SHM_LOCK_REOPEN
+ int i;
+ jk_shmem.fd_lock = -1;
+ mode_t mask = umask(0);
+ for (i = 0; i < 8; i++) {
+ strcpy(flkname, "/tmp/jkshmlock.XXXXXX");
+ if (mktemp(flkname)) {
+ jk_shmem.fd_lock = open(flkname, O_RDWR|O_CREAT|O_TRUNC, 0666);
+ if (jk_shmem.fd_lock >= 0)
+ break;
+ }
+ }
+ umask(mask);
+#else
+ strcpy(flkname, fname);
+ strcat(flkname, ".lock");
+#ifdef AS400_UTF8
+ wptr = (char *)malloc(strlen(flkname) + 1);
+ jk_ascii2ebcdic((char *)flkname, wptr);
+ jk_shmem.fd_lock = open(wptr, O_RDWR|O_CREAT|O_TRUNC, 0666);
+ free(wptr);
+#else
+ jk_shmem.fd_lock = open(flkname, O_RDWR|O_CREAT|O_TRUNC, 0666);
+#endif
+#endif
+ if (jk_shmem.fd_lock == -1) {
+ rc = errno;
+ JK_TRACE_EXIT(l);
+ return rc;
+ }
+ jk_shmem.lockname = strdup(flkname);
+ }
+ else {
+ /* Nothing to do */
+ JK_TRACE_EXIT(l);
+ return 0;
+ }
+
+ if (ftruncate(jk_shmem.fd_lock, 1)) {
+ rc = errno;
+ close(jk_shmem.fd_lock);
+ jk_shmem.fd_lock = -1;
+ JK_TRACE_EXIT(l);
+ return rc;
+ }
+ if (lseek(jk_shmem.fd_lock, 0, SEEK_SET) != 0) {
+ rc = errno;
+ close(jk_shmem.fd_lock);
+ jk_shmem.fd_lock = -1;
+ return rc;
+ }
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Opened shared memory lock %s", jk_shmem.lockname);
+ JK_TRACE_EXIT(l);
+ return 0;
+}
+
+static int do_shm_open(const char *fname, int attached,
+ size_t sz, jk_logger_t *l)
+{
+ int rc;
+ int fd;
+ void *base;
+#ifdef AS400_UTF8
+ char *wptr;
+#endif
+
+ JK_TRACE_ENTER(l);
+ if (jk_shmem.hdr) {
+ /* Probably a call from vhost */
+ if (!attached)
+ attached = 1;
+ }
+ else if (attached) {
+ /* We should already have a header
+ * Use memory if we don't
+ */
+ JK_TRACE_EXIT(l);
+ return 0;
+ }
+ jk_shmem.size = JK_SHM_ALIGN(sizeof(jk_shm_header_t) + sz);
+
+ if (!fname) {
+ /* Use plain memory in case there is no file name */
+ if (!jk_shmem.filename)
+ jk_shmem.filename = strdup("memory");
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Using process memory as shared memory");
+ JK_TRACE_EXIT(l);
+ return 0;
+ }
+
+ if (!jk_shmem.filename) {
+ jk_shmem.filename = (char *)malloc(strlen(fname) + 32);
+ sprintf(jk_shmem.filename, "%s.%" JK_PID_T_FMT, fname, getpid());
+ }
+ if (!attached) {
+ size_t size;
+ jk_shmem.attached = 0;
+#ifdef AS400_UTF8
+ wptr = (char *)malloc(strlen(jk_shmem.filename) + 1);
+ jk_ascii2ebcdic((char *)jk_shmem.filename, wptr);
+ fd = open(wptr, O_RDWR|O_CREAT|O_TRUNC, 0666);
+ free(wptr);
+#else
+ fd = open(jk_shmem.filename, O_RDWR|O_CREAT|O_TRUNC, 0666);
+#endif
+ if (fd == -1) {
+ jk_shmem.size = 0;
+ JK_TRACE_EXIT(l);
+ return errno;
+ }
+ size = lseek(fd, 0, SEEK_END);
+ if (size < jk_shmem.size) {
+ size = jk_shmem.size;
+ if (ftruncate(fd, jk_shmem.size)) {
+ rc = errno;
+ close(fd);
+#ifdef AS400_UTF8
+ wptr = (char *)malloc(strlen(jk_shmem.filename) + 1);
+ jk_ascii2ebcdic((char *)jk_shmem.filename, wptr);
+ unlink(wptr);
+ free(wptr);
+#else
+ unlink(jk_shmem.filename);
+#endif
+ jk_shmem.size = 0;
+ JK_TRACE_EXIT(l);
+ return rc;
+ }
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Truncated shared memory to %u", size);
+ }
+ if (lseek(fd, 0, SEEK_SET) != 0) {
+ rc = errno;
+ close(fd);
+#ifdef AS400_UTF8
+ wptr = (char *)malloc(strlen(jk_shmem.filename) + 1);
+ jk_ascii2ebcdic((char *)jk_shmem.filename, wptr);
+ unlink(wptr);
+ free(wptr);
+#else
+ unlink(jk_shmem.filename);
+#endif
+ jk_shmem.size = 0;
+ JK_TRACE_EXIT(l);
+ return rc;
+ }
+
+ base = mmap((caddr_t)0, jk_shmem.size,
+ PROT_READ | PROT_WRITE,
+ MAP_FILE | MAP_SHARED,
+ fd, 0);
+ if (base == (caddr_t)MAP_FAILED || base == (caddr_t)0) {
+ rc = errno;
+ close(fd);
+#ifdef AS400_UTF8
+ wptr = (char *)malloc(strlen(jk_shmem.filename) + 1);
+ jk_ascii2ebcdic((char *)jk_shmem.filename, wptr);
+ unlink(wptr);
+ free(wptr);
+#else
+ unlink(jk_shmem.filename);
+#endif
+ jk_shmem.size = 0;
+ JK_TRACE_EXIT(l);
+ return rc;
+ }
+ jk_shmem.hdr = base;
+ jk_shmem.fd = fd;
+ memset(jk_shmem.hdr, 0, jk_shmem.size);
+ memcpy(jk_shmem.hdr->h.data.magic, shm_signature, JK_SHM_MAGIC_SIZ);
+ jk_shmem.hdr->h.data.size = sz;
+ jk_shmem.hdr->h.data.childs = 1;
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Initialized shared memory %s size=%u free=%u addr=%#lx",
+ jk_shm_name(), jk_shmem.size,
+ jk_shmem.hdr->h.data.size - jk_shmem.hdr->h.data.pos,
+ jk_shmem.hdr);
+ }
+ else {
+ unsigned int nchild;
+ jk_shmem.hdr->h.data.childs++;
+ jk_shmem.attached = (int)getpid();
+ nchild = jk_shmem.hdr->h.data.childs;
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Attached shared memory %s [%d] size=%u free=%u addr=%#lx",
+ jk_shm_name(), nchild, jk_shmem.size,
+ jk_shmem.hdr->h.data.size - jk_shmem.hdr->h.data.pos,
+ jk_shmem.hdr);
+ /*
+ * Reset the shared memory so that
+ * alloc works even for attached memory.
+ * XXX: This might break already used memory
+ * if the number of workers change between
+ * open and attach or between two attach operations.
+ */
+ if (nchild > 1) {
+ if (JK_IS_DEBUG_LEVEL(l)) {
+ jk_log(l, JK_LOG_DEBUG,
+ "Resetting the shared memory for child %d",
+ nchild);
+ }
+ }
+ jk_shmem.hdr->h.data.pos = 0;
+ jk_shmem.hdr->h.data.workers = 0;
+ }
+ JK_INIT_CS(&(jk_shmem.cs), rc);
+ if ((rc = do_shm_open_lock(jk_shmem.filename, attached, l))) {
+ if (!attached) {
+ munmap((void *)jk_shmem.hdr, jk_shmem.size);
+ close(jk_shmem.fd);
+#ifdef AS400_UTF8
+ wptr = (char *)malloc(strlen(jk_shmem.filename) + 1);
+ jk_ascii2ebcdic((char *)jk_shmem.filename, wptr);
+ unlink(wptr);
+ free(wptr);
+#else
+ unlink(jk_shmem.filename);
+#endif
+ }
+ jk_shmem.hdr = NULL;
+ jk_shmem.fd = -1;
+ JK_TRACE_EXIT(l);
+ return rc;
+ }
+ JK_TRACE_EXIT(l);
+ return 0;
+}
+
+int jk_shm_open(const char *fname, size_t sz, jk_logger_t *l)
+{
+ return do_shm_open(fname, 0, sz, l);
+}
+
+int jk_shm_attach(const char *fname, size_t sz, jk_logger_t *l)
+{
+ return do_shm_open(fname, 1, sz, l);
+}
+
+void jk_shm_close()
+{
+ int rc;
+#ifdef AS400_UTF8
+ char *wptr;
+#endif
+
+ if (jk_shmem.hdr) {
+ --jk_shmem.hdr->h.data.childs;
+
+#ifdef JK_SHM_LOCK_REOPEN
+ if (jk_shmem.fd_lock >= 0) {
+ close(jk_shmem.fd_lock);
+ jk_shmem.fd_lock = -1;
+ }
+#endif
+ JK_DELETE_CS(&(jk_shmem.cs), rc);
+ if (jk_shmem.attached) {
+ int p = (int)getpid();
+ if (p == jk_shmem.attached) {
+ /* In case this is a forked child
+ * do not close the shared memory.
+ * It will be closed by the parent.
+ */
+ jk_shmem.size = 0;
+ jk_shmem.hdr = NULL;
+ jk_shmem.fd = -1;
+ return;
+ }
+ }
+ if (jk_shmem.fd >= 0) {
+ munmap((void *)jk_shmem.hdr, jk_shmem.size);
+ close(jk_shmem.fd);
+ }
+ if (jk_shmem.fd_lock >= 0)
+ close(jk_shmem.fd_lock);
+ if (jk_shmem.lockname) {
+#ifdef AS400_UTF8
+ wptr = (char *)malloc(strlen(jk_shmem.lockname) + 1);
+ jk_ascii2ebcdic((char *)jk_shmem.lockname, wptr);
+ unlink(wptr);
+ free(wptr);
+#else
+ unlink(jk_shmem.lockname);
+#endif
+ free(jk_shmem.lockname);
+ jk_shmem.lockname = NULL;
+ }
+ if (jk_shmem.filename) {
+#ifdef AS400_UTF8
+ wptr = (char *)malloc(strlen(jk_shmem.filename) + 1);
+ jk_ascii2ebcdic((char *)jk_shmem.filename, wptr);
+ unlink(wptr);
+ free(wptr);
+#else
+ unlink(jk_shmem.filename);
+#endif
+ free(jk_shmem.filename);
+ jk_shmem.filename = NULL;
+ }
+ }
+ jk_shmem.size = 0;
+ jk_shmem.hdr = NULL;
+ jk_shmem.fd = -1;
+ jk_shmem.fd_lock = -1;
+}
+
+
+#endif
+
+void *jk_shm_alloc(jk_pool_t *p, size_t size)
+{
+ void *rc = NULL;
+
+ if (jk_shmem.hdr) {
+ size = JK_SHM_ALIGN(size);
+ if ((jk_shmem.hdr->h.data.size - jk_shmem.hdr->h.data.pos) >= size) {
+ rc = &(jk_shmem.hdr->buf[jk_shmem.hdr->h.data.pos]);
+ jk_shmem.hdr->h.data.pos += size;
+ }
+ }
+ else if (p)
+ rc = jk_pool_alloc(p, size);
+
+ return rc;
+}
+
+const char *jk_shm_name()
+{
+ return jk_shmem.filename;
+}
+
+
+time_t jk_shm_get_workers_time()
+{
+ if (jk_shmem.hdr)
+ return jk_shmem.hdr->h.data.modified;
+ else
+ return jk_workers_modified_time;
+}
+
+void jk_shm_set_workers_time(time_t t)
+{
+ if (jk_shmem.hdr)
+ jk_shmem.hdr->h.data.modified = t;
+ else
+ jk_workers_modified_time = t;
+ jk_workers_access_time = t;
+}
+
+int jk_shm_is_modified()
+{
+ time_t m = jk_shm_get_workers_time();
+ if (m != jk_workers_access_time)
+ return 1;
+ else
+ return 0;
+}
+
+void jk_shm_sync_access_time()
+{
+ jk_workers_access_time = jk_shm_get_workers_time();
+}
+
+int jk_shm_lock()
+{
+ int rc;
+ JK_ENTER_CS(&(jk_shmem.cs), rc);
+#if defined (WIN32)
+ if (rc == JK_TRUE && jk_shm_hlock != NULL) {
+ DWORD rv = WaitForSingleObject(jk_shm_hlock, INFINITE);
+ if (rv == WAIT_OBJECT_0 || rv == WAIT_ABANDONED)
+ rc = JK_TRUE;
+ else
+ rc = JK_FALSE;
+ }
+#else
+ if (rc == JK_TRUE && jk_shmem.fd_lock != -1) {
+ JK_ENTER_LOCK(jk_shmem.fd_lock, rc);
+ }
+#endif
+ return rc;
+}
+
+int jk_shm_unlock()
+{
+ int rc;
+ JK_LEAVE_CS(&(jk_shmem.cs), rc);
+#if defined (WIN32)
+ if (rc == JK_TRUE && jk_shm_hlock != NULL) {
+ if (!ReleaseMutex(jk_shm_hlock))
+ rc = JK_FALSE;
+ }
+#else
+ if (rc == JK_TRUE && jk_shmem.fd_lock != -1) {
+ JK_LEAVE_LOCK(jk_shmem.fd_lock, rc);
+ }
+#endif
+ return rc;
+}
+
+jk_shm_ajp_worker_t *jk_shm_alloc_ajp_worker(jk_pool_t *p)
+{
+ jk_shm_ajp_worker_t *w = (jk_shm_ajp_worker_t *)jk_shm_alloc(p, JK_SHM_AJP_WORKER_SIZE);
+ if (w) {
+ memset(w, 0, JK_SHM_AJP_WORKER_SIZE);
+ if (jk_shmem.hdr) {
+ jk_shmem.hdr->h.data.workers++;
+ w->h.id = jk_shmem.hdr->h.data.workers;
+ w->h.type = JK_AJP13_WORKER_TYPE;
+ }
+ else
+ w->h.id = -1;
+ }
+ return w;
+}
+
+jk_shm_lb_sub_worker_t *jk_shm_alloc_lb_sub_worker(jk_pool_t *p)
+{
+ jk_shm_lb_sub_worker_t *w = (jk_shm_lb_sub_worker_t *)jk_shm_alloc(p, JK_SHM_LB_SUB_WORKER_SIZE);
+ if (w) {
+ memset(w, 0, JK_SHM_LB_SUB_WORKER_SIZE);
+ if (jk_shmem.hdr) {
+ jk_shmem.hdr->h.data.workers++;
+ w->h.id = jk_shmem.hdr->h.data.workers;
+ w->h.type = JK_LB_SUB_WORKER_TYPE;
+ }
+ else
+ w->h.id = -1;
+ }
+ return w;
+}
+
+jk_shm_lb_worker_t *jk_shm_alloc_lb_worker(jk_pool_t *p)
+{
+ jk_shm_lb_worker_t *w = (jk_shm_lb_worker_t *)jk_shm_alloc(p, JK_SHM_LB_WORKER_SIZE);
+ if (w) {
+ memset(w, 0, JK_SHM_LB_WORKER_SIZE);
+ if (jk_shmem.hdr) {
+ jk_shmem.hdr->h.data.workers++;
+ w->h.id = jk_shmem.hdr->h.data.workers;
+ w->h.type = JK_LB_WORKER_TYPE;
+ }
+ else
+ w->h.id = -1;
+ }
+ return w;
+}
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_shm.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_shm.h
new file mode 100644
index 00000000..f8d54a45
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_shm.h
@@ -0,0 +1,258 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: Shared Memory object header file *
+ * Author: Mladen Turk <mturk@jboss.com> *
+ * Author: Rainer Jung <rjung@apache.org> *
+ * Version: $Revision: 893253 $ *
+ ***************************************************************************/
+#ifndef _JK_SHM_H
+#define _JK_SHM_H
+
+#include "jk_global.h"
+#include "jk_pool.h"
+#include "jk_util.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+/**
+ * @file jk_shm.h
+ * @brief Jk shared memory management
+ *
+ *
+ */
+
+#define JK_SHM_MAJOR '1'
+#define JK_SHM_MINOR '3'
+#define JK_SHM_STR_SIZ 63
+#define JK_SHM_URI_SIZ 127
+#define JK_SHM_DYNAMIC 16
+#define JK_SHM_MAGIC '!', 'J', 'K', 'S', 'H', 'M', JK_SHM_MAJOR, JK_SHM_MINOR
+#define JK_SHM_MAGIC_SIZ 8
+
+/* Really huge numbers, but 64 workers should be enough */
+#define JK_SHM_MAX_WORKERS 64
+#define JK_SHM_ALIGNMENT 64
+#define JK_SHM_ALIGN(x) JK_ALIGN((x), JK_SHM_ALIGNMENT)
+#define JK_SHM_AJP_WORKER_SIZE JK_SHM_ALIGN(sizeof(jk_shm_ajp_worker_t))
+#define JK_SHM_LB_SUB_WORKER_SIZE JK_SHM_ALIGN(sizeof(jk_shm_lb_sub_worker_t))
+#define JK_SHM_LB_WORKER_SIZE JK_SHM_ALIGN(sizeof(jk_shm_lb_worker_t))
+#define JK_SHM_AJP_SIZE(x) ((x) * JK_SHM_AJP_WORKER_SIZE)
+#define JK_SHM_LB_SUB_SIZE(x) ((x) * JK_SHM_LB_SUB_WORKER_SIZE)
+#define JK_SHM_LB_SIZE(x) ((x) * JK_SHM_LB_WORKER_SIZE)
+#define JK_SHM_DEF_SIZE JK_SHM_AJP_SIZE(JK_SHM_MAX_WORKERS) + JK_SHM_LB_SUB_SIZE(JK_SHM_MAX_WORKERS) + JK_SHM_LB_SIZE(JK_SHM_MAX_WORKERS)
+
+/** jk shm generic worker record structure */
+struct jk_shm_worker_header
+{
+ int id;
+ int type;
+ /* worker name */
+ char name[JK_SHM_STR_SIZ+1];
+ /* Sequence counter starting at 0 and increasing
+ * every time we change the config
+ */
+ volatile unsigned int sequence;
+};
+typedef struct jk_shm_worker_header jk_shm_worker_header_t;
+
+/** jk shm ajp13/ajp14 worker record structure */
+struct jk_shm_ajp_worker
+{
+ jk_shm_worker_header_t h;
+ char host[JK_SHM_STR_SIZ+1];
+ int port;
+ volatile int addr_sequence;
+
+ /* Configuration data mirrored from ajp_worker */
+ int cache_timeout;
+ int connect_timeout;
+ int ping_timeout;
+ int reply_timeout;
+ int prepost_timeout;
+ unsigned int recovery_opts;
+ int retries;
+ int retry_interval;
+ unsigned int max_packet_size;
+ /* current error state (runtime) of the worker */
+ volatile int state;
+ /* Statistical data */
+ /* Number of currently connected channels */
+ volatile int connected;
+ /* Number of currently busy channels */
+ volatile int busy;
+ /* Maximum number of busy channels */
+ volatile int max_busy;
+ volatile time_t error_time;
+ /* Number of bytes read from remote */
+ volatile jk_uint64_t readed;
+ /* Number of bytes transferred to remote */
+ volatile jk_uint64_t transferred;
+ /* Number of times the worker was used */
+ volatile jk_uint64_t used;
+ /* Number of times the worker was used - snapshot during maintenance */
+ volatile jk_uint64_t used_snapshot;
+ /* Number of non 200 responses */
+ volatile jk_uint32_t errors;
+ /* Decayed number of reply_timeout errors */
+ volatile jk_uint32_t reply_timeouts;
+ /* Number of client errors */
+ volatile jk_uint32_t client_errors;
+ /* Last reset time */
+ volatile time_t last_reset;
+ volatile time_t last_maintain_time;
+};
+typedef struct jk_shm_ajp_worker jk_shm_ajp_worker_t;
+
+/** jk shm lb sub worker record structure */
+struct jk_shm_lb_sub_worker
+{
+ jk_shm_worker_header_t h;
+
+ /* route */
+ char route[JK_SHM_STR_SIZ+1];
+ /* worker domain */
+ char domain[JK_SHM_STR_SIZ+1];
+ /* worker redirect route */
+ char redirect[JK_SHM_STR_SIZ+1];
+ /* Number of currently busy channels */
+ volatile int busy;
+ /* worker distance */
+ volatile int distance;
+ /* current activation state (config) of the worker */
+ volatile int activation;
+ /* current error state (runtime) of the worker */
+ volatile int state;
+ /* Current lb factor */
+ volatile int lb_factor;
+ /* Current lb reciprocal factor */
+ volatile jk_uint64_t lb_mult;
+ /* Current lb value */
+ volatile jk_uint64_t lb_value;
+ /* Statistical data */
+ volatile time_t error_time;
+ /* Number of times the worker was elected - snapshot during maintenance */
+ volatile jk_uint64_t elected_snapshot;
+ /* Number of non 200 responses */
+ volatile jk_uint32_t errors;
+};
+typedef struct jk_shm_lb_sub_worker jk_shm_lb_sub_worker_t;
+
+/** jk shm lb worker record structure */
+struct jk_shm_lb_worker
+{
+ jk_shm_worker_header_t h;
+
+ /* Number of currently busy channels */
+ volatile int busy;
+ /* Maximum number of busy channels */
+ volatile int max_busy;
+ int sticky_session;
+ int sticky_session_force;
+ int recover_wait_time;
+ int error_escalation_time;
+ int max_reply_timeouts;
+ int retries;
+ int retry_interval;
+ int lbmethod;
+ int lblock;
+ unsigned int max_packet_size;
+ /* Last reset time */
+ volatile time_t last_reset;
+ volatile time_t last_maintain_time;
+ /* Session cookie */
+ char session_cookie[JK_SHM_STR_SIZ+1];
+ /* Session path */
+ char session_path[JK_SHM_STR_SIZ+1];
+
+};
+typedef struct jk_shm_lb_worker jk_shm_lb_worker_t;
+
+const char *jk_shm_name(void);
+
+/* Calculate needed shm size */
+size_t jk_shm_calculate_size(jk_map_t *init_data, jk_logger_t *l);
+
+/* Open the shared memory creating file if needed
+ */
+int jk_shm_open(const char *fname, size_t sz, jk_logger_t *l);
+
+/* Close the shared memory
+ */
+void jk_shm_close(void);
+
+/* Attach the shared memory in child process.
+ * File has to be opened in parent.
+ */
+int jk_shm_attach(const char *fname, size_t sz, jk_logger_t *l);
+
+/* allocate shm memory
+ * If there is no shm present the pool will be used instead
+ */
+void *jk_shm_alloc(jk_pool_t *p, size_t size);
+
+/* allocate shm ajp worker record
+ * If there is no shm present the pool will be used instead
+ */
+jk_shm_ajp_worker_t *jk_shm_alloc_ajp_worker(jk_pool_t *p);
+
+/* allocate shm lb sub worker record
+ * If there is no shm present the pool will be used instead
+ */
+jk_shm_lb_sub_worker_t *jk_shm_alloc_lb_sub_worker(jk_pool_t *p);
+
+/* allocate shm lb worker record
+ * If there is no shm present the pool will be used instead
+ */
+jk_shm_lb_worker_t *jk_shm_alloc_lb_worker(jk_pool_t *p);
+
+/* Return workers.properties last modified time
+ */
+time_t jk_shm_get_workers_time(void);
+
+/* Set workers.properties last modified time
+ */
+void jk_shm_set_workers_time(time_t t);
+
+/* Check if the shared memory has been modified
+ * by some other process.
+ */
+int jk_shm_is_modified(void);
+
+/* Synchronize access and modification time.
+ * This function should be called when the shared memory
+ * is modified and after we update the config acording
+ * to the current shared memory data.
+ */
+void jk_shm_sync_access_time(void);
+
+
+/* Lock shared memory for thread safe access */
+int jk_shm_lock(void);
+
+/* Unlock shared memory for thread safe access */
+int jk_shm_unlock(void);
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* _JK_SHM_H */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_shm.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_shm.lo
new file mode 100644
index 00000000..44e59ec0
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_shm.lo
@@ -0,0 +1,12 @@
+# jk_shm.lo - a libtool object file
+# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18)
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/jk_shm.o'
+
+# Name of the non-PIC object.
+non_pic_object='jk_shm.o'
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_shm.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_shm.o
new file mode 100644
index 00000000..8f02d766
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_shm.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_sockbuf.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_sockbuf.c
new file mode 100644
index 00000000..da956258
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_sockbuf.c
@@ -0,0 +1,195 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: Simple buffer object to handle buffered socket IO *
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Version: $Revision: 466585 $ *
+ ***************************************************************************/
+
+#include "jk_global.h"
+#include "jk_sockbuf.h"
+
+static int fill_buffer(jk_sockbuf_t *sb);
+
+int jk_sb_open(jk_sockbuf_t *sb, jk_sock_t sd)
+{
+ if (sb && sd >= 0) {
+ sb->end = 0;
+ sb->start = 0;
+ sb->sd = sd;
+ return JK_TRUE;
+ }
+
+ return JK_FALSE;
+}
+
+int jk_sb_write(jk_sockbuf_t *sb, const void *buf, unsigned sz)
+{
+ if (sb && buf && sz) {
+ if ((SOCKBUF_SIZE - sb->end) >= sz) {
+ memcpy(sb->buf + sb->end, buf, sz);
+ sb->end += sz;
+ }
+ else {
+ if (!jk_sb_flush(sb)) {
+ return JK_FALSE;
+ }
+ if (sz > SOCKBUF_SIZE) {
+ return (send(sb->sd, (char *)buf, sz, 0) == (int)sz);
+ }
+
+ memcpy(sb->buf + sb->end, buf, sz);
+ sb->end += sz;
+ }
+
+ return JK_TRUE;
+ }
+
+ return JK_FALSE;
+}
+
+int jk_sb_flush(jk_sockbuf_t *sb)
+{
+ if (sb) {
+ int save_out = sb->end;
+ sb->end = sb->start = 0;
+ if (save_out) {
+ return send(sb->sd, sb->buf, save_out, 0) == save_out;
+ }
+ return JK_TRUE;
+ }
+
+ return JK_FALSE;
+}
+
+
+int jk_sb_read(jk_sockbuf_t *sb, char **buf, unsigned sz, unsigned *ac)
+{
+ if (sb && buf && ac) {
+ unsigned avail;
+
+ *ac = 0;
+ *buf = NULL;
+
+ if (sb->end == sb->start) {
+ sb->end = sb->start = 0;
+ if (fill_buffer(sb) < 0) {
+ return JK_FALSE;
+ }
+ }
+
+ *buf = sb->buf + sb->start;
+ avail = sb->end - sb->start;
+ if (avail > sz) {
+ *ac = sz;
+ }
+ else {
+ *ac = avail;
+ }
+ sb->start += *ac;
+
+ return JK_TRUE;
+ }
+
+ return JK_FALSE;
+}
+
+int jk_sb_gets(jk_sockbuf_t *sb, char **ps)
+{
+ int ret;
+ if (sb) {
+ while (1) {
+ unsigned i;
+ for (i = sb->start; i < sb->end; i++) {
+ if (JK_LF == sb->buf[i]) {
+ if (i > sb->start && JK_CR == sb->buf[i - 1]) {
+ sb->buf[i - 1] = '\0';
+ }
+ else {
+ sb->buf[i] = '\0';
+ }
+ *ps = sb->buf + sb->start;
+ sb->start = (i + 1);
+ return JK_TRUE;
+ }
+ }
+ if ((ret = fill_buffer(sb)) < 0) {
+ return JK_FALSE;
+ }
+ else if (ret == 0) {
+ *ps = sb->buf + sb->start;
+ if ((SOCKBUF_SIZE - sb->end) > 0) {
+ sb->buf[sb->end] = '\0';
+ }
+ else {
+ sb->buf[sb->end - 1] = '\0';
+ }
+ return JK_TRUE;
+ }
+ }
+ }
+
+ return JK_FALSE;
+}
+
+/*
+ * Read data from the socket into the associated buffer, and update the
+ * start and end indices. May move the data currently in the buffer. If
+ * new data is read into the buffer (or if it is already full), returns 1.
+ * If EOF is received on the socket, returns 0. In case of error returns
+ * -1.
+ */
+static int fill_buffer(jk_sockbuf_t *sb)
+{
+ int ret;
+
+ /*
+ * First move the current data to the beginning of the buffer
+ */
+ if (sb->start < sb->end) {
+ if (sb->start > 0) {
+ unsigned to_copy = sb->end - sb->start;
+ memmove(sb->buf, sb->buf + sb->start, to_copy);
+ sb->start = 0;
+ sb->end = to_copy;
+ }
+ }
+ else {
+ sb->start = sb->end = 0;
+ }
+
+ /*
+ * In the unlikely case where the buffer is already full, we won't be
+ * reading anything and we'd be calling recv with a 0 count.
+ */
+ if ((SOCKBUF_SIZE - sb->end) > 0) {
+ /*
+ * Now, read more data
+ */
+ ret = recv(sb->sd, sb->buf + sb->end, SOCKBUF_SIZE - sb->end, 0);
+
+ /* 0 is EOF/SHUTDOWN, -1 is SOCK_ERROR */
+ if (ret <= 0) {
+ return ret;
+ }
+
+ sb->end += ret;
+ }
+
+ return 1;
+}
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_sockbuf.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_sockbuf.h
new file mode 100644
index 00000000..4ed75141
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_sockbuf.h
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: Socket buffer header file *
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Version: $Revision: 466585 $ *
+ ***************************************************************************/
+
+#include "jk_global.h"
+
+#define SOCKBUF_SIZE (8*1024)
+
+struct jk_sockbuf
+{
+ char buf[SOCKBUF_SIZE];
+ unsigned int start;
+ unsigned int end;
+ jk_sock_t sd;
+};
+typedef struct jk_sockbuf jk_sockbuf_t;
+
+int jk_sb_open(jk_sockbuf_t *sb, jk_sock_t sd);
+
+int jk_sb_write(jk_sockbuf_t *sb, const void *buf, unsigned sz);
+
+int jk_sb_read(jk_sockbuf_t *sb, char **buf, unsigned sz, unsigned *ac);
+
+int jk_sb_flush(jk_sockbuf_t *sb);
+
+int jk_sb_gets(jk_sockbuf_t *sb, char **ps);
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_sockbuf.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_sockbuf.lo
new file mode 100644
index 00000000..81ac7e40
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_sockbuf.lo
@@ -0,0 +1,12 @@
+# jk_sockbuf.lo - a libtool object file
+# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18)
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/jk_sockbuf.o'
+
+# Name of the non-PIC object.
+non_pic_object='jk_sockbuf.o'
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_sockbuf.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_sockbuf.o
new file mode 100644
index 00000000..53350c5d
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_sockbuf.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_status.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_status.c
new file mode 100644
index 00000000..d9c0a6ad
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_status.c
@@ -0,0 +1,5200 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: Status worker, display and manages JK workers *
+ * Author: Mladen Turk <mturk@jboss.com> *
+ * Author: Rainer Jung <rjung@apache.org> *
+ * Version: $Revision: 1054603 $ *
+ ***************************************************************************/
+
+#include "jk_pool.h"
+#include "jk_service.h"
+#include "jk_util.h"
+#include "jk_worker.h"
+#include "jk_status.h"
+#include "jk_mt.h"
+#include "jk_shm.h"
+#include "jk_ajp_common.h"
+#include "jk_lb_worker.h"
+#include "jk_ajp13_worker.h"
+#include "jk_ajp14_worker.h"
+#include "jk_connect.h"
+#include "jk_uri_worker_map.h"
+
+#define HUGE_BUFFER_SIZE (8*1024)
+
+/**
+ * Command line reference:
+ * cmd=list (default) display configuration
+ * cmd=show display detailed configuration
+ * cmd=edit form to change configuration
+ * cmd=update commit update configuration
+ * cmd=reset reset lb runtime states, or lb member runtime states
+ * cmd=version show only software version
+ * Query arguments:
+ * re=n (refresh time in seconds, n=0: disabled)
+ * w=worker (cmd should be executed for worker "worker")
+ * sw=sub_worker (cmd should be executed for "sub_worker" of worker "worker")
+ * from=lastcmd (the last viewing command was "lastcmd")
+ * opt=option (changes meaning of edit and list/show)
+ */
+
+#define JK_STATUS_ARG_CMD "cmd"
+#define JK_STATUS_ARG_MIME "mime"
+#define JK_STATUS_ARG_FROM "from"
+#define JK_STATUS_ARG_REFRESH "re"
+#define JK_STATUS_ARG_WORKER "w"
+#define JK_STATUS_ARG_SUB_WORKER "sw"
+#define JK_STATUS_ARG_PREV_SUB_WORKER "psw"
+#define JK_STATUS_ARG_ATTRIBUTE "att"
+#define JK_STATUS_ARG_MULT_VALUE_BASE "val"
+#define JK_STATUS_ARG_OPTIONS "opt"
+
+#define JK_STATUS_ARG_OPTION_NO_MEMBERS 0x0001
+#define JK_STATUS_ARG_OPTION_NO_MAPS 0x0002
+#define JK_STATUS_ARG_OPTION_NO_LEGEND 0x0004
+#define JK_STATUS_ARG_OPTION_NO_LB 0x0008
+#define JK_STATUS_ARG_OPTION_NO_AJP 0x0010
+#define JK_STATUS_ARG_OPTION_READ_ONLY 0x0020
+#define JK_STATUS_ARG_OPTION_NO_LB_CONF 0x0040
+#define JK_STATUS_ARG_OPTION_NO_LB_SUMMARY 0x0080
+#define JK_STATUS_ARG_OPTION_NO_AJP_CONF 0x0100
+
+#define JK_STATUS_ARG_LB_RETRIES ("vlr")
+#define JK_STATUS_ARG_LB_RETRY_INT ("vlri")
+#define JK_STATUS_ARG_LB_RECOVER_TIME ("vlt")
+#define JK_STATUS_ARG_LB_ERROR_ESCALATION_TIME ("vlee")
+#define JK_STATUS_ARG_LB_MAX_REPLY_TIMEOUTS ("vlx")
+#define JK_STATUS_ARG_LB_STICKY ("vls")
+#define JK_STATUS_ARG_LB_STICKY_FORCE ("vlf")
+#define JK_STATUS_ARG_LB_METHOD ("vlm")
+#define JK_STATUS_ARG_LB_LOCK ("vll")
+
+#define JK_STATUS_ARG_LB_TEXT_RETRIES "Retries"
+#define JK_STATUS_ARG_LB_TEXT_RETRY_INT "Retry Interval"
+#define JK_STATUS_ARG_LB_TEXT_RECOVER_TIME "Recover Wait Time"
+#define JK_STATUS_ARG_LB_TEXT_ERROR_ESCALATION_TIME "Error Escalation Time"
+#define JK_STATUS_ARG_LB_TEXT_MAX_REPLY_TIMEOUTS "Max Reply Timeouts"
+#define JK_STATUS_ARG_LB_TEXT_STICKY "Sticky Sessions"
+#define JK_STATUS_ARG_LB_TEXT_STICKY_FORCE "Force Sticky Sessions"
+#define JK_STATUS_ARG_LB_TEXT_METHOD "LB Method"
+#define JK_STATUS_ARG_LB_TEXT_LOCK "Locking"
+
+#define JK_STATUS_ARG_LBM_ACTIVATION ("vwa")
+#define JK_STATUS_ARG_LBM_FACTOR ("vwf")
+#define JK_STATUS_ARG_LBM_ROUTE ("vwn")
+#define JK_STATUS_ARG_LBM_REDIRECT ("vwr")
+#define JK_STATUS_ARG_LBM_DOMAIN ("vwc")
+#define JK_STATUS_ARG_LBM_DISTANCE ("vwd")
+
+#define JK_STATUS_ARG_LBM_TEXT_ACTIVATION "Activation"
+#define JK_STATUS_ARG_LBM_TEXT_FACTOR "LB Factor"
+#define JK_STATUS_ARG_LBM_TEXT_ROUTE "Route"
+#define JK_STATUS_ARG_LBM_TEXT_REDIRECT "Redirect Route"
+#define JK_STATUS_ARG_LBM_TEXT_DOMAIN "Cluster Domain"
+#define JK_STATUS_ARG_LBM_TEXT_DISTANCE "Distance"
+
+#define JK_STATUS_ARG_AJP_CACHE_TO "vacpt"
+#define JK_STATUS_ARG_AJP_PING_TO "vapng"
+#define JK_STATUS_ARG_AJP_CONNECT_TO "vact"
+#define JK_STATUS_ARG_AJP_PREPOST_TO "vapt"
+#define JK_STATUS_ARG_AJP_REPLY_TO "vart"
+#define JK_STATUS_ARG_AJP_RETRIES "var"
+#define JK_STATUS_ARG_AJP_RETRY_INT "vari"
+#define JK_STATUS_ARG_AJP_REC_OPTS "varo"
+#define JK_STATUS_ARG_AJP_MAX_PK_SZ "vamps"
+#define JK_STATUS_ARG_AJP_CPING_INT "vacpi"
+#define JK_STATUS_ARG_AJP_HOST_STR "vahst"
+#define JK_STATUS_ARG_AJP_PORT "vaprt"
+
+#define JK_STATUS_ARG_AJP_TEXT_CACHE_TO "Connection Pool Timeout"
+#define JK_STATUS_ARG_AJP_TEXT_PING_TO "Ping Timeout"
+#define JK_STATUS_ARG_AJP_TEXT_CONNECT_TO "Connect Timeout"
+#define JK_STATUS_ARG_AJP_TEXT_PREPOST_TO "Prepost Timeout"
+#define JK_STATUS_ARG_AJP_TEXT_REPLY_TO "Reply Timeout"
+#define JK_STATUS_ARG_AJP_TEXT_RETRIES "Retries"
+#define JK_STATUS_ARG_AJP_TEXT_RETRY_INT "Retry Interval"
+#define JK_STATUS_ARG_AJP_TEXT_REC_OPTS "Recovery Options"
+#define JK_STATUS_ARG_AJP_TEXT_MAX_PK_SZ "Max Packet Size"
+#define JK_STATUS_ARG_AJP_TEXT_CPING_INT "Connection Ping Interval"
+#define JK_STATUS_ARG_AJP_TEXT_HOST_STR "Hostname"
+#define JK_STATUS_ARG_AJP_TEXT_PORT "Port"
+#define JK_STATUS_ARG_AJP_TEXT_ADDR_STR "Address:Port"
+
+#define JK_STATUS_CMD_UNKNOWN (0)
+#define JK_STATUS_CMD_LIST (1)
+#define JK_STATUS_CMD_SHOW (2)
+#define JK_STATUS_CMD_EDIT (3)
+#define JK_STATUS_CMD_UPDATE (4)
+#define JK_STATUS_CMD_RESET (5)
+#define JK_STATUS_CMD_VERSION (6)
+#define JK_STATUS_CMD_RECOVER (7)
+#define JK_STATUS_CMD_DUMP (8)
+#define JK_STATUS_CMD_DEF (JK_STATUS_CMD_LIST)
+#define JK_STATUS_CMD_MAX (JK_STATUS_CMD_DUMP)
+#define JK_STATUS_CMD_TEXT_UNKNOWN ("unknown")
+#define JK_STATUS_CMD_TEXT_LIST ("list")
+#define JK_STATUS_CMD_TEXT_SHOW ("show")
+#define JK_STATUS_CMD_TEXT_EDIT ("edit")
+#define JK_STATUS_CMD_TEXT_UPDATE ("update")
+#define JK_STATUS_CMD_TEXT_RESET ("reset")
+#define JK_STATUS_CMD_TEXT_VERSION ("version")
+#define JK_STATUS_CMD_TEXT_RECOVER ("recover")
+#define JK_STATUS_CMD_TEXT_DUMP ("dump")
+#define JK_STATUS_CMD_TEXT_DEF (JK_STATUS_CMD_TEXT_LIST)
+
+#define JK_STATUS_CMD_PROP_CHECK_WORKER 0x00000001
+#define JK_STATUS_CMD_PROP_READONLY 0x00000002
+#define JK_STATUS_CMD_PROP_HEAD 0x00000004
+#define JK_STATUS_CMD_PROP_REFRESH 0x00000008
+#define JK_STATUS_CMD_PROP_BACK_LINK 0x00000010
+#define JK_STATUS_CMD_PROP_BACK_LIST 0x00000020
+#define JK_STATUS_CMD_PROP_FMT 0x00000040
+#define JK_STATUS_CMD_PROP_SWITCH_RO 0x00000080
+#define JK_STATUS_CMD_PROP_DUMP_LINK 0x00000100
+#define JK_STATUS_CMD_PROP_LINK_HELP 0x00000200
+#define JK_STATUS_CMD_PROP_LEGEND 0x00000400
+#define JK_STATUS_CMD_PROP_WILDCARD 0x00000800
+
+#define JK_STATUS_MIME_UNKNOWN (0)
+#define JK_STATUS_MIME_HTML (1)
+#define JK_STATUS_MIME_XML (2)
+#define JK_STATUS_MIME_TXT (3)
+#define JK_STATUS_MIME_PROP (4)
+#define JK_STATUS_MIME_DEF (JK_STATUS_MIME_HTML)
+#define JK_STATUS_MIME_MAX (JK_STATUS_MIME_PROP)
+#define JK_STATUS_MIME_TEXT_UNKNOWN ("unknown")
+#define JK_STATUS_MIME_TEXT_HTML ("html")
+#define JK_STATUS_MIME_TEXT_XML ("xml")
+#define JK_STATUS_MIME_TEXT_TXT ("txt")
+#define JK_STATUS_MIME_TEXT_PROP ("prop")
+#define JK_STATUS_MIME_TEXT_DEF (JK_STATUS_MIME_TEXT_HTML)
+
+#define JK_STATUS_MASK_ACTIVE 0x000000FF
+#define JK_STATUS_MASK_DISABLED 0x0000FF00
+#define JK_STATUS_MASK_STOPPED 0x00FF0000
+#define JK_STATUS_MASK_OK 0x00010101
+#define JK_STATUS_MASK_IDLE 0x00020202
+#define JK_STATUS_MASK_BUSY 0x00040404
+#define JK_STATUS_MASK_RECOVER 0x00080808
+#define JK_STATUS_MASK_ERROR 0x00101010
+#define JK_STATUS_MASK_GOOD_DEF 0x0000000F
+#define JK_STATUS_MASK_BAD_DEF 0x00FF1010
+
+#define JK_STATUS_NEEDS_PUSH 0x00000001
+#define JK_STATUS_NEEDS_RESET_LB_VALUES 0x00000002
+#define JK_STATUS_NEEDS_UPDATE_MULT 0x00000004
+#define JK_STATUS_NEEDS_ADDR_PUSH 0x00000008
+
+#define JK_STATUS_WAIT_AFTER_UPDATE "3"
+#define JK_STATUS_REFRESH_DEF "10"
+#define JK_STATUS_ESC_CHARS ("<>?\"")
+#define JK_STATUS_TIME_FMT_HTML "%a, %d %b %Y %X %Z"
+#define JK_STATUS_TIME_FMT_TEXT "%Y%m%d%H%M%S"
+#define JK_STATUS_TIME_FMT_TZ "%Z"
+#define JK_STATUS_TIME_BUF_SZ (80)
+
+#define JK_STATUS_HEAD "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n" \
+ "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"" \
+ " \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n" \
+ "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">" \
+ "<head><title>JK Status Manager</title>"
+
+#define JK_STATUS_COPYRIGHT "Copyright &#169; 1999-2011, The Apache Software Foundation<br />" \
+ "Licensed under the <a href=\"http://www.apache.org/licenses/LICENSE-2.0\">" \
+ "Apache License, Version 2.0</a>."
+
+#define JK_STATUS_HEND "</head>\n<body>\n"
+#define JK_STATUS_BEND "</body>\n</html>\n"
+
+#define JK_STATUS_XMLH "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"
+
+#define JK_STATUS_NS_DEF "jk:"
+#define JK_STATUS_XMLNS_DEF "xmlns:jk=\"http://tomcat.apache.org\""
+#define JK_STATUS_PREFIX_DEF "worker"
+
+#define JK_STATUS_FORM_START "<form method=\"%s\" action=\"%s\">\n"
+#define JK_STATUS_FORM_HIDDEN_INT "<input type=\"hidden\" name=\"%s\" value=\"%d\"/>\n"
+#define JK_STATUS_FORM_HIDDEN_STRING "<input type=\"hidden\" name=\"%s\" value=\"%s\"/>\n"
+#define JK_STATUS_URI_MAP_TABLE_HEAD "<tr><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th></tr>\n"
+#define JK_STATUS_URI_MAP_TABLE_ROW "<tr><td>%s</td><td>%s</td><td>%s</td><td>%d</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%d</td></tr>\n"
+#define JK_STATUS_URI_MAP_TABLE_HEAD2 "<tr><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th></tr>\n"
+#define JK_STATUS_URI_MAP_TABLE_ROW2 "<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%d</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%d</td></tr>\n"
+#define JK_STATUS_SHOW_AJP_CONF_HEAD "<tr>" \
+ "<th>Type</th>" \
+ "<th>" JK_STATUS_ARG_AJP_TEXT_HOST_STR "</th>" \
+ "<th>" JK_STATUS_ARG_AJP_TEXT_ADDR_STR "</th>" \
+ "<th>" JK_STATUS_ARG_AJP_TEXT_CACHE_TO "</th>" \
+ "<th>" JK_STATUS_ARG_AJP_TEXT_CONNECT_TO "</th>" \
+ "<th>" JK_STATUS_ARG_AJP_TEXT_PREPOST_TO "</th>" \
+ "<th>" JK_STATUS_ARG_AJP_TEXT_REPLY_TO "</th>" \
+ "<th>" JK_STATUS_ARG_AJP_TEXT_RETRIES "</th>" \
+ "<th>" JK_STATUS_ARG_AJP_TEXT_REC_OPTS "</th>" \
+ "<th>" JK_STATUS_ARG_AJP_TEXT_MAX_PK_SZ "</th>" \
+ "<th>\n"
+#define JK_STATUS_SHOW_AJP_CONF_ROW "<tr>" \
+ "<td>%s</td>" \
+ "<td>%s</td>" \
+ "<td>%s</td>" \
+ "<td>%d</td>" \
+ "<td>%d</td>" \
+ "<td>%d</td>" \
+ "<td>%d</td>" \
+ "<td>%u</td>" \
+ "<td>%u</td>" \
+ "<td></td>" \
+ "</tr>\n"
+#define JK_STATUS_SHOW_AJP_HEAD "<tr>" \
+ "<th>State</th>" \
+ "<th>Acc</th>" \
+ "<th>Err</th><th>CE</th><th>RE</th>" \
+ "<th>Wr</th><th>Rd</th><th>Busy</th><th>Max</th><th>Con</th><th>LR</th><th>LE</th>" \
+ "</tr>\n"
+#define JK_STATUS_SHOW_AJP_ROW "<tr>" \
+ "<td>%s</td>" \
+ "<td>%" JK_UINT64_T_FMT " (%d/sec)</td>" \
+ "<td>%" JK_UINT32_T_FMT "</td>" \
+ "<td>%" JK_UINT32_T_FMT "</td>" \
+ "<td>%" JK_UINT32_T_FMT "</td>" \
+ "<td>%s (%s/sec)</td>" \
+ "<td>%s (%s/sec)</td>" \
+ "<td>%d</td>" \
+ "<td>%d</td>" \
+ "<td>%d</td>" \
+ "<td>%d</td>" \
+ "<td>%s</td>" \
+ "</tr>\n"
+#define JK_STATUS_SHOW_LB_HEAD "<tr>" \
+ "<th>Type</th>" \
+ "<th>" JK_STATUS_ARG_LB_TEXT_STICKY "</th>" \
+ "<th>" JK_STATUS_ARG_LB_TEXT_STICKY_FORCE "</th>" \
+ "<th>" JK_STATUS_ARG_LB_TEXT_RETRIES "</th>" \
+ "<th>" JK_STATUS_ARG_LB_TEXT_METHOD "</th>" \
+ "<th>" JK_STATUS_ARG_LB_TEXT_LOCK "</th>" \
+ "<th>" JK_STATUS_ARG_LB_TEXT_RECOVER_TIME "</th>" \
+ "<th>" JK_STATUS_ARG_LB_TEXT_ERROR_ESCALATION_TIME "</th>" \
+ "<th>" JK_STATUS_ARG_LB_TEXT_MAX_REPLY_TIMEOUTS "</th>" \
+ "<th>\n"
+#define JK_STATUS_SHOW_LB_ROW "<tr>" \
+ "<td>%s</td>" \
+ "<td>%s</td>" \
+ "<td>%s</td>" \
+ "<td>%d</td>" \
+ "<td>%s</td>" \
+ "<td>%s</td>" \
+ "<td>%d</td>" \
+ "<td>%d</td>" \
+ "<td>%d</td>" \
+ "<td></td>" \
+ "</tr>\n"
+#define JK_STATUS_SHOW_MEMBER_HEAD "<tr>" \
+ "<th>&nbsp;</th><th>Name</th>" \
+ "<th>Act</th><th>State</th>" \
+ "<th>D</th><th>F</th><th>M</th>" \
+ "<th>V</th><th>Acc</th>" \
+ "<th>Err</th><th>CE</th><th>RE</th>" \
+ "<th>Wr</th><th>Rd</th><th>Busy</th><th>Max</th><th>Con</th>" \
+ "<th>" JK_STATUS_ARG_LBM_TEXT_ROUTE "</th>" \
+ "<th>RR</th><th>Cd</th><th>Rs</th><th>LR</th><th>LE</th>" \
+ "</tr>\n"
+#define JK_STATUS_SHOW_MEMBER_ROW "<td>%s</td>" \
+ "<td>%s</td>" \
+ "<td>%s</td>" \
+ "<td>%d</td>" \
+ "<td>%d</td>" \
+ "<td>%" JK_UINT64_T_FMT "</td>" \
+ "<td>%" JK_UINT64_T_FMT "</td>" \
+ "<td>%" JK_UINT64_T_FMT " (%d/sec)</td>" \
+ "<td>%" JK_UINT32_T_FMT "</td>" \
+ "<td>%" JK_UINT32_T_FMT "</td>" \
+ "<td>%" JK_UINT32_T_FMT "</td>" \
+ "<td>%s (%s/sec)</td>" \
+ "<td>%s (%s/sec)</td>" \
+ "<td>%d</td>" \
+ "<td>%d</td>" \
+ "<td>%d</td>" \
+ "<td>%s</td>" \
+ "<td>%s</td>" \
+ "<td>%s</td>" \
+ "<td>%d/%d</td>" \
+ "<td>%d</td>" \
+ "<td>%s</td>" \
+ "</tr>\n"
+#define JK_STATUS_SHOW_MEMBER_CONF_HEAD "<tr>" \
+ "<th>Name</th><th>Type</th>" \
+ "<th>" JK_STATUS_ARG_AJP_TEXT_HOST_STR "</th>" \
+ "<th>" JK_STATUS_ARG_AJP_TEXT_ADDR_STR "</th>" \
+ "<th>" JK_STATUS_ARG_AJP_TEXT_CACHE_TO "</th>" \
+ "<th>" JK_STATUS_ARG_AJP_TEXT_CONNECT_TO "</th>" \
+ "<th>" JK_STATUS_ARG_AJP_TEXT_PREPOST_TO "</th>" \
+ "<th>" JK_STATUS_ARG_AJP_TEXT_REPLY_TO "</th>" \
+ "<th>" JK_STATUS_ARG_AJP_TEXT_RETRIES "</th>" \
+ "<th>" JK_STATUS_ARG_AJP_TEXT_REC_OPTS "</th>" \
+ "<th>" JK_STATUS_ARG_AJP_TEXT_MAX_PK_SZ "</th>" \
+ "<th>\n"
+#define JK_STATUS_SHOW_MEMBER_CONF_ROW "<tr>" \
+ "<td>%s</td>" \
+ "<td>%s</td>" \
+ "<td>%s</td>" \
+ "<td>%s</td>" \
+ "<td>%d</td>" \
+ "<td>%d</td>" \
+ "<td>%d</td>" \
+ "<td>%d</td>" \
+ "<td>%d</td>" \
+ "<td>%u</td>" \
+ "<td>%u</td>" \
+ "<td></td>" \
+ "</tr>\n"
+
+typedef struct status_worker status_worker_t;
+
+struct status_endpoint
+{
+ status_worker_t *worker;
+
+ char *query_string;
+ jk_map_t *req_params;
+ char *msg;
+
+ jk_endpoint_t endpoint;
+
+};
+
+typedef struct status_endpoint status_endpoint_t;
+
+struct status_worker
+{
+ jk_pool_t p;
+ jk_pool_atom_t buf[TINY_POOL_SIZE];
+ const char *name;
+ const char *css;
+ const char *ns;
+ const char *xmlns;
+ const char *doctype;
+ const char *prefix;
+ int read_only;
+ char **user_names;
+ unsigned int num_of_users;
+ int user_case_insensitive;
+ jk_uint32_t good_mask;
+ jk_uint32_t bad_mask;
+ jk_worker_t worker;
+ jk_worker_env_t *we;
+};
+
+static const char *worker_type[] = {
+ "unknown",
+ "ajp12",
+ "ajp13",
+ "ajp14",
+ "jni",
+ "lb",
+ "status",
+ NULL
+};
+
+static const char *headers_names[] = {
+ "Content-Type",
+ "Cache-Control",
+ "Pragma",
+ NULL
+};
+
+static const char *cmd_type[] = {
+ JK_STATUS_CMD_TEXT_UNKNOWN,
+ JK_STATUS_CMD_TEXT_LIST,
+ JK_STATUS_CMD_TEXT_SHOW,
+ JK_STATUS_CMD_TEXT_EDIT,
+ JK_STATUS_CMD_TEXT_UPDATE,
+ JK_STATUS_CMD_TEXT_RESET,
+ JK_STATUS_CMD_TEXT_VERSION,
+ JK_STATUS_CMD_TEXT_RECOVER,
+ JK_STATUS_CMD_TEXT_DUMP,
+ NULL
+};
+
+static const char *mime_type[] = {
+ JK_STATUS_MIME_TEXT_UNKNOWN,
+ JK_STATUS_MIME_TEXT_HTML,
+ JK_STATUS_MIME_TEXT_XML,
+ JK_STATUS_MIME_TEXT_TXT,
+ JK_STATUS_MIME_TEXT_PROP,
+ NULL
+};
+
+#define HEADERS_NO_CACHE "no-cache", "no-cache", NULL
+
+static const char *headers_vhtml[] = {
+ "text/html",
+ HEADERS_NO_CACHE
+};
+
+static const char *headers_vxml[] = {
+ "text/xml",
+ HEADERS_NO_CACHE
+};
+
+static const char *headers_vtxt[] = {
+ "text/plain",
+ HEADERS_NO_CACHE
+};
+
+static void jk_puts(jk_ws_service_t *s, const char *str)
+{
+ if (str)
+ s->write(s, str, (unsigned int)strlen(str));
+ else
+ s->write(s, "(null)", 6);
+}
+
+static void jk_putv(jk_ws_service_t *s, ...)
+{
+ va_list va;
+ const char *str;
+
+ va_start(va, s);
+ while (1) {
+ str = va_arg(va, const char *);
+ if (str == NULL)
+ break;
+ s->write(s, str, (unsigned int)strlen(str));
+ }
+ va_end(va);
+}
+
+static int jk_printf(jk_ws_service_t *s, const char *fmt, ...)
+{
+ int rc = 0;
+ va_list args;
+#ifdef NETWARE
+/* On NetWare, this can get called on a thread that has a limited stack so */
+/* we will allocate and free the temporary buffer in this function */
+ char *buf;
+#else
+ char buf[HUGE_BUFFER_SIZE];
+#endif
+
+ if (!s || !fmt) {
+ return -1;
+ }
+ va_start(args, fmt);
+
+#ifdef NETWARE
+ buf = (char *)malloc(HUGE_BUFFER_SIZE);
+ if (NULL == buf)
+ return -1;
+#endif
+ rc = vsnprintf(buf, HUGE_BUFFER_SIZE, fmt, args);
+ va_end(args);
+ if (rc > 0)
+ s->write(s, buf, rc);
+#ifdef NETWARE
+ free(buf);
+#endif
+ return rc;
+}
+
+static void jk_print_xml_start_elt(jk_ws_service_t *s, status_worker_t *w,
+ int indentation, int close_tag,
+ const char *name)
+{
+ if (close_tag) {
+ jk_printf(s, "%*s<%s%s>\n", indentation, "", w->ns, name);
+ }
+ else {
+ jk_printf(s, "%*s<%s%s\n", indentation, "", w->ns, name);
+ }
+}
+
+static void jk_print_xml_close_elt(jk_ws_service_t *s, status_worker_t *w,
+ int indentation,
+ const char *name)
+{
+ jk_printf(s, "%*s</%s%s>\n", indentation, "", w->ns, name);
+}
+
+static void jk_print_xml_stop_elt(jk_ws_service_t *s,
+ int indentation, int close_tag)
+{
+ if (close_tag) {
+ jk_printf(s, "%*s/>\n", indentation, "");
+ }
+ else {
+ jk_printf(s, "%*s>\n", indentation, "");
+ }
+}
+
+static void jk_print_xml_att_string(jk_ws_service_t *s,
+ int indentation,
+ const char *key, const char *value)
+{
+ jk_printf(s, "%*s%s=\"%s\"\n", indentation, "", key, value ? value : "");
+}
+
+static void jk_print_xml_att_int(jk_ws_service_t *s,
+ int indentation,
+ const char *key, int value)
+{
+ jk_printf(s, "%*s%s=\"%d\"\n", indentation, "", key, value);
+}
+
+static void jk_print_xml_att_uint(jk_ws_service_t *s,
+ int indentation,
+ const char *key, unsigned int value)
+{
+ jk_printf(s, "%*s%s=\"%u\"\n", indentation, "", key, value);
+}
+
+static void jk_print_xml_att_long(jk_ws_service_t *s,
+ int indentation,
+ const char *key, long value)
+{
+ jk_printf(s, "%*s%s=\"%ld\"\n", indentation, "", key, value);
+}
+
+static void jk_print_xml_att_uint32(jk_ws_service_t *s,
+ int indentation,
+ const char *key, jk_uint32_t value)
+{
+ jk_printf(s, "%*s%s=\"%" JK_UINT32_T_FMT "\"\n", indentation, "", key, value);
+}
+
+static void jk_print_xml_att_uint64(jk_ws_service_t *s,
+ int indentation,
+ const char *key, jk_uint64_t value)
+{
+ jk_printf(s, "%*s%s=\"%" JK_UINT64_T_FMT "\"\n", indentation, "", key, value);
+}
+
+static void jk_print_prop_att_string(jk_ws_service_t *s, status_worker_t *w,
+ const char *name,
+ const char *key, const char *value)
+{
+ if (name) {
+ jk_printf(s, "%s.%s.%s=%s\n", w->prefix, name, key, value ? value : "");
+ }
+ else {
+ jk_printf(s, "%s.%s=%s\n", w->prefix, key, value ? value : "");
+ }
+}
+
+static void jk_print_prop_att_int(jk_ws_service_t *s, status_worker_t *w,
+ const char *name,
+ const char *key, int value)
+{
+ if (name) {
+ jk_printf(s, "%s.%s.%s=%d\n", w->prefix, name, key, value);
+ }
+ else {
+ jk_printf(s, "%s.%s=%d\n", w->prefix, key, value);
+ }
+}
+
+static void jk_print_prop_att_uint(jk_ws_service_t *s, status_worker_t *w,
+ const char *name,
+ const char *key, unsigned int value)
+{
+ if (name) {
+ jk_printf(s, "%s.%s.%s=%u\n", w->prefix, name, key, value);
+ }
+ else {
+ jk_printf(s, "%s.%s=%u\n", w->prefix, key, value);
+ }
+}
+
+static void jk_print_prop_att_long(jk_ws_service_t *s, status_worker_t *w,
+ const char *name,
+ const char *key, long value)
+{
+ if (name) {
+ jk_printf(s, "%s.%s.%s=%ld\n", w->prefix, name, key, value);
+ }
+ else {
+ jk_printf(s, "%s.%s=%ld\n", w->prefix, key, value);
+ }
+}
+
+static void jk_print_prop_att_uint32(jk_ws_service_t *s, status_worker_t *w,
+ const char *name,
+ const char *key, jk_uint32_t value)
+{
+ if (name) {
+ jk_printf(s, "%s.%s.%s=%" JK_UINT32_T_FMT "\n", w->prefix, name, key, value);
+ }
+ else {
+ jk_printf(s, "%s.%s=%" JK_UINT32_T_FMT "\n", w->prefix, key, value);
+ }
+}
+
+static void jk_print_prop_att_uint64(jk_ws_service_t *s, status_worker_t *w,
+ const char *name,
+ const char *key, jk_uint64_t value)
+{
+ if (name) {
+ jk_printf(s, "%s.%s.%s=%" JK_UINT64_T_FMT "\n", w->prefix, name, key, value);
+ }
+ else {
+ jk_printf(s, "%s.%s=%" JK_UINT64_T_FMT "\n", w->prefix, key, value);
+ }
+}
+
+static void jk_print_prop_item_int(jk_ws_service_t *s, status_worker_t *w,
+ const char *name, const char *list, int num,
+ const char *key, int value)
+{
+ if (name) {
+ jk_printf(s, "%s.%s.%s.%d.%s=%d\n", w->prefix, name, list, num, key, value);
+ }
+ else {
+ jk_printf(s, "%s.%s.%d.%s=%d\n", w->prefix, list, num, key, value);
+ }
+}
+
+static void jk_print_prop_item_string(jk_ws_service_t *s, status_worker_t *w,
+ const char *name, const char *list, int num,
+ const char *key, const char *value)
+{
+ if (name) {
+ jk_printf(s, "%s.%s.%s.%d.%s=%s\n", w->prefix, name, list, num, key, value ? value : "");
+ }
+ else {
+ jk_printf(s, "%s.%s.%d.%s=%s\n", w->prefix, list, num, key, value ? value : "");
+ }
+}
+
+/* Actually APR's apr_strfsize */
+static char *status_strfsize(jk_uint64_t size, char *buf)
+{
+ const char ord[] = "KMGTPE";
+ const char *o = ord;
+ unsigned int remain, siz;
+
+ if (size < 973) {
+ if (sprintf(buf, "%d ", (int) size) < 0)
+ return strcpy(buf, "****");
+ return buf;
+ }
+ do {
+ remain = (unsigned int)(size & 0x03FF);
+ size >>= 10;
+ if (size >= 973) {
+ ++o;
+ continue;
+ }
+ siz = (unsigned int)(size & 0xFFFF);
+ if (siz < 9 || (siz == 9 && remain < 973)) {
+ if ((remain = ((remain * 5) + 256) / 512) >= 10)
+ ++siz, remain = 0;
+ if (sprintf(buf, "%d.%d%c", siz, remain, *o) < 0)
+ return strcpy(buf, "****");
+ return buf;
+ }
+ if (remain >= 512)
+ ++siz;
+ if (sprintf(buf, "%d%c", siz, *o) < 0)
+ return strcpy(buf, "****");
+ return buf;
+ } while (1);
+}
+
+static int status_strftime(time_t clock, int mime, char *buf_time, char *buf_tz,
+ jk_logger_t *l)
+{
+ size_t rc_time;
+#ifdef _MT_CODE_PTHREAD
+ struct tm res;
+ struct tm *tms = localtime_r(&clock, &res);
+#else
+ struct tm *tms = localtime(&clock);
+#endif
+
+ JK_TRACE_ENTER(l);
+
+ if (mime == JK_STATUS_MIME_HTML)
+ rc_time = strftime(buf_time, JK_STATUS_TIME_BUF_SZ, JK_STATUS_TIME_FMT_HTML, tms);
+ else {
+ rc_time = strftime(buf_time, JK_STATUS_TIME_BUF_SZ, JK_STATUS_TIME_FMT_TEXT, tms);
+ }
+ strftime(buf_tz, JK_STATUS_TIME_BUF_SZ, JK_STATUS_TIME_FMT_TZ, tms);
+
+ JK_TRACE_EXIT(l);
+ return (int)rc_time;
+
+}
+
+static int status_rate(lb_sub_worker_t *wr, status_worker_t *w,
+ jk_logger_t *l)
+{
+ jk_uint32_t mask = 0;
+ int activation = wr->activation;
+ int state = wr->s->state;
+ jk_uint32_t good = w->good_mask;
+ jk_uint32_t bad = w->bad_mask;
+ int rv = 0;
+
+ switch (activation)
+ {
+ case JK_LB_ACTIVATION_ACTIVE:
+ mask = JK_STATUS_MASK_ACTIVE;
+ break;
+ case JK_LB_ACTIVATION_DISABLED:
+ mask = JK_STATUS_MASK_DISABLED;
+ break;
+ case JK_LB_ACTIVATION_STOPPED:
+ mask = JK_STATUS_MASK_STOPPED;
+ break;
+ default:
+ jk_log(l, JK_LOG_WARNING,
+ "Status worker '%s' unknown activation type '%d'",
+ w->name, activation);
+ }
+ switch (state)
+ {
+ case JK_LB_STATE_IDLE:
+ mask &= JK_STATUS_MASK_IDLE;
+ break;
+ case JK_LB_STATE_OK:
+ mask &= JK_STATUS_MASK_OK;
+ break;
+ case JK_LB_STATE_RECOVER:
+ mask &= JK_STATUS_MASK_RECOVER;
+ break;
+ case JK_LB_STATE_FORCE:
+ mask &= JK_STATUS_MASK_RECOVER;
+ break;
+ case JK_LB_STATE_BUSY:
+ mask &= JK_STATUS_MASK_BUSY;
+ break;
+ case JK_LB_STATE_ERROR:
+ mask &= JK_STATUS_MASK_ERROR;
+ break;
+ case JK_LB_STATE_PROBE:
+ mask &= JK_STATUS_MASK_RECOVER;
+ break;
+ default:
+ jk_log(l, JK_LOG_WARNING,
+ "Status worker '%s' unknown state type '%d'",
+ w->name, state);
+ }
+ if (mask&bad)
+ rv = -1;
+ else if (mask&good)
+ rv = 1;
+ else
+ rv = 0;
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Status worker '%s' rating of activation '%s' and state '%s' for good '%08" JK_UINT32_T_HEX_FMT
+ "' and bad '%08" JK_UINT32_T_HEX_FMT "' is %d",
+ w->name, jk_lb_get_activation(wr, l), jk_lb_get_state(wr, l),
+ good, bad, rv);
+ return rv;
+}
+
+static jk_uint32_t status_get_single_rating(const char rating, jk_logger_t *l)
+{
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "rating retrieval for '%c'",
+ rating);
+ switch (rating)
+ {
+ case 'A':
+ case 'a':
+ return JK_STATUS_MASK_ACTIVE;
+ case 'D':
+ case 'd':
+ return JK_STATUS_MASK_DISABLED;
+ case 'S':
+ case 's':
+ return JK_STATUS_MASK_STOPPED;
+ case 'O':
+ case 'o':
+ return JK_STATUS_MASK_OK;
+ case 'I':
+ case 'i':
+ case 'N':
+ case 'n':
+ return JK_STATUS_MASK_IDLE;
+ case 'B':
+ case 'b':
+ return JK_STATUS_MASK_BUSY;
+ case 'R':
+ case 'r':
+ return JK_STATUS_MASK_RECOVER;
+ case 'E':
+ case 'e':
+ return JK_STATUS_MASK_ERROR;
+ default:
+ jk_log(l, JK_LOG_WARNING,
+ "Unknown rating type '%c'",
+ rating);
+ return 0;
+ }
+}
+
+static jk_uint32_t status_get_rating(const char *rating,
+ jk_logger_t *l)
+{
+ int off = 0;
+ jk_uint32_t mask = 0;
+
+ while (rating[off] == ' ' || rating[off] == '\t' || rating[off] == '.') {
+ off++;
+ }
+ mask = status_get_single_rating(rating[off], l);
+ while (rating[off] != '\0' && rating[off] != '.') {
+ off++;
+ }
+ if (rating[off] == '.') {
+ off++;
+ }
+ if (rating[off] != '\0') {
+ mask &= status_get_single_rating(rating[off], l);
+ }
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "rating for '%s' is '%08" JK_UINT32_T_HEX_FMT "'",
+ rating, mask);
+ return mask;
+}
+
+static const char *status_worker_type(int t)
+{
+ if (t < 0 || t > 6)
+ t = 0;
+ return worker_type[t];
+}
+
+
+static int status_get_string(status_endpoint_t *p,
+ const char *param,
+ const char *def,
+ const char **result,
+ jk_logger_t *l)
+{
+ int rv;
+
+ *result = jk_map_get_string(p->req_params,
+ param, NULL);
+ if (*result) {
+ rv = JK_TRUE;
+ }
+ else {
+ *result = def;
+ rv = JK_FALSE;
+ }
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "retrieved string arg '%s' as '%s'%s",
+ param, *result ? *result : "(null)",
+ rv == JK_FALSE ? " (default)" : "");
+ return rv;
+}
+
+static int status_get_int(status_endpoint_t *p,
+ const char *param,
+ int def,
+ jk_logger_t *l)
+{
+ const char *arg;
+ int rv = def;
+
+ if (status_get_string(p, param, NULL, &arg, l) == JK_TRUE) {
+ rv = atoi(arg);
+ }
+ return rv;
+}
+
+static int status_get_bool(status_endpoint_t *p,
+ const char *param,
+ int def,
+ jk_logger_t *l)
+{
+ const char *arg;
+
+ if (status_get_string(p, param, NULL, &arg, l) == JK_TRUE) {
+ return jk_get_bool_code(arg, def);
+ }
+ return def;
+}
+
+static const char *status_cmd_text(int cmd)
+{
+ return cmd_type[cmd];
+}
+
+static int status_cmd_int(const char *cmd)
+{
+ if (!cmd)
+ return JK_STATUS_CMD_DEF;
+ if (!strcmp(cmd, JK_STATUS_CMD_TEXT_LIST))
+ return JK_STATUS_CMD_LIST;
+ else if (!strcmp(cmd, JK_STATUS_CMD_TEXT_SHOW))
+ return JK_STATUS_CMD_SHOW;
+ else if (!strcmp(cmd, JK_STATUS_CMD_TEXT_EDIT))
+ return JK_STATUS_CMD_EDIT;
+ else if (!strcmp(cmd, JK_STATUS_CMD_TEXT_UPDATE))
+ return JK_STATUS_CMD_UPDATE;
+ else if (!strcmp(cmd, JK_STATUS_CMD_TEXT_RESET))
+ return JK_STATUS_CMD_RESET;
+ else if (!strcmp(cmd, JK_STATUS_CMD_TEXT_VERSION))
+ return JK_STATUS_CMD_VERSION;
+ else if (!strcmp(cmd, JK_STATUS_CMD_TEXT_RECOVER))
+ return JK_STATUS_CMD_RECOVER;
+ else if (!strcmp(cmd, JK_STATUS_CMD_TEXT_DUMP))
+ return JK_STATUS_CMD_DUMP;
+ return JK_STATUS_CMD_UNKNOWN;
+}
+
+static const char *status_mime_text(int mime)
+{
+ return mime_type[mime];
+}
+
+static int status_mime_int(const char *mime)
+{
+ if (!mime)
+ return JK_STATUS_MIME_DEF;
+ if (!strcmp(mime, JK_STATUS_MIME_TEXT_HTML))
+ return JK_STATUS_MIME_HTML;
+ else if (!strcmp(mime, JK_STATUS_MIME_TEXT_XML))
+ return JK_STATUS_MIME_XML;
+ else if (!strcmp(mime, JK_STATUS_MIME_TEXT_TXT))
+ return JK_STATUS_MIME_TXT;
+ else if (!strcmp(mime, JK_STATUS_MIME_TEXT_PROP))
+ return JK_STATUS_MIME_PROP;
+ return JK_STATUS_MIME_UNKNOWN;
+}
+
+static jk_uint32_t status_cmd_props(int cmd)
+{
+ jk_uint32_t props = 0;
+
+ if (cmd == JK_STATUS_CMD_LIST ||
+ cmd == JK_STATUS_CMD_SHOW)
+ props |= JK_STATUS_CMD_PROP_REFRESH |
+ JK_STATUS_CMD_PROP_SWITCH_RO |
+ JK_STATUS_CMD_PROP_LINK_HELP |
+ JK_STATUS_CMD_PROP_LEGEND;
+ if (cmd == JK_STATUS_CMD_LIST ||
+ cmd == JK_STATUS_CMD_SHOW ||
+ cmd == JK_STATUS_CMD_VERSION)
+ props |= JK_STATUS_CMD_PROP_DUMP_LINK;
+ if (cmd == JK_STATUS_CMD_LIST ||
+ cmd == JK_STATUS_CMD_SHOW ||
+ cmd == JK_STATUS_CMD_VERSION ||
+ cmd == JK_STATUS_CMD_DUMP)
+ props |= JK_STATUS_CMD_PROP_HEAD |
+ JK_STATUS_CMD_PROP_FMT;
+ if (cmd == JK_STATUS_CMD_SHOW ||
+ cmd == JK_STATUS_CMD_VERSION ||
+ cmd == JK_STATUS_CMD_DUMP)
+ props |= JK_STATUS_CMD_PROP_BACK_LIST;
+ if (cmd == JK_STATUS_CMD_SHOW ||
+ cmd == JK_STATUS_CMD_EDIT ||
+ cmd == JK_STATUS_CMD_VERSION ||
+ cmd == JK_STATUS_CMD_DUMP)
+ props |= JK_STATUS_CMD_PROP_BACK_LINK;
+ if (cmd == JK_STATUS_CMD_UPDATE)
+ props |= JK_STATUS_CMD_PROP_WILDCARD;
+ if (cmd != JK_STATUS_CMD_EDIT &&
+ cmd != JK_STATUS_CMD_UPDATE &&
+ cmd != JK_STATUS_CMD_RESET &&
+ cmd != JK_STATUS_CMD_RECOVER)
+ props |= JK_STATUS_CMD_PROP_READONLY;
+ if (cmd != JK_STATUS_CMD_LIST &&
+ cmd != JK_STATUS_CMD_VERSION &&
+ cmd != JK_STATUS_CMD_DUMP)
+ props |= JK_STATUS_CMD_PROP_CHECK_WORKER;
+
+ return props;
+}
+
+static void status_start_form(jk_ws_service_t *s,
+ status_endpoint_t *p,
+ const char *method,
+ int cmd,
+ const char *overwrite,
+ jk_logger_t *l)
+{
+
+ int i;
+ int sz;
+ jk_map_t *m = p->req_params;
+
+ if (method)
+ jk_printf(s, JK_STATUS_FORM_START, method, s->req_uri);
+ else
+ return;
+ if (cmd != JK_STATUS_CMD_UNKNOWN) {
+ jk_printf(s, JK_STATUS_FORM_HIDDEN_STRING,
+ JK_STATUS_ARG_CMD, status_cmd_text(cmd));
+ }
+
+ sz = jk_map_size(m);
+ for (i = 0; i < sz; i++) {
+ const char *k = jk_map_name_at(m, i);
+ const char *v = jk_map_value_at(m, i);
+ if ((strcmp(k, JK_STATUS_ARG_CMD) ||
+ cmd == JK_STATUS_CMD_UNKNOWN) &&
+ (!overwrite ||
+ strcmp(k, overwrite))) {
+ jk_printf(s, JK_STATUS_FORM_HIDDEN_STRING, k, v);
+ }
+ }
+}
+
+static void status_write_uri(jk_ws_service_t *s,
+ status_endpoint_t *p,
+ const char *text,
+ int cmd, int mime,
+ const char *worker, const char *sub_worker,
+ unsigned int add_options, unsigned int rm_options,
+ const char *attribute,
+ jk_logger_t *l)
+{
+ int i;
+ int sz;
+ int started = 0;
+ int from;
+ int restore_sub_worker = JK_FALSE;
+ int save_sub_worker = JK_FALSE;
+ int prev;
+ unsigned int opt = 0;
+ const char *arg;
+ jk_map_t *m = p->req_params;
+
+ if (text)
+ jk_puts(s, "<a href=\"");
+ jk_puts(s, s->req_uri);
+ status_get_string(p, JK_STATUS_ARG_FROM, NULL, &arg, l);
+ from = status_cmd_int(arg);
+ status_get_string(p, JK_STATUS_ARG_CMD, NULL, &arg, l);
+ prev = status_cmd_int(arg);
+ if (cmd == JK_STATUS_CMD_SHOW && prev == JK_STATUS_CMD_EDIT) {
+ restore_sub_worker = JK_TRUE;
+ }
+ if (cmd == JK_STATUS_CMD_UNKNOWN) {
+ if (prev == JK_STATUS_CMD_UPDATE ||
+ prev == JK_STATUS_CMD_RESET ||
+ prev == JK_STATUS_CMD_RECOVER) {
+ cmd = from;
+ restore_sub_worker = JK_TRUE;
+ }
+ }
+ if (cmd != JK_STATUS_CMD_UNKNOWN) {
+ jk_printf(s, "%s%s=%s", started ? "&amp;" : "?",
+ JK_STATUS_ARG_CMD, status_cmd_text(cmd));
+ if (cmd == JK_STATUS_CMD_EDIT ||
+ cmd == JK_STATUS_CMD_RESET ||
+ cmd == JK_STATUS_CMD_RECOVER) {
+ jk_printf(s, "%s%s=%s", "&amp;",
+ JK_STATUS_ARG_FROM, status_cmd_text(prev));
+ save_sub_worker = JK_TRUE;
+ }
+ started=1;
+ }
+ if (mime != JK_STATUS_MIME_UNKNOWN) {
+ jk_printf(s, "%s%s=%s", started ? "&amp;" : "?",
+ JK_STATUS_ARG_MIME, status_mime_text(mime));
+ started=1;
+ }
+ if (worker && worker[0]) {
+ jk_printf(s, "%s%s=%s", started ? "&amp;" : "?",
+ JK_STATUS_ARG_WORKER, worker);
+ started=1;
+ }
+ if (sub_worker && sub_worker[0] && cmd != JK_STATUS_CMD_LIST) {
+ jk_printf(s, "%s%s=%s", started ? "&amp;" : "?",
+ JK_STATUS_ARG_SUB_WORKER, sub_worker);
+ started=1;
+ }
+ if (attribute && attribute[0]) {
+ jk_printf(s, "%s%s=%s", started ? "&amp;" : "?",
+ JK_STATUS_ARG_ATTRIBUTE, attribute);
+ started=1;
+ }
+
+ sz = jk_map_size(m);
+ for (i = 0; i < sz; i++) {
+ const char *k = jk_map_name_at(m, i);
+ const char *v = jk_map_value_at(m, i);
+ if (!strcmp(k, JK_STATUS_ARG_CMD) && cmd != JK_STATUS_CMD_UNKNOWN) {
+ continue;
+ }
+ if (!strcmp(k, JK_STATUS_ARG_MIME) && mime != JK_STATUS_MIME_UNKNOWN) {
+ continue;
+ }
+ if (!strcmp(k, JK_STATUS_ARG_FROM)) {
+ continue;
+ }
+ if (!strcmp(k, JK_STATUS_ARG_WORKER) && worker) {
+ continue;
+ }
+ if (!strcmp(k, JK_STATUS_ARG_SUB_WORKER)) {
+ if (save_sub_worker == JK_TRUE) {
+ jk_printf(s, "%s%s=%s", started ? "&amp;" : "?",
+ JK_STATUS_ARG_PREV_SUB_WORKER, v);
+ started=1;
+ continue;
+ }
+ else if (sub_worker || cmd == JK_STATUS_CMD_LIST) {
+ continue;
+ }
+ else if (restore_sub_worker == JK_TRUE) {
+ continue;
+ }
+ }
+ if (!strcmp(k, JK_STATUS_ARG_PREV_SUB_WORKER) && restore_sub_worker == JK_TRUE && cmd != JK_STATUS_CMD_LIST) {
+ jk_printf(s, "%s%s=%s", started ? "&amp;" : "?",
+ JK_STATUS_ARG_SUB_WORKER, v);
+ started=1;
+ continue;
+ }
+ if (!strcmp(k, JK_STATUS_ARG_ATTRIBUTE) && attribute) {
+ continue;
+ }
+ if (!strcmp(k, JK_STATUS_ARG_ATTRIBUTE) && cmd != JK_STATUS_CMD_UPDATE && cmd != JK_STATUS_CMD_EDIT) {
+ continue;
+ }
+ if (!strncmp(k, JK_STATUS_ARG_MULT_VALUE_BASE, 3) && cmd != JK_STATUS_CMD_UPDATE) {
+ continue;
+ }
+ if (k[0] == 'v' && cmd != JK_STATUS_CMD_UPDATE) {
+ continue;
+ }
+ if (!strcmp(k, JK_STATUS_ARG_OPTIONS)) {
+ opt = atoi(v);
+ continue;
+ }
+ jk_printf(s, "%s%s=%s", started ? "&amp;" : "?", k, v);
+ started=1;
+ }
+ if (opt | add_options | rm_options)
+ jk_printf(s, "%s%s=%u", started ? "&amp;" : "?",
+ JK_STATUS_ARG_OPTIONS, (opt | add_options) & ~rm_options);
+ if (text)
+ jk_putv(s, "\">", text, "</a>", NULL);
+}
+
+static int status_parse_uri(jk_ws_service_t *s,
+ status_endpoint_t *p,
+ jk_logger_t *l)
+{
+ jk_map_t *m;
+ status_worker_t *w = p->worker;
+#ifdef _MT_CODE_PTHREAD
+ char *lasts;
+#endif
+ char *param;
+ char *query;
+
+ JK_TRACE_ENTER(l);
+
+ if (!s->query_string) {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Status worker '%s' query string is empty",
+ w->name);
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+
+ p->query_string = jk_pool_strdup(s->pool, s->query_string);
+ if (!p->query_string) {
+ jk_log(l, JK_LOG_ERROR,
+ "Status worker '%s' could not copy query string",
+ w->name);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ /* XXX We simply mask special chars n the query string with '@' to prevent cross site scripting */
+ query = p->query_string;
+ while ((query = strpbrk(query, JK_STATUS_ESC_CHARS)))
+ query[0] = '@';
+
+ if (!jk_map_alloc(&(p->req_params))) {
+ jk_log(l, JK_LOG_ERROR,
+ "Status worker '%s' could not alloc map for request parameters",
+ w->name);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ m = p->req_params;
+
+ query = jk_pool_strdup(s->pool, p->query_string);
+ if (!query) {
+ jk_log(l, JK_LOG_ERROR,
+ "Status worker '%s' could not copy query string",
+ w->name);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+#ifdef _MT_CODE_PTHREAD
+ for (param = strtok_r(query, "&", &lasts);
+ param; param = strtok_r(NULL, "&", &lasts)) {
+#else
+ for (param = strtok(query, "&"); param; param = strtok(NULL, "&")) {
+#endif
+ char *key = jk_pool_strdup(s->pool, param);
+ char *value;
+ if (!key) {
+ jk_log(l, JK_LOG_ERROR,
+ "Status worker '%s' could not copy string",
+ w->name);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ value = strchr(key, '=');
+ if (value) {
+ *value = '\0';
+ value++;
+ /* XXX Depending on the params values, we might need to trim and decode */
+ if (strlen(key)) {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Status worker '%s' adding request param '%s' with value '%s'",
+ w->name, key, value);
+ jk_map_put(m, key, value, NULL);
+ }
+ }
+ }
+
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+static void write_html_refresh_response(jk_ws_service_t *s,
+ status_endpoint_t *p,
+ const char *err,
+ jk_logger_t *l)
+{
+ if (!err) {
+ jk_puts(s, "\n<meta http-equiv=\"Refresh\" content=\""
+ JK_STATUS_WAIT_AFTER_UPDATE ";url=");
+ status_write_uri(s, p, NULL, JK_STATUS_CMD_UNKNOWN, JK_STATUS_MIME_UNKNOWN,
+ NULL, NULL, 0, 0, NULL, l);
+ jk_puts(s, "\">");
+ jk_putv(s, "<p><b>Result: OK - You will be redirected in "
+ JK_STATUS_WAIT_AFTER_UPDATE " seconds.</b><p/>", NULL);
+ }
+}
+
+static int fetch_worker_and_sub_worker(status_endpoint_t *p,
+ const char *operation,
+ const char **worker,
+ const char **sub_worker,
+ jk_logger_t *l)
+{
+ status_worker_t *w = p->worker;
+
+ JK_TRACE_ENTER(l);
+ status_get_string(p, JK_STATUS_ARG_WORKER, NULL, worker, l);
+ status_get_string(p, JK_STATUS_ARG_SUB_WORKER, NULL, sub_worker, l);
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Status worker '%s' %s worker '%s' sub worker '%s'",
+ w->name, operation,
+ *worker ? *worker : "(null)", *sub_worker ? *sub_worker : "(null)");
+ if (!*worker || !(*worker)[0]) {
+ jk_log(l, JK_LOG_WARNING,
+ "Status worker '%s' NULL or EMPTY worker param",
+ w->name);
+ p->msg = "NULL or EMPTY worker param";
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ if (*sub_worker && !(*sub_worker)[0]) {
+ jk_log(l, JK_LOG_WARNING,
+ "Status worker '%s' EMPTY sub worker param",
+ w->name);
+ p->msg = "EMPTY sub worker param";
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+static int check_valid_lb(jk_ws_service_t *s,
+ status_endpoint_t *p,
+ jk_worker_t *jw,
+ const char *worker,
+ lb_worker_t **lbp,
+ int implemented,
+ jk_logger_t *l)
+{
+ status_worker_t *w = p->worker;
+
+ JK_TRACE_ENTER(l);
+ if (jw->type != JK_LB_WORKER_TYPE) {
+ if (implemented) {
+ jk_log(l, JK_LOG_WARNING,
+ "Status worker '%s' worker type of worker '%s' has no sub workers",
+ w->name, worker);
+ p->msg = "worker type has no sub workers";
+ }
+ else {
+ jk_log(l, JK_LOG_WARNING,
+ "Status worker '%s' worker type of worker '%s' not implemented",
+ w->name, worker);
+ p->msg = "worker type not implemented";
+ }
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ *lbp = (lb_worker_t *)jw->worker_private;
+ if (!*lbp) {
+ jk_log(l, JK_LOG_WARNING,
+ "Status worker '%s' lb structure of worker '%s' is (null)",
+ w->name, worker);
+ p->msg = "lb structure is (null)";
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ p->msg = "OK";
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+static int search_worker(jk_ws_service_t *s,
+ status_endpoint_t *p,
+ jk_worker_t **jwp,
+ const char *worker,
+ jk_logger_t *l)
+{
+ status_worker_t *w = p->worker;
+
+ JK_TRACE_ENTER(l);
+ *jwp = NULL;
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Status worker '%s' searching worker '%s'",
+ w->name, worker ? worker : "(null)");
+ if (!worker || !worker[0]) {
+ jk_log(l, JK_LOG_WARNING,
+ "Status worker '%s' NULL or EMPTY worker param",
+ w->name);
+ p->msg = "NULL or EMPTY worker param";
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ *jwp = wc_get_worker_for_name(worker, l);
+ if (!*jwp) {
+ jk_log(l, JK_LOG_WARNING,
+ "Status worker '%s' could not find worker '%s'",
+ w->name, worker);
+ p->msg = "Could not find given worker";
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ p->msg = "OK";
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+static int search_sub_worker(jk_ws_service_t *s,
+ status_endpoint_t *p,
+ jk_worker_t *jw,
+ const char *worker,
+ lb_sub_worker_t **wrp,
+ const char *sub_worker,
+ unsigned int *idx,
+ jk_logger_t *l)
+{
+ lb_worker_t *lb = NULL;
+ lb_sub_worker_t *wr = NULL;
+ status_worker_t *w = p->worker;
+ unsigned int i = 0;
+
+ JK_TRACE_ENTER(l);
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Status worker '%s' searching sub worker '%s' of worker '%s'",
+ w->name, sub_worker ? sub_worker : "(null)",
+ worker ? worker : "(null)");
+ if (!sub_worker || !sub_worker[0]) {
+ jk_log(l, JK_LOG_WARNING,
+ "Status worker '%s' NULL or EMPTY sub_worker param",
+ w->name);
+ p->msg = "NULL or EMPTY sub_worker param";
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ if (check_valid_lb(s, p, jw, worker, &lb, 1, l) == JK_FALSE) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ if (idx)
+ i = *idx;
+ for (; i < lb->num_of_workers; i++) {
+ wr = &(lb->lb_workers[i]);
+ if (idx) {
+ if (jk_wildchar_match(wr->name, sub_worker, 0) == 0) {
+ *idx = i + 1;
+ break;
+ }
+ }
+ else if (strcmp(sub_worker, wr->name) == 0)
+ break;
+ }
+ *wrp = wr;
+ if (!wr || i == lb->num_of_workers) {
+ jk_log(l, JK_LOG_WARNING,
+ "Status worker '%s' could not find sub worker '%s' of worker '%s'",
+ w->name, sub_worker, worker ? worker : "(null)");
+ p->msg = "could not find sub worker";
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ p->msg = "OK";
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+static int count_map(jk_uri_worker_map_t *uw_map,
+ const char *worker,
+ jk_logger_t *l)
+{
+ unsigned int i;
+ int count=0;
+
+ JK_TRACE_ENTER(l);
+ if (uw_map) {
+ for (i = 0; i < uw_map->size[uw_map->index]; i++) {
+ uri_worker_record_t *uwr = uw_map->maps[uw_map->index][i];
+ if (strcmp(uwr->worker_name, worker) &&
+ strcmp(uwr->worker_name, "*")) {
+ continue;
+ }
+ count++;
+ }
+ }
+ JK_TRACE_EXIT(l);
+ return count;
+}
+
+static int count_maps(jk_ws_service_t *s,
+ const char *worker,
+ jk_logger_t *l)
+{
+ int count=0;
+
+ JK_TRACE_ENTER(l);
+ if (s->next_vhost) {
+ void *srv;
+ for (srv = s->next_vhost(NULL); srv; srv = s->next_vhost(srv)) {
+ count += count_map(s->vhost_to_uw_map(srv), worker, l);
+ }
+ }
+ else if (s->uw_map)
+ count = count_map(s->uw_map, worker, l);
+ JK_TRACE_EXIT(l);
+ return count;
+}
+
+static void display_map(jk_ws_service_t *s,
+ status_endpoint_t *p,
+ jk_uri_worker_map_t *uw_map,
+ const char *worker,
+ const char *server_name,
+ int *count_ptr,
+ int mime,
+ jk_logger_t *l)
+{
+ char buf[64];
+ unsigned int i;
+ int count;
+ status_worker_t *w = p->worker;
+
+ JK_TRACE_ENTER(l);
+
+ if (uw_map->fname) {
+ uri_worker_map_update(uw_map, 1, l);
+ }
+ for (i = 0; i < uw_map->size[uw_map->index]; i++) {
+ uri_worker_record_t *uwr = uw_map->maps[uw_map->index][i];
+
+ if (strcmp(uwr->worker_name, worker) &&
+ strcmp(uwr->worker_name, "*")) {
+ continue;
+ }
+ (*count_ptr)++;
+ count = *count_ptr;
+
+ if (mime == JK_STATUS_MIME_HTML) {
+ if (server_name)
+ jk_printf(s, JK_STATUS_URI_MAP_TABLE_ROW2,
+ server_name,
+ uwr->uri,
+ uri_worker_map_get_match(uwr, buf, l),
+ uri_worker_map_get_source(uwr, l),
+ uwr->extensions.reply_timeout,
+ uwr->extensions.fail_on_status_str ? uwr->extensions.fail_on_status_str : "-",
+ uwr->extensions.active ? uwr->extensions.active : "-",
+ uwr->extensions.disabled ? uwr->extensions.disabled : "-",
+ uwr->extensions.stopped ? uwr->extensions.stopped : "-",
+ uwr->extensions.use_server_error_pages);
+ else
+ jk_printf(s, JK_STATUS_URI_MAP_TABLE_ROW,
+ uwr->uri,
+ uri_worker_map_get_match(uwr, buf, l),
+ uri_worker_map_get_source(uwr, l),
+ uwr->extensions.reply_timeout,
+ uwr->extensions.fail_on_status_str ? uwr->extensions.fail_on_status_str : "-",
+ uwr->extensions.active ? uwr->extensions.active : "-",
+ uwr->extensions.disabled ? uwr->extensions.disabled : "-",
+ uwr->extensions.stopped ? uwr->extensions.stopped : "-",
+ uwr->extensions.use_server_error_pages);
+ }
+ else if (mime == JK_STATUS_MIME_XML) {
+ jk_print_xml_start_elt(s, w, 6, 0, "map");
+ jk_print_xml_att_int(s, 8, "id", count);
+ if (server_name)
+ jk_print_xml_att_string(s, 8, "server", server_name);
+ jk_print_xml_att_string(s, 8, "uri", uwr->uri);
+ jk_print_xml_att_string(s, 8, "type", uri_worker_map_get_match(uwr, buf, l));
+ jk_print_xml_att_string(s, 8, "source", uri_worker_map_get_source(uwr, l));
+ jk_print_xml_att_int(s, 8, "reply_timeout", uwr->extensions.reply_timeout);
+ jk_print_xml_att_string(s, 8, "fail_on_status", uwr->extensions.fail_on_status_str);
+ jk_print_xml_att_string(s, 8, "active", uwr->extensions.active);
+ jk_print_xml_att_string(s, 8, "disabled", uwr->extensions.disabled);
+ jk_print_xml_att_string(s, 8, "stopped", uwr->extensions.stopped);
+ jk_print_xml_att_int(s, 8, "use_server_errors", uwr->extensions.use_server_error_pages);
+ jk_print_xml_stop_elt(s, 6, 1);
+ }
+ else if (mime == JK_STATUS_MIME_TXT) {
+ jk_puts(s, "Map:");
+ jk_printf(s, " id=%d", count);
+ if (server_name)
+ jk_printf(s, " server=\"%s\"", server_name);
+ jk_printf(s, " uri=\"%s\"", uwr->uri);
+ jk_printf(s, " type=\"%s\"", uri_worker_map_get_match(uwr, buf, l));
+ jk_printf(s, " source=\"%s\"", uri_worker_map_get_source(uwr, l));
+ jk_printf(s, " reply_timeout=\"%d\"", uwr->extensions.reply_timeout);
+ jk_printf(s, " fail_on_status=\"%s\"", uwr->extensions.fail_on_status_str ? uwr->extensions.fail_on_status_str : "");
+ jk_printf(s, " active=\"%s\"", uwr->extensions.active ? uwr->extensions.active : "");
+ jk_printf(s, " disabled=\"%s\"", uwr->extensions.disabled ? uwr->extensions.disabled : "");
+ jk_printf(s, " stopped=\"%s\"", uwr->extensions.stopped ? uwr->extensions.stopped : "");
+ jk_printf(s, " use_server_errors=\"%d\"", uwr->extensions.use_server_error_pages);
+ jk_puts(s, "\n");
+ }
+ else if (mime == JK_STATUS_MIME_PROP) {
+ if (server_name)
+ jk_print_prop_item_string(s, w, worker, "map", count, "server", server_name);
+ jk_print_prop_item_string(s, w, worker, "map", count, "uri", uwr->uri);
+ jk_print_prop_item_string(s, w, worker, "map", count, "type", uri_worker_map_get_match(uwr, buf, l));
+ jk_print_prop_item_string(s, w, worker, "map", count, "source", uri_worker_map_get_source(uwr, l));
+ jk_print_prop_item_int(s, w, worker, "map", count, "reply_timeout", uwr->extensions.reply_timeout);
+ jk_print_prop_item_string(s, w, worker, "map", count, "fail_on_status", uwr->extensions.fail_on_status_str);
+ jk_print_prop_item_string(s, w, worker, "map", count, "active", uwr->extensions.active);
+ jk_print_prop_item_string(s, w, worker, "map", count, "disabled", uwr->extensions.disabled);
+ jk_print_prop_item_string(s, w, worker, "map", count, "stopped", uwr->extensions.stopped);
+ jk_print_prop_item_int(s, w, worker, "map", count, "use_server_errors", uwr->extensions.use_server_error_pages);
+ }
+ }
+ JK_TRACE_EXIT(l);
+}
+
+static void display_maps(jk_ws_service_t *s,
+ status_endpoint_t *p,
+ const char *worker,
+ jk_logger_t *l)
+{
+ int mime;
+ unsigned int hide;
+ int has_server_iterator = 0;
+ int count=0;
+ const char *arg;
+ status_worker_t *w = p->worker;
+ jk_uri_worker_map_t *uw_map;
+ char server_name[80];
+ void *srv;
+
+ JK_TRACE_ENTER(l);
+ status_get_string(p, JK_STATUS_ARG_MIME, NULL, &arg, l);
+ mime = status_mime_int(arg);
+ hide = status_get_int(p, JK_STATUS_ARG_OPTIONS, 0, l) &
+ JK_STATUS_ARG_OPTION_NO_MAPS;
+ if (s->next_vhost)
+ has_server_iterator = 1;
+
+ count = count_maps(s, worker, l);
+
+ if (hide) {
+ if (count && mime == JK_STATUS_MIME_HTML) {
+ jk_puts(s, "<p>\n");
+ status_write_uri(s, p, "Show URI Mappings", JK_STATUS_CMD_UNKNOWN, JK_STATUS_MIME_UNKNOWN,
+ NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_MAPS, NULL, l);
+ jk_puts(s, "</p>\n");
+ }
+ JK_TRACE_EXIT(l);
+ return;
+ }
+
+ if (count) {
+ if (mime == JK_STATUS_MIME_HTML) {
+ jk_printf(s, "<hr/><h3>URI Mappings for %s (%d maps) [", worker, count);
+ status_write_uri(s, p, "Hide", JK_STATUS_CMD_UNKNOWN, JK_STATUS_MIME_UNKNOWN,
+ NULL, NULL, JK_STATUS_ARG_OPTION_NO_MAPS, 0, NULL, l);
+ jk_puts(s, "]</h3><table>\n");
+ if (has_server_iterator)
+ jk_printf(s, JK_STATUS_URI_MAP_TABLE_HEAD2,
+ "Server", "URI", "Match Type", "Source", "Reply Timeout", "Fail on Status", "Active", "Disabled", "Stopped", "Use Server Errors");
+ else
+ jk_printf(s, JK_STATUS_URI_MAP_TABLE_HEAD,
+ "URI", "Match Type", "Source", "Reply Timeout", "Fail on Status", "Active", "Disabled", "Stopped", "Use Server Errors");
+ }
+ count = 0;
+ if (has_server_iterator) {
+ for (srv = s->next_vhost(NULL); srv; srv = s->next_vhost(srv)) {
+ uw_map = s->vhost_to_uw_map(srv);
+ if (uw_map) {
+ s->vhost_to_text(srv, server_name, 80);
+ display_map(s, p, uw_map, worker, server_name, &count, mime, l);
+ }
+ }
+ }
+ else {
+ uw_map = s->uw_map;
+ if (uw_map) {
+ display_map(s, p, uw_map, worker, NULL, &count, mime, l);
+ }
+ }
+ if (mime == JK_STATUS_MIME_HTML) {
+ jk_puts(s, "</table>\n");
+ }
+ }
+ else {
+ if (mime == JK_STATUS_MIME_HTML) {
+ jk_putv(s, "<hr/><h3>Warning: No URI Mappings defined for ",
+ worker, " !</h3>\n", NULL);
+ }
+ }
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Status worker '%s' displayed %d maps for worker '%s'",
+ w->name, count, worker);
+ JK_TRACE_EXIT(l);
+}
+
+static const char *dump_ajp_addr(ajp_worker_t *aw, char *buf)
+{
+ if (aw->port > 0)
+ return jk_dump_hinfo(&aw->worker_inet_addr, buf);
+ else {
+ if (aw->addr_sequence != aw->s->addr_sequence)
+ return "unresolved";
+ else
+ return "invalid";
+ }
+}
+
+static void display_worker_ajp_conf_details(jk_ws_service_t *s,
+ status_endpoint_t *p,
+ ajp_worker_t *aw,
+ int is_member,
+ int type,
+ jk_logger_t *l)
+{
+ char buf[32];
+
+ JK_TRACE_ENTER(l);
+
+ if (is_member)
+ jk_printf(s, JK_STATUS_SHOW_MEMBER_CONF_ROW,
+ aw->name,
+ status_worker_type(type),
+ aw->host,
+ dump_ajp_addr(aw, buf),
+ aw->cache_timeout,
+ aw->connect_timeout,
+ aw->prepost_timeout,
+ aw->reply_timeout,
+ aw->retries,
+ aw->recovery_opts,
+ aw->max_packet_size);
+ else
+ jk_printf(s, JK_STATUS_SHOW_AJP_CONF_ROW,
+ status_worker_type(type),
+ aw->host,
+ dump_ajp_addr(aw, buf),
+ aw->cache_timeout,
+ aw->connect_timeout,
+ aw->prepost_timeout,
+ aw->reply_timeout,
+ aw->retries,
+ aw->recovery_opts,
+ aw->max_packet_size);
+ JK_TRACE_EXIT(l);
+
+}
+
+static void display_worker_ajp_details(jk_ws_service_t *s,
+ status_endpoint_t *p,
+ ajp_worker_t *aw,
+ lb_sub_worker_t *wr,
+ lb_worker_t *lb,
+ int ms_min,
+ int ms_max,
+ int map_count,
+ jk_logger_t *l)
+{
+ char buf[32];
+ char buf_rd[32];
+ char buf_rd_sec[32];
+ char buf_wr[32];
+ char buf_wr_sec[32];
+ int mime;
+ const char *arg;
+ time_t now = time(NULL);
+ const char *name = NULL;
+ const char *sub_name = NULL;
+ const char *ajp_name = NULL;
+ status_worker_t *w = p->worker;
+ int rs_min = 0;
+ int rs_max = 0;
+ int delta_reset = (int)difftime(now, aw->s->last_reset);
+ int delta_error = -1;
+ char buf_time[JK_STATUS_TIME_BUF_SZ];
+ char buf_tz[JK_STATUS_TIME_BUF_SZ];
+ time_t error_time = 0;
+ int rc_time = -1;
+
+ JK_TRACE_ENTER(l);
+
+ status_get_string(p, JK_STATUS_ARG_MIME, NULL, &arg, l);
+ mime = status_mime_int(arg);
+
+ if (lb) {
+ name = lb->name;
+ sub_name = wr->name;
+ ajp_name = wr->name;
+ error_time = wr->s->error_time;
+ if (wr->s->state == JK_LB_STATE_ERROR) {
+ rs_min = lb->recover_wait_time - (int)difftime(now, wr->s->error_time);
+ if (rs_min < 0) {
+ rs_min = 0;
+ }
+ rs_max = rs_min + lb->maintain_time;
+ if (rs_min < ms_min) {
+ rs_min = ms_min;
+ }
+ }
+ }
+ else {
+ name = aw->name;
+ sub_name = NULL;
+ ajp_name = aw->name;
+ error_time = aw->s->error_time;
+ }
+
+ if (error_time > 0) {
+ delta_error = (int)difftime(now, error_time);
+ rc_time = status_strftime(error_time, mime, buf_time, buf_tz, l);
+ }
+
+ if (mime == JK_STATUS_MIME_HTML) {
+
+ if (lb)
+ jk_printf(s, JK_STATUS_SHOW_MEMBER_ROW,
+ sub_name,
+ jk_lb_get_activation(wr, l),
+ jk_lb_get_state(wr, l),
+ wr->distance,
+ wr->lb_factor,
+ wr->lb_mult,
+ wr->s->lb_value,
+ aw->s->used,
+ delta_reset > 0 ? (int)(aw->s->used / delta_reset) : -1,
+ wr->s->errors,
+ aw->s->client_errors,
+ aw->s->reply_timeouts,
+ status_strfsize(aw->s->transferred, buf_wr),
+ delta_reset > 0 ? status_strfsize(aw->s->transferred / delta_reset, buf_wr_sec) : "-",
+ status_strfsize(aw->s->readed, buf_rd),
+ delta_reset > 0 ? status_strfsize(aw->s->readed / delta_reset , buf_rd_sec) : "-",
+ aw->s->busy,
+ aw->s->max_busy,
+ aw->s->connected,
+ wr->route,
+ wr->redirect ? (*wr->redirect ? wr->redirect : "&nbsp;") : "&nbsp",
+ wr->domain ? (*wr->domain ? wr->domain : "&nbsp;") : "&nbsp",
+ rs_min,
+ rs_max,
+ delta_reset,
+ rc_time > 0 ? buf_time : "&nbsp;");
+ else {
+ jk_printf(s, JK_STATUS_SHOW_AJP_ROW,
+ jk_ajp_get_state(aw, l),
+ aw->s->used,
+ delta_reset > 0 ? (int)(aw->s->used / delta_reset) : -1,
+ aw->s->errors,
+ aw->s->client_errors,
+ aw->s->reply_timeouts,
+ status_strfsize(aw->s->transferred, buf_wr),
+ delta_reset > 0 ? status_strfsize(aw->s->transferred / delta_reset, buf_wr_sec) : "-",
+ status_strfsize(aw->s->readed, buf_rd),
+ delta_reset > 0 ? status_strfsize(aw->s->readed / delta_reset , buf_rd_sec) : "-",
+ aw->s->busy,
+ aw->s->max_busy,
+ aw->s->connected,
+ delta_reset,
+ rc_time > 0 ? buf_time : "&nbsp;");
+ }
+
+ }
+ else if (mime == JK_STATUS_MIME_XML) {
+
+ int off = 2;
+ if (lb)
+ off = 6;
+ if (lb) {
+ jk_print_xml_start_elt(s, w, off, 0, "member");
+ jk_print_xml_att_string(s, off+2, "name", sub_name);
+ jk_print_xml_att_string(s, off+2, "type", status_worker_type(wr->worker->type));
+ }
+ else {
+ jk_print_xml_start_elt(s, w, off, 0, "ajp");
+ jk_print_xml_att_string(s, off+2, "name", ajp_name);
+ jk_print_xml_att_string(s, off+2, "type", status_worker_type(aw->worker.type));
+ }
+ jk_print_xml_att_string(s, off+2, "host", aw->host);
+ jk_print_xml_att_int(s, off+2, "port", aw->port);
+ jk_print_xml_att_string(s, off+2, "address", dump_ajp_addr(aw, buf));
+ jk_print_xml_att_int(s, off+2, "connection_pool_timeout", aw->cache_timeout);
+ jk_print_xml_att_int(s, off+2, "ping_timeout", aw->ping_timeout);
+ jk_print_xml_att_int(s, off+2, "connect_timeout", aw->connect_timeout);
+ jk_print_xml_att_int(s, off+2, "prepost_timeout", aw->prepost_timeout);
+ jk_print_xml_att_int(s, off+2, "reply_timeout", aw->reply_timeout);
+ jk_print_xml_att_int(s, off+2, "connection_ping_interval", aw->conn_ping_interval);
+ jk_print_xml_att_int(s, off+2, "retries", aw->retries);
+ jk_print_xml_att_uint(s, off+2, "recovery_options", aw->recovery_opts);
+ jk_print_xml_att_uint(s, off+2, "max_packet_size", aw->max_packet_size);
+ if (lb) {
+ jk_print_xml_att_string(s, off+2, "activation", jk_lb_get_activation(wr, l));
+ jk_print_xml_att_int(s, off+2, "lbfactor", wr->lb_factor);
+ jk_print_xml_att_string(s, off+2, "route", wr->route);
+ jk_print_xml_att_string(s, off+2, "redirect", wr->redirect);
+ jk_print_xml_att_string(s, off+2, "domain", wr->domain);
+ jk_print_xml_att_int(s, off+2, "distance", wr->distance);
+ jk_print_xml_att_string(s, off+2, "state", jk_lb_get_state(wr, l));
+ jk_print_xml_att_uint64(s, off+2, "lbmult", wr->lb_mult);
+ jk_print_xml_att_uint64(s, off+2, "lbvalue", wr->s->lb_value);
+ jk_print_xml_att_uint64(s, off+2, "elected", aw->s->used);
+ jk_print_xml_att_uint32(s, off+2, "errors", wr->s->errors);
+ }
+ else {
+ jk_print_xml_att_uint64(s, off+2, "used", aw->s->used);
+ jk_print_xml_att_uint32(s, off+2, "errors", aw->s->errors);
+ }
+ jk_print_xml_att_uint32(s, off+2, "client_errors", aw->s->client_errors);
+ jk_print_xml_att_uint32(s, off+2, "reply_timeouts", aw->s->reply_timeouts);
+ jk_print_xml_att_uint64(s, off+2, "transferred", aw->s->transferred);
+ jk_print_xml_att_uint64(s, off+2, "read", aw->s->readed);
+ jk_print_xml_att_int(s, off+2, "busy", aw->s->busy);
+ jk_print_xml_att_int(s, off+2, "max_busy", aw->s->max_busy);
+ jk_print_xml_att_int(s, off+2, "connected", aw->s->connected);
+ if (lb) {
+ jk_print_xml_att_int(s, off+2, "time_to_recover_min", rs_min);
+ jk_print_xml_att_int(s, off+2, "time_to_recover_max", rs_max);
+ }
+ else
+ jk_print_xml_att_int(s, off+2, "map_count", map_count);
+ jk_print_xml_att_long(s, off+2, "last_reset_at", (long)aw->s->last_reset);
+ jk_print_xml_att_int(s, off+2, "last_reset_ago", delta_reset);
+ if (rc_time > 0 ) {
+ jk_print_xml_att_string(s, off+2, "error_time_datetime", buf_time);
+ jk_print_xml_att_string(s, off+2, "error_time_tz", buf_tz);
+ jk_print_xml_att_int(s, off+2, "error_time_unix_seconds", (int)error_time);
+ jk_print_xml_att_int(s, off+2, "error_time_ago", delta_error);
+ }
+ /* Terminate the tag */
+ jk_print_xml_stop_elt(s, off, 1);
+
+ }
+ else if (mime == JK_STATUS_MIME_TXT) {
+
+ if (lb) {
+ jk_puts(s, "Member:");
+ jk_printf(s, " name=%s", sub_name);
+ jk_printf(s, " type=%s", status_worker_type(wr->worker->type));
+ }
+ else {
+ jk_puts(s, "AJP Worker:");
+ jk_printf(s, " name=%s", ajp_name);
+ jk_printf(s, " type=%s", status_worker_type(aw->worker.type));
+ }
+ jk_printf(s, " host=%s", aw->host);
+ jk_printf(s, " port=%d", aw->port);
+ jk_printf(s, " address=%s", dump_ajp_addr(aw, buf));
+ jk_printf(s, " connection_pool_timeout=%d", aw->cache_timeout);
+ jk_printf(s, " ping_timeout=%d", aw->ping_timeout);
+ jk_printf(s, " connect_timeout=%d", aw->connect_timeout);
+ jk_printf(s, " prepost_timeout=%d", aw->prepost_timeout);
+ jk_printf(s, " reply_timeout=%d", aw->reply_timeout);
+ jk_printf(s, " retries=%d", aw->retries);
+ jk_printf(s, " connection_ping_interval=%d", aw->conn_ping_interval);
+ jk_printf(s, " recovery_options=%u", aw->recovery_opts);
+ jk_printf(s, " max_packet_size=%u", aw->max_packet_size);
+ if (lb) {
+ jk_printf(s, " activation=%s", jk_lb_get_activation(wr, l));
+ jk_printf(s, " lbfactor=%d", wr->lb_factor);
+ jk_printf(s, " route=\"%s\"", wr->route ? wr->route : "");
+ jk_printf(s, " redirect=\"%s\"", wr->redirect ? wr->redirect : "");
+ jk_printf(s, " domain=\"%s\"", wr->domain ? wr->domain : "");
+ jk_printf(s, " distance=%d", wr->distance);
+ jk_printf(s, " state=%s", jk_lb_get_state(wr, l));
+ jk_printf(s, " lbmult=%" JK_UINT64_T_FMT, wr->lb_mult);
+ jk_printf(s, " lbvalue=%" JK_UINT64_T_FMT, wr->s->lb_value);
+ jk_printf(s, " elected=%" JK_UINT64_T_FMT, aw->s->used);
+ jk_printf(s, " errors=%" JK_UINT32_T_FMT, wr->s->errors);
+ }
+ else {
+ jk_printf(s, " used=%" JK_UINT64_T_FMT, aw->s->used);
+ jk_printf(s, " errors=%" JK_UINT32_T_FMT, aw->s->errors);
+ }
+ jk_printf(s, " client_errors=%" JK_UINT32_T_FMT, aw->s->client_errors);
+ jk_printf(s, " reply_timeouts=%" JK_UINT32_T_FMT, aw->s->reply_timeouts);
+ jk_printf(s, " transferred=%" JK_UINT64_T_FMT, aw->s->transferred);
+ jk_printf(s, " read=%" JK_UINT64_T_FMT, aw->s->readed);
+ jk_printf(s, " busy=%d", aw->s->busy);
+ jk_printf(s, " max_busy=%d", aw->s->max_busy);
+ jk_printf(s, " connected=%d", aw->s->connected);
+ if (lb) {
+ jk_printf(s, " time_to_recover_min=%d", rs_min);
+ jk_printf(s, " time_to_recover_max=%d", rs_max);
+ }
+ else
+ jk_printf(s, " map_count=%d", map_count);
+ jk_printf(s, " last_reset_at=%ld", (long)aw->s->last_reset);
+ jk_printf(s, " last_reset_ago=%d", delta_reset);
+ if (rc_time > 0) {
+ jk_printf(s, " error_time_datetime=%s", buf_time);
+ jk_printf(s, " error_time_tz=%s", buf_tz);
+ jk_printf(s, " error_time_unix_seconds=%d", error_time);
+ jk_printf(s, " error_time_ago=%d", delta_error);
+ }
+ jk_puts(s, "\n");
+
+ }
+ else if (mime == JK_STATUS_MIME_PROP) {
+
+ if (lb) {
+ jk_print_prop_att_string(s, w, name, "balance_workers", sub_name);
+ jk_print_prop_att_string(s, w, ajp_name, "type", status_worker_type(wr->worker->type));
+ }
+ else {
+ jk_print_prop_att_string(s, w, name, "list", ajp_name);
+ jk_print_prop_att_string(s, w, ajp_name, "type", status_worker_type(aw->worker.type));
+ }
+ jk_print_prop_att_string(s, w, ajp_name, "host", aw->host);
+ jk_print_prop_att_int(s, w, ajp_name, "port", aw->port);
+ jk_print_prop_att_string(s, w, ajp_name, "address", dump_ajp_addr(aw, buf));
+ jk_print_prop_att_int(s, w, ajp_name, "connection_pool_timeout", aw->cache_timeout);
+ jk_print_prop_att_int(s, w, ajp_name, "ping_timeout", aw->ping_timeout);
+ jk_print_prop_att_int(s, w, ajp_name, "connect_timeout", aw->connect_timeout);
+ jk_print_prop_att_int(s, w, ajp_name, "prepost_timeout", aw->prepost_timeout);
+ jk_print_prop_att_int(s, w, ajp_name, "reply_timeout", aw->reply_timeout);
+ jk_print_prop_att_int(s, w, ajp_name, "retries", aw->retries);
+ jk_print_prop_att_int(s, w, ajp_name, "connection_ping_interval", aw->conn_ping_interval);
+ jk_print_prop_att_uint(s, w, ajp_name, "recovery_options", aw->recovery_opts);
+ jk_print_prop_att_uint(s, w, ajp_name, "max_packet_size", aw->max_packet_size);
+ if (lb) {
+ jk_print_prop_att_string(s, w, ajp_name, "activation", jk_lb_get_activation(wr, l));
+ jk_print_prop_att_int(s, w, ajp_name, "lbfactor", wr->lb_factor);
+ jk_print_prop_att_string(s, w, ajp_name, "route", wr->route);
+ jk_print_prop_att_string(s, w, ajp_name, "redirect", wr->redirect);
+ jk_print_prop_att_string(s, w, ajp_name, "domain", wr->domain);
+ jk_print_prop_att_int(s, w, ajp_name, "distance", wr->distance);
+ jk_print_prop_att_string(s, w, ajp_name, "state", jk_lb_get_state(wr, l));
+ jk_print_prop_att_uint64(s, w, ajp_name, "lbmult", wr->lb_mult);
+ jk_print_prop_att_uint64(s, w, ajp_name, "lbvalue", wr->s->lb_value);
+ jk_print_prop_att_uint64(s, w, ajp_name, "elected", aw->s->used);
+ jk_print_prop_att_uint32(s, w, ajp_name, "errors", wr->s->errors);
+ }
+ else {
+ jk_print_prop_att_uint64(s, w, ajp_name, "used", aw->s->used);
+ jk_print_prop_att_uint32(s, w, ajp_name, "errors", aw->s->errors);
+ }
+ jk_print_prop_att_uint32(s, w, ajp_name, "client_errors", aw->s->client_errors);
+ jk_print_prop_att_uint32(s, w, ajp_name, "reply_timeouts", aw->s->reply_timeouts);
+ jk_print_prop_att_uint64(s, w, ajp_name, "transferred", aw->s->transferred);
+ jk_print_prop_att_uint64(s, w, ajp_name, "read", aw->s->readed);
+ jk_print_prop_att_int(s, w, ajp_name, "busy", aw->s->busy);
+ jk_print_prop_att_int(s, w, ajp_name, "max_busy", aw->s->max_busy);
+ jk_print_prop_att_int(s, w, ajp_name, "connected", aw->s->connected);
+ if (lb) {
+ jk_print_prop_att_int(s, w, ajp_name, "time_to_recover_min", rs_min);
+ jk_print_prop_att_int(s, w, ajp_name, "time_to_recover_max", rs_max);
+ }
+ else
+ jk_print_prop_att_int(s, w, name, "map_count", map_count);
+ jk_print_prop_att_long(s, w, name, "last_reset_at", (long)aw->s->last_reset);
+ jk_print_prop_att_int(s, w, name, "last_reset_ago", delta_reset);
+ if (rc_time > 0) {
+ jk_print_prop_att_string(s, w, name, "error_time_datetime", buf_time);
+ jk_print_prop_att_string(s, w, name, "error_time_tz", buf_tz);
+ jk_print_prop_att_int(s, w, name, "error_time_unix seconds", (int)error_time);
+ jk_print_prop_att_int(s, w, name, "error_time_ago seconds", delta_error);
+ }
+
+ }
+ JK_TRACE_EXIT(l);
+
+}
+
+static void display_worker_lb(jk_ws_service_t *s,
+ status_endpoint_t *p,
+ lb_worker_t *lb,
+ lb_sub_worker_t *swr,
+ jk_logger_t *l)
+{
+ int cmd;
+ int mime;
+ int read_only = 0;
+ int single = 0;
+ unsigned int hide_members;
+ unsigned int hide_lb_conf;
+ unsigned int hide_lb_summary;
+ unsigned int hide_ajp_conf;
+ const char *arg;
+ time_t now = time(NULL);
+ unsigned int good = 0;
+ unsigned int degraded = 0;
+ unsigned int bad = 0;
+ int map_count;
+ int ms_min;
+ int ms_max;
+ unsigned int j;
+ int pstart = JK_FALSE;
+ const char *name = lb->name;
+ status_worker_t *w = p->worker;
+
+ JK_TRACE_ENTER(l);
+ status_get_string(p, JK_STATUS_ARG_CMD, NULL, &arg, l);
+ cmd = status_cmd_int(arg);
+ status_get_string(p, JK_STATUS_ARG_MIME, NULL, &arg, l);
+ mime = status_mime_int(arg);
+ hide_members = status_get_int(p, JK_STATUS_ARG_OPTIONS, 0, l) &
+ JK_STATUS_ARG_OPTION_NO_MEMBERS;
+ hide_lb_conf = status_get_int(p, JK_STATUS_ARG_OPTIONS, 0, l) &
+ JK_STATUS_ARG_OPTION_NO_LB_CONF;
+ hide_lb_summary = status_get_int(p, JK_STATUS_ARG_OPTIONS, 0, l) &
+ JK_STATUS_ARG_OPTION_NO_LB_SUMMARY;
+ hide_ajp_conf = status_get_int(p, JK_STATUS_ARG_OPTIONS, 0, l) &
+ JK_STATUS_ARG_OPTION_NO_AJP_CONF;
+ if (w->read_only) {
+ read_only = 1;
+ }
+ else {
+ read_only = status_get_int(p, JK_STATUS_ARG_OPTIONS, 0, l) &
+ JK_STATUS_ARG_OPTION_READ_ONLY;
+ }
+ if (cmd == JK_STATUS_CMD_SHOW) {
+ single = 1;
+ }
+
+ if (lb->sequence != lb->s->h.sequence)
+ jk_lb_pull(lb, JK_FALSE, l);
+
+ for (j = 0; j < lb->num_of_workers; j++) {
+ lb_sub_worker_t *wr = &(lb->lb_workers[j]);
+ int rate;
+ rate = status_rate(wr, w, l);
+ if (rate > 0 )
+ good++;
+ else if (rate < 0 )
+ bad++;
+ else
+ degraded++;
+ }
+
+ map_count = count_maps(s, name, l);
+ ms_min = lb->maintain_time - (int)difftime(now, lb->s->last_maintain_time);
+ ms_max = ms_min + lb->maintain_time;
+ ms_min -= JK_LB_MAINTAIN_TOLERANCE;
+ if (ms_min < 0) {
+ ms_min = 0;
+ }
+ if (ms_max < 0) {
+ ms_max = 0;
+ }
+
+ if (mime == JK_STATUS_MIME_HTML) {
+
+ jk_puts(s, "<hr/><h3>[");
+ if (single) {
+ jk_puts(s, "S");
+ }
+ else {
+ status_write_uri(s, p, "S", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN,
+ name, "", 0, 0, "", l);
+ }
+ if (!read_only) {
+ jk_puts(s, "|");
+ status_write_uri(s, p, "E", JK_STATUS_CMD_EDIT, JK_STATUS_MIME_UNKNOWN,
+ name, "", 0, 0, "", l);
+ jk_puts(s, "|");
+ status_write_uri(s, p, "R", JK_STATUS_CMD_RESET, JK_STATUS_MIME_UNKNOWN,
+ name, "", 0, 0, "", l);
+ }
+ jk_puts(s, "]&nbsp;&nbsp;");
+ jk_putv(s, "Worker Status for ", name, "</h3>\n", NULL);
+ if (hide_lb_conf) {
+ pstart = JK_TRUE;
+ jk_puts(s, "<p>\n");
+ if (single) {
+ status_write_uri(s, p, "Show LB Configuration", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN,
+ NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_LB_CONF, "", l);
+ }
+ else {
+ status_write_uri(s, p, "Show LB Configuration", JK_STATUS_CMD_LIST, JK_STATUS_MIME_UNKNOWN,
+ NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_LB_CONF, "", l);
+ }
+ }
+ if (hide_lb_summary) {
+ if (pstart == JK_FALSE)
+ jk_puts(s, "<p>\n");
+ else
+ jk_puts(s, "&nbsp;&nbsp;|&nbsp;&nbsp;");
+ pstart = JK_TRUE;
+ if (single) {
+ status_write_uri(s, p, "Show LB Summary", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN,
+ NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_LB_SUMMARY, "", l);
+ }
+ else {
+ status_write_uri(s, p, "Show LB Summary", JK_STATUS_CMD_LIST, JK_STATUS_MIME_UNKNOWN,
+ NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_LB_SUMMARY, "", l);
+ }
+ }
+ if (!hide_members && hide_ajp_conf) {
+ if (pstart == JK_FALSE)
+ jk_puts(s, "<p>\n");
+ else
+ jk_puts(s, "&nbsp;&nbsp;|&nbsp;&nbsp;");
+ pstart = JK_TRUE;
+ if (single) {
+ status_write_uri(s, p, "Show AJP Configuration", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN,
+ NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_AJP_CONF, "", l);
+ }
+ else {
+ status_write_uri(s, p, "Show AJP Configuration", JK_STATUS_CMD_LIST, JK_STATUS_MIME_UNKNOWN,
+ NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_AJP_CONF, "", l);
+ }
+ }
+ if (hide_members) {
+ if (pstart == JK_FALSE)
+ jk_puts(s, "<p>\n");
+ else
+ jk_puts(s, "&nbsp;&nbsp;|&nbsp;&nbsp;");
+ pstart = JK_TRUE;
+ if (single) {
+ status_write_uri(s, p, "Show Balancer Members", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN,
+ NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_MEMBERS, "", l);
+ }
+ else {
+ status_write_uri(s, p, "Show Balancer Members", JK_STATUS_CMD_LIST, JK_STATUS_MIME_UNKNOWN,
+ NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_MEMBERS, "", l);
+ }
+ }
+ if (pstart == JK_TRUE)
+ jk_puts(s, "</p>\n");
+
+ if (!hide_lb_conf) {
+ jk_puts(s, "<table>" JK_STATUS_SHOW_LB_HEAD);
+ jk_puts(s, "[");
+ status_write_uri(s, p, "Hide", JK_STATUS_CMD_UNKNOWN, JK_STATUS_MIME_UNKNOWN,
+ NULL, NULL, JK_STATUS_ARG_OPTION_NO_LB_CONF, 0, NULL, l);
+ jk_puts(s, "]</th></tr>");
+ jk_printf(s, JK_STATUS_SHOW_LB_ROW,
+ status_worker_type(JK_LB_WORKER_TYPE),
+ jk_get_bool(lb->sticky_session),
+ jk_get_bool(lb->sticky_session_force),
+ lb->retries,
+ jk_lb_get_method(lb, l),
+ jk_lb_get_lock(lb, l),
+ lb->recover_wait_time,
+ lb->error_escalation_time,
+ lb->max_reply_timeouts);
+ jk_puts(s, "</table>\n<br/>\n");
+ }
+
+ if (!hide_lb_summary) {
+ jk_puts(s, "<table><tr>"
+ "<th>Good</th><th>Degraded</th><th>Bad/Stopped</th><th>Busy</th><th>Max Busy</th><th>Next Maintenance</th><th>Last Reset</th><th>[");
+ status_write_uri(s, p, "Hide", JK_STATUS_CMD_UNKNOWN, JK_STATUS_MIME_UNKNOWN,
+ NULL, NULL, JK_STATUS_ARG_OPTION_NO_LB_SUMMARY, 0, NULL, l);
+ jk_puts(s, "]</th></tr>\n<tr>");
+ jk_printf(s, "<td>%d</td>", good);
+ jk_printf(s, "<td>%d</td>", degraded);
+ jk_printf(s, "<td>%d</td>", bad);
+ jk_printf(s, "<td>%d</td>", lb->s->busy);
+ jk_printf(s, "<td>%d</td>", lb->s->max_busy);
+ jk_printf(s, "<td>%d/%d</td>", ms_min, ms_max);
+ jk_printf(s, "<td>%d</td>", (int)difftime(now, lb->s->last_reset));
+ jk_puts(s, "<td></td></tr>\n</table>\n\n");
+ }
+ }
+ else if (mime == JK_STATUS_MIME_XML) {
+
+ jk_print_xml_start_elt(s, w, 2, 0, "balancer");
+ jk_print_xml_att_string(s, 4, "name", name);
+ jk_print_xml_att_string(s, 4, "type", status_worker_type(JK_LB_WORKER_TYPE));
+ jk_print_xml_att_string(s, 4, "sticky_session", jk_get_bool(lb->sticky_session));
+ jk_print_xml_att_string(s, 4, "sticky_session_force", jk_get_bool(lb->sticky_session_force));
+ jk_print_xml_att_int(s, 4, "retries", lb->retries);
+ jk_print_xml_att_int(s, 4, "recover_time", lb->recover_wait_time);
+ jk_print_xml_att_int(s, 4, "error_escalation_time", lb->error_escalation_time);
+ jk_print_xml_att_int(s, 4, "max_reply_timeouts", lb->max_reply_timeouts);
+ jk_print_xml_att_string(s, 4, "method", jk_lb_get_method(lb, l));
+ jk_print_xml_att_string(s, 4, "lock", jk_lb_get_lock(lb, l));
+ jk_print_xml_att_int(s, 4, "member_count", lb->num_of_workers);
+ jk_print_xml_att_int(s, 4, "good", good);
+ jk_print_xml_att_int(s, 4, "degraded", degraded);
+ jk_print_xml_att_int(s, 4, "bad", bad);
+ jk_print_xml_att_int(s, 4, "busy", lb->s->busy);
+ jk_print_xml_att_int(s, 4, "max_busy", lb->s->max_busy);
+ jk_print_xml_att_int(s, 4, "map_count", map_count);
+ jk_print_xml_att_int(s, 4, "time_to_maintenance_min", ms_min);
+ jk_print_xml_att_int(s, 4, "time_to_maintenance_max", ms_max);
+ jk_print_xml_att_long(s, 4, "last_reset_at", (long)lb->s->last_reset);
+ jk_print_xml_att_int(s, 4, "last_reset_ago", (int)difftime(now, lb->s->last_reset));
+ jk_print_xml_stop_elt(s, 2, 0);
+
+ }
+ else if (mime == JK_STATUS_MIME_TXT) {
+
+ jk_puts(s, "Balancer Worker:");
+ jk_printf(s, " name=%s", name);
+ jk_printf(s, " type=%s", status_worker_type(JK_LB_WORKER_TYPE));
+ jk_printf(s, " sticky_session=%s", jk_get_bool(lb->sticky_session));
+ jk_printf(s, " sticky_session_force=%s", jk_get_bool(lb->sticky_session_force));
+ jk_printf(s, " retries=%d", lb->retries);
+ jk_printf(s, " recover_time=%d", lb->recover_wait_time);
+ jk_printf(s, " error_escalation_time=%d", lb->error_escalation_time);
+ jk_printf(s, " max_reply_timeouts=%d", lb->max_reply_timeouts);
+ jk_printf(s, " method=%s", jk_lb_get_method(lb, l));
+ jk_printf(s, " lock=%s", jk_lb_get_lock(lb, l));
+ jk_printf(s, " member_count=%d", lb->num_of_workers);
+ jk_printf(s, " good=%d", good);
+ jk_printf(s, " degraded=%d", degraded);
+ jk_printf(s, " bad=%d", bad);
+ jk_printf(s, " busy=%d", lb->s->busy);
+ jk_printf(s, " max_busy=%d", lb->s->max_busy);
+ jk_printf(s, " map_count=%d", map_count);
+ jk_printf(s, " time_to_maintenance_min=%d", ms_min);
+ jk_printf(s, " time_to_maintenance_max=%d", ms_max);
+ jk_printf(s, " last_reset_at=%ld", (long)lb->s->last_reset);
+ jk_printf(s, " last_reset_ago=%d", (int)difftime(now, lb->s->last_reset));
+ jk_puts(s, "\n");
+
+ }
+ else if (mime == JK_STATUS_MIME_PROP) {
+
+ jk_print_prop_att_string(s, w, NULL, "list", name);
+ jk_print_prop_att_string(s, w, name, "type", status_worker_type(JK_LB_WORKER_TYPE));
+ jk_print_prop_att_string(s, w, name, "sticky_session", jk_get_bool(lb->sticky_session));
+ jk_print_prop_att_string(s, w, name, "sticky_session_force", jk_get_bool(lb->sticky_session_force));
+ jk_print_prop_att_int(s, w, name, "retries", lb->retries);
+ jk_print_prop_att_int(s, w, name, "recover_time", lb->recover_wait_time);
+ jk_print_prop_att_int(s, w, name, "error_escalation_time", lb->error_escalation_time);
+ jk_print_prop_att_int(s, w, name, "max_reply_timeouts", lb->max_reply_timeouts);
+ jk_print_prop_att_string(s, w, name, "method", jk_lb_get_method(lb, l));
+ jk_print_prop_att_string(s, w, name, "lock", jk_lb_get_lock(lb, l));
+ jk_print_prop_att_int(s, w, name, "member_count", lb->num_of_workers);
+ jk_print_prop_att_int(s, w, name, "good", good);
+ jk_print_prop_att_int(s, w, name, "degraded", degraded);
+ jk_print_prop_att_int(s, w, name, "bad", bad);
+ jk_print_prop_att_int(s, w, name, "busy", lb->s->busy);
+ jk_print_prop_att_int(s, w, name, "max_busy", lb->s->max_busy);
+ jk_print_prop_att_int(s, w, name, "map_count", map_count);
+ jk_print_prop_att_int(s, w, name, "time_to_maintenance_min", ms_min);
+ jk_print_prop_att_int(s, w, name, "time_to_maintenance_max", ms_max);
+ jk_print_prop_att_long(s, w, name, "last_reset_at", (long)lb->s->last_reset);
+ jk_print_prop_att_int(s, w, name, "last_reset_ago", (int)difftime(now, lb->s->last_reset));
+
+ }
+
+ if (!hide_members) {
+
+ if (mime == JK_STATUS_MIME_HTML) {
+
+ jk_puts(s, "<h4>Balancer Members [");
+ if (swr) {
+ status_write_uri(s, p, "Show All Members", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN,
+ name, "", 0, 0, "", l);
+ jk_puts(s, "]&nbsp;&nbsp;[");
+ }
+ if (single) {
+ status_write_uri(s, p, "Hide", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN,
+ NULL, NULL, JK_STATUS_ARG_OPTION_NO_MEMBERS, 0, "", l);
+ }
+ else {
+ status_write_uri(s, p, "Hide", JK_STATUS_CMD_LIST, JK_STATUS_MIME_UNKNOWN,
+ NULL, NULL, JK_STATUS_ARG_OPTION_NO_MEMBERS, 0, "", l);
+ }
+ jk_puts(s, "]</h4>\n");
+ if (!hide_ajp_conf) {
+ jk_puts(s, "<table>" JK_STATUS_SHOW_MEMBER_CONF_HEAD);
+ jk_puts(s, "[");
+ status_write_uri(s, p, "Hide", JK_STATUS_CMD_UNKNOWN, JK_STATUS_MIME_UNKNOWN,
+ NULL, NULL, JK_STATUS_ARG_OPTION_NO_AJP_CONF, 0, NULL, l);
+ jk_puts(s, "]</td></tr>");
+ if (swr) {
+ jk_worker_t *jw = (jk_worker_t *)swr->worker;
+ ajp_worker_t *aw = (ajp_worker_t *)jw->worker_private;
+ display_worker_ajp_conf_details(s, p, aw, 1, jw->type, l);
+ }
+ else
+ for (j = 0; j < lb->num_of_workers; j++) {
+ lb_sub_worker_t *wr = &(lb->lb_workers[j]);
+ jk_worker_t *jw = (jk_worker_t *)wr->worker;
+ ajp_worker_t *aw = (ajp_worker_t *)jw->worker_private;
+ display_worker_ajp_conf_details(s, p, aw, 1, jw->type, l);
+ }
+ jk_puts(s, "</table>\n<br/>\n");
+ }
+ jk_puts(s, "<table>" JK_STATUS_SHOW_MEMBER_HEAD);
+
+ }
+
+ if (swr) {
+ const char *sub_name = swr->name;
+ ajp_worker_t *aw = (ajp_worker_t *)swr->worker->worker_private;
+
+ if (mime == JK_STATUS_MIME_HTML) {
+ jk_puts(s, "<tr>\n<td>[");
+ jk_puts(s, "S");
+ if (!read_only) {
+ jk_puts(s, "|");
+ status_write_uri(s, p, "E", JK_STATUS_CMD_EDIT, JK_STATUS_MIME_UNKNOWN,
+ name, sub_name, 0, 0, "", l);
+ jk_puts(s, "|");
+ status_write_uri(s, p, "R", JK_STATUS_CMD_RESET, JK_STATUS_MIME_UNKNOWN,
+ name, sub_name, 0, 0, "", l);
+ if (swr->s->state == JK_LB_STATE_ERROR) {
+ jk_puts(s, "|");
+ status_write_uri(s, p, "T", JK_STATUS_CMD_RECOVER, JK_STATUS_MIME_UNKNOWN,
+ name, sub_name, 0, 0, "", l);
+ }
+ }
+ jk_puts(s, "]");
+ jk_puts(s, "&nbsp;</td>");
+ }
+ display_worker_ajp_details(s, p, aw, swr, lb, ms_min, ms_max, 0, l);
+ } else
+ for (j = 0; j < lb->num_of_workers; j++) {
+ lb_sub_worker_t *wr = &(lb->lb_workers[j]);
+ const char *sub_name = wr->name;
+ ajp_worker_t *aw = (ajp_worker_t *)wr->worker->worker_private;
+
+ if (mime == JK_STATUS_MIME_HTML) {
+ jk_puts(s, "<tr>\n<td>[");
+ status_write_uri(s, p, "S", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN,
+ name, sub_name, 0, 0, "", l);
+ if (!read_only) {
+ jk_puts(s, "|");
+ status_write_uri(s, p, "E", JK_STATUS_CMD_EDIT, JK_STATUS_MIME_UNKNOWN,
+ name, sub_name, 0, 0, "", l);
+ jk_puts(s, "|");
+ status_write_uri(s, p, "R", JK_STATUS_CMD_RESET, JK_STATUS_MIME_UNKNOWN,
+ name, sub_name, 0, 0, "", l);
+ if (wr->s->state == JK_LB_STATE_ERROR) {
+ jk_puts(s, "|");
+ status_write_uri(s, p, "T", JK_STATUS_CMD_RECOVER, JK_STATUS_MIME_UNKNOWN,
+ name, sub_name, 0, 0, "", l);
+ }
+ }
+ jk_puts(s, "]");
+ jk_puts(s, "&nbsp;</td>");
+ }
+ display_worker_ajp_details(s, p, aw, wr, lb, ms_min, ms_max, 0, l);
+ }
+
+ if (mime == JK_STATUS_MIME_HTML) {
+
+ jk_puts(s, "</table><br/>\n");
+ if (!read_only) {
+ const char *arg;
+ status_get_string(p, JK_STATUS_ARG_CMD, NULL, &arg, l);
+ status_start_form(s, p, "get", JK_STATUS_CMD_EDIT, NULL, l);
+ jk_printf(s, JK_STATUS_FORM_HIDDEN_STRING, JK_STATUS_ARG_WORKER, name);
+ if (arg)
+ jk_printf(s, JK_STATUS_FORM_HIDDEN_STRING, JK_STATUS_ARG_FROM, arg);
+ jk_puts(s, "<table><tr><td><b>E</b>dit this attribute for all members:</td><td>");
+ jk_putv(s, "<select name=\"", JK_STATUS_ARG_ATTRIBUTE,
+ "\" size=\"1\">\n", NULL);
+ jk_putv(s, "<option value=\"", JK_STATUS_ARG_LBM_ACTIVATION, "\">", JK_STATUS_ARG_LBM_TEXT_ACTIVATION, "</option>\n", NULL);
+ jk_putv(s, "<option value=\"", JK_STATUS_ARG_LBM_FACTOR, "\">", JK_STATUS_ARG_LBM_TEXT_FACTOR, "</option>\n", NULL);
+ jk_putv(s, "<option value=\"", JK_STATUS_ARG_LBM_ROUTE, "\">", JK_STATUS_ARG_LBM_TEXT_ROUTE, "</option>\n", NULL);
+ jk_putv(s, "<option value=\"", JK_STATUS_ARG_LBM_REDIRECT, "\">", JK_STATUS_ARG_LBM_TEXT_REDIRECT, "</option>\n", NULL);
+ jk_putv(s, "<option value=\"", JK_STATUS_ARG_LBM_DOMAIN, "\">", JK_STATUS_ARG_LBM_TEXT_DOMAIN, "</option>\n", NULL);
+ jk_putv(s, "<option value=\"", JK_STATUS_ARG_LBM_DISTANCE, "\">", JK_STATUS_ARG_LBM_TEXT_DISTANCE, "</option>\n", NULL);
+ jk_putv(s, "<option value=\"", JK_STATUS_ARG_AJP_CACHE_TO, "\">", JK_STATUS_ARG_AJP_TEXT_CACHE_TO, "</option>\n", NULL);
+ jk_putv(s, "<option value=\"", JK_STATUS_ARG_AJP_PING_TO, "\">", JK_STATUS_ARG_AJP_TEXT_PING_TO, "</option>\n", NULL);
+ jk_putv(s, "<option value=\"", JK_STATUS_ARG_AJP_CONNECT_TO, "\">", JK_STATUS_ARG_AJP_TEXT_CONNECT_TO, "</option>\n", NULL);
+ jk_putv(s, "<option value=\"", JK_STATUS_ARG_AJP_PREPOST_TO, "\">", JK_STATUS_ARG_AJP_TEXT_PREPOST_TO, "</option>\n", NULL);
+ jk_putv(s, "<option value=\"", JK_STATUS_ARG_AJP_REPLY_TO, "\">", JK_STATUS_ARG_AJP_TEXT_REPLY_TO, "</option>\n", NULL);
+ jk_putv(s, "<option value=\"", JK_STATUS_ARG_AJP_RETRIES, "\">", JK_STATUS_ARG_AJP_TEXT_RETRIES, "</option>\n", NULL);
+ jk_putv(s, "<option value=\"", JK_STATUS_ARG_AJP_RETRY_INT, "\">", JK_STATUS_ARG_AJP_TEXT_RETRY_INT, "</option>\n", NULL);
+ jk_putv(s, "<option value=\"", JK_STATUS_ARG_AJP_CPING_INT, "\">", JK_STATUS_ARG_AJP_TEXT_CPING_INT, "</option>\n", NULL);
+ jk_putv(s, "<option value=\"", JK_STATUS_ARG_AJP_REC_OPTS, "\">", JK_STATUS_ARG_AJP_TEXT_REC_OPTS, "</option>\n", NULL);
+ jk_putv(s, "<option value=\"", JK_STATUS_ARG_AJP_MAX_PK_SZ, "\">", JK_STATUS_ARG_AJP_TEXT_MAX_PK_SZ, "</option>\n", NULL);
+ jk_puts(s, "</select></td><td><input type=\"submit\" value=\"Go\"/></tr></table></form>\n");
+ }
+
+ }
+
+ }
+
+ if (name)
+ display_maps(s, p, name, l);
+
+ if (mime == JK_STATUS_MIME_XML) {
+ jk_print_xml_close_elt(s, w, 2, "balancer");
+ }
+
+ JK_TRACE_EXIT(l);
+}
+
+static void display_worker_ajp(jk_ws_service_t *s,
+ status_endpoint_t *p,
+ ajp_worker_t *aw,
+ int type,
+ jk_logger_t *l)
+{
+ int cmd;
+ int mime;
+ int read_only = 0;
+ int single = 0;
+ unsigned int hide_ajp_conf;
+ const char *arg;
+ int map_count;
+ const char *name = aw->name;
+ status_worker_t *w = p->worker;
+
+ JK_TRACE_ENTER(l);
+ status_get_string(p, JK_STATUS_ARG_CMD, NULL, &arg, l);
+ cmd = status_cmd_int(arg);
+ status_get_string(p, JK_STATUS_ARG_MIME, NULL, &arg, l);
+ mime = status_mime_int(arg);
+ hide_ajp_conf = status_get_int(p, JK_STATUS_ARG_OPTIONS, 0, l) &
+ JK_STATUS_ARG_OPTION_NO_AJP_CONF;
+ if (w->read_only) {
+ read_only = 1;
+ }
+ else {
+ read_only = status_get_int(p, JK_STATUS_ARG_OPTIONS, 0, l) &
+ JK_STATUS_ARG_OPTION_READ_ONLY;
+ }
+ if (cmd == JK_STATUS_CMD_SHOW) {
+ single = 1;
+ }
+
+ if (aw->sequence != aw->s->h.sequence)
+ jk_ajp_pull(aw, JK_FALSE, l);
+
+ map_count = count_maps(s, name, l);
+
+ if (mime == JK_STATUS_MIME_HTML) {
+
+ jk_puts(s, "<hr/><h3>[");
+ if (single)
+ jk_puts(s, "S");
+ else
+ status_write_uri(s, p, "S", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN,
+ name, "", 0, 0, "", l);
+ if (!read_only) {
+ jk_puts(s, "|");
+ status_write_uri(s, p, "E", JK_STATUS_CMD_EDIT, JK_STATUS_MIME_UNKNOWN,
+ name, "", 0, 0, "", l);
+ jk_puts(s, "|");
+ status_write_uri(s, p, "R", JK_STATUS_CMD_RESET, JK_STATUS_MIME_UNKNOWN,
+ name, "", 0, 0, "", l);
+ }
+ jk_puts(s, "]&nbsp;&nbsp;");
+ jk_putv(s, "Worker Status for ", name, "</h3>\n", NULL);
+ if (!hide_ajp_conf) {
+ jk_puts(s, "<table>" JK_STATUS_SHOW_AJP_CONF_HEAD);
+ jk_puts(s, "[");
+ status_write_uri(s, p, "Hide", JK_STATUS_CMD_UNKNOWN, JK_STATUS_MIME_UNKNOWN,
+ NULL, NULL, JK_STATUS_ARG_OPTION_NO_AJP_CONF, 0, NULL, l);
+ jk_puts(s, "]</td></tr>");
+ display_worker_ajp_conf_details(s, p, aw, 0, type, l);
+ jk_puts(s, "</table>\n<br/>\n");
+ }
+ else {
+ jk_puts(s, "<p>\n");
+ if (single) {
+ status_write_uri(s, p, "Show AJP Configuration", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN,
+ NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_AJP_CONF, "", l);
+ }
+ else {
+ status_write_uri(s, p, "Show AJP Configuration", JK_STATUS_CMD_LIST, JK_STATUS_MIME_UNKNOWN,
+ NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_AJP_CONF, "", l);
+ }
+ jk_puts(s, "</p>\n");
+ }
+ jk_puts(s, "<table>" JK_STATUS_SHOW_AJP_HEAD);
+ }
+ display_worker_ajp_details(s, p, aw, NULL, NULL, 0, 0, map_count, l);
+
+ if (mime == JK_STATUS_MIME_HTML) {
+ jk_puts(s, "</table>\n");
+ }
+ if (name)
+ display_maps(s, p, name, l);
+
+ JK_TRACE_EXIT(l);
+}
+
+static void display_worker(jk_ws_service_t *s,
+ status_endpoint_t *p,
+ jk_worker_t *jw,
+ lb_sub_worker_t *swr,
+ jk_logger_t *l)
+{
+ status_worker_t *w = p->worker;
+
+ JK_TRACE_ENTER(l);
+ if (jw->type == JK_LB_WORKER_TYPE) {
+ lb_worker_t *lb = (lb_worker_t *)jw->worker_private;
+ if (lb) {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Status worker '%s' %s lb worker '%s'",
+ w->name, "displaying", lb->name);
+ display_worker_lb(s, p, lb, swr, l);
+ }
+ else {
+ jk_log(l, JK_LOG_WARNING,
+ "Status worker '%s' lb worker is (null)",
+ w->name);
+ }
+ }
+ else if (jw->type == JK_AJP13_WORKER_TYPE ||
+ jw->type == JK_AJP14_WORKER_TYPE) {
+ ajp_worker_t *aw = (ajp_worker_t *)jw->worker_private;
+ if (aw) {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Status worker '%s' %s ajp worker '%s'",
+ w->name, "displaying", aw->name);
+ display_worker_ajp(s, p, aw, jw->type, l);
+ }
+ else {
+ jk_log(l, JK_LOG_WARNING,
+ "Status worker '%s' aw worker is (null)",
+ w->name);
+ }
+ }
+ else {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Status worker '%s' worker type not implemented",
+ w->name);
+ JK_TRACE_EXIT(l);
+ return;
+ }
+}
+
+static void form_worker(jk_ws_service_t *s,
+ status_endpoint_t *p,
+ jk_worker_t *jw,
+ jk_logger_t *l)
+{
+ const char *name = NULL;
+ lb_worker_t *lb = NULL;
+ status_worker_t *w = p->worker;
+
+ JK_TRACE_ENTER(l);
+ if (jw->type == JK_LB_WORKER_TYPE) {
+ lb = (lb_worker_t *)jw->worker_private;
+ name = lb->name;
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Status worker '%s' producing edit form for lb worker '%s'",
+ w->name, name);
+ }
+ else {
+ jk_log(l, JK_LOG_WARNING,
+ "Status worker '%s' worker type not implemented",
+ w->name);
+ JK_TRACE_EXIT(l);
+ return;
+ }
+
+ if (!lb) {
+ jk_log(l, JK_LOG_WARNING,
+ "Status worker '%s' lb structure is (null)",
+ w->name);
+ JK_TRACE_EXIT(l);
+ return;
+ }
+
+ jk_putv(s, "<hr/><h3>Edit load balancer settings for ",
+ name, "</h3>\n", NULL);
+
+ status_start_form(s, p, "get", JK_STATUS_CMD_UPDATE, NULL, l);
+
+ jk_putv(s, "<table>\n<tr><td>", JK_STATUS_ARG_LB_TEXT_RETRIES,
+ ":</td><td><input name=\"",
+ JK_STATUS_ARG_LB_RETRIES, "\" type=\"text\" ", NULL);
+ jk_printf(s, "value=\"%d\"/></td></tr>\n", lb->retries);
+ jk_putv(s, "<tr><td>", JK_STATUS_ARG_LB_TEXT_RETRY_INT,
+ ":</td><td><input name=\"",
+ JK_STATUS_ARG_LB_RETRY_INT, "\" type=\"text\" ", NULL);
+ jk_printf(s, "value=\"%d\"/></td></tr>\n", lb->retry_interval);
+ jk_putv(s, "<tr><td>", JK_STATUS_ARG_LB_TEXT_RECOVER_TIME,
+ ":</td><td><input name=\"",
+ JK_STATUS_ARG_LB_RECOVER_TIME, "\" type=\"text\" ", NULL);
+ jk_printf(s, "value=\"%d\"/></td></tr>\n", lb->recover_wait_time);
+ jk_putv(s, "<tr><td>", JK_STATUS_ARG_LB_TEXT_ERROR_ESCALATION_TIME,
+ ":</td><td><input name=\"",
+ JK_STATUS_ARG_LB_ERROR_ESCALATION_TIME, "\" type=\"text\" ", NULL);
+ jk_printf(s, "value=\"%d\"/></td></tr>\n", lb->error_escalation_time);
+ jk_putv(s, "<tr><td>", JK_STATUS_ARG_LB_TEXT_MAX_REPLY_TIMEOUTS,
+ ":</td><td><input name=\"",
+ JK_STATUS_ARG_LB_MAX_REPLY_TIMEOUTS, "\" type=\"text\" ", NULL);
+ jk_printf(s, "value=\"%d\"/></td></tr>\n", lb->max_reply_timeouts);
+ jk_putv(s, "<tr><td>", JK_STATUS_ARG_LB_TEXT_STICKY,
+ ":</td><td><input name=\"",
+ JK_STATUS_ARG_LB_STICKY, "\" type=\"checkbox\"", NULL);
+ if (lb->sticky_session)
+ jk_puts(s, " checked=\"checked\"");
+ jk_puts(s, "/></td></tr>\n");
+ jk_putv(s, "<tr><td>", JK_STATUS_ARG_LB_TEXT_STICKY_FORCE,
+ ":</td><td><input name=\"",
+ JK_STATUS_ARG_LB_STICKY_FORCE, "\" type=\"checkbox\"", NULL);
+ if (lb->sticky_session_force)
+ jk_puts(s, " checked=\"checked\"");
+ jk_puts(s, "/></td></tr>\n");
+ jk_putv(s, "<tr><td>", JK_STATUS_ARG_LB_TEXT_METHOD,
+ ":</td><td></td></tr>\n", NULL);
+ jk_putv(s, "<tr><td>&nbsp;&nbsp;Requests</td><td><input name=\"",
+ JK_STATUS_ARG_LB_METHOD, "\" type=\"radio\"", NULL);
+ jk_printf(s, " value=\"%d\"", JK_LB_METHOD_REQUESTS);
+ if (lb->lbmethod == JK_LB_METHOD_REQUESTS)
+ jk_puts(s, " checked=\"checked\"");
+ jk_puts(s, "/></td></tr>\n");
+ jk_putv(s, "<tr><td>&nbsp;&nbsp;Traffic</td><td><input name=\"",
+ JK_STATUS_ARG_LB_METHOD, "\" type=\"radio\"", NULL);
+ jk_printf(s, " value=\"%d\"", JK_LB_METHOD_TRAFFIC);
+ if (lb->lbmethod == JK_LB_METHOD_TRAFFIC)
+ jk_puts(s, " checked=\"checked\"");
+ jk_puts(s, "/></td></tr>\n");
+ jk_putv(s, "<tr><td>&nbsp;&nbsp;Busyness</td><td><input name=\"",
+ JK_STATUS_ARG_LB_METHOD, "\" type=\"radio\"", NULL);
+ jk_printf(s, " value=\"%d\"", JK_LB_METHOD_BUSYNESS);
+ if (lb->lbmethod == JK_LB_METHOD_BUSYNESS)
+ jk_puts(s, " checked=\"checked\"");
+ jk_puts(s, "/></td></tr>\n");
+ jk_putv(s, "<tr><td>&nbsp;&nbsp;Sessions</td><td><input name=\"",
+ JK_STATUS_ARG_LB_METHOD, "\" type=\"radio\"", NULL);
+ jk_printf(s, " value=\"%d\"", JK_LB_METHOD_SESSIONS);
+ if (lb->lbmethod == JK_LB_METHOD_SESSIONS)
+ jk_puts(s, " checked=\"checked\"");
+ jk_puts(s, "/></td></tr>\n");
+ jk_putv(s, "<tr><td>", JK_STATUS_ARG_LB_TEXT_LOCK,
+ ":</td><td></td></tr>\n", NULL);
+ jk_putv(s, "<tr><td>&nbsp;&nbsp;Optimistic</td><td><input name=\"",
+ JK_STATUS_ARG_LB_LOCK, "\" type=\"radio\"", NULL);
+ jk_printf(s, " value=\"%d\"", JK_LB_LOCK_OPTIMISTIC);
+ if (lb->lblock == JK_LB_LOCK_OPTIMISTIC)
+ jk_puts(s, " checked=\"checked\"");
+ jk_puts(s, "/></td></tr>\n");
+ jk_putv(s, "<tr><td>&nbsp;&nbsp;Pessimistic</td><td><input name=\"",
+ JK_STATUS_ARG_LB_LOCK, "\" type=\"radio\"", NULL);
+ jk_printf(s, " value=\"%d\"", JK_LB_LOCK_PESSIMISTIC);
+ if (lb->lblock == JK_LB_LOCK_PESSIMISTIC)
+ jk_puts(s, " checked=\"checked\"");
+ jk_puts(s, "/></td></tr>\n");
+ jk_puts(s, "</table>\n");
+ jk_puts(s, "<br/><input type=\"submit\" value=\"Update Balancer\"/></form>\n");
+
+ JK_TRACE_EXIT(l);
+}
+
+static void form_member(jk_ws_service_t *s,
+ status_endpoint_t *p,
+ lb_sub_worker_t *wr,
+ ajp_worker_t *aw,
+ const char *lb_name,
+ jk_logger_t *l)
+{
+ status_worker_t *w = p->worker;
+
+ JK_TRACE_ENTER(l);
+
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Status worker '%s' producing edit form for sub worker '%s' of lb worker '%s'",
+ w->name, wr? wr->name : aw->name, lb_name);
+
+ jk_putv(s, "<hr/><h3>Edit worker settings for ",
+ wr? wr->name : aw->name, "</h3>\n", NULL);
+ status_start_form(s, p, "get", JK_STATUS_CMD_UPDATE, NULL, l);
+
+ if (wr) {
+ jk_puts(s, "<table><tbody valign=\"baseline\"><tr><th>Balancing related settings</th>\n");
+ jk_puts(s, "<th>&nbsp;&nbsp;</th><th>AJP settings</th>\n");
+ jk_puts(s, "</tr>\n");
+ jk_puts(s, "<tr><td><table>\n");
+ jk_putv(s, "<tr><td>", JK_STATUS_ARG_LBM_TEXT_ACTIVATION,
+ ":</td><td></td></tr>\n", NULL);
+ jk_putv(s, "<tr><td>&nbsp;&nbsp;Active</td><td><input name=\"",
+ JK_STATUS_ARG_LBM_ACTIVATION, "\" type=\"radio\"", NULL);
+ jk_printf(s, " value=\"%d\"", JK_LB_ACTIVATION_ACTIVE);
+ if (wr->activation == JK_LB_ACTIVATION_ACTIVE)
+ jk_puts(s, " checked=\"checked\"");
+ jk_puts(s, "/></td></tr>\n");
+ jk_putv(s, "<tr><td>&nbsp;&nbsp;Disabled</td><td><input name=\"",
+ JK_STATUS_ARG_LBM_ACTIVATION, "\" type=\"radio\"", NULL);
+ jk_printf(s, " value=\"%d\"", JK_LB_ACTIVATION_DISABLED);
+ if (wr->activation == JK_LB_ACTIVATION_DISABLED)
+ jk_puts(s, " checked=\"checked\"");
+ jk_puts(s, "/></td></tr>\n");
+ jk_putv(s, "<tr><td>&nbsp;&nbsp;Stopped</td><td><input name=\"",
+ JK_STATUS_ARG_LBM_ACTIVATION, "\" type=\"radio\"", NULL);
+ jk_printf(s, " value=\"%d\"", JK_LB_ACTIVATION_STOPPED);
+ if (wr->activation == JK_LB_ACTIVATION_STOPPED)
+ jk_puts(s, " checked=\"checked\"");
+ jk_puts(s, "/></td></tr>\n");
+ jk_putv(s, "<tr><td>", JK_STATUS_ARG_LBM_TEXT_FACTOR,
+ ":</td><td><input name=\"",
+ JK_STATUS_ARG_LBM_FACTOR, "\" type=\"text\" ", NULL);
+ jk_printf(s, "value=\"%d\"/></td></tr>\n", wr->lb_factor);
+ jk_putv(s, "<tr><td>", JK_STATUS_ARG_LBM_TEXT_ROUTE,
+ ":</td><td><input name=\"",
+ JK_STATUS_ARG_LBM_ROUTE, "\" type=\"text\" ", NULL);
+ jk_printf(s, "value=\"%s\"/></td></tr>\n", wr->route);
+ jk_putv(s, "<tr><td>", JK_STATUS_ARG_LBM_TEXT_REDIRECT,
+ ":</td><td><input name=\"",
+ JK_STATUS_ARG_LBM_REDIRECT, "\" type=\"text\" ", NULL);
+ jk_putv(s, "value=\"", wr->redirect, NULL);
+ jk_puts(s, "\"/></td></tr>\n");
+ jk_putv(s, "<tr><td>", JK_STATUS_ARG_LBM_TEXT_DOMAIN,
+ ":</td><td><input name=\"",
+ JK_STATUS_ARG_LBM_DOMAIN, "\" type=\"text\" ", NULL);
+ jk_putv(s, "value=\"", wr->domain, NULL);
+ jk_puts(s, "\"/></td></tr>\n");
+ jk_putv(s, "<tr><td>", JK_STATUS_ARG_LBM_TEXT_DISTANCE,
+ ":</td><td><input name=\"",
+ JK_STATUS_ARG_LBM_DISTANCE, "\" type=\"text\" ", NULL);
+ jk_printf(s, "value=\"%d\"/></td></tr>\n", wr->distance);
+ jk_puts(s, "</table>\n");
+ jk_puts(s, "</td><td></td><td>\n");
+ }
+
+ jk_puts(s, "<table>\n");
+ jk_putv(s, "<tr><td>", JK_STATUS_ARG_AJP_TEXT_HOST_STR,
+ ":</td><td><input name=\"",
+ JK_STATUS_ARG_AJP_HOST_STR, "\" type=\"text\" ", NULL);
+ jk_printf(s, "value=\"%s\"/></td></tr>\n", aw->host);
+ jk_putv(s, "<tr><td>", JK_STATUS_ARG_AJP_TEXT_PORT,
+ ":</td><td><input name=\"",
+ JK_STATUS_ARG_AJP_PORT, "\" type=\"text\" ", NULL);
+ jk_printf(s, "value=\"%d\"/></td></tr>\n", aw->port);
+
+ jk_putv(s, "<tr><td>", JK_STATUS_ARG_AJP_TEXT_CACHE_TO,
+ ":</td><td><input name=\"",
+ JK_STATUS_ARG_AJP_CACHE_TO, "\" type=\"text\" ", NULL);
+ jk_printf(s, "value=\"%d\"/></td></tr>\n", aw->cache_timeout);
+ jk_putv(s, "<tr><td>", JK_STATUS_ARG_AJP_TEXT_PING_TO,
+ ":</td><td><input name=\"",
+ JK_STATUS_ARG_AJP_PING_TO, "\" type=\"text\" ", NULL);
+ jk_printf(s, "value=\"%d\"/></td></tr>\n", aw->ping_timeout);
+ jk_putv(s, "<tr><td>", JK_STATUS_ARG_AJP_TEXT_CONNECT_TO,
+ ":</td><td><input name=\"",
+ JK_STATUS_ARG_AJP_CONNECT_TO, "\" type=\"text\" ", NULL);
+ jk_printf(s, "value=\"%d\"/></td></tr>\n", aw->connect_timeout);
+ jk_putv(s, "<tr><td>", JK_STATUS_ARG_AJP_TEXT_PREPOST_TO,
+ ":</td><td><input name=\"",
+ JK_STATUS_ARG_AJP_PREPOST_TO, "\" type=\"text\" ", NULL);
+ jk_printf(s, "value=\"%d\"/></td></tr>\n", aw->prepost_timeout);
+ jk_putv(s, "<tr><td>", JK_STATUS_ARG_AJP_TEXT_REPLY_TO,
+ ":</td><td><input name=\"",
+ JK_STATUS_ARG_AJP_REPLY_TO, "\" type=\"text\" ", NULL);
+ jk_printf(s, "value=\"%d\"/></td></tr>\n", aw->reply_timeout);
+ jk_putv(s, "<tr><td>", JK_STATUS_ARG_AJP_TEXT_RETRIES,
+ ":</td><td><input name=\"",
+ JK_STATUS_ARG_AJP_RETRIES, "\" type=\"text\" ", NULL);
+ jk_printf(s, "value=\"%d\"/></td></tr>\n", aw->retries);
+ jk_putv(s, "<tr><td>", JK_STATUS_ARG_AJP_TEXT_RETRY_INT,
+ ":</td><td><input name=\"",
+ JK_STATUS_ARG_AJP_RETRY_INT, "\" type=\"text\" ", NULL);
+ jk_printf(s, "value=\"%d\"/></td></tr>\n", aw->retry_interval);
+ jk_putv(s, "<tr><td>", JK_STATUS_ARG_AJP_TEXT_CPING_INT,
+ ":</td><td><input name=\"",
+ JK_STATUS_ARG_AJP_CPING_INT, "\" type=\"text\" ", NULL);
+ jk_printf(s, "value=\"%d\"/></td></tr>\n", aw->conn_ping_interval);
+ jk_putv(s, "<tr><td>", JK_STATUS_ARG_AJP_TEXT_REC_OPTS,
+ ":</td><td><input name=\"",
+ JK_STATUS_ARG_AJP_REC_OPTS, "\" type=\"text\" ", NULL);
+ jk_printf(s, "value=\"%d\"/></td></tr>\n", aw->recovery_opts);
+ jk_putv(s, "<tr><td>", JK_STATUS_ARG_AJP_TEXT_MAX_PK_SZ,
+ ":</td><td><input name=\"",
+ JK_STATUS_ARG_AJP_MAX_PK_SZ, "\" type=\"text\" ", NULL);
+ jk_printf(s, "value=\"%d\"/></td></tr>\n", aw->max_packet_size);
+ jk_puts(s, "</table>\n");
+ if (wr)
+ jk_puts(s, "</td></tr></table>\n");
+ jk_puts(s, "<br/><input type=\"submit\" value=\"Update Worker\"/>\n</form>\n");
+ JK_TRACE_EXIT(l);
+}
+
+static void form_all_members(jk_ws_service_t *s,
+ status_endpoint_t *p,
+ jk_worker_t *jw,
+ const char *attribute,
+ jk_logger_t *l)
+{
+ const char *name = NULL;
+ lb_worker_t *lb = NULL;
+ status_worker_t *w = p->worker;
+ const char *aname;
+ unsigned int i;
+
+ JK_TRACE_ENTER(l);
+ if (!attribute) {
+ jk_log(l, JK_LOG_WARNING,
+ "Status worker '%s' missing request parameter '%s'",
+ w->name, JK_STATUS_ARG_ATTRIBUTE);
+ JK_TRACE_EXIT(l);
+ return;
+ }
+ else {
+ if (!strcmp(attribute, JK_STATUS_ARG_LBM_ACTIVATION))
+ aname=JK_STATUS_ARG_LBM_TEXT_ACTIVATION;
+ else if (!strcmp(attribute, JK_STATUS_ARG_LBM_FACTOR))
+ aname=JK_STATUS_ARG_LBM_TEXT_FACTOR;
+ else if (!strcmp(attribute, JK_STATUS_ARG_LBM_ROUTE))
+ aname=JK_STATUS_ARG_LBM_TEXT_ROUTE;
+ else if (!strcmp(attribute, JK_STATUS_ARG_LBM_REDIRECT))
+ aname=JK_STATUS_ARG_LBM_TEXT_REDIRECT;
+ else if (!strcmp(attribute, JK_STATUS_ARG_LBM_DOMAIN))
+ aname=JK_STATUS_ARG_LBM_TEXT_DOMAIN;
+ else if (!strcmp(attribute, JK_STATUS_ARG_LBM_DISTANCE))
+ aname=JK_STATUS_ARG_LBM_TEXT_DISTANCE;
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_CACHE_TO))
+ aname=JK_STATUS_ARG_AJP_TEXT_CACHE_TO;
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_PING_TO))
+ aname=JK_STATUS_ARG_AJP_TEXT_PING_TO;
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_CONNECT_TO))
+ aname=JK_STATUS_ARG_AJP_TEXT_CONNECT_TO;
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_PREPOST_TO))
+ aname=JK_STATUS_ARG_AJP_TEXT_PREPOST_TO;
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_REPLY_TO))
+ aname=JK_STATUS_ARG_AJP_TEXT_REPLY_TO;
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_RETRIES))
+ aname=JK_STATUS_ARG_AJP_TEXT_RETRIES;
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_RETRY_INT))
+ aname=JK_STATUS_ARG_AJP_TEXT_RETRY_INT;
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_CPING_INT))
+ aname=JK_STATUS_ARG_AJP_TEXT_CPING_INT;
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_REC_OPTS))
+ aname=JK_STATUS_ARG_AJP_TEXT_REC_OPTS;
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_MAX_PK_SZ))
+ aname=JK_STATUS_ARG_AJP_TEXT_MAX_PK_SZ;
+ else {
+ jk_log(l, JK_LOG_WARNING,
+ "Status worker '%s' unknown attribute '%s'",
+ w->name, attribute);
+ JK_TRACE_EXIT(l);
+ return;
+ }
+ }
+ if (jw->type == JK_LB_WORKER_TYPE) {
+ lb = (lb_worker_t *)jw->worker_private;
+ name = lb->name;
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Status worker '%s' producing edit form for attribute '%s' [%s] of all members of lb worker '%s'",
+ w->name, attribute, aname, name);
+ }
+ else {
+ jk_log(l, JK_LOG_WARNING,
+ "Status worker '%s' worker type not implemented",
+ w->name);
+ JK_TRACE_EXIT(l);
+ return;
+ }
+
+ if (lb) {
+ jk_putv(s, "<hr/><h3>Edit attribute '", aname,
+ "' for all members of load balancer ",
+ name, "</h3>\n", NULL);
+
+ status_start_form(s, p, "get", JK_STATUS_CMD_UPDATE, NULL, l);
+
+ jk_putv(s, "<table><tr>"
+ "<th>Balanced Worker</th><th>", aname, "</th>"
+ "</tr>", NULL);
+
+ for (i = 0; i < lb->num_of_workers; i++) {
+ lb_sub_worker_t *wr = &(lb->lb_workers[i]);
+ jk_worker_t *jw = wr->worker;
+ ajp_worker_t *aw = (ajp_worker_t *)jw->worker_private;;
+
+ jk_putv(s, "<tr><td>", wr->name, "</td><td>\n", NULL);
+
+ if (!strcmp(attribute, JK_STATUS_ARG_LBM_ACTIVATION)) {
+
+ jk_printf(s, "Active:&nbsp;<input name=\"" JK_STATUS_ARG_MULT_VALUE_BASE "%d\" type=\"radio\"", i);
+ jk_printf(s, " value=\"%d\"", JK_LB_ACTIVATION_ACTIVE);
+ if (wr->activation == JK_LB_ACTIVATION_ACTIVE)
+ jk_puts(s, " checked=\"checked\"");
+ jk_puts(s, "/>&nbsp;|&nbsp;\n");
+ jk_printf(s, "Disabled:&nbsp;<input name=\"" JK_STATUS_ARG_MULT_VALUE_BASE "%d\" type=\"radio\"", i);
+ jk_printf(s, " value=\"%d\"", JK_LB_ACTIVATION_DISABLED);
+ if (wr->activation == JK_LB_ACTIVATION_DISABLED)
+ jk_puts(s, " checked=\"checked\"");
+ jk_puts(s, "/>&nbsp;|&nbsp;\n");
+ jk_printf(s, "Stopped:&nbsp;<input name=\"" JK_STATUS_ARG_MULT_VALUE_BASE "%d\" type=\"radio\"", i);
+ jk_printf(s, " value=\"%d\"", JK_LB_ACTIVATION_STOPPED);
+ if (wr->activation == JK_LB_ACTIVATION_STOPPED)
+ jk_puts(s, " checked=\"checked\"");
+ jk_puts(s, "/>\n");
+
+ }
+ else if (!strcmp(attribute, JK_STATUS_ARG_LBM_FACTOR)) {
+ jk_printf(s, "<input name=\"" JK_STATUS_ARG_MULT_VALUE_BASE "%d\" type=\"text\"", i);
+ jk_printf(s, "value=\"%d\"/>\n", wr->lb_factor);
+ }
+ else if (!strcmp(attribute, JK_STATUS_ARG_LBM_ROUTE)) {
+ jk_printf(s, "<input name=\"" JK_STATUS_ARG_MULT_VALUE_BASE "%d\" type=\"text\"", i);
+ jk_putv(s, "value=\"", wr->route, "\"/>\n", NULL);
+ }
+ else if (!strcmp(attribute, JK_STATUS_ARG_LBM_REDIRECT)) {
+ jk_printf(s, "<input name=\"" JK_STATUS_ARG_MULT_VALUE_BASE "%d\" type=\"text\"", i);
+ jk_putv(s, "value=\"", wr->redirect, "\"/>\n", NULL);
+ }
+ else if (!strcmp(attribute, JK_STATUS_ARG_LBM_DOMAIN)) {
+ jk_printf(s, "<input name=\"" JK_STATUS_ARG_MULT_VALUE_BASE "%d\" type=\"text\"", i);
+ jk_putv(s, "value=\"", wr->domain, "\"/>\n", NULL);
+ }
+ else if (!strcmp(attribute, JK_STATUS_ARG_LBM_DISTANCE)) {
+ jk_printf(s, "<input name=\"" JK_STATUS_ARG_MULT_VALUE_BASE "%d\" type=\"text\"", i);
+ jk_printf(s, "value=\"%d\"/>\n", wr->distance);
+ }
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_CACHE_TO)) {
+ jk_printf(s, "<input name=\"" JK_STATUS_ARG_MULT_VALUE_BASE "%d\" type=\"text\"", i);
+ jk_printf(s, "value=\"%d\"/>\n", aw->cache_timeout);
+ }
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_PING_TO)) {
+ jk_printf(s, "<input name=\"" JK_STATUS_ARG_MULT_VALUE_BASE "%d\" type=\"text\"", i);
+ jk_printf(s, "value=\"%d\"/>\n", aw->ping_timeout);
+ }
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_CONNECT_TO)) {
+ jk_printf(s, "<input name=\"" JK_STATUS_ARG_MULT_VALUE_BASE "%d\" type=\"text\"", i);
+ jk_printf(s, "value=\"%d\"/>\n", aw->connect_timeout);
+ }
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_PREPOST_TO)) {
+ jk_printf(s, "<input name=\"" JK_STATUS_ARG_MULT_VALUE_BASE "%d\" type=\"text\"", i);
+ jk_printf(s, "value=\"%d\"/>\n", aw->prepost_timeout);
+ }
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_REPLY_TO)) {
+ jk_printf(s, "<input name=\"" JK_STATUS_ARG_MULT_VALUE_BASE "%d\" type=\"text\"", i);
+ jk_printf(s, "value=\"%d\"/>\n", aw->reply_timeout);
+ }
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_RETRIES)) {
+ jk_printf(s, "<input name=\"" JK_STATUS_ARG_MULT_VALUE_BASE "%d\" type=\"text\"", i);
+ jk_printf(s, "value=\"%d\"/>\n", aw->retries);
+ }
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_RETRY_INT)) {
+ jk_printf(s, "<input name=\"" JK_STATUS_ARG_MULT_VALUE_BASE "%d\" type=\"text\"", i);
+ jk_printf(s, "value=\"%d\"/>\n", aw->retry_interval);
+ }
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_CPING_INT)) {
+ jk_printf(s, "<input name=\"" JK_STATUS_ARG_MULT_VALUE_BASE "%d\" type=\"text\"", i);
+ jk_printf(s, "value=\"%d\"/>\n", aw->conn_ping_interval);
+ }
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_REC_OPTS)) {
+ jk_printf(s, "<input name=\"" JK_STATUS_ARG_MULT_VALUE_BASE "%d\" type=\"text\"", i);
+ jk_printf(s, "value=\"%d\"/>\n", aw->recovery_opts);
+ }
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_MAX_PK_SZ)) {
+ jk_printf(s, "<input name=\"" JK_STATUS_ARG_MULT_VALUE_BASE "%d\" type=\"text\"", i);
+ jk_printf(s, "value=\"%d\"/>\n", aw->max_packet_size);
+ }
+
+ jk_puts(s, "</td></tr>");
+ }
+
+ jk_puts(s, "</table>\n");
+ jk_puts(s, "<br/><input type=\"submit\" value=\"Update Balancer\"/></form>\n");
+ }
+ JK_TRACE_EXIT(l);
+}
+
+static void commit_worker(jk_ws_service_t *s,
+ status_endpoint_t *p,
+ jk_worker_t *jw,
+ jk_logger_t *l)
+{
+ const char *name = NULL;
+ lb_worker_t *lb = NULL;
+ status_worker_t *w = p->worker;
+ const char *arg;
+ int sync_needed = JK_FALSE;
+ int i;
+
+ JK_TRACE_ENTER(l);
+ if (jw->type == JK_LB_WORKER_TYPE) {
+ lb = (lb_worker_t *)jw->worker_private;
+ name = lb->name;
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Status worker '%s' committing changes for lb worker '%s'",
+ w->name, name);
+ }
+ else {
+ jk_log(l, JK_LOG_WARNING,
+ "Status worker '%s' worker type not implemented",
+ w->name);
+ JK_TRACE_EXIT(l);
+ return;
+ }
+
+ if (!lb) {
+ jk_log(l, JK_LOG_WARNING,
+ "Status worker '%s' lb structure is (null)",
+ w->name);
+ JK_TRACE_EXIT(l);
+ return;
+ }
+
+ i = status_get_int(p, JK_STATUS_ARG_LB_RETRIES,
+ lb->retries, l);
+ if (i != lb->retries && i > 0) {
+ jk_log(l, JK_LOG_INFO,
+ "Status worker '%s' setting 'retries' for lb worker '%s' to '%i'",
+ w->name, name, i);
+ lb->retries = i;
+ sync_needed = JK_TRUE;
+ }
+ i = status_get_int(p, JK_STATUS_ARG_LB_RETRY_INT,
+ lb->retry_interval, l);
+ if (i != lb->retry_interval && i > 0) {
+ jk_log(l, JK_LOG_INFO,
+ "Status worker '%s' setting 'retry_interval' for lb worker '%s' to '%i'",
+ w->name, name, i);
+ lb->retry_interval = i;
+ sync_needed = JK_TRUE;
+ }
+ i = status_get_int(p, JK_STATUS_ARG_LB_RECOVER_TIME,
+ lb->recover_wait_time, l);
+ if (i != lb->recover_wait_time && i > 0) {
+ jk_log(l, JK_LOG_INFO,
+ "Status worker '%s' setting 'recover_time' for lb worker '%s' to '%i'",
+ w->name, name, i);
+ lb->recover_wait_time = i;
+ sync_needed = JK_TRUE;
+ }
+ i = status_get_int(p, JK_STATUS_ARG_LB_ERROR_ESCALATION_TIME,
+ lb->error_escalation_time, l);
+ if (i != lb->error_escalation_time && i > 0) {
+ jk_log(l, JK_LOG_INFO,
+ "Status worker '%s' setting 'error_escalation_time' for lb worker '%s' to '%i'",
+ w->name, name, i);
+ lb->error_escalation_time = i;
+ sync_needed = JK_TRUE;
+ }
+ i = status_get_int(p, JK_STATUS_ARG_LB_MAX_REPLY_TIMEOUTS,
+ lb->max_reply_timeouts, l);
+ if (i != lb->max_reply_timeouts && i >= 0) {
+ jk_log(l, JK_LOG_INFO,
+ "Status worker '%s' setting 'max_reply_timeouts' for lb worker '%s' to '%i'",
+ w->name, name, i);
+ lb->max_reply_timeouts = i;
+ sync_needed = JK_TRUE;
+ }
+ i = status_get_bool(p, JK_STATUS_ARG_LB_STICKY, lb->sticky_session, l);
+ if (i != lb->sticky_session) {
+ jk_log(l, JK_LOG_INFO,
+ "Status worker '%s' setting 'sticky_session' for lb worker '%s' to '%i'",
+ w->name, name, i);
+ lb->sticky_session = i;
+ sync_needed = JK_TRUE;
+ }
+ i = status_get_bool(p, JK_STATUS_ARG_LB_STICKY_FORCE, lb->sticky_session_force, l);
+ if (i != lb->sticky_session_force) {
+ jk_log(l, JK_LOG_INFO,
+ "Status worker '%s' setting 'sticky_session_force' for lb worker '%s' to '%i'",
+ w->name, name, i);
+ lb->sticky_session_force = i;
+ sync_needed = JK_TRUE;
+ }
+ if (status_get_string(p, JK_STATUS_ARG_LB_METHOD, NULL, &arg, l) == JK_TRUE) {
+ i = jk_lb_get_method_code(arg);
+ if (i != lb->lbmethod && i >= 0 && i <= JK_LB_METHOD_MAX) {
+ jk_log(l, JK_LOG_INFO,
+ "Status worker '%s' setting 'method' for lb worker '%s' to '%s'",
+ w->name, name, jk_lb_get_method(lb, l));
+ lb->lbmethod = i;
+ sync_needed = JK_TRUE;
+ }
+ }
+ if (status_get_string(p, JK_STATUS_ARG_LB_LOCK, NULL, &arg, l) == JK_TRUE) {
+ i = jk_lb_get_lock_code(arg);
+ if (i != lb->lblock && i >= 0 && i <= JK_LB_LOCK_MAX) {
+ jk_log(l, JK_LOG_INFO,
+ "Status worker '%s' setting 'lock' for lb worker '%s' to '%s'",
+ w->name, name, jk_lb_get_lock(lb, l));
+ lb->lblock = i;
+ sync_needed = JK_TRUE;
+ }
+ }
+ if (sync_needed == JK_TRUE) {
+ lb->sequence++;
+ jk_lb_push(lb, JK_TRUE, l);
+ }
+}
+
+static int set_int_if_changed(status_endpoint_t *p,
+ const char *name,
+ const char *att,
+ const char *arg,
+ int min,
+ int max,
+ int *param,
+ const char *lb_name,
+ jk_logger_t *l)
+{
+ int i;
+ status_worker_t *w = p->worker;
+ i = status_get_int(p, arg, *param, l);
+ if (i != *param && i >= min && i <= max) {
+ if (lb_name)
+ jk_log(l, JK_LOG_INFO,
+ "Status worker '%s' setting '%s' for sub worker '%s' of lb worker '%s' to '%i'",
+ w->name, att, name, lb_name, i);
+ else
+ jk_log(l, JK_LOG_INFO,
+ "Status worker '%s' setting '%s' for ajp worker '%s' to '%i'",
+ w->name, att, name, i);
+ *param = i;
+ return JK_TRUE;
+ }
+ return JK_FALSE;
+}
+
+static int set_uint_if_changed(status_endpoint_t *p,
+ const char *name,
+ const char *att,
+ const char *arg,
+ unsigned int min,
+ unsigned int max,
+ unsigned int *param,
+ const char *lb_name,
+ jk_logger_t *l)
+{
+ unsigned i;
+ status_worker_t *w = p->worker;
+ i = (unsigned)status_get_int(p, arg, *param, l);
+ if (i != *param && i >= min && i <= max) {
+ if (lb_name)
+ jk_log(l, JK_LOG_INFO,
+ "Status worker '%s' setting '%s' for sub worker '%s' of lb worker '%s' to '%u'",
+ w->name, att, name, lb_name, i);
+ else
+ jk_log(l, JK_LOG_INFO,
+ "Status worker '%s' setting '%s' for ajp worker '%s' to '%u'",
+ w->name, att, name, i);
+ *param = i;
+ return JK_TRUE;
+ }
+ return JK_FALSE;
+}
+
+static int commit_member(jk_ws_service_t *s,
+ status_endpoint_t *p,
+ lb_worker_t *lb,
+ lb_sub_worker_t *wr,
+ ajp_worker_t *aw,
+ int *side_effect,
+ jk_logger_t *l)
+{
+ const char *arg;
+ const char *lb_name = NULL;
+ status_worker_t *w = p->worker;
+ int rc = JK_TRUE;
+ int rv;
+ int i;
+ int old;
+ int resolve = JK_FALSE;
+ char host[JK_SHM_STR_SIZ+1];
+ int port = 0;
+
+ JK_TRACE_ENTER(l);
+ if (lb) {
+ lb_name = lb->name;
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Status worker '%s' committing changes for sub worker '%s' of lb worker '%s'",
+ w->name, wr->name, lb_name);
+ }
+ else {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Status worker '%s' committing changes for ajp worker '%s'",
+ w->name, aw->name);
+ }
+
+ if (lb) {
+ if (status_get_string(p, JK_STATUS_ARG_LBM_ACTIVATION, NULL, &arg, l) == JK_TRUE) {
+ i = jk_lb_get_activation_code(arg);
+ if (i != wr->activation && i >= 0 && i <= JK_LB_ACTIVATION_MAX) {
+ wr->activation = i;
+ jk_log(l, JK_LOG_INFO,
+ "Status worker '%s' setting 'activation' for sub worker '%s' of lb worker '%s' to '%s'",
+ w->name, wr->name, lb_name, jk_lb_get_activation(wr, l));
+ *side_effect |= JK_STATUS_NEEDS_RESET_LB_VALUES | JK_STATUS_NEEDS_PUSH;
+ }
+ }
+ if (set_int_if_changed(p, wr->name, "lbfactor", JK_STATUS_ARG_LBM_FACTOR,
+ 1, INT_MAX, &wr->lb_factor, lb_name, l))
+ /* Recalculate the load multiplicators wrt. lb_factor */
+ *side_effect |= JK_STATUS_NEEDS_UPDATE_MULT | JK_STATUS_NEEDS_PUSH;
+ if ((rv = status_get_string(p, JK_STATUS_ARG_LBM_ROUTE,
+ NULL, &arg, l)) == JK_TRUE) {
+ if (strncmp(wr->route, arg, JK_SHM_STR_SIZ)) {
+ jk_log(l, JK_LOG_INFO,
+ "Status worker '%s' setting 'route' for sub worker '%s' of lb worker '%s' to '%s'",
+ w->name, wr->name, lb_name, arg);
+ strncpy(wr->route, arg, JK_SHM_STR_SIZ);
+ *side_effect |= JK_STATUS_NEEDS_PUSH;
+ if (!wr->domain[0]) {
+ char * id_domain = strchr(wr->route, '.');
+ if (id_domain) {
+ *id_domain = '\0';
+ strcpy(wr->domain, wr->route);
+ *id_domain = '.';
+ }
+ }
+ }
+ }
+ if ((rv = status_get_string(p, JK_STATUS_ARG_LBM_REDIRECT,
+ NULL, &arg, l)) == JK_TRUE) {
+ if (strncmp(wr->redirect, arg, JK_SHM_STR_SIZ)) {
+ jk_log(l, JK_LOG_INFO,
+ "Status worker '%s' setting 'redirect' for sub worker '%s' of lb worker '%s' to '%s'",
+ w->name, wr->name, lb_name, arg);
+ strncpy(wr->redirect, arg, JK_SHM_STR_SIZ);
+ *side_effect |= JK_STATUS_NEEDS_PUSH;
+ }
+ }
+ if ((rv = status_get_string(p, JK_STATUS_ARG_LBM_DOMAIN,
+ NULL, &arg, l)) == JK_TRUE) {
+ if (strncmp(wr->domain, arg, JK_SHM_STR_SIZ)) {
+ jk_log(l, JK_LOG_INFO,
+ "Status worker '%s' setting 'domain' for sub worker '%s' of lb worker '%s' to '%s'",
+ w->name, wr->name, lb_name, arg);
+ strncpy(wr->domain, arg, JK_SHM_STR_SIZ);
+ *side_effect |= JK_STATUS_NEEDS_PUSH;
+ }
+ }
+ if (set_int_if_changed(p, wr->name, "distance", JK_STATUS_ARG_LBM_DISTANCE,
+ 0, INT_MAX, &wr->distance, lb_name, l))
+ *side_effect |= JK_STATUS_NEEDS_PUSH;
+ }
+ old = aw->cache_timeout;
+ if (set_int_if_changed(p, aw->name, "connection_pool_timeout", JK_STATUS_ARG_AJP_CACHE_TO,
+ 0, INT_MAX, &aw->cache_timeout, lb_name, l)) {
+ *side_effect |= JK_STATUS_NEEDS_PUSH;
+ if (old == 0) {
+ unsigned int i;
+ for (i = 0; i < aw->ep_cache_sz; i++) {
+ ajp_endpoint_t *ae = (ajp_endpoint_t *) aw->ep_cache[i];
+ if (ae)
+ ae->last_access = time(NULL);
+ }
+ }
+ }
+ port = aw->port;
+ if (set_int_if_changed(p, aw->name, "port", JK_STATUS_ARG_AJP_PORT,
+ 0, INT_MAX, &port, lb_name, l)) {
+ strncpy(host, aw->host, JK_SHM_STR_SIZ);
+ resolve = JK_TRUE;
+ }
+ if ((rv = status_get_string(p, JK_STATUS_ARG_AJP_HOST_STR,
+ NULL, &arg, l)) == JK_TRUE) {
+ if (strncmp(aw->host, arg, JK_SHM_STR_SIZ)) {
+ jk_log(l, JK_LOG_INFO,
+ "Status worker '%s' setting 'host' for sub worker '%s' to '%s'",
+ w->name, aw->name, arg);
+ strncpy(host, arg, JK_SHM_STR_SIZ);
+ resolve = JK_TRUE;
+ }
+ }
+ if (resolve == JK_TRUE) {
+ struct sockaddr_in inet_addr;
+ if (!jk_resolve(host, port, &inet_addr,
+ aw->worker.we->pool, l)) {
+ const char *msg = "Update failed (at least partially): could not resolve address '%s:%d' for sub worker '%s'.";
+ size_t size = strlen(msg) + strlen(host) + strlen(aw->name) + 10 + 1;
+ p->msg = jk_pool_alloc(s->pool, size);
+ snprintf(p->msg, size, msg, host, port, aw->name);
+ jk_log(l, JK_LOG_ERROR,
+ "Status worker '%s' failed resolving address '%s:%d' for sub worker '%s'.",
+ w->name, host, port, aw->name);
+ rc = JK_FALSE;
+ }
+ else {
+ /* This is not atomic and not thread safe */
+ aw->port = port;
+ strncpy(aw->host, host, JK_SHM_STR_SIZ);
+ memcpy(&(aw->worker_inet_addr), &inet_addr, sizeof(inet_addr));
+ *side_effect |= JK_STATUS_NEEDS_PUSH | JK_STATUS_NEEDS_ADDR_PUSH;
+ }
+ }
+ if (set_int_if_changed(p, aw->name, "ping_timeout", JK_STATUS_ARG_AJP_PING_TO,
+ 0, INT_MAX, &aw->ping_timeout, lb_name, l))
+ *side_effect |= JK_STATUS_NEEDS_PUSH;
+ if (set_int_if_changed(p, aw->name, "connect_timeout", JK_STATUS_ARG_AJP_CONNECT_TO,
+ 0, INT_MAX, &aw->connect_timeout, lb_name, l))
+ *side_effect |= JK_STATUS_NEEDS_PUSH;
+ if (set_int_if_changed(p, aw->name, "prepost_timeout", JK_STATUS_ARG_AJP_PREPOST_TO,
+ 0, INT_MAX, &aw->prepost_timeout, lb_name, l))
+ *side_effect |= JK_STATUS_NEEDS_PUSH;
+ if (set_int_if_changed(p, aw->name, "reply_timeout", JK_STATUS_ARG_AJP_REPLY_TO,
+ 0, INT_MAX, &aw->reply_timeout, lb_name, l))
+ *side_effect |= JK_STATUS_NEEDS_PUSH;
+ if (set_int_if_changed(p, aw->name, "retries", JK_STATUS_ARG_AJP_RETRIES,
+ 1, INT_MAX, &aw->retries, lb_name, l))
+ *side_effect |= JK_STATUS_NEEDS_PUSH;
+ if (set_int_if_changed(p, aw->name, "retry_interval", JK_STATUS_ARG_AJP_RETRY_INT,
+ 1, INT_MAX, &aw->retry_interval, lb_name, l))
+ *side_effect |= JK_STATUS_NEEDS_PUSH;
+ if (set_int_if_changed(p, aw->name, "connection_ping_interval", JK_STATUS_ARG_AJP_CPING_INT,
+ 1, INT_MAX, &aw->conn_ping_interval, lb_name, l))
+ *side_effect |= JK_STATUS_NEEDS_PUSH;
+ if (set_uint_if_changed(p, aw->name, "recovery_options", JK_STATUS_ARG_AJP_REC_OPTS,
+ 0, INT_MAX, &aw->recovery_opts, lb_name, l))
+ *side_effect |= JK_STATUS_NEEDS_PUSH;
+ if (set_uint_if_changed(p, aw->name, "max_packet_size", JK_STATUS_ARG_AJP_MAX_PK_SZ,
+ 8*1024, 64*1024, &aw->max_packet_size, lb_name, l)) {
+ *side_effect |= JK_STATUS_NEEDS_PUSH;
+ if (aw->max_packet_size > lb->max_packet_size) {
+ lb->max_packet_size = aw->max_packet_size;
+ }
+ }
+ return rc;
+}
+
+static void commit_all_members(jk_ws_service_t *s,
+ status_endpoint_t *p,
+ jk_worker_t *jw,
+ const char *attribute,
+ jk_logger_t *l)
+{
+ const char *arg;
+ char vname[32];
+ const char *name = NULL;
+ lb_worker_t *lb = NULL;
+ status_worker_t *w = p->worker;
+ const char *aname;
+ int i;
+ int rc = 0;
+ unsigned int j;
+
+ JK_TRACE_ENTER(l);
+ if (!attribute) {
+ jk_log(l, JK_LOG_WARNING,
+ "Status worker '%s' missing request parameter '%s'",
+ w->name, JK_STATUS_ARG_ATTRIBUTE);
+ JK_TRACE_EXIT(l);
+ return;
+ }
+ else {
+ if (!strcmp(attribute, JK_STATUS_ARG_LBM_ACTIVATION))
+ aname=JK_STATUS_ARG_LBM_TEXT_ACTIVATION;
+ else if (!strcmp(attribute, JK_STATUS_ARG_LBM_FACTOR))
+ aname=JK_STATUS_ARG_LBM_TEXT_FACTOR;
+ else if (!strcmp(attribute, JK_STATUS_ARG_LBM_ROUTE))
+ aname=JK_STATUS_ARG_LBM_TEXT_ROUTE;
+ else if (!strcmp(attribute, JK_STATUS_ARG_LBM_REDIRECT))
+ aname=JK_STATUS_ARG_LBM_TEXT_REDIRECT;
+ else if (!strcmp(attribute, JK_STATUS_ARG_LBM_DOMAIN))
+ aname=JK_STATUS_ARG_LBM_TEXT_DOMAIN;
+ else if (!strcmp(attribute, JK_STATUS_ARG_LBM_DISTANCE))
+ aname=JK_STATUS_ARG_LBM_TEXT_DISTANCE;
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_CACHE_TO))
+ aname=JK_STATUS_ARG_AJP_TEXT_CACHE_TO;
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_PING_TO))
+ aname=JK_STATUS_ARG_AJP_TEXT_PING_TO;
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_CONNECT_TO))
+ aname=JK_STATUS_ARG_AJP_TEXT_CONNECT_TO;
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_PREPOST_TO))
+ aname=JK_STATUS_ARG_AJP_TEXT_PREPOST_TO;
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_REPLY_TO))
+ aname=JK_STATUS_ARG_AJP_TEXT_REPLY_TO;
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_RETRIES))
+ aname=JK_STATUS_ARG_AJP_TEXT_RETRIES;
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_RETRY_INT))
+ aname=JK_STATUS_ARG_AJP_TEXT_RETRY_INT;
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_CPING_INT))
+ aname=JK_STATUS_ARG_AJP_TEXT_CPING_INT;
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_REC_OPTS))
+ aname=JK_STATUS_ARG_AJP_TEXT_REC_OPTS;
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_MAX_PK_SZ))
+ aname=JK_STATUS_ARG_AJP_TEXT_MAX_PK_SZ;
+ else {
+ jk_log(l, JK_LOG_WARNING,
+ "Status worker '%s' unknown attribute '%s'",
+ w->name, attribute);
+ JK_TRACE_EXIT(l);
+ return;
+ }
+ }
+ if (jw->type == JK_LB_WORKER_TYPE) {
+ lb = (lb_worker_t *)jw->worker_private;
+ name = lb->name;
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Status worker '%s' committing changes for attribute '%s' [%s] of all members of lb worker '%s'",
+ w->name, attribute, aname, name);
+ }
+ else {
+ jk_log(l, JK_LOG_WARNING,
+ "Status worker '%s' worker type not implemented",
+ w->name);
+ JK_TRACE_EXIT(l);
+ return;
+ }
+
+ if (lb) {
+ for (j = 0; j < lb->num_of_workers; j++) {
+ int sync_needed = JK_FALSE;
+ lb_sub_worker_t *wr = &(lb->lb_workers[j]);
+ jk_worker_t *jw = wr->worker;
+ ajp_worker_t *aw = (ajp_worker_t *)jw->worker_private;;
+ snprintf(vname, 32-1, "" JK_STATUS_ARG_MULT_VALUE_BASE "%d", j);
+
+ if (!strcmp(attribute, JK_STATUS_ARG_LBM_FACTOR)) {
+ if (set_int_if_changed(p, wr->name, "lbfactor", vname,
+ 1, INT_MAX, &wr->lb_factor, name, l)) {
+ rc = 2;
+ sync_needed = JK_TRUE;
+ }
+ }
+ else if (!strcmp(attribute, JK_STATUS_ARG_LBM_DISTANCE)) {
+ if (set_int_if_changed(p, wr->name, "distance", vname,
+ 0, INT_MAX, &wr->distance, name, l))
+ sync_needed = JK_TRUE;
+ }
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_CACHE_TO)) {
+ int old = aw->cache_timeout;
+ if (set_int_if_changed(p, aw->name, "connection_pool_timeout", vname,
+ 0, INT_MAX, &aw->cache_timeout, name, l)) {
+ sync_needed = JK_TRUE;
+ if (old == 0) {
+ unsigned int i;
+ for (i = 0; i < aw->ep_cache_sz; i++) {
+ ajp_endpoint_t *ae = (ajp_endpoint_t *) aw->ep_cache[i];
+ if (ae)
+ ae->last_access = time(NULL);
+ }
+ }
+ }
+ }
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_PING_TO)) {
+ if (set_int_if_changed(p, aw->name, "ping_timeout", vname,
+ 0, INT_MAX, &aw->ping_timeout, name, l))
+ sync_needed = JK_TRUE;
+ }
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_CONNECT_TO)) {
+ if (set_int_if_changed(p, aw->name, "connect_timeout", vname,
+ 0, INT_MAX, &aw->connect_timeout, name, l))
+ sync_needed = JK_TRUE;
+ }
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_PREPOST_TO)) {
+ if (set_int_if_changed(p, aw->name, "prepost_timeout", vname,
+ 0, INT_MAX, &aw->prepost_timeout, name, l))
+ sync_needed = JK_TRUE;
+ }
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_REPLY_TO)) {
+ if (set_int_if_changed(p, aw->name, "reply_timeout", vname,
+ 0, INT_MAX, &aw->reply_timeout, name, l))
+ sync_needed = JK_TRUE;
+ }
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_RETRIES)) {
+ if (set_int_if_changed(p, aw->name, "retries", vname,
+ 1, INT_MAX, &aw->retries, name, l))
+ sync_needed = JK_TRUE;
+ }
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_RETRY_INT)) {
+ if (set_int_if_changed(p, aw->name, "retry_interval", vname,
+ 1, INT_MAX, &aw->retry_interval, name, l))
+ sync_needed = JK_TRUE;
+ }
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_CPING_INT)) {
+ if (set_int_if_changed(p, aw->name, "connection_ping_interval", vname,
+ 1, INT_MAX, &aw->conn_ping_interval, name, l))
+ sync_needed = JK_TRUE;
+ }
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_REC_OPTS)) {
+ if (set_uint_if_changed(p, aw->name, "recovery_options", vname,
+ 0, INT_MAX, &aw->recovery_opts, name, l))
+ sync_needed = JK_TRUE;
+ }
+ else if (!strcmp(attribute, JK_STATUS_ARG_AJP_MAX_PK_SZ)) {
+ if (set_uint_if_changed(p, aw->name, "max_packet_size", vname,
+ 8*1024, 64*1024, &aw->max_packet_size, name, l)) {
+ sync_needed = JK_TRUE;
+ if (aw->max_packet_size > lb->max_packet_size) {
+ lb->max_packet_size = aw->max_packet_size;
+ }
+ }
+ }
+ else {
+ int rv = status_get_string(p, vname, NULL, &arg, l);
+ if (!strcmp(attribute, JK_STATUS_ARG_LBM_ACTIVATION)) {
+ if (rv == JK_TRUE) {
+ i = jk_lb_get_activation_code(arg);
+ if (i != wr->activation && i >= 0 && i <= JK_LB_ACTIVATION_MAX) {
+ jk_log(l, JK_LOG_INFO,
+ "Status worker '%s' setting 'activation' for sub worker '%s' of lb worker '%s' to '%s'",
+ w->name, wr->name, name, jk_lb_get_activation(wr, l));
+ wr->activation = i;
+ rc = 1;
+ sync_needed = JK_TRUE;
+ }
+ }
+ }
+ else if (!strcmp(attribute, JK_STATUS_ARG_LBM_ROUTE)) {
+ if (rv == JK_TRUE) {
+ if (strncmp(wr->route, arg, JK_SHM_STR_SIZ)) {
+ jk_log(l, JK_LOG_INFO,
+ "Status worker '%s' setting 'route' for sub worker '%s' of lb worker '%s' to '%s'",
+ w->name, wr->name, name, arg);
+ strncpy(wr->route, arg, JK_SHM_STR_SIZ);
+ sync_needed = JK_TRUE;
+ if (!wr->domain[0]) {
+ char * id_domain = strchr(wr->route, '.');
+ if (id_domain) {
+ *id_domain = '\0';
+ strcpy(wr->domain, wr->route);
+ *id_domain = '.';
+ }
+ }
+ }
+ }
+ }
+ else if (!strcmp(attribute, JK_STATUS_ARG_LBM_REDIRECT)) {
+ if (rv == JK_TRUE) {
+ if (strncmp(wr->redirect, arg, JK_SHM_STR_SIZ)) {
+ jk_log(l, JK_LOG_INFO,
+ "Status worker '%s' setting 'redirect' for sub worker '%s' of lb worker '%s' to '%s'",
+ w->name, wr->name, name, arg);
+ strncpy(wr->redirect, arg, JK_SHM_STR_SIZ);
+ sync_needed = JK_TRUE;
+ }
+ }
+ }
+ else if (!strcmp(attribute, JK_STATUS_ARG_LBM_DOMAIN)) {
+ if (rv == JK_TRUE) {
+ if (strncmp(wr->domain, arg, JK_SHM_STR_SIZ)) {
+ jk_log(l, JK_LOG_INFO,
+ "Status worker '%s' setting 'domain' for sub worker '%s' of lb worker '%s' to '%s'",
+ w->name, wr->name, name, arg);
+ strncpy(wr->domain, arg, JK_SHM_STR_SIZ);
+ sync_needed = JK_TRUE;
+ }
+ }
+ }
+ }
+ if (sync_needed == JK_TRUE) {
+ wr->sequence++;
+ if (!rc)
+ rc = 3;
+ }
+ }
+ if (rc == 1)
+ reset_lb_values(lb, l);
+ else if (rc == 2)
+ /* Recalculate the load multiplicators wrt. lb_factor */
+ update_mult(lb, l);
+ if (rc) {
+ lb->sequence++;
+ jk_lb_push(lb, JK_TRUE, l);
+ }
+ }
+ JK_TRACE_EXIT(l);
+}
+
+static void display_legend(jk_ws_service_t *s,
+ status_endpoint_t *p,
+ jk_logger_t *l)
+{
+
+ int mime;
+ const char *arg;
+ unsigned int hide_legend;
+
+ JK_TRACE_ENTER(l);
+ status_get_string(p, JK_STATUS_ARG_MIME, NULL, &arg, l);
+ mime = status_mime_int(arg);
+ if (mime != JK_STATUS_MIME_HTML) {
+ JK_TRACE_EXIT(l);
+ return;
+ }
+ hide_legend = status_get_int(p, JK_STATUS_ARG_OPTIONS, 0, l) &
+ JK_STATUS_ARG_OPTION_NO_LEGEND;
+ if (hide_legend) {
+ jk_puts(s, "<p>\n");
+ status_write_uri(s, p, "Show Legend", JK_STATUS_CMD_UNKNOWN, JK_STATUS_MIME_UNKNOWN,
+ NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_LEGEND, NULL, l);
+ jk_puts(s, "</p>\n");
+ }
+ else {
+ jk_puts(s, "<h2>Legend [");
+ status_write_uri(s, p, "Hide", JK_STATUS_CMD_UNKNOWN, JK_STATUS_MIME_UNKNOWN,
+ NULL, NULL, JK_STATUS_ARG_OPTION_NO_LEGEND, 0, NULL, l);
+ jk_puts(s, "]</h2>\n");
+
+ jk_puts(s, "<table>\n"
+ "<tbody valign=\"baseline\">\n"
+ "<tr><th>Name</th><td>Worker name</td></tr>\n"
+ "<tr><th>Type</th><td>Worker type</td></tr>\n"
+ "<tr><th>Route</th><td>Worker route</td></tr>\n"
+ "<tr><th>Act</th><td>Worker activation configuration<br/>\n"
+ "ACT=Active, DIS=Disabled, STP=Stopped</td></tr>\n"
+ "<tr><th>State</th><td>Worker error status<br/>\n"
+ "OK=OK, ERR=Error with substates<br/>\n"
+ "IDLE=No requests handled, BUSY=All connections busy,<br/>\n"
+ "REC=Recovering, PRB=Probing, FRC=Forced Recovery</td></tr>\n"
+ "<tr><th>D</th><td>Worker distance</td></tr>\n"
+ "<tr><th>F</th><td>Load Balancer factor</td></tr>\n"
+ "<tr><th>M</th><td>Load Balancer multiplicity</td></tr>\n"
+ "<tr><th>V</th><td>Load Balancer value</td></tr>\n"
+ "<tr><th>Acc</th><td>Number of requests</td></tr>\n"
+ "<tr><th>Err</th><td>Number of failed requests</td></tr>\n"
+ "<tr><th>CE</th><td>Number of client errors</td></tr>\n"
+ "<tr><th>RE</th><td>Number of reply timeouts (decayed)</td></tr>\n"
+ "<tr><th>Wr</th><td>Number of bytes transferred</td></tr>\n"
+ "<tr><th>Rd</th><td>Number of bytes read</td></tr>\n"
+ "<tr><th>Busy</th><td>Current number of busy connections</td></tr>\n"
+ "<tr><th>Max</th><td>Maximum number of busy connections</td></tr>\n"
+ "<tr><th>Con</th><td>Current number of backend connections</td></tr>\n"
+ "<tr><th>RR</th><td>Route redirect</td></tr>\n"
+ "<tr><th>Cd</th><td>Cluster domain</td></tr>\n"
+ "<tr><th>Rs</th><td>Recovery scheduled in app. min/max seconds</td></tr>\n"
+ "<tr><th>LR</th><td>Seconds since last reset of statistics counters</td></tr>\n"
+ "<tr><th>LE</th><td>Timestamp of the last error</td></tr>\n"
+ "</tbody>\n"
+ "</table>\n");
+ }
+
+ JK_TRACE_EXIT(l);
+}
+
+static int check_worker(jk_ws_service_t *s,
+ status_endpoint_t *p,
+ jk_uint32_t allow_wildchars,
+ jk_logger_t *l)
+{
+ const char *worker;
+ const char *sub_worker;
+ status_worker_t *w = p->worker;
+ jk_worker_t *jw = NULL;
+ lb_sub_worker_t *wr = NULL;
+
+ JK_TRACE_ENTER(l);
+ if (fetch_worker_and_sub_worker(p, "checking", &worker, &sub_worker, l) == JK_FALSE ||
+ search_worker(s, p, &jw, worker, l) == JK_FALSE) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ if (sub_worker && sub_worker[0]) {
+ unsigned int idx = 0;
+ unsigned int *wi = NULL;
+ if (strchr(sub_worker, '*') || strchr(sub_worker, '?')) {
+ /* We have a wildchar matching rule */
+ if (!allow_wildchars) {
+ jk_log(l, JK_LOG_ERROR,
+ "Status worker '%s' wildcards in sub worker '%s' of worker '%s' not allowed for this command",
+ w->name, sub_worker, worker ? worker : "(null)");
+ p->msg = "wildcard not allowed in sub worker for this command";
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ else {
+ wi = &idx;
+ }
+ }
+ if (search_sub_worker(s, p, jw, worker, &wr, sub_worker,
+ wi, l) == JK_FALSE) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ }
+
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+static void count_workers(jk_ws_service_t *s,
+ status_endpoint_t *p,
+ int *lb_cnt, int *ajp_cnt,
+ jk_logger_t *l)
+{
+ unsigned int i;
+ jk_worker_t *jw = NULL;
+ status_worker_t *w = p->worker;
+
+ JK_TRACE_ENTER(l);
+ *lb_cnt = 0;
+ *ajp_cnt = 0;
+ for (i = 0; i < w->we->num_of_workers; i++) {
+ jw = wc_get_worker_for_name(w->we->worker_list[i], l);
+ if (!jw) {
+ jk_log(l, JK_LOG_WARNING,
+ "Status worker '%s' could not find worker '%s'",
+ w->name, w->we->worker_list[i]);
+ continue;
+ }
+ if (jw->type == JK_LB_WORKER_TYPE) {
+ (*lb_cnt)++;
+ }
+ else if (jw->type == JK_AJP13_WORKER_TYPE ||
+ jw->type == JK_AJP14_WORKER_TYPE) {
+ (*ajp_cnt)++;
+ }
+ }
+ JK_TRACE_EXIT(l);
+}
+
+static void list_workers_type(jk_ws_service_t *s,
+ status_endpoint_t *p,
+ int list_lb, int count,
+ jk_logger_t *l)
+{
+
+ const char *arg;
+ unsigned int i;
+ int mime;
+ unsigned int hide;
+ jk_worker_t *jw = NULL;
+ status_worker_t *w = p->worker;
+
+ JK_TRACE_ENTER(l);
+
+ status_get_string(p, JK_STATUS_ARG_MIME, NULL, &arg, l);
+ mime = status_mime_int(arg);
+ if (list_lb) {
+ hide = status_get_int(p, JK_STATUS_ARG_OPTIONS, 0, l) &
+ JK_STATUS_ARG_OPTION_NO_LB;
+ if (hide) {
+ if (mime == JK_STATUS_MIME_HTML) {
+ jk_puts(s, "<p>\n");
+ status_write_uri(s, p, "Show Load Balancing Workers", JK_STATUS_CMD_UNKNOWN, JK_STATUS_MIME_UNKNOWN,
+ NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_LB, NULL, l);
+ jk_puts(s, "</p>\n");
+ }
+ }
+ else {
+ if (mime == JK_STATUS_MIME_XML) {
+ jk_print_xml_start_elt(s, w, 0, 0, "balancers");
+ jk_print_xml_att_int(s, 2, "count", count);
+ jk_print_xml_stop_elt(s, 0, 0);
+ }
+ else if (mime == JK_STATUS_MIME_TXT) {
+ jk_printf(s, "Balancer Workers: count=%d\n", count);
+ }
+ else if (mime == JK_STATUS_MIME_PROP) {
+ jk_print_prop_att_int(s, w, NULL, "lb_count", count);
+ }
+ else {
+ jk_printf(s, "<hr/><h2>Listing Load Balancing Worker%s (%d Worker%s) [",
+ count>1 ? "s" : "", count, count>1 ? "s" : "");
+ status_write_uri(s, p, "Hide", JK_STATUS_CMD_UNKNOWN, JK_STATUS_MIME_UNKNOWN,
+ NULL, NULL, JK_STATUS_ARG_OPTION_NO_LB, 0, NULL, l);
+ jk_puts(s, "]</h2>\n");
+ }
+ }
+ }
+ else {
+ hide = status_get_int(p, JK_STATUS_ARG_OPTIONS, 0, l) &
+ JK_STATUS_ARG_OPTION_NO_AJP;
+ if (hide) {
+ if (mime == JK_STATUS_MIME_HTML) {
+ jk_puts(s, "<p>\n");
+ status_write_uri(s, p, "Show AJP Workers", JK_STATUS_CMD_UNKNOWN, JK_STATUS_MIME_UNKNOWN,
+ NULL, NULL, 0, JK_STATUS_ARG_OPTION_NO_AJP, NULL, l);
+ jk_puts(s, "</p>\n");
+ }
+ }
+ else {
+ if (mime == JK_STATUS_MIME_XML) {
+ jk_print_xml_start_elt(s, w, 0, 0, "ajp_workers");
+ jk_print_xml_att_int(s, 2, "count", count);
+ jk_print_xml_stop_elt(s, 0, 0);
+ }
+ else if (mime == JK_STATUS_MIME_TXT) {
+ jk_printf(s, "AJP Workers: count=%d\n", count);
+ }
+ else if (mime == JK_STATUS_MIME_PROP) {
+ jk_print_prop_att_int(s, w, NULL, "ajp_count", count);
+ }
+ else {
+ jk_printf(s, "<hr/><h2>Listing AJP Worker%s (%d Worker%s) [",
+ count>1 ? "s" : "", count, count>1 ? "s" : "");
+ status_write_uri(s, p, "Hide", JK_STATUS_CMD_UNKNOWN, JK_STATUS_MIME_UNKNOWN,
+ NULL, NULL, JK_STATUS_ARG_OPTION_NO_AJP, 0, NULL, l);
+ jk_puts(s, "]</h2>\n");
+ }
+ }
+ }
+
+ if (hide) {
+ JK_TRACE_EXIT(l);
+ return;
+ }
+
+ for (i = 0; i < w->we->num_of_workers; i++) {
+ jw = wc_get_worker_for_name(w->we->worker_list[i], l);
+ if (!jw) {
+ jk_log(l, JK_LOG_WARNING,
+ "Status worker '%s' could not find worker '%s'",
+ w->name, w->we->worker_list[i]);
+ continue;
+ }
+ if ((list_lb && jw->type == JK_LB_WORKER_TYPE) ||
+ (!list_lb && jw->type != JK_LB_WORKER_TYPE)) {
+ display_worker(s, p, jw, NULL, l);
+ }
+ }
+
+ if (list_lb) {
+ if (mime == JK_STATUS_MIME_XML) {
+ jk_print_xml_close_elt(s, w, 0, "balancers");
+ }
+ else if (mime == JK_STATUS_MIME_TXT) {
+ }
+ else if (mime == JK_STATUS_MIME_PROP) {
+ }
+ else if (mime == JK_STATUS_MIME_HTML) {
+ }
+ }
+ else {
+ if (mime == JK_STATUS_MIME_XML) {
+ jk_print_xml_close_elt(s, w, 0, "ajp_workers");
+ }
+ else if (mime == JK_STATUS_MIME_TXT) {
+ }
+ else if (mime == JK_STATUS_MIME_PROP) {
+ }
+ else if (mime == JK_STATUS_MIME_HTML) {
+ }
+ }
+
+ JK_TRACE_EXIT(l);
+}
+
+static int list_workers(jk_ws_service_t *s,
+ status_endpoint_t *p,
+ jk_logger_t *l)
+{
+ int lb_cnt = 0;
+ int ajp_cnt = 0;
+
+ JK_TRACE_ENTER(l);
+ count_workers(s, p, &lb_cnt, &ajp_cnt, l);
+
+ if (lb_cnt) {
+ list_workers_type(s, p, 1, lb_cnt, l);
+ }
+
+ if (ajp_cnt) {
+ list_workers_type(s, p, 0, ajp_cnt, l);
+ }
+
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+static int show_worker(jk_ws_service_t *s,
+ status_endpoint_t *p,
+ jk_logger_t *l)
+{
+ const char *worker;
+ const char *sub_worker;
+ jk_worker_t *jw = NULL;
+ lb_sub_worker_t *wr = NULL;
+
+ JK_TRACE_ENTER(l);
+ if (fetch_worker_and_sub_worker(p, "showing", &worker, &sub_worker, l) == JK_FALSE ||
+ search_worker(s, p, &jw, worker, l) == JK_FALSE) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ if (sub_worker && sub_worker[0]) {
+ if (search_sub_worker(s, p, jw, worker, &wr, sub_worker,
+ NULL, l) == JK_FALSE) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ }
+ display_worker(s, p, jw, wr, l);
+
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+static int edit_worker(jk_ws_service_t *s,
+ status_endpoint_t *p,
+ jk_logger_t *l)
+{
+ const char *worker;
+ const char *sub_worker;
+ status_worker_t *w = p->worker;
+ jk_worker_t *jw = NULL;
+ lb_worker_t *lb = NULL;
+ lb_sub_worker_t *wr = NULL;
+ ajp_worker_t *aw = NULL;
+
+ JK_TRACE_ENTER(l);
+ if (fetch_worker_and_sub_worker(p, "editing", &worker, &sub_worker, l) == JK_FALSE ||
+ search_worker(s, p, &jw, worker, l) == JK_FALSE) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ if (jw->type == JK_LB_WORKER_TYPE) {
+ if (check_valid_lb(s, p, jw, worker, &lb, 0, l) == JK_FALSE) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ if (lb->sequence != lb->s->h.sequence)
+ jk_lb_pull(lb, JK_FALSE, l);
+ if (!sub_worker || !sub_worker[0]) {
+ const char *arg;
+ if (status_get_string(p, JK_STATUS_ARG_ATTRIBUTE,
+ NULL, &arg, l) == JK_TRUE) {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Status worker '%s' %s lb worker '%s' with all sub workers",
+ w->name, "editing", lb->name);
+ form_all_members(s, p, jw, arg, l);
+ }
+ else {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Status worker '%s' %s lb worker '%s'",
+ w->name, "editing", lb->name);
+ form_worker(s, p, jw, l);
+ }
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+ else {
+ if (search_sub_worker(s, p, jw, worker, &wr, sub_worker,
+ NULL, l) == JK_FALSE) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Status worker '%s' %s lb worker '%s' sub worker '%s'",
+ w->name, "editing", lb->name, wr->name);
+ aw = (ajp_worker_t *)wr->worker->worker_private;
+ form_member(s, p, wr, aw, worker, l);
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+ }
+ else if (jw->type == JK_AJP13_WORKER_TYPE ||
+ jw->type == JK_AJP14_WORKER_TYPE) {
+ ajp_worker_t *aw = (ajp_worker_t *)jw->worker_private;
+ if (aw) {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Status worker '%s' %s ajp worker '%s'",
+ w->name, "editing", aw->name);
+ if (aw->sequence != aw->s->h.sequence)
+ jk_ajp_pull(aw, JK_FALSE, l);
+ form_member(s, p, NULL, aw, worker, l);
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+ else {
+ jk_log(l, JK_LOG_WARNING,
+ "Status worker '%s' aw worker is (null)",
+ w->name);
+ }
+ }
+ else {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Status worker '%s' worker type not implemented",
+ w->name);
+ }
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+}
+
+static int update_worker(jk_ws_service_t *s,
+ status_endpoint_t *p,
+ jk_logger_t *l)
+{
+ const char *worker;
+ const char *sub_worker;
+ status_worker_t *w = p->worker;
+ jk_worker_t *jw = NULL;
+ lb_worker_t *lb = NULL;
+ lb_sub_worker_t *wr = NULL;
+ ajp_worker_t *aw = NULL;
+ int rc = JK_TRUE;
+ int rv;
+
+ JK_TRACE_ENTER(l);
+ if (fetch_worker_and_sub_worker(p, "updating", &worker, &sub_worker, l) == JK_FALSE ||
+ search_worker(s, p, &jw, worker, l) == JK_FALSE) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ if (jw->type == JK_LB_WORKER_TYPE) {
+ if (check_valid_lb(s, p, jw, worker, &lb, 0, l) == JK_FALSE) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ if (lb->sequence != lb->s->h.sequence)
+ jk_lb_pull(lb, JK_TRUE, l);
+ if (!sub_worker || !sub_worker[0]) {
+ const char *arg;
+ if (status_get_string(p, JK_STATUS_ARG_ATTRIBUTE,
+ NULL, &arg, l) == JK_TRUE) {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Status worker '%s' %s lb worker '%s' with all sub workers",
+ w->name, "updating", lb->name);
+ commit_all_members(s, p, jw, arg, l);
+ }
+ else {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Status worker '%s' %s lb worker '%s'",
+ w->name, "updating", lb->name);
+ commit_worker(s, p, jw, l);
+ }
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+ else {
+ unsigned int idx = 0;
+ unsigned int *wi = NULL;
+ int is_wildchar = JK_FALSE;
+
+ if (strchr(sub_worker, '*') || strchr(sub_worker, '?')) {
+ /* We have a wildchar matching rule */
+ wi = &idx;
+ is_wildchar = JK_TRUE;
+ }
+ for (;;) {
+ if (search_sub_worker(s, p, jw, worker, &wr, sub_worker,
+ wi, l) == JK_FALSE) {
+ if (!idx) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ else {
+ /* We have found at least one match previously */
+ p->msg = "OK";
+ break;
+ }
+ }
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Status worker '%s' %s lb worker '%s' sub worker '%s'",
+ w->name, "updating", lb->name, wr->name);
+ aw = (ajp_worker_t *)wr->worker->worker_private;
+ rv = 0;
+ rc = commit_member(s, p, lb, wr, aw, &rv, l);
+ if (rv & JK_STATUS_NEEDS_ADDR_PUSH) {
+ aw->addr_sequence++;
+ }
+ if (rv & (JK_STATUS_NEEDS_PUSH | JK_STATUS_NEEDS_ADDR_PUSH)) {
+ wr->sequence++;
+ lb->sequence++;
+ jk_lb_push(lb, JK_TRUE, l);
+ }
+ if (rv & JK_STATUS_NEEDS_RESET_LB_VALUES)
+ reset_lb_values(lb, l);
+ if (rv & JK_STATUS_NEEDS_UPDATE_MULT)
+ /* Recalculate the load multiplicators wrt. lb_factor */
+ update_mult(lb, l);
+ if (rc == JK_FALSE) {
+ jk_log(l, JK_LOG_ERROR,
+ "Status worker '%s' failed updating sub worker '%s' (at least partially).%s",
+ w->name, aw->name, (is_wildchar == JK_TRUE) ? " Aborting further wildcard updates." : "");
+ if (!strncmp("OK", p->msg, 3)) {
+ const char *msg = "Update failed (at least partially) for sub worker '%s'";
+ size_t size = strlen(msg) + strlen(aw->name) + 1;
+ p->msg = jk_pool_alloc(s->pool, size);
+ snprintf(p->msg, size, msg, aw->name);
+ }
+ if (is_wildchar == JK_TRUE) {
+ const char *msg = " Aborting further wildcard updates.";
+ size_t size = strlen(msg) + strlen(p->msg) + 1;
+ p->msg = jk_pool_realloc(s->pool, size, p->msg, strlen(p->msg) + 1);
+ strcat(p->msg, msg);
+ }
+ break;
+ }
+ if (!wi)
+ break;
+ }
+ JK_TRACE_EXIT(l);
+ return rc;
+ }
+ }
+ else if (jw->type == JK_AJP13_WORKER_TYPE ||
+ jw->type == JK_AJP14_WORKER_TYPE) {
+ ajp_worker_t *aw = (ajp_worker_t *)jw->worker_private;
+ if (aw) {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Status worker '%s' %s ajp worker '%s'",
+ w->name, "updating", aw->name);
+ if (aw->sequence != aw->s->h.sequence)
+ jk_ajp_pull(aw, JK_TRUE, l);
+ rv = 0;
+ rc = commit_member(s, p, NULL, NULL, aw, &rv, l);
+ if (rv & JK_STATUS_NEEDS_ADDR_PUSH) {
+ aw->addr_sequence++;
+ }
+ if (rv & (JK_STATUS_NEEDS_PUSH | JK_STATUS_NEEDS_ADDR_PUSH)) {
+ aw->sequence++;
+ jk_ajp_push(aw, JK_TRUE, l);
+ }
+ if (rc == JK_FALSE) {
+ jk_log(l, JK_LOG_ERROR,
+ "Status worker '%s' failed updating worker '%s' (at least partially).",
+ w->name, aw->name);
+ if (!strncmp("OK", p->msg, 3)) {
+ const char *msg = "Update failed (at least partially) for worker '%s'";
+ size_t size = strlen(msg) + strlen(aw->name) + 1;
+ p->msg = jk_pool_alloc(s->pool, size);
+ snprintf(p->msg, size, msg, aw->name);
+ }
+ }
+ JK_TRACE_EXIT(l);
+ return rc;
+ }
+ else {
+ jk_log(l, JK_LOG_WARNING,
+ "Status worker '%s' aw worker is (null)",
+ w->name);
+ }
+ }
+ else {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Status worker '%s' worker type not implemented",
+ w->name);
+ }
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+}
+
+static int reset_worker(jk_ws_service_t *s,
+ status_endpoint_t *p,
+ jk_logger_t *l)
+{
+ unsigned int i;
+ const char *worker;
+ const char *sub_worker;
+ status_worker_t *w = p->worker;
+ jk_worker_t *jw = NULL;
+ lb_worker_t *lb = NULL;
+ lb_sub_worker_t *wr = NULL;
+ ajp_worker_t *aw = NULL;
+ time_t now = 0;
+
+ JK_TRACE_ENTER(l);
+ if (fetch_worker_and_sub_worker(p, "resetting", &worker, &sub_worker, l) == JK_FALSE ||
+ search_worker(s, p, &jw, worker, l) == JK_FALSE) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ now = time(NULL);
+ if (jw->type == JK_LB_WORKER_TYPE) {
+ if (check_valid_lb(s, p, jw, worker, &lb, 0, l) == JK_FALSE) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ if (!sub_worker || !sub_worker[0]) {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Status worker '%s' %s lb worker '%s' with all sub workers",
+ w->name, "resetting", lb->name);
+ lb->s->max_busy = 0;
+ lb->s->last_reset = now;
+ for (i = 0; i < lb->num_of_workers; i++) {
+ wr = &(lb->lb_workers[i]);
+ aw = (ajp_worker_t *)wr->worker->worker_private;
+ wr->s->state = JK_LB_STATE_IDLE;
+ wr->s->elected_snapshot = 0;
+ wr->s->error_time = 0;
+ wr->s->errors = 0;
+ wr->s->lb_value = 0;
+ aw->s->used = 0;
+ aw->s->client_errors = 0;
+ aw->s->reply_timeouts = 0;
+ aw->s->transferred = 0;
+ aw->s->readed = 0;
+ aw->s->max_busy = 0;
+ aw->s->last_reset = now;
+ }
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+ else {
+ if (search_sub_worker(s, p, jw, worker, &wr, sub_worker,
+ NULL, l) == JK_FALSE) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Status worker '%s' %s lb worker '%s' sub worker '%s'",
+ w->name, "resetting", lb->name, wr->name);
+ aw = (ajp_worker_t *)wr->worker->worker_private;
+ wr->s->state = JK_LB_STATE_IDLE;
+ wr->s->elected_snapshot = 0;
+ wr->s->error_time = 0;
+ wr->s->errors = 0;
+ wr->s->lb_value = 0;
+ aw->s->used = 0;
+ aw->s->client_errors = 0;
+ aw->s->reply_timeouts = 0;
+ aw->s->transferred = 0;
+ aw->s->readed = 0;
+ aw->s->max_busy = 0;
+ aw->s->last_reset = now;
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+ }
+ else if (jw->type == JK_AJP13_WORKER_TYPE ||
+ jw->type == JK_AJP14_WORKER_TYPE) {
+ ajp_worker_t *aw = (ajp_worker_t *)jw->worker_private;
+ if (aw) {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Status worker '%s' %s ajp worker '%s'",
+ w->name, "resetting", aw->name);
+ aw->s->errors = 0;
+ aw->s->used = 0;
+ aw->s->client_errors = 0;
+ aw->s->reply_timeouts = 0;
+ aw->s->transferred = 0;
+ aw->s->readed = 0;
+ aw->s->max_busy = 0;
+ aw->s->last_reset = now;
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+ else {
+ jk_log(l, JK_LOG_WARNING,
+ "Status worker '%s' aw worker is (null)",
+ w->name);
+ }
+ }
+ else {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Status worker '%s' worker type not implemented",
+ w->name);
+ }
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+}
+
+static int recover_worker(jk_ws_service_t *s,
+ status_endpoint_t *p,
+ jk_logger_t *l)
+{
+ const char *worker;
+ const char *sub_worker;
+ jk_worker_t *jw = NULL;
+ lb_sub_worker_t *wr = NULL;
+ ajp_worker_t *aw = NULL;
+ status_worker_t *w = p->worker;
+
+ JK_TRACE_ENTER(l);
+ if (fetch_worker_and_sub_worker(p, "recovering", &worker, &sub_worker, l) == JK_FALSE ||
+ search_worker(s, p, &jw, worker, l) == JK_FALSE) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ if (search_sub_worker(s, p, jw, worker, &wr, sub_worker,
+ NULL, l) == JK_FALSE) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ aw = (ajp_worker_t *)wr->worker->worker_private;
+ if (wr->s->state == JK_LB_STATE_ERROR) {
+ lb_worker_t *lb = NULL;
+
+ /* We need an lb to correct the lb_value */
+ if (check_valid_lb(s, p, jw, worker, &lb, 0, l) == JK_FALSE) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ if (lb->lbmethod != JK_LB_METHOD_BUSYNESS) {
+ unsigned int i;
+ jk_uint64_t curmax = 0;
+
+ for (i = 0; i < lb->num_of_workers; i++) {
+ if (lb->lb_workers[i].s->lb_value > curmax) {
+ curmax = lb->lb_workers[i].s->lb_value;
+ }
+ }
+ wr->s->lb_value = curmax;
+ }
+
+ aw->s->reply_timeouts = 0;
+ wr->s->state = JK_LB_STATE_RECOVER;
+ jk_log(l, JK_LOG_INFO,
+ "Status worker '%s' marked worker '%s' sub worker '%s' for recovery",
+ w->name, worker ? worker : "(null)", sub_worker ? sub_worker : "(null)");
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+ jk_log(l, JK_LOG_WARNING,
+ "Status worker '%s' could not mark worker '%s' sub worker '%s' for recovery - state %s is not an error state",
+ w->name, worker ? worker : "(null)", sub_worker ? sub_worker : "(null)",
+ jk_lb_get_state(wr, l));
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+}
+
+static int dump_config(jk_ws_service_t *s,
+ status_endpoint_t *p,
+ int mime, jk_logger_t *l)
+{
+ status_worker_t *w = p->worker;
+ jk_worker_env_t *we = w->we;
+ jk_map_t *init_data = we->init_data;
+
+ JK_TRACE_ENTER(l);
+
+ if (init_data) {
+ int l = jk_map_size(init_data);
+ int i;
+ if (mime == JK_STATUS_MIME_HTML) {
+ jk_puts(s, "<hr/><h2>Configuration Data</h2><hr/>\n");
+ jk_puts(s, "This dump does not include any changes applied by the status worker\n");
+ jk_puts(s, "to the configuration after the initial startup\n");
+ jk_puts(s, "<PRE>\n");
+ }
+ else if (mime == JK_STATUS_MIME_XML) {
+ jk_print_xml_start_elt(s, w, 2, 0, "configuration");
+ }
+ else if (mime == JK_STATUS_MIME_TXT) {
+ jk_puts(s, "Configuration:\n");
+ }
+ for (i=0;i<l;i++) {
+ const char *name = jk_map_name_at(init_data, i);
+ if (name) {
+ const char *value;
+ size_t nl = strlen(name);
+ if (nl > sizeof(".secret") &&
+ strcmp(name + nl - 7, ".secret") == 0) {
+ continue;
+ }
+ value = jk_map_value_at(init_data, i);
+ if (!value)
+ value = "(null)";
+ if (mime == JK_STATUS_MIME_HTML ||
+ mime == JK_STATUS_MIME_PROP ||
+ mime == JK_STATUS_MIME_TXT) {
+ jk_putv(s, name, "=", value, "\n", NULL);
+ }
+ else if (mime == JK_STATUS_MIME_XML) {
+ jk_print_xml_att_string(s, 4, name, value);
+ }
+ }
+ }
+ if (mime == JK_STATUS_MIME_HTML) {
+ jk_puts(s, "</PRE>\n");
+ }
+ else if (mime == JK_STATUS_MIME_XML) {
+ jk_print_xml_stop_elt(s, 2, 1);
+ }
+ }
+ else {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+/*
+ * Return values of service() method for status worker:
+ * return value is_error reason
+ * JK_FALSE JK_HTTP_SERVER_ERROR Invalid parameters (null values)
+ * JK_TRUE JK_HTTP_OK All other cases
+ */
+static int JK_METHOD service(jk_endpoint_t *e,
+ jk_ws_service_t *s,
+ jk_logger_t *l, int *is_error)
+{
+ int cmd;
+ jk_uint32_t cmd_props;
+ int mime;
+ int refresh;
+ int read_only = 0;
+ const char *arg;
+ char *err = NULL;
+ status_endpoint_t *p;
+ status_worker_t *w;
+ int denied = 0;
+
+ JK_TRACE_ENTER(l);
+
+ if (!e || !e->endpoint_private || !s || !is_error) {
+ JK_LOG_NULL_PARAMS(l);
+ if (is_error)
+ *is_error = JK_HTTP_SERVER_ERROR;
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ p = e->endpoint_private;
+ w = p->worker;
+
+ /* Set returned error to OK */
+ *is_error = JK_HTTP_OK;
+
+ if (w->num_of_users) {
+ if (s->remote_user) {
+ unsigned int i;
+ denied = 1;
+ for (i = 0; i < w->num_of_users; i++) {
+ if (w->user_case_insensitive) {
+ if (!strcasecmp(s->remote_user, w->user_names[i])) {
+ denied = 0;
+ break;
+ }
+ }
+ else {
+ if (!strcmp(s->remote_user, w->user_names[i])) {
+ denied = 0;
+ break;
+ }
+ }
+ }
+ }
+ else {
+ denied = 2;
+ }
+ }
+
+ /* Step 1: Process GET params and update configuration */
+ if (status_parse_uri(s, p, l) != JK_TRUE) {
+ err = "Error during parsing of URI";
+ }
+ status_get_string(p, JK_STATUS_ARG_CMD, NULL, &arg, l);
+ cmd = status_cmd_int(arg);
+ cmd_props = status_cmd_props(cmd);
+ status_get_string(p, JK_STATUS_ARG_MIME, NULL, &arg, l);
+ mime = status_mime_int(arg);
+ refresh = status_get_int(p, JK_STATUS_ARG_REFRESH, 0, l);
+ if (w->read_only) {
+ read_only = 1;
+ }
+ else {
+ read_only = status_get_int(p, JK_STATUS_ARG_OPTIONS, 0, l) &
+ JK_STATUS_ARG_OPTION_READ_ONLY;
+ }
+
+ if (mime == JK_STATUS_MIME_HTML) {
+ s->start_response(s, 200, "OK", headers_names, headers_vhtml, 3);
+ jk_puts(s, JK_STATUS_HEAD);
+ }
+ else if (mime == JK_STATUS_MIME_XML) {
+ s->start_response(s, 200, "OK", headers_names, headers_vxml, 3);
+ jk_puts(s, JK_STATUS_XMLH);
+ if (w->doctype) {
+ jk_putv(s, w->doctype, "\n", NULL);
+ }
+ jk_print_xml_start_elt(s, w, 0, 0, "status");
+ if (w->xmlns && strlen(w->xmlns))
+ jk_putv(s, " ", w->xmlns, NULL);
+ jk_print_xml_stop_elt(s, 0, 0);
+ }
+ else {
+ s->start_response(s, 200, "OK", headers_names, headers_vtxt, 3);
+ }
+
+ if (denied == 0) {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Status worker '%s' service allowed for user '%s' [%s] from %s [%s]",
+ w->name,
+ s->remote_user ? s->remote_user : "(null)",
+ s->auth_type ? s->auth_type : "(null)",
+ s->remote_addr ? s->remote_addr : "(null)",
+ s->remote_host ? s->remote_host : "(null)");
+ }
+ else if (denied == 1) {
+ err = "Access denied.";
+ jk_log(l, JK_LOG_WARNING,
+ "Status worker '%s' service denied for user '%s' [%s] from %s [%s]",
+ w->name,
+ s->remote_user ? s->remote_user : "(null)",
+ s->auth_type ? s->auth_type : "(null)",
+ s->remote_addr ? s->remote_addr : "(null)",
+ s->remote_host ? s->remote_host : "(null)");
+ }
+ else if (denied == 2) {
+ err = "Access denied.";
+ jk_log(l, JK_LOG_WARNING,
+ "Status worker '%s' service denied (no user) [%s] from %s [%s]",
+ w->name,
+ s->remote_user ? s->remote_user : "(null)",
+ s->auth_type ? s->auth_type : "(null)",
+ s->remote_addr ? s->remote_addr : "(null)",
+ s->remote_host ? s->remote_host : "(null)");
+ }
+ else {
+ err = "Access denied.";
+ jk_log(l, JK_LOG_WARNING,
+ "Status worker '%s' service denied (unknown reason) for user '%s' [%s] from %s [%s]",
+ w->name,
+ s->remote_user ? s->remote_user : "(null)",
+ s->auth_type ? s->auth_type : "(null)",
+ s->remote_addr ? s->remote_addr : "(null)",
+ s->remote_host ? s->remote_host : "(null)");
+ }
+
+ if (!err) {
+ if (read_only && !(cmd_props & JK_STATUS_CMD_PROP_READONLY)) {
+ err = "This command is not allowed in read only mode.";
+ }
+ }
+
+ if (!err) {
+ if (cmd == JK_STATUS_CMD_UNKNOWN) {
+ err = "Invalid command.";
+ }
+ else if (mime == JK_STATUS_MIME_UNKNOWN) {
+ err = "Invalid mime type.";
+ }
+ else if (cmd_props & JK_STATUS_CMD_PROP_CHECK_WORKER &&
+ (check_worker(s, p, cmd_props & JK_STATUS_CMD_PROP_WILDCARD, l) != JK_TRUE)) {
+ err = p->msg;
+ }
+ }
+
+ if (!err) {
+ char buf_time[JK_STATUS_TIME_BUF_SZ];
+ char buf_tz[JK_STATUS_TIME_BUF_SZ];
+ time_t clock = time(NULL);
+ long unix_seconds = (long)clock;
+ int rc_time = status_strftime(clock, mime, buf_time, buf_tz, l);
+ if (cmd == JK_STATUS_CMD_UPDATE) {
+ /* lock shared memory */
+ jk_shm_lock();
+ if (update_worker(s, p, l) == JK_FALSE) {
+ if (strncmp("OK", p->msg, 3))
+ err = p->msg;
+ else
+ err = "Update failed";
+ }
+ /* unlock the shared memory */
+ jk_shm_unlock();
+ if (mime == JK_STATUS_MIME_HTML) {
+ write_html_refresh_response(s, p, err, l);
+ }
+ }
+ else if (cmd == JK_STATUS_CMD_RESET) {
+ /* lock shared memory */
+ jk_shm_lock();
+ if (reset_worker(s, p, l) == JK_FALSE) {
+ err = "Reset failed";
+ }
+ /* unlock the shared memory */
+ jk_shm_unlock();
+ if (mime == JK_STATUS_MIME_HTML) {
+ write_html_refresh_response(s, p, err, l);
+ }
+ }
+ else if (cmd == JK_STATUS_CMD_RECOVER) {
+ /* lock shared memory */
+ jk_shm_lock();
+ if (recover_worker(s, p, l) == JK_FALSE) {
+ err = "Marking worker for recovery failed";
+ }
+ /* unlock the shared memory */
+ jk_shm_unlock();
+ if (mime == JK_STATUS_MIME_HTML) {
+ write_html_refresh_response(s, p, err, l);
+ }
+ }
+ else {
+ if (mime == JK_STATUS_MIME_XML) {
+ jk_print_xml_start_elt(s, w, 0, 0, "server");
+ jk_print_xml_att_string(s, 2, "name", s->server_name);
+ jk_print_xml_att_int(s, 2, "port", s->server_port);
+ jk_print_xml_stop_elt(s, 0, 1);
+ if (cmd_props & JK_STATUS_CMD_PROP_HEAD) {
+ if (rc_time > 0 ) {
+ jk_print_xml_start_elt(s, w, 0, 0, "time");
+ jk_print_xml_att_string(s, 2, "datetime", buf_time);
+ jk_print_xml_att_string(s, 2, "tz", buf_tz);
+ jk_print_xml_att_long(s, 2, "unix", unix_seconds);
+ jk_print_xml_stop_elt(s, 0, 1);
+ }
+ jk_print_xml_start_elt(s, w, 0, 0, "software");
+ jk_print_xml_att_string(s, 2, "web_server", s->server_software);
+ jk_print_xml_att_string(s, 2, "jk_version", JK_FULL_EXPOSED_VERSION);
+ jk_print_xml_stop_elt(s, 0, 1);
+ }
+ if (cmd == JK_STATUS_CMD_LIST) {
+ /* Step 2: Display configuration */
+ if (list_workers(s, p, l) != JK_TRUE) {
+ err = "Error in listing the workers.";
+ }
+ }
+ else if (cmd == JK_STATUS_CMD_SHOW) {
+ /* Step 2: Display detailed configuration */
+ if (show_worker(s, p, l) != JK_TRUE) {
+ err = "Error in showing this worker.";
+ }
+ }
+ }
+ else if (mime == JK_STATUS_MIME_TXT) {
+ jk_puts(s, "Server:");
+ jk_printf(s, " name=%s", s->server_name);
+ jk_printf(s, " port=%d", s->server_port);
+ jk_puts(s, "\n");
+ if (cmd_props & JK_STATUS_CMD_PROP_HEAD) {
+ if (rc_time > 0) {
+ jk_puts(s, "Time:");
+ jk_printf(s, " datetime=%s", buf_time);
+ jk_printf(s, " tz=%s", buf_tz);
+ jk_printf(s, " unix=%ld", unix_seconds);
+ jk_puts(s, "\n");
+ }
+ jk_puts(s, "Software:");
+ jk_printf(s, " web_server=\"%s\"", s->server_software);
+ jk_printf(s, " jk_version=%s", JK_FULL_EXPOSED_VERSION);
+ jk_puts(s, "\n");
+ }
+ if (cmd == JK_STATUS_CMD_LIST) {
+ /* Step 2: Display configuration */
+ if (list_workers(s, p, l) != JK_TRUE) {
+ err = "Error in listing the workers.";
+ }
+ }
+ else if (cmd == JK_STATUS_CMD_SHOW) {
+ /* Step 2: Display detailed configuration */
+ if (show_worker(s, p, l) != JK_TRUE) {
+ err = "Error in showing this worker.";
+ }
+ }
+ }
+ else if (mime == JK_STATUS_MIME_PROP) {
+ jk_print_prop_att_string(s, w, NULL, "server_name", s->server_name);
+ jk_print_prop_att_int(s, w, NULL, "server_port", s->server_port);
+ if (cmd_props & JK_STATUS_CMD_PROP_HEAD) {
+ if (rc_time > 0) {
+ jk_print_prop_att_string(s, w, NULL, "time_datetime", buf_time);
+ jk_print_prop_att_string(s, w, NULL, "time_tz", buf_tz);
+ jk_print_prop_att_long(s, w, NULL, "time_unix", unix_seconds);
+ }
+ jk_print_prop_att_string(s, w, NULL, "web_server", s->server_software);
+ jk_print_prop_att_string(s, w, NULL, "jk_version", JK_FULL_EXPOSED_VERSION);
+ }
+ if (cmd == JK_STATUS_CMD_LIST) {
+ /* Step 2: Display configuration */
+ if (list_workers(s, p, l) != JK_TRUE) {
+ err = "Error in listing the workers.";
+ }
+ }
+ else if (cmd == JK_STATUS_CMD_SHOW) {
+ /* Step 2: Display detailed configuration */
+ if (show_worker(s, p, l) != JK_TRUE) {
+ err = "Error in showing this worker.";
+ }
+ }
+ }
+ else if (mime == JK_STATUS_MIME_HTML) {
+ if (cmd_props & JK_STATUS_CMD_PROP_REFRESH &&
+ refresh > 0) {
+ jk_printf(s, "\n<meta http-equiv=\"Refresh\" content=\"%d;url=%s?%s\">",
+ refresh, s->req_uri, p->query_string);
+ }
+ if (w->css) {
+ jk_putv(s, "\n<link rel=\"stylesheet\" type=\"text/css\" href=\"",
+ w->css, "\" />\n", NULL);
+ }
+ jk_puts(s, JK_STATUS_HEND);
+ jk_puts(s, "<h1>JK Status Manager for ");
+ jk_puts(s, s->server_name);
+ jk_printf(s, ":%d", s->server_port);
+ if (read_only) {
+ jk_puts(s, " (read only)");
+ }
+ jk_puts(s, "</h1>\n\n");
+ if (cmd_props & JK_STATUS_CMD_PROP_HEAD) {
+ jk_putv(s, "<table><tr><td>Server Version:</td><td>",
+ s->server_software, "</td><td>&nbsp;&nbsp;&nbsp;</td><td>", NULL);
+ if (rc_time > 0) {
+ jk_putv(s, "Server Time:</td><td>", buf_time, NULL);
+ }
+ jk_puts(s, "</td></tr>\n");
+ jk_putv(s, "<tr><td>JK Version:</td><td>",
+ JK_FULL_EXPOSED_VERSION, "</td><td></td><td>", NULL);
+ jk_printf(s, "Unix Seconds:</td><td>%d", unix_seconds);
+ jk_puts(s, "</td></tr></table>\n<hr/>\n");
+ }
+ jk_puts(s, "<table><tbody valign=\"baseline\"><tr>\n");
+ if (cmd_props & JK_STATUS_CMD_PROP_REFRESH) {
+ jk_puts(s, "<td>");
+ if (refresh > 0) {
+ const char *str = p->query_string;
+ char *buf = jk_pool_alloc(s->pool, sizeof(char *) * (strlen(str)+1));
+ int result = 0;
+ size_t scan = 0;
+ size_t len = strlen(JK_STATUS_ARG_REFRESH);
+
+ while (str[scan] != '\0') {
+ if (strncmp(&str[scan], JK_STATUS_ARG_REFRESH, len) == 0 &&
+ str[scan+len] == '=') {
+ scan += len + 1;
+ while (str[scan] != '\0' && str[scan] != '&')
+ scan++;
+ if (str[scan] == '&')
+ scan++;
+ }
+ else {
+ if (result > 0 && str[scan] != '\0' && str[scan] != '&') {
+ buf[result] = '&';
+ result++;
+ }
+ while (str[scan] != '\0' && str[scan] != '&') {
+ buf[result] = str[scan];
+ result++;
+ scan++;
+ }
+ if (str[scan] == '&')
+ scan++;
+ }
+ }
+ buf[result] = '\0';
+
+ jk_putv(s, "[<a href=\"", s->req_uri, NULL);
+ if (buf && buf[0])
+ jk_putv(s, "?", buf, NULL);
+ jk_puts(s, "\">Stop auto refresh</a>]");
+ }
+ else {
+ status_start_form(s, p, "get", JK_STATUS_CMD_UNKNOWN, JK_STATUS_ARG_REFRESH, l);
+ jk_puts(s, "<input type=\"submit\" value=\"Start auto refresh\"/>\n");
+ jk_putv(s, "(every ",
+ "<input name=\"", JK_STATUS_ARG_REFRESH,
+ "\" type=\"text\" size=\"3\" value=\"",
+ JK_STATUS_REFRESH_DEF "\"/> ",
+ "seconds)", NULL);
+ jk_puts(s, "</form>\n");
+ }
+ jk_puts(s, "</td><td>&nbsp;&nbsp;|&nbsp;&nbsp;</td>\n");
+ }
+ if (cmd_props & JK_STATUS_CMD_PROP_FMT) {
+ jk_puts(s, "<td>\n");
+ status_start_form(s, p, "get", JK_STATUS_CMD_UNKNOWN, JK_STATUS_ARG_MIME, l);
+ jk_puts(s, "<input type=\"submit\" value=\"Change format\"/>\n");
+ jk_putv(s, "<select name=\"", JK_STATUS_ARG_MIME, "\" size=\"1\">", NULL);
+ jk_putv(s, "<option value=\"", JK_STATUS_MIME_TEXT_XML, "\">XML</option>", NULL);
+ jk_putv(s, "<option value=\"", JK_STATUS_MIME_TEXT_PROP, "\">Properties</option>", NULL);
+ jk_putv(s, "<option value=\"", JK_STATUS_MIME_TEXT_TXT, "\">Text</option>", NULL);
+ jk_puts(s, "</select></form>\n");
+ jk_puts(s, "</td>\n");
+ }
+ jk_puts(s, "</tr></table>\n");
+ jk_puts(s, "<table><tbody valign=\"baseline\"><tr>\n");
+ if (cmd_props & JK_STATUS_CMD_PROP_BACK_LINK) {
+ int from;
+ jk_puts(s, "<td>\n");
+ status_get_string(p, JK_STATUS_ARG_FROM, NULL, &arg, l);
+ from = status_cmd_int(arg);
+ jk_puts(s, "[");
+ if (cmd_props & JK_STATUS_CMD_PROP_BACK_LIST ||
+ from == JK_STATUS_CMD_LIST) {
+ status_write_uri(s, p, "Back to worker list", JK_STATUS_CMD_LIST, JK_STATUS_MIME_UNKNOWN,
+ "", "", 0, 0, "", l);
+ }
+ else {
+ status_write_uri(s, p, "Back to worker view", JK_STATUS_CMD_SHOW, JK_STATUS_MIME_UNKNOWN,
+ NULL, NULL, 0, 0, "", l);
+ }
+ jk_puts(s, "]&nbsp;&nbsp;");
+ jk_puts(s, "</td>\n");
+ }
+ if (cmd_props & JK_STATUS_CMD_PROP_SWITCH_RO) {
+ jk_puts(s, "<td>\n");
+ if (!w->read_only) {
+ jk_puts(s, "[");
+ if (read_only) {
+ status_write_uri(s, p, "Read/Write", 0, JK_STATUS_MIME_UNKNOWN,
+ NULL, NULL, 0, JK_STATUS_ARG_OPTION_READ_ONLY, NULL, l);
+ }
+ else {
+ status_write_uri(s, p, "Read Only", 0, JK_STATUS_MIME_UNKNOWN,
+ NULL, NULL, JK_STATUS_ARG_OPTION_READ_ONLY, 0, NULL, l);
+ }
+ jk_puts(s, "]&nbsp;&nbsp;\n");
+ }
+ jk_puts(s, "</td>\n");
+ }
+ if (cmd_props & JK_STATUS_CMD_PROP_DUMP_LINK) {
+ jk_puts(s, "<td>\n");
+ jk_puts(s, "[");
+ status_write_uri(s, p, "Dump", JK_STATUS_CMD_DUMP, JK_STATUS_MIME_UNKNOWN,
+ NULL, NULL, 0, 0, NULL, l);
+ jk_puts(s, "]&nbsp;&nbsp;\n");
+ jk_puts(s, "</td>\n");
+ }
+ if (cmd_props & JK_STATUS_CMD_PROP_LINK_HELP &&
+ (cmd == JK_STATUS_CMD_LIST || !read_only)) {
+ jk_puts(s, "<td>\n");
+ jk_puts(s, "[");
+ if (cmd == JK_STATUS_CMD_LIST) {
+ jk_puts(s, "<b>S</b>=Show only this worker, ");
+ }
+ jk_puts(s, "<b>E</b>=Edit worker, <b>R</b>=Reset worker state, <b>T</b>=Try worker recovery");
+ jk_puts(s, "]<br/>\n");
+ jk_puts(s, "</td>\n");
+ }
+ jk_puts(s, "</tr></table>\n");
+ if (cmd == JK_STATUS_CMD_LIST) {
+ /* Step 2: Display configuration */
+ if (list_workers(s, p, l) != JK_TRUE) {
+ err = "Error in listing the workers.";
+ }
+ }
+ else if (cmd == JK_STATUS_CMD_SHOW) {
+ /* Step 2: Display detailed configuration */
+ if (show_worker(s, p, l) != JK_TRUE) {
+ err = "Error in showing this worker.";
+ }
+ }
+ else if (cmd == JK_STATUS_CMD_EDIT) {
+ /* Step 2: Display edit form */
+ if (edit_worker(s, p, l) != JK_TRUE) {
+ err = "Error in generating this worker's configuration form.";
+ }
+ }
+ }
+ if (cmd == JK_STATUS_CMD_DUMP) {
+ if (dump_config(s, p, mime, l) == JK_FALSE) {
+ err = "Dumping configuration failed";
+ }
+ }
+ if (cmd_props & JK_STATUS_CMD_PROP_LEGEND) {
+ display_legend(s, p, l);
+ }
+ }
+ }
+ if (err) {
+ jk_log(l, JK_LOG_WARNING, "Status worker '%s': %s", w->name, err);
+ if (mime == JK_STATUS_MIME_HTML) {
+ jk_putv(s, "<p><b>Result: ERROR - ", err, "</b><br/>", NULL);
+ jk_putv(s, "<a href=\"", s->req_uri, "\">JK Status Manager Start Page</a></p>", NULL);
+ }
+ else if (mime == JK_STATUS_MIME_XML) {
+ jk_print_xml_start_elt(s, w, 2, 0, "result");
+ jk_print_xml_att_string(s, 4, "type", "ERROR");
+ jk_print_xml_att_string(s, 4, "message", err);
+ jk_print_xml_stop_elt(s, 2, 1);
+ }
+ else if (mime == JK_STATUS_MIME_TXT) {
+ jk_puts(s, "Result:");
+ jk_printf(s, " type=%s", "ERROR");
+ jk_printf(s, " message=\"%s\"", err);
+ jk_puts(s, "\n");
+ }
+ else {
+ jk_print_prop_att_string(s, w, "result", "type", "ERROR");
+ jk_print_prop_att_string(s, w, "result", "message", err);
+ }
+ }
+ else {
+ if (mime == JK_STATUS_MIME_HTML) {
+ jk_putv(s, "<p><a href=\"", s->req_uri, "\">JK Status Manager Start Page</a></p>", NULL);
+ }
+ else if (mime == JK_STATUS_MIME_XML) {
+ jk_print_xml_start_elt(s, w, 2, 0, "result");
+ jk_print_xml_att_string(s, 4, "type", "OK");
+ jk_print_xml_att_string(s, 4, "message", "Action finished");
+ jk_print_xml_stop_elt(s, 2, 1);
+ }
+ else if (mime == JK_STATUS_MIME_TXT) {
+ jk_puts(s, "Result:");
+ jk_printf(s, " type=%s", "OK");
+ jk_printf(s, " message=\"%s\"", "Action finished");
+ jk_puts(s, "\n");
+ }
+ else {
+ jk_print_prop_att_string(s, w, "result", "type", "OK");
+ jk_print_prop_att_string(s, w, "result", "message", "Action finished");
+ }
+ }
+ if (mime == JK_STATUS_MIME_HTML) {
+ if (w->css) {
+ jk_putv(s, "<hr/><div class=\"footer\">", JK_STATUS_COPYRIGHT,
+ "</div>\n", NULL);
+ }
+ else {
+ jk_putv(s, "<hr/><p align=\"center\"><small>", JK_STATUS_COPYRIGHT,
+ "</small></p>\n", NULL);
+ }
+ jk_puts(s, JK_STATUS_BEND);
+ }
+ else if (mime == JK_STATUS_MIME_XML) {
+ jk_print_xml_close_elt(s, w, 0, "status");
+ }
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+static int JK_METHOD done(jk_endpoint_t **e, jk_logger_t *l)
+{
+ JK_TRACE_ENTER(l);
+
+ if (e && *e && (*e)->endpoint_private) {
+ status_endpoint_t *p = (*e)->endpoint_private;
+
+ jk_map_free(&(p->req_params));
+ free(p);
+ *e = NULL;
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+
+ JK_LOG_NULL_PARAMS(l);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+}
+
+static int JK_METHOD validate(jk_worker_t *pThis,
+ jk_map_t *props,
+ jk_worker_env_t *we, jk_logger_t *l)
+{
+ JK_TRACE_ENTER(l);
+
+ if (pThis && pThis->worker_private) {
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+
+ JK_LOG_NULL_PARAMS(l);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+}
+
+static int JK_METHOD init(jk_worker_t *pThis,
+ jk_map_t *props,
+ jk_worker_env_t *we, jk_logger_t *l)
+{
+ JK_TRACE_ENTER(l);
+ if (pThis && pThis->worker_private) {
+ status_worker_t *p = pThis->worker_private;
+ char **good_rating;
+ unsigned int num_of_good;
+ char **bad_rating;
+ unsigned int num_of_bad;
+ unsigned int i;
+ p->we = we;
+ p->css = jk_get_worker_style_sheet(props, p->name, NULL);
+ p->prefix = jk_get_worker_prop_prefix(props, p->name, JK_STATUS_PREFIX_DEF);
+ p->ns = jk_get_worker_name_space(props, p->name, JK_STATUS_NS_DEF);
+ p->xmlns = jk_get_worker_xmlns(props, p->name, JK_STATUS_XMLNS_DEF);
+ p->doctype = jk_get_worker_xml_doctype(props, p->name, NULL);
+ p->read_only = jk_get_is_read_only(props, p->name);
+ p->user_case_insensitive = jk_get_worker_user_case_insensitive(props, p->name);
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Status worker '%s' is %s and has css '%s', prefix '%s', name space '%s', xml name space '%s', document type '%s'",
+ p->name,
+ p->read_only ? "read-only" : "read/write",
+ p->css ? p->css : "(null)",
+ p->prefix ? p->prefix : "(null)",
+ p->ns ? p->ns : "(null)",
+ p->xmlns ? p->xmlns : "(null)",
+ p->doctype ? p->doctype : "(null)");
+ if (jk_get_worker_user_list(props, p->name,
+ &(p->user_names),
+ &(p->num_of_users)) && p->num_of_users) {
+ for (i = 0; i < p->num_of_users; i++) {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Status worker '%s' restricting access to user '%s' case %s",
+ p->name, p->user_names[i],
+ p->user_case_insensitive ? "insensitive" : "sensitive");
+ }
+ }
+ if (jk_get_worker_good_rating(props, p->name,
+ &good_rating,
+ &num_of_good) && num_of_good) {
+ p->good_mask = 0;
+ for (i = 0; i < num_of_good; i++) {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Status worker '%s' rating as good: '%s'",
+ p->name, good_rating[i]);
+ p->good_mask |= status_get_rating(good_rating[i], l);
+ }
+ }
+ else {
+ p->good_mask = JK_STATUS_MASK_GOOD_DEF;
+ }
+ if (jk_get_worker_bad_rating(props, p->name,
+ &bad_rating,
+ &num_of_bad) && num_of_bad) {
+ p->bad_mask = 0;
+ for (i = 0; i < num_of_bad; i++) {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Status worker '%s' rating as bad: '%s'",
+ p->name, bad_rating[i]);
+ p->bad_mask |= status_get_rating(bad_rating[i], l);
+ }
+ }
+ else {
+ p->bad_mask = JK_STATUS_MASK_BAD_DEF;
+ }
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Status worker '%s' has good rating for '%08" JK_UINT32_T_HEX_FMT
+ "' and bad rating for '%08" JK_UINT32_T_HEX_FMT "'",
+ p->name,
+ p->good_mask,
+ p->bad_mask);
+ if (p->good_mask & p->bad_mask)
+ jk_log(l, JK_LOG_WARNING,
+ "Status worker '%s' has non empty intersection '%08" JK_UINT32_T_HEX_FMT
+ "' between good rating for '%08" JK_UINT32_T_HEX_FMT
+ "' and bad rating for '%08" JK_UINT32_T_HEX_FMT "'",
+ p->name,
+ p->good_mask & p->bad_mask,
+ p->good_mask,
+ p->bad_mask);
+ }
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+static int JK_METHOD get_endpoint(jk_worker_t *pThis,
+ jk_endpoint_t **pend, jk_logger_t *l)
+{
+ JK_TRACE_ENTER(l);
+
+ if (pThis && pThis->worker_private && pend) {
+ status_endpoint_t *p = (status_endpoint_t *) malloc(sizeof(status_endpoint_t));
+ p->worker = pThis->worker_private;
+ p->endpoint.endpoint_private = p;
+ p->endpoint.service = service;
+ p->endpoint.done = done;
+ p->req_params = NULL;
+ p->msg = NULL;
+ *pend = &p->endpoint;
+
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+ else {
+ JK_LOG_NULL_PARAMS(l);
+ }
+
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+}
+
+static int JK_METHOD destroy(jk_worker_t **pThis, jk_logger_t *l)
+{
+ JK_TRACE_ENTER(l);
+
+ if (pThis && *pThis && (*pThis)->worker_private) {
+ status_worker_t *private_data = (*pThis)->worker_private;
+
+ jk_close_pool(&private_data->p);
+ free(private_data);
+
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+
+ JK_LOG_NULL_PARAMS(l);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+}
+
+int JK_METHOD status_worker_factory(jk_worker_t **w,
+ const char *name, jk_logger_t *l)
+{
+ JK_TRACE_ENTER(l);
+
+ if (NULL != name && NULL != w) {
+ status_worker_t *private_data =
+ (status_worker_t *) calloc(1, sizeof(status_worker_t));
+
+ jk_open_pool(&private_data->p,
+ private_data->buf,
+ sizeof(jk_pool_atom_t) * TINY_POOL_SIZE);
+
+ private_data->name = name;
+
+ private_data->worker.worker_private = private_data;
+ private_data->worker.validate = validate;
+ private_data->worker.init = init;
+ private_data->worker.get_endpoint = get_endpoint;
+ private_data->worker.destroy = destroy;
+
+ *w = &private_data->worker;
+ JK_TRACE_EXIT(l);
+ return JK_STATUS_WORKER_TYPE;
+ }
+ else {
+ JK_LOG_NULL_PARAMS(l);
+ }
+
+ JK_TRACE_EXIT(l);
+ return 0;
+}
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_status.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_status.h
new file mode 100644
index 00000000..59eb1260
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_status.h
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: Status worker header file *
+ * Author: Mladen Turk <mturk@jboss.com> *
+ * Version: $Revision: 466585 $ *
+ ***************************************************************************/
+
+#ifndef JK_STATUS_H
+#define JK_STATUS_H
+
+#include "jk_logger.h"
+#include "jk_service.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+#define JK_STATUS_WORKER_NAME ("status")
+#define JK_STATUS_WORKER_TYPE (6)
+
+int JK_METHOD status_worker_factory(jk_worker_t **w,
+ const char *name, jk_logger_t *l);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* JK_STATUS_H */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_status.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_status.lo
new file mode 100644
index 00000000..0185386d
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_status.lo
@@ -0,0 +1,12 @@
+# jk_status.lo - a libtool object file
+# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18)
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/jk_status.o'
+
+# Name of the non-PIC object.
+non_pic_object='jk_status.o'
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_status.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_status.o
new file mode 100644
index 00000000..3db458bf
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_status.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_types.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_types.h
new file mode 100644
index 00000000..e8029377
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_types.h
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: Platform specific, auto-detected types. *
+ * Author: Rainer Jung <rjung@apache.org> *
+ * Version: $Revision: 915199 $ *
+ ***************************************************************************/
+
+#ifndef JK_TYPES_H
+#define JK_TYPES_H
+
+/* GENERATED FILE WARNING! DO NOT EDIT jk_types.h
+ *
+ * You must modify jk_types.h.in instead.
+ *
+ */
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+/* jk_uint32_t defines a four byte word */
+typedef unsigned int jk_uint32_t;
+
+/* And JK_UINT32_T_FMT */
+#define JK_UINT32_T_FMT "u"
+
+/* And JK_UINT32_T_HEX_FMT */
+#define JK_UINT32_T_HEX_FMT "x"
+
+/* jk_uint64_t defines a eight byte word */
+typedef unsigned long jk_uint64_t;
+
+/* And JK_UINT64_T_FMT */
+#define JK_UINT64_T_FMT "lu"
+
+/* And JK_UINT64_T_HEX_FMT */
+#define JK_UINT64_T_HEX_FMT "lx"
+
+/* And JK_PID_T_FMT */
+#define JK_PID_T_FMT "d"
+
+/* jk_pthread_t defines a eight byte word */
+typedef unsigned long jk_pthread_t;
+
+/* And JK_PTHREAD_T_FMT */
+#define JK_PTHREAD_T_FMT "lu"
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* JK_TYPES_H */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_types.h.in b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_types.h.in
new file mode 100644
index 00000000..6301b240
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_types.h.in
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: Platform specific, auto-detected types. *
+ * Author: Rainer Jung <rjung@apache.org> *
+ * Version: $Revision: 915199 $ *
+ ***************************************************************************/
+
+#ifndef JK_TYPES_H
+#define JK_TYPES_H
+
+/* GENERATED FILE WARNING! DO NOT EDIT jk_types.h
+ *
+ * You must modify jk_types.h.in instead.
+ *
+ */
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+/* jk_uint32_t defines a four byte word */
+typedef unsigned @int32_value@ jk_uint32_t;
+
+/* And JK_UINT32_T_FMT */
+@uint32_t_fmt@
+
+/* And JK_UINT32_T_HEX_FMT */
+@uint32_t_hex_fmt@
+
+/* jk_uint64_t defines a eight byte word */
+typedef unsigned @int64_value@ jk_uint64_t;
+
+/* And JK_UINT64_T_FMT */
+@uint64_t_fmt@
+
+/* And JK_UINT64_T_HEX_FMT */
+@uint64_t_hex_fmt@
+
+/* And JK_PID_T_FMT */
+@pid_t_fmt@
+
+/* jk_pthread_t defines a eight byte word */
+typedef unsigned @pthread_t_value@ jk_pthread_t;
+
+/* And JK_PTHREAD_T_FMT */
+@pthread_t_fmt@
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* JK_TYPES_H */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_uri_worker_map.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_uri_worker_map.c
new file mode 100644
index 00000000..d652f769
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_uri_worker_map.c
@@ -0,0 +1,1191 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: URI to worker map object. *
+ * *
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Author: Mladen Turk <mturk@apache.org> *
+ * Version: $Revision: 890739 $ *
+ ***************************************************************************/
+
+#include "jk_pool.h"
+#include "jk_util.h"
+#include "jk_map.h"
+#include "jk_mt.h"
+#include "jk_uri_worker_map.h"
+#include "jk_worker.h"
+#include "jk_lb_worker.h"
+
+#ifdef WIN32
+#define JK_STRCMP strcasecmp
+#define JK_STRNCMP strnicmp
+#else
+#define JK_STRCMP strcmp
+#define JK_STRNCMP strncmp
+#endif
+
+#define JK_UWMAP_EXTENSION_REPLY_TIMEOUT "reply_timeout="
+#define JK_UWMAP_EXTENSION_ACTIVE "active="
+#define JK_UWMAP_EXTENSION_DISABLED "disabled="
+#define JK_UWMAP_EXTENSION_STOPPED "stopped="
+#define JK_UWMAP_EXTENSION_FAIL_ON_STATUS "fail_on_status="
+#define JK_UWMAP_EXTENSION_USE_SRV_ERRORS "use_server_errors="
+
+#define IND_SWITCH(x) (((x)+1) % 2)
+#define IND_THIS(x) ((x)[uw_map->index])
+#define IND_NEXT(x) ((x)[IND_SWITCH(uw_map->index)])
+
+#define STRNULL_FOR_NULL(x) ((x) ? (x) : "(null)")
+
+static const char *uri_worker_map_source_type[] = {
+ "unknown",
+ SOURCE_TYPE_TEXT_WORKERDEF,
+ SOURCE_TYPE_TEXT_JKMOUNT,
+ SOURCE_TYPE_TEXT_URIMAP,
+ SOURCE_TYPE_TEXT_DISCOVER,
+ NULL
+};
+
+
+/* Return the string representation of the uwr source */
+const char *uri_worker_map_get_source(uri_worker_record_t *uwr, jk_logger_t *l)
+{
+ return uri_worker_map_source_type[uwr->source_type];
+}
+
+/* Return the string representation of the uwr match type */
+char *uri_worker_map_get_match(uri_worker_record_t *uwr, char *buf, jk_logger_t *l)
+{
+ unsigned int match;
+
+ buf[0] = '\0';
+ match = uwr->match_type;
+
+ if (match & MATCH_TYPE_DISABLED)
+ strcat(buf, "Disabled ");
+/* deprecated
+ if (match & MATCH_TYPE_STOPPED)
+ strcat(buf, "Stopped ");
+ */
+ if (match & MATCH_TYPE_NO_MATCH)
+ strcat(buf, "Unmount ");
+ if (match & MATCH_TYPE_EXACT)
+ strcat(buf, "Exact");
+ else if (match & MATCH_TYPE_WILDCHAR_PATH)
+ strcat(buf, "Wildchar");
+/* deprecated
+ else if (match & MATCH_TYPE_CONTEXT)
+ strcat(buf, "Context");
+ else if (match & MATCH_TYPE_CONTEXT_PATH)
+ strcat(buf, "Context Path");
+ else if (match & MATCH_TYPE_SUFFIX)
+ strcat(buf, "Suffix");
+ else if (match & MATCH_TYPE_GENERAL_SUFFIX)
+ return "General Suffix";
+ */
+ else
+ strcat(buf, "Unknown");
+ return buf;
+}
+
+/*
+ * Given context uri, count the number of path tokens.
+ *
+ * Servlet specification 2.4, SRV.11.1 says
+
+ * The container will recursively try tomatch the longest
+ * path-prefix. This is done by stepping down the path tree a
+ * directory at a time, using the / character as a path
+ * separator. The longest match determines the servlet selected.
+ *
+ * The implication seems to be `most uri path elements is most exact'.
+ * This is a little helper function to count uri tokens, so we can
+ * keep the worker map sorted with most specific first.
+ */
+static int worker_count_context_uri_tokens(const char * context)
+{
+ const char * c = context;
+ int count = 0;
+ while (c && *c) {
+ if ('/' == *c++)
+ count++;
+ }
+ return count;
+}
+
+static int worker_compare(const void *elem1, const void *elem2)
+{
+ uri_worker_record_t *e1 = *(uri_worker_record_t **)elem1;
+ uri_worker_record_t *e2 = *(uri_worker_record_t **)elem2;
+ int e1_tokens = 0;
+ int e2_tokens = 0;
+
+ e1_tokens = worker_count_context_uri_tokens(e1->context);
+ e2_tokens = worker_count_context_uri_tokens(e2->context);
+
+ if (e1_tokens != e2_tokens) {
+ return (e2_tokens - e1_tokens);
+ }
+ /* given the same number of URI tokens, use character
+ * length as a tie breaker
+ */
+ if(e2->context_len != e1->context_len)
+ return ((int)e2->context_len - (int)e1->context_len);
+
+ return ((int)e2->source_type - (int)e1->source_type);
+}
+
+static void worker_qsort(jk_uri_worker_map_t *uw_map)
+{
+
+ /* Sort remaining args using Quicksort algorithm: */
+ qsort((void *)IND_NEXT(uw_map->maps), IND_NEXT(uw_map->size),
+ sizeof(uri_worker_record_t *), worker_compare );
+
+}
+
+/* Dump the map contents - only call if debug log is active. */
+static void uri_worker_map_dump(jk_uri_worker_map_t *uw_map,
+ const char *reason, jk_logger_t *l)
+{
+ JK_TRACE_ENTER(l);
+ if (uw_map) {
+ int i, off, k;
+ uri_worker_record_t *uwr = NULL;
+ char buf[32];
+ jk_log(l, JK_LOG_DEBUG, "uri map dump %s: index=%d file='%s' reject_unsafe=%d "
+ "reload=%d modified=%d checked=%d",
+ reason, uw_map->index, STRNULL_FOR_NULL(uw_map->fname), uw_map->reject_unsafe,
+ uw_map->reload, uw_map->modified, uw_map->checked);
+ for(i=0;i<=1;i++) {
+ jk_log(l, JK_LOG_DEBUG, "generation %d: size=%d nosize=%d capacity=%d",
+ i, uw_map->size[i], uw_map->nosize[i], uw_map->capacity[i], uw_map->maps[i]);
+ }
+
+ off = uw_map->index;
+ for(i=0;i<=1;i++) {
+ unsigned int j;
+ k = (i + off) % 2;
+ for (j = 0; j < uw_map->size[k]; j++) {
+ uwr = uw_map->maps[k][j];
+ jk_log(l, JK_LOG_DEBUG, "%s (%d) map #%d: uri=%s worker=%s context=%s "
+ "source=%s type=%s len=%d",
+ i ? "NEXT" : "THIS", i, j,
+ STRNULL_FOR_NULL(uwr->uri), STRNULL_FOR_NULL(uwr->worker_name),
+ STRNULL_FOR_NULL(uwr->context), STRNULL_FOR_NULL(uri_worker_map_get_source(uwr,l)),
+ STRNULL_FOR_NULL(uri_worker_map_get_match(uwr,buf,l)), uwr->context_len);
+ }
+ }
+ }
+ JK_TRACE_EXIT(l);
+}
+
+
+int uri_worker_map_alloc(jk_uri_worker_map_t **uw_map_p,
+ jk_map_t *init_data, jk_logger_t *l)
+{
+ int i;
+
+ JK_TRACE_ENTER(l);
+
+ if (uw_map_p) {
+ int rc;
+ jk_uri_worker_map_t *uw_map;
+ *uw_map_p = (jk_uri_worker_map_t *)calloc(1, sizeof(jk_uri_worker_map_t));
+ uw_map = *uw_map_p;
+
+ JK_INIT_CS(&(uw_map->cs), rc);
+ if (rc == JK_FALSE) {
+ jk_log(l, JK_LOG_ERROR,
+ "creating thread lock (errno=%d)",
+ errno);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ jk_open_pool(&(uw_map->p),
+ uw_map->buf, sizeof(jk_pool_atom_t) * BIG_POOL_SIZE);
+ for(i=0;i<=1;i++) {
+ jk_open_pool(&(uw_map->p_dyn[i]),
+ uw_map->buf_dyn[i], sizeof(jk_pool_atom_t) * BIG_POOL_SIZE);
+ uw_map->size[i] = 0;
+ uw_map->nosize[i] = 0;
+ uw_map->capacity[i] = 0;
+ uw_map->maps[i] = NULL;
+ }
+ uw_map->index = 0;
+ uw_map->fname = NULL;
+ uw_map->reject_unsafe = 0;
+ uw_map->reload = JK_URIMAP_DEF_RELOAD;
+ uw_map->modified = 0;
+ uw_map->checked = 0;
+
+ if (init_data)
+ rc = uri_worker_map_open(uw_map, init_data, l);
+ JK_TRACE_EXIT(l);
+ return rc;
+ }
+
+ JK_LOG_NULL_PARAMS(l);
+ JK_TRACE_EXIT(l);
+
+ return JK_FALSE;
+}
+
+static int uri_worker_map_close(jk_uri_worker_map_t *uw_map, jk_logger_t *l)
+{
+ JK_TRACE_ENTER(l);
+
+ if (uw_map) {
+ int i;
+ JK_DELETE_CS(&(uw_map->cs), i);
+ jk_close_pool(&uw_map->p_dyn[0]);
+ jk_close_pool(&uw_map->p_dyn[1]);
+ jk_close_pool(&uw_map->p);
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+
+ JK_LOG_NULL_PARAMS(l);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+}
+
+int uri_worker_map_free(jk_uri_worker_map_t **uw_map, jk_logger_t *l)
+{
+ JK_TRACE_ENTER(l);
+
+ if (uw_map && *uw_map) {
+ uri_worker_map_close(*uw_map, l);
+ free(*uw_map);
+ *uw_map = NULL;
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+ else
+ JK_LOG_NULL_PARAMS(l);
+
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+}
+
+/*
+ * Ensure there will be memory in context info to store Context Bases
+ */
+
+#define UW_INC_SIZE 4 /* 4 URI->WORKER STEP */
+
+static int uri_worker_map_realloc(jk_uri_worker_map_t *uw_map)
+{
+ if (IND_NEXT(uw_map->size) == IND_NEXT(uw_map->capacity)) {
+ uri_worker_record_t **uwr;
+ int capacity = IND_NEXT(uw_map->capacity) + UW_INC_SIZE;
+
+ uwr =
+ (uri_worker_record_t **) jk_pool_alloc(&IND_NEXT(uw_map->p_dyn),
+ sizeof(uri_worker_record_t
+ *) * capacity);
+
+ if (!uwr)
+ return JK_FALSE;
+
+ if (IND_NEXT(uw_map->capacity) && IND_NEXT(uw_map->maps))
+ memcpy(uwr, IND_NEXT(uw_map->maps),
+ sizeof(uri_worker_record_t *) * IND_NEXT(uw_map->capacity));
+
+ IND_NEXT(uw_map->maps) = uwr;
+ IND_NEXT(uw_map->capacity) = capacity;
+ }
+
+ return JK_TRUE;
+}
+
+
+/*
+ * Delete all entries of a given source type
+ */
+
+static int uri_worker_map_clear(jk_uri_worker_map_t *uw_map,
+ jk_logger_t *l)
+{
+ uri_worker_record_t *uwr = NULL;
+ unsigned int i;
+ unsigned int new_size = 0;
+ unsigned int new_nosize = 0;
+
+ JK_TRACE_ENTER(l);
+
+ IND_NEXT(uw_map->maps) =
+ (uri_worker_record_t **) jk_pool_alloc(&(IND_NEXT(uw_map->p_dyn)),
+ sizeof(uri_worker_record_t
+ *) * IND_THIS(uw_map->size));
+ IND_NEXT(uw_map->capacity) = IND_THIS(uw_map->size);
+ IND_NEXT(uw_map->size) = 0;
+ IND_NEXT(uw_map->nosize) = 0;
+ for (i = 0; i < IND_THIS(uw_map->size); i++) {
+ uwr = IND_THIS(uw_map->maps)[i];
+ if (uwr->source_type == SOURCE_TYPE_URIMAP) {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "deleting map rule '%s=%s' source '%s'",
+ uwr->context, uwr->worker_name, uri_worker_map_get_source(uwr, l));
+ }
+ else {
+ IND_NEXT(uw_map->maps)[new_size] = uwr;
+ new_size++;
+ if (uwr->match_type & MATCH_TYPE_NO_MATCH)
+ new_nosize++;
+ }
+ }
+ IND_NEXT(uw_map->size) = new_size;
+ IND_NEXT(uw_map->nosize) = new_nosize;
+
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+static void extract_activation(jk_uri_worker_map_t *uw_map,
+ uri_worker_record_t *uwr,
+ lb_worker_t *lb,
+ int *activations,
+ char *workers,
+ int activation,
+ jk_logger_t *l)
+{
+ unsigned int i;
+ jk_pool_t *p;
+ char *worker;
+#ifdef _MT_CODE_PTHREAD
+ char *lasts;
+#endif
+
+ JK_TRACE_ENTER(l);
+
+ if (uwr->source_type == SOURCE_TYPE_URIMAP)
+ p = &IND_NEXT(uw_map->p_dyn);
+ else
+ p = &uw_map->p;
+ worker = jk_pool_strdup(p, workers);
+
+#ifdef _MT_CODE_PTHREAD
+ for (worker = strtok_r(worker, ", ", &lasts);
+ worker; worker = strtok_r(NULL, ", ", &lasts)) {
+#else
+ for (worker = strtok(worker, ", "); worker; worker = strtok(NULL, ", ")) {
+#endif
+ for (i=0; i<lb->num_of_workers; i++) {
+ if (!strcmp(worker, lb->lb_workers[i].name)) {
+ if (activations[i] != JK_LB_ACTIVATION_UNSET)
+ jk_log(l, JK_LOG_WARNING,
+ "inconsistent activation overwrite for member %s "
+ "of load balancer %s: '%s' replaced by '%s'",
+ worker, lb->name,
+ jk_lb_get_activation_direct(activations[i], l),
+ jk_lb_get_activation_direct(activation, l));
+ activations[i] = activation;
+ break;
+ }
+ }
+ if (i >= lb->num_of_workers)
+ jk_log(l, JK_LOG_WARNING,
+ "could not find member %s of load balancer %s",
+ worker, lb->name);
+ }
+
+ JK_TRACE_EXIT(l);
+
+}
+
+static void extract_fail_on_status(jk_uri_worker_map_t *uw_map,
+ uri_worker_record_t *uwr,
+ jk_logger_t *l)
+{
+ unsigned int i;
+ int j;
+ int cnt = 1;
+ jk_pool_t *p;
+ char *status;
+#ifdef _MT_CODE_PTHREAD
+ char *lasts;
+#endif
+
+ JK_TRACE_ENTER(l);
+
+ for (i=0; i<strlen(uwr->extensions.fail_on_status_str); i++) {
+ if (uwr->extensions.fail_on_status_str[i] == ',' ||
+ uwr->extensions.fail_on_status_str[i] == ' ')
+ cnt++;
+ }
+ uwr->extensions.fail_on_status_size = cnt;
+
+ if (uwr->source_type == SOURCE_TYPE_URIMAP)
+ p = &IND_NEXT(uw_map->p_dyn);
+ else
+ p = &uw_map->p;
+ status = jk_pool_strdup(p, uwr->extensions.fail_on_status_str);
+ uwr->extensions.fail_on_status = (int *)jk_pool_alloc(p,
+ uwr->extensions.fail_on_status_size * sizeof(int));
+ if (!uwr->extensions.fail_on_status) {
+ jk_log(l, JK_LOG_ERROR,
+ "can't alloc extensions fail_on_status list");
+ JK_TRACE_EXIT(l);
+ return;
+ } else if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Allocated fail_on_status array of size %d for worker %s",
+ uwr->extensions.fail_on_status_size, uwr->worker_name);
+
+
+ for (j=0; j<uwr->extensions.fail_on_status_size; j++) {
+ uwr->extensions.fail_on_status[j] = 0;
+ }
+
+ cnt = 0;
+#ifdef _MT_CODE_PTHREAD
+ for (status = strtok_r(status, ", ", &lasts);
+ status; status = strtok_r(NULL, ", ", &lasts)) {
+#else
+ for (status = strtok(status, ", "); status; status = strtok(NULL, ", ")) {
+#endif
+ uwr->extensions.fail_on_status[cnt] = atoi(status);
+ cnt++;
+ }
+
+ JK_TRACE_EXIT(l);
+
+}
+
+void uri_worker_map_switch(jk_uri_worker_map_t *uw_map, jk_logger_t *l)
+{
+ int new_index;
+
+ JK_TRACE_ENTER(l);
+
+ if (uw_map) {
+ new_index = IND_SWITCH(uw_map->index);
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Switching uri worker map from index %d to index %d",
+ uw_map->index, new_index);
+ uw_map->index = new_index;
+ jk_reset_pool(&(IND_NEXT(uw_map->p_dyn)));
+ }
+
+ JK_TRACE_EXIT(l);
+
+}
+
+void uri_worker_map_ext(jk_uri_worker_map_t *uw_map, jk_logger_t *l)
+{
+ unsigned int i;
+
+ JK_TRACE_ENTER(l);
+
+ for (i = 0; i < IND_NEXT(uw_map->size); i++) {
+ uri_worker_record_t *uwr = IND_NEXT(uw_map->maps)[i];
+ jk_worker_t *jw;
+ if(uwr->match_type & MATCH_TYPE_NO_MATCH)
+ continue;
+ jw = wc_get_worker_for_name(uwr->worker_name, l);
+ if(!jw) {
+ jk_log(l, JK_LOG_ERROR,
+ "Could not find worker with name '%s' in uri map post processing.",
+ uwr->worker_name);
+ continue;
+ }
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Checking extension for worker %d: %s of type %s (%d)",
+ i, uwr->worker_name, wc_get_name_for_type(jw->type,l), jw->type);
+
+ if (jw->type == JK_LB_WORKER_TYPE &&
+ (uwr->extensions.active || uwr->extensions.disabled || uwr->extensions.stopped)) {
+ int j;
+ lb_worker_t *lb = (lb_worker_t *)jw->worker_private;
+ jk_pool_t *p;
+ if (!uwr->extensions.activation) {
+ uwr->extensions.activation_size = lb->num_of_workers;
+ if (uwr->source_type == SOURCE_TYPE_URIMAP)
+ p = &IND_NEXT(uw_map->p_dyn);
+ else
+ p = &uw_map->p;
+ uwr->extensions.activation = (int *)jk_pool_alloc(p,
+ uwr->extensions.activation_size * sizeof(int));
+ if (!uwr->extensions.activation) {
+ jk_log(l, JK_LOG_ERROR,
+ "can't alloc extensions activation list");
+ continue;
+ } else if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Allocated activations array of size %d for lb worker %s",
+ uwr->extensions.activation_size, uwr->worker_name);
+ for (j=0; j<uwr->extensions.activation_size; j++) {
+ uwr->extensions.activation[j] = JK_LB_ACTIVATION_UNSET;
+ }
+ }
+ if (uwr->extensions.active)
+ extract_activation(uw_map, uwr, lb, uwr->extensions.activation,
+ uwr->extensions.active, JK_LB_ACTIVATION_ACTIVE, l);
+ if (uwr->extensions.disabled)
+ extract_activation(uw_map, uwr, lb, uwr->extensions.activation,
+ uwr->extensions.disabled, JK_LB_ACTIVATION_DISABLED, l);
+ if (uwr->extensions.stopped)
+ extract_activation(uw_map, uwr, lb, uwr->extensions.activation,
+ uwr->extensions.stopped, JK_LB_ACTIVATION_STOPPED, l);
+ }
+ else if (uwr->extensions.active) {
+ jk_log(l, JK_LOG_WARNING,
+ "Worker %s is not of type lb, activation extension "
+ JK_UWMAP_EXTENSION_ACTIVE " for %s ignored",
+ uwr->worker_name, uwr->extensions.active);
+ }
+ else if (uwr->extensions.disabled) {
+ jk_log(l, JK_LOG_WARNING,
+ "Worker %s is not of type lb, activation extension "
+ JK_UWMAP_EXTENSION_DISABLED " for %s ignored",
+ uwr->worker_name, uwr->extensions.disabled);
+ }
+ else if (uwr->extensions.stopped) {
+ jk_log(l, JK_LOG_WARNING,
+ "Worker %s is not of type lb, activation extension "
+ JK_UWMAP_EXTENSION_STOPPED " for %s ignored",
+ uwr->worker_name, uwr->extensions.stopped);
+ }
+ if (uwr->extensions.fail_on_status_str) {
+ extract_fail_on_status(uw_map, uwr, l);
+ }
+ }
+ if (JK_IS_DEBUG_LEVEL(l))
+ uri_worker_map_dump(uw_map, "after extension stripping", l);
+
+ JK_TRACE_EXIT(l);
+ return;
+
+}
+
+/* Add new entry to NEXT generation */
+int uri_worker_map_add(jk_uri_worker_map_t *uw_map,
+ const char *puri, const char *worker,
+ unsigned int source_type, jk_logger_t *l)
+{
+ uri_worker_record_t *uwr = NULL;
+ char *uri;
+ jk_pool_t *p;
+ unsigned int match_type = 0;
+
+ JK_TRACE_ENTER(l);
+
+ if (*puri == '-') {
+ /* Disable urimap.
+ * This way you can disable already mounted
+ * context.
+ */
+ match_type = MATCH_TYPE_DISABLED;
+ puri++;
+ }
+ if (*puri == '!') {
+ match_type |= MATCH_TYPE_NO_MATCH;
+ puri++;
+ }
+
+ if (uri_worker_map_realloc(uw_map) == JK_FALSE) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ if (source_type == SOURCE_TYPE_URIMAP)
+ p = &IND_NEXT(uw_map->p_dyn);
+ else
+ p = &uw_map->p;
+
+ uwr = (uri_worker_record_t *)jk_pool_alloc(p, sizeof(uri_worker_record_t));
+ if (!uwr) {
+ jk_log(l, JK_LOG_ERROR,
+ "can't alloc map entry");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ uri = jk_pool_strdup(p, puri);
+ if (!uri || !worker) {
+ jk_log(l, JK_LOG_ERROR,
+ "can't alloc uri/worker strings");
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ if (*uri == '/') {
+ char *w;
+ char *param;
+#ifdef _MT_CODE_PTHREAD
+ char *lasts = NULL;
+#endif
+
+ w = jk_pool_strdup(p, worker);
+ uwr->extensions.reply_timeout = -1;
+ uwr->extensions.active = NULL;
+ uwr->extensions.disabled = NULL;
+ uwr->extensions.stopped = NULL;
+ uwr->extensions.activation_size = 0;
+ uwr->extensions.activation = NULL;
+ uwr->extensions.fail_on_status_size = 0;
+ uwr->extensions.fail_on_status = NULL;
+ uwr->extensions.fail_on_status_str = NULL;
+ uwr->extensions.use_server_error_pages = 0;
+
+#ifdef _MT_CODE_PTHREAD
+ param = strtok_r(w, ";", &lasts);
+#else
+ param = strtok(w, ";");
+#endif
+ if (param) {
+#ifdef _MT_CODE_PTHREAD
+ for (param = strtok_r(NULL, ";", &lasts); param; param = strtok_r(NULL, ";", &lasts)) {
+#else
+ for (param = strtok(NULL, ";"); param; param = strtok(NULL, ";")) {
+#endif
+ if (!strncmp(param, JK_UWMAP_EXTENSION_REPLY_TIMEOUT, strlen(JK_UWMAP_EXTENSION_REPLY_TIMEOUT))) {
+ uwr->extensions.reply_timeout = atoi(param + strlen(JK_UWMAP_EXTENSION_REPLY_TIMEOUT));
+ }
+ else if (!strncmp(param, JK_UWMAP_EXTENSION_USE_SRV_ERRORS, strlen(JK_UWMAP_EXTENSION_USE_SRV_ERRORS))) {
+ uwr->extensions.use_server_error_pages = atoi(param + strlen(JK_UWMAP_EXTENSION_USE_SRV_ERRORS));
+ }
+ else if (!strncmp(param, JK_UWMAP_EXTENSION_ACTIVE, strlen(JK_UWMAP_EXTENSION_ACTIVE))) {
+ if (uwr->extensions.active)
+ jk_log(l, JK_LOG_WARNING,
+ "extension '%s' in uri worker map only allowed once",
+ JK_UWMAP_EXTENSION_ACTIVE);
+ else
+ uwr->extensions.active = param + strlen(JK_UWMAP_EXTENSION_ACTIVE);
+ }
+ else if (!strncmp(param, JK_UWMAP_EXTENSION_DISABLED, strlen(JK_UWMAP_EXTENSION_DISABLED))) {
+ if (uwr->extensions.disabled)
+ jk_log(l, JK_LOG_WARNING,
+ "extension '%s' in uri worker map only allowed once",
+ JK_UWMAP_EXTENSION_DISABLED);
+ else
+ uwr->extensions.disabled = param + strlen(JK_UWMAP_EXTENSION_DISABLED);
+ }
+ else if (!strncmp(param, JK_UWMAP_EXTENSION_STOPPED, strlen(JK_UWMAP_EXTENSION_STOPPED))) {
+ if (uwr->extensions.stopped)
+ jk_log(l, JK_LOG_WARNING,
+ "extension '%s' in uri worker map only allowed once",
+ JK_UWMAP_EXTENSION_STOPPED);
+ else
+ uwr->extensions.stopped = param + strlen(JK_UWMAP_EXTENSION_STOPPED);
+ }
+ else if (!strncmp(param, JK_UWMAP_EXTENSION_FAIL_ON_STATUS, strlen(JK_UWMAP_EXTENSION_FAIL_ON_STATUS))) {
+ if (uwr->extensions.fail_on_status_str)
+ jk_log(l, JK_LOG_WARNING,
+ "extension '%s' in uri worker map only allowed once",
+ JK_UWMAP_EXTENSION_FAIL_ON_STATUS);
+ else
+ uwr->extensions.fail_on_status_str = param + strlen(JK_UWMAP_EXTENSION_FAIL_ON_STATUS);
+ }
+ else {
+ jk_log(l, JK_LOG_WARNING,
+ "unknown extension '%s' in uri worker map",
+ param);
+ }
+ }
+ }
+
+ uwr->source_type = source_type;
+ uwr->worker_name = w;
+ uwr->uri = uri;
+ uwr->context = uri;
+ uwr->context_len = strlen(uwr->context);
+ if (strchr(uri, '*') ||
+ strchr(uri, '?')) {
+ /* Something like
+ * /context/ * /user/ *
+ * /context/ *.suffix
+ */
+ match_type |= MATCH_TYPE_WILDCHAR_PATH;
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "wildchar rule '%s=%s' source '%s' was added",
+ uwr->context, uwr->worker_name, uri_worker_map_get_source(uwr, l));
+
+ }
+ else {
+ /* Something like: JkMount /login/j_security_check ajp13 */
+ match_type |= MATCH_TYPE_EXACT;
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "exact rule '%s=%s' source '%s' was added",
+ uwr->context, uwr->worker_name, uri_worker_map_get_source(uwr, l));
+ }
+ }
+ else {
+ /*
+ * JFC: please check...
+ * Not sure what to do, but I try to prevent problems.
+ * I have fixed jk_mount_context() in apaches/mod_jk.c so we should
+ * not arrive here when using Apache.
+ */
+ jk_log(l, JK_LOG_ERROR,
+ "invalid context '%s': does not begin with '/'",
+ uri);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ uwr->match_type = match_type;
+ IND_NEXT(uw_map->maps)[IND_NEXT(uw_map->size)] = uwr;
+ IND_NEXT(uw_map->size)++;
+ if (match_type & MATCH_TYPE_NO_MATCH) {
+ /* If we split the mappings this one will be calculated */
+ IND_NEXT(uw_map->nosize)++;
+ }
+ worker_qsort(uw_map);
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+int uri_worker_map_open(jk_uri_worker_map_t *uw_map,
+ jk_map_t *init_data, jk_logger_t *l)
+{
+ int rc = JK_TRUE;
+
+ JK_TRACE_ENTER(l);
+
+ if (uw_map) {
+ int sz = jk_map_size(init_data);
+
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "rule map size is %d",
+ sz);
+
+ if (sz > 0) {
+ int i;
+ for (i = 0; i < sz; i++) {
+ const char *u = jk_map_name_at(init_data, i);
+ const char *w = jk_map_value_at(init_data, i);
+ /* Multiple mappings like :
+ * /servlets-examples|/ *
+ * will create two mappings:
+ * /servlets-examples
+ * and:
+ * /servlets-examples/ *
+ */
+ if (strchr(u, '|')) {
+ char *s, *r = strdup(u);
+ s = strchr(r, '|');
+ *(s++) = '\0';
+ /* Add first mapping */
+ if (!uri_worker_map_add(uw_map, r, w, SOURCE_TYPE_JKMOUNT, l)) {
+ jk_log(l, JK_LOG_ERROR,
+ "invalid mapping rule %s->%s", r, w);
+ rc = JK_FALSE;
+ }
+ for (; *s; s++)
+ *(s - 1) = *s;
+ *(s - 1) = '\0';
+ /* add second mapping */
+ if (!uri_worker_map_add(uw_map, r, w, SOURCE_TYPE_JKMOUNT, l)) {
+ jk_log(l, JK_LOG_ERROR,
+ "invalid mapping rule %s->%s", r, w);
+ rc = JK_FALSE;
+ }
+ free(r);
+ }
+ else if (!uri_worker_map_add(uw_map, u, w, SOURCE_TYPE_JKMOUNT, l)) {
+ jk_log(l, JK_LOG_ERROR,
+ "invalid mapping rule %s->%s",
+ u, w);
+ rc = JK_FALSE;
+ break;
+ }
+ if (rc == JK_FALSE)
+ break;
+ }
+ }
+
+ if (rc == JK_FALSE) {
+ jk_log(l, JK_LOG_ERROR,
+ "there was an error, freeing buf");
+ jk_close_pool(&uw_map->p_dyn[0]);
+ jk_close_pool(&uw_map->p_dyn[1]);
+ jk_close_pool(&uw_map->p);
+ }
+ else if (JK_IS_DEBUG_LEVEL(l))
+ uri_worker_map_dump(uw_map, "after map open", l);
+ }
+
+ JK_TRACE_EXIT(l);
+ return rc;
+}
+
+static int find_match(jk_uri_worker_map_t *uw_map,
+ const char *url, jk_logger_t *l)
+{
+ unsigned int i;
+
+ JK_TRACE_ENTER(l);
+
+ for (i = 0; i < IND_THIS(uw_map->size); i++) {
+ uri_worker_record_t *uwr = IND_THIS(uw_map->maps)[i];
+
+ /* Check for match types */
+ if ((uwr->match_type & MATCH_TYPE_DISABLED) ||
+ (uwr->match_type & MATCH_TYPE_NO_MATCH))
+ continue;
+
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG, "Attempting to map context URI '%s=%s' source '%s'",
+ uwr->context, uwr->worker_name, uri_worker_map_get_source(uwr, l));
+
+ if (uwr->match_type & MATCH_TYPE_WILDCHAR_PATH) {
+ /* Map is already sorted by context_len */
+ if (jk_wildchar_match(url, uwr->context,
+#ifdef WIN32
+ 0
+#else
+ 0
+#endif
+ ) == 0) {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Found a wildchar match '%s=%s'",
+ uwr->context, uwr->worker_name);
+ JK_TRACE_EXIT(l);
+ return i;
+ }
+ }
+ else if (JK_STRNCMP(uwr->context, url, uwr->context_len) == 0) {
+ if (strlen(url) == uwr->context_len) {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Found an exact match '%s=%s'",
+ uwr->context, uwr->worker_name);
+ JK_TRACE_EXIT(l);
+ return i;
+ }
+ }
+ }
+
+ JK_TRACE_EXIT(l);
+ return -1;
+}
+
+static int is_nomatch(jk_uri_worker_map_t *uw_map,
+ const char *uri, int match,
+ jk_logger_t *l)
+{
+ unsigned int i;
+ const char *worker = IND_THIS(uw_map->maps)[match]->worker_name;
+
+ JK_TRACE_ENTER(l);
+
+ for (i = 0; i < IND_THIS(uw_map->size); i++) {
+ uri_worker_record_t *uwr = IND_THIS(uw_map->maps)[i];
+
+ /* Check only nomatch mappings */
+ if (!(uwr->match_type & MATCH_TYPE_NO_MATCH) ||
+ (uwr->match_type & MATCH_TYPE_DISABLED))
+ continue;
+ /* Check only matching workers */
+ if (strcmp(uwr->worker_name, worker) &&
+ strcmp(uwr->worker_name, "*"))
+ continue;
+ if (uwr->match_type & MATCH_TYPE_WILDCHAR_PATH) {
+ /* Map is already sorted by context_len */
+ if (jk_wildchar_match(uri, uwr->context,
+#ifdef WIN32
+ 0
+#else
+ 0
+#endif
+ ) == 0) {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Found a wildchar no match '%s=%s' source '%s'",
+ uwr->context, uwr->worker_name, uri_worker_map_get_source(uwr, l));
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+ }
+ else if (JK_STRNCMP(uwr->context, uri, uwr->context_len) == 0) {
+ if (strlen(uri) == uwr->context_len) {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Found an exact no match '%s=%s' source '%s'",
+ uwr->context, uwr->worker_name, uri_worker_map_get_source(uwr, l));
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+ }
+ }
+
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+}
+
+const char *map_uri_to_worker_ext(jk_uri_worker_map_t *uw_map,
+ const char *uri, const char *vhost,
+ rule_extension_t **extensions,
+ int *index,
+ jk_logger_t *l)
+{
+ unsigned int i;
+ unsigned int vhost_len;
+ int reject_unsafe;
+ int rv = -1;
+ char url[JK_MAX_URI_LEN+1];
+
+ JK_TRACE_ENTER(l);
+
+ if (!uw_map || !uri || !extensions) {
+ JK_LOG_NULL_PARAMS(l);
+ JK_TRACE_EXIT(l);
+ return NULL;
+ }
+ *extensions = NULL;
+ if (index)
+ *index = -1;
+ if (*uri != '/') {
+ jk_log(l, JK_LOG_WARNING,
+ "Uri %s is invalid. Uri must start with /", uri);
+ JK_TRACE_EXIT(l);
+ return NULL;
+ }
+ if (uw_map->fname) {
+ uri_worker_map_update(uw_map, 0, l);
+ if (!IND_THIS(uw_map->size)) {
+ jk_log(l, JK_LOG_INFO,
+ "No worker maps defined for %s.",
+ uw_map->fname);
+ JK_TRACE_EXIT(l);
+ return NULL;
+ }
+ }
+ /* Make the copy of the provided uri and strip
+ * everything after the first ';' char.
+ */
+ reject_unsafe = uw_map->reject_unsafe;
+ vhost_len = 0;
+ /*
+ * In case we got a vhost, we prepend a slash
+ * and the vhost to the url in order to enable
+ * vhost mapping rules especially for IIS.
+ */
+ if (vhost) {
+ int off = 0;
+ /* Add leading '/' if necessary */
+ if (vhost[0] != '/') {
+ url[0] = '/';
+ off = 1;
+ }
+ /* Size including leading slash. */
+ vhost_len = strlen(vhost);
+ if (vhost_len + off >= JK_MAX_URI_LEN) {
+ vhost_len = 0;
+ jk_log(l, JK_LOG_WARNING,
+ "Host prefix %s for URI %s is invalid and will be ignored."
+ " It must be smaller than %d chars",
+ vhost, JK_MAX_URI_LEN - off);
+ }
+ else {
+ strncpy(&url[off], vhost, vhost_len + 1);
+ }
+ vhost_len += off;
+ }
+ for (i = 0; i < strlen(uri); i++) {
+ if (i == JK_MAX_URI_LEN) {
+ jk_log(l, JK_LOG_WARNING,
+ "URI %s is invalid. URI must be smaller than %d chars",
+ uri, JK_MAX_URI_LEN);
+ JK_TRACE_EXIT(l);
+ return NULL;
+ }
+ if (uri[i] == ';')
+ break;
+ else {
+ url[i + vhost_len] = uri[i];
+ if (reject_unsafe && (uri[i] == '%' || uri[i] == '\\')) {
+ jk_log(l, JK_LOG_INFO, "Potentially unsafe request url '%s' rejected", uri);
+ JK_TRACE_EXIT(l);
+ return NULL;
+ }
+ }
+ }
+ url[i + vhost_len] = '\0';
+
+ if (JK_IS_DEBUG_LEVEL(l)) {
+ char *url_rewrite = strstr(uri, JK_PATH_SESSION_IDENTIFIER);
+ if (url_rewrite)
+ jk_log(l, JK_LOG_DEBUG, "Found session identifier '%s' in url '%s'",
+ url_rewrite, uri);
+ }
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG, "Attempting to map URI '%s' from %d maps",
+ url, IND_THIS(uw_map->size));
+ rv = find_match(uw_map, url, l);
+ /* If this doesn't find a match, try without the vhost. */
+ if (rv < 0 && vhost_len) {
+ rv = find_match(uw_map, &url[vhost_len], l);
+ }
+
+ /* In case we found a match, check for the unmounts. */
+ if (rv >= 0 && IND_THIS(uw_map->nosize)) {
+ /* Again first including vhost. */
+ int rc = is_nomatch(uw_map, url, rv, l);
+ /* If no unmount was find, try without vhost. */
+ if (!rc && vhost_len)
+ rc = is_nomatch(uw_map, &url[vhost_len], rv, l);
+ if (rc) {
+ if (JK_IS_DEBUG_LEVEL(l)) {
+ jk_log(l, JK_LOG_DEBUG,
+ "Denying match for worker %s by nomatch rule",
+ IND_THIS(uw_map->maps)[rv]->worker_name);
+ }
+ rv = -1;
+ }
+ }
+
+ if (rv >= 0) {
+ *extensions = &(IND_THIS(uw_map->maps)[rv]->extensions);
+ if (index)
+ *index = rv;
+ JK_TRACE_EXIT(l);
+ return IND_THIS(uw_map->maps)[rv]->worker_name;
+ }
+ JK_TRACE_EXIT(l);
+ return NULL;
+}
+
+rule_extension_t *get_uri_to_worker_ext(jk_uri_worker_map_t *uw_map,
+ int index)
+{
+ if (index >= 0) {
+ return &(IND_THIS(uw_map->maps)[index]->extensions);
+ }
+ else {
+ return NULL;
+ }
+}
+
+const char *map_uri_to_worker(jk_uri_worker_map_t *uw_map,
+ const char *uri, const char *vhost,
+ jk_logger_t *l)
+{
+ rule_extension_t *ext;
+ return map_uri_to_worker_ext(uw_map, uri, vhost, &ext, NULL, l);
+}
+
+int uri_worker_map_load(jk_uri_worker_map_t *uw_map,
+ jk_logger_t *l)
+{
+ int rc = JK_FALSE;
+ jk_map_t *map;
+
+ jk_map_alloc(&map);
+ if (jk_map_read_properties(map, NULL, uw_map->fname, &uw_map->modified,
+ JK_MAP_HANDLE_NORMAL, l)) {
+ int i;
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Loading urimaps from %s with reload check interval %d seconds",
+ uw_map->fname, uw_map->reload);
+ uri_worker_map_clear(uw_map, l);
+ for (i = 0; i < jk_map_size(map); i++) {
+ const char *u = jk_map_name_at(map, i);
+ const char *w = jk_map_value_at(map, i);
+ /* Multiple mappings like :
+ * /servlets-examples|/ *
+ * will create two mappings:
+ * /servlets-examples
+ * and:
+ * /servlets-examples/ *
+ */
+ if (strchr(u, '|')) {
+ char *s, *r = strdup(u);
+ s = strchr(r, '|');
+ *(s++) = '\0';
+ /* Add first mapping */
+ if (!uri_worker_map_add(uw_map, r, w, SOURCE_TYPE_URIMAP, l)) {
+ jk_log(l, JK_LOG_ERROR,
+ "invalid mapping rule %s->%s", r, w);
+ }
+ for (; *s; s++)
+ *(s - 1) = *s;
+ *(s - 1) = '\0';
+ /* add second mapping */
+ if (!uri_worker_map_add(uw_map, r, w, SOURCE_TYPE_URIMAP, l)) {
+ jk_log(l, JK_LOG_ERROR,
+ "invalid mapping rule %s->%s", r, w);
+ }
+ free(r);
+ }
+ else if (!uri_worker_map_add(uw_map, u, w, SOURCE_TYPE_URIMAP, l)) {
+ jk_log(l, JK_LOG_ERROR,
+ "invalid mapping rule %s->%s",
+ u, w);
+ }
+ }
+ uw_map->checked = time(NULL);
+ if (JK_IS_DEBUG_LEVEL(l))
+ uri_worker_map_dump(uw_map, "after file load", l);
+ rc = JK_TRUE;
+ }
+ jk_map_free(&map);
+ return rc;
+}
+
+int uri_worker_map_update(jk_uri_worker_map_t *uw_map,
+ int force, jk_logger_t *l)
+{
+ int rc = JK_TRUE;
+ time_t now = time(NULL);
+
+ if (force || (uw_map->reload > 0 && difftime(now, uw_map->checked) >
+ uw_map->reload)) {
+ struct stat statbuf;
+ uw_map->checked = now;
+ if ((rc = jk_stat(uw_map->fname, &statbuf)) == -1) {
+ jk_log(l, JK_LOG_ERROR,
+ "Unable to stat the %s (errno=%d)",
+ uw_map->fname, errno);
+ return JK_FALSE;
+ }
+ if (statbuf.st_mtime == uw_map->modified) {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "File %s is not modified",
+ uw_map->fname);
+ return JK_TRUE;
+ }
+ JK_ENTER_CS(&(uw_map->cs), rc);
+ /* Check if some other thread updated status */
+ if (statbuf.st_mtime == uw_map->modified) {
+ JK_LEAVE_CS(&(uw_map->cs), rc);
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "File %s is not modified",
+ uw_map->fname);
+ return JK_TRUE;
+ }
+ rc = uri_worker_map_load(uw_map, l);
+ uri_worker_map_ext(uw_map, l);
+ uri_worker_map_switch(uw_map, l);
+ JK_LEAVE_CS(&(uw_map->cs), rc);
+ jk_log(l, JK_LOG_INFO,
+ "Reloaded urimaps from %s", uw_map->fname);
+ }
+ return JK_TRUE;
+}
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_uri_worker_map.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_uri_worker_map.h
new file mode 100644
index 00000000..30091dc4
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_uri_worker_map.h
@@ -0,0 +1,208 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: URI to worker mapper header file *
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Version: $Revision: 705283 $ *
+ ***************************************************************************/
+
+#ifndef JK_URI_WORKER_MAP_H
+#define JK_URI_WORKER_MAP_H
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+#include "jk_global.h"
+#include "jk_map.h"
+#include "jk_logger.h"
+#include "jk_mt.h"
+
+#define MATCH_TYPE_EXACT 0x0001
+/* deprecated
+#define MATCH_TYPE_CONTEXT 0x0002
+ */
+/* match all context path URIs with a path component suffix */
+/* deprecated
+#define MATCH_TYPE_CONTEXT_PATH 0x0004
+ */
+/* deprecated
+#define MATCH_TYPE_SUFFIX 0x0010
+ */
+/* match all URIs of the form *ext */
+/* deprecated
+#define MATCH_TYPE_GENERAL_SUFFIX 0x0020
+ */
+/* match multiple wild characters (*) and (?) */
+#define MATCH_TYPE_WILDCHAR_PATH 0x0040
+#define MATCH_TYPE_NO_MATCH 0x1000
+#define MATCH_TYPE_DISABLED 0x2000
+/* deprecated
+#define MATCH_TYPE_STOPPED 0x4000
+ */
+
+#define SOURCE_TYPE_WORKERDEF 0x0001
+#define SOURCE_TYPE_JKMOUNT 0x0002
+#define SOURCE_TYPE_URIMAP 0x0003
+#define SOURCE_TYPE_DISCOVER 0x0004
+#define SOURCE_TYPE_TEXT_WORKERDEF ("worker definition")
+#define SOURCE_TYPE_TEXT_JKMOUNT ("JkMount")
+#define SOURCE_TYPE_TEXT_URIMAP ("uriworkermap")
+#define SOURCE_TYPE_TEXT_DISCOVER ("ajp14")
+
+#define JK_MAX_URI_LEN 4095
+
+struct rule_extension
+{
+ /* reply_timeout overwrite */
+ int reply_timeout;
+ /* activation state overwrites for load balancers */
+ /* Number of elements in the array activations. */
+ int activation_size;
+ /* Dynamically allocated array with one entry per lb member. */
+ int *activation;
+ /* Temporary storage for the original extension strings. */
+ char *active;
+ char *disabled;
+ char *stopped;
+ /* fail_on_status overwrites */
+ /* Number of elements in the array fail_on_status. */
+ int fail_on_status_size;
+ /* Dynamically allocated array with one entry per status. */
+ int *fail_on_status;
+ /* Temporary storage for the original extension strings. */
+ char *fail_on_status_str;
+ /* Use server error pages for responses >= 400. */
+ int use_server_error_pages;
+};
+typedef struct rule_extension rule_extension_t;
+
+struct uri_worker_record
+{
+ /* Original uri for logging */
+ char *uri;
+
+ /* Name of worker mapped */
+ const char *worker_name;
+
+ /* Base context */
+ const char *context;
+
+ /* Match type */
+ unsigned int match_type;
+
+ /* Definition source type */
+ unsigned int source_type;
+
+ /* char length of the context */
+ size_t context_len;
+
+ /* extended mapping properties */
+ rule_extension_t extensions;
+};
+typedef struct uri_worker_record uri_worker_record_t;
+
+struct jk_uri_worker_map
+{
+ /* Memory Pool */
+ jk_pool_t p;
+ jk_pool_atom_t buf[BIG_POOL_SIZE];
+
+ /* Index 0 or 1, which map instance do we use */
+ /* Needed to make map reload more atomically */
+ int index;
+
+ /* Memory Pool - cleared when doing reload */
+ /* Use this pool to allocate objects, that are deleted */
+ /* when the map gets dynamically reloaded from uriworkermap.properties. */
+ jk_pool_t p_dyn[2];
+ jk_pool_atom_t buf_dyn[2][BIG_POOL_SIZE];
+
+ /* map URI->WORKER */
+ uri_worker_record_t **maps[2];
+
+ /* Map Number */
+ unsigned int size[2];
+
+ /* Map Capacity */
+ unsigned int capacity[2];
+
+ /* NoMap Number */
+ unsigned int nosize[2];
+
+ /* Dynamic config support */
+
+ JK_CRIT_SEC cs;
+ /* should we forward potentially unsafe URLs */
+ int reject_unsafe;
+ /* uriworkermap filename */
+ const char *fname;
+ /* uriworkermap reload check interval */
+ int reload;
+ /* Last modified time */
+ time_t modified;
+ /* Last checked time */
+ time_t checked;
+};
+typedef struct jk_uri_worker_map jk_uri_worker_map_t;
+
+const char *uri_worker_map_get_source(uri_worker_record_t *uwr, jk_logger_t *l);
+
+char *uri_worker_map_get_match(uri_worker_record_t *uwr, char *buf, jk_logger_t *l);
+
+int uri_worker_map_alloc(jk_uri_worker_map_t **uw_map,
+ jk_map_t *init_data, jk_logger_t *l);
+
+int uri_worker_map_free(jk_uri_worker_map_t **uw_map, jk_logger_t *l);
+
+int uri_worker_map_open(jk_uri_worker_map_t *uw_map,
+ jk_map_t *init_data, jk_logger_t *l);
+
+void uri_worker_map_switch(jk_uri_worker_map_t *uw_map, jk_logger_t *l);
+
+void uri_worker_map_ext(jk_uri_worker_map_t *uw_map, jk_logger_t *l);
+
+int uri_worker_map_add(jk_uri_worker_map_t *uw_map,
+ const char *puri, const char *worker,
+ unsigned int source_type, jk_logger_t *l);
+
+const char *map_uri_to_worker(jk_uri_worker_map_t *uw_map,
+ const char *uri, const char *vhost,
+ jk_logger_t *l);
+
+const char *map_uri_to_worker_ext(jk_uri_worker_map_t *uw_map,
+ const char *uri, const char *vhost,
+ rule_extension_t **extensions,
+ int *index,
+ jk_logger_t *l);
+
+rule_extension_t *get_uri_to_worker_ext(jk_uri_worker_map_t *uw_map,
+ int index);
+
+int uri_worker_map_load(jk_uri_worker_map_t *uw_map,
+ jk_logger_t *l);
+
+int uri_worker_map_update(jk_uri_worker_map_t *uw_map,
+ int force, jk_logger_t *l);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* JK_URI_WORKER_MAP_H */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_uri_worker_map.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_uri_worker_map.lo
new file mode 100644
index 00000000..3d3b423a
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_uri_worker_map.lo
@@ -0,0 +1,12 @@
+# jk_uri_worker_map.lo - a libtool object file
+# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18)
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/jk_uri_worker_map.o'
+
+# Name of the non-PIC object.
+non_pic_object='jk_uri_worker_map.o'
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_uri_worker_map.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_uri_worker_map.o
new file mode 100644
index 00000000..c402e1fc
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_uri_worker_map.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_url.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_url.c
new file mode 100644
index 00000000..884f01d0
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_url.c
@@ -0,0 +1,124 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: URL manipulation subroutines. (ported from mod_proxy). *
+ * Version: $Revision: 531816 $ *
+ ***************************************************************************/
+
+#include "jk_global.h"
+#include "jk_url.h"
+
+#ifdef HAVE_APR
+#define JK_ISXDIGIT(x) apr_isxdigit((x))
+#define JK_ISDIGIT(x) apr_isdigit((x))
+#define JK_ISUPPER(x) apr_isupper((x))
+#define JK_ISALNUM(x) apr_isalnum((x))
+#else
+#define JK_ISXDIGIT(x) isxdigit((int)(unsigned char)((x)))
+#define JK_ISDIGIT(x) isdigit((int)(unsigned char)((x)))
+#define JK_ISUPPER(x) isupper((int)(unsigned char)((x)))
+#define JK_ISALNUM(x) isalnum((int)(unsigned char)((x)))
+#endif
+
+static void jk_c2hex(int ch, char *x)
+{
+#if !CHARSET_EBCDIC
+ int i;
+
+ x[0] = '%';
+ i = (ch & 0xF0) >> 4;
+ if (i >= 10) {
+ x[1] = ('A' - 10) + i;
+ }
+ else {
+ x[1] = '0' + i;
+ }
+
+ i = ch & 0x0F;
+ if (i >= 10) {
+ x[2] = ('A' - 10) + i;
+ }
+ else {
+ x[2] = '0' + i;
+ }
+#else /*CHARSET_EBCDIC*/
+ static const char ntoa[] = { "0123456789ABCDEF" };
+ char buf[1];
+
+ ch &= 0xFF;
+
+ buf[0] = ch;
+ jk_xlate_to_ascii(buf, 1);
+
+ x[0] = '%';
+ x[1] = ntoa[(buf[0] >> 4) & 0x0F];
+ x[2] = ntoa[buf[0] & 0x0F];
+ x[3] = '\0';
+#endif /*CHARSET_EBCDIC*/
+}
+
+/*
+ * Convert a URL-encoded string to canonical form.
+ * It encodes those which must be encoded, and does not touch
+ * those which must not be touched.
+ * String x must be '\0'-terminated.
+ * String y must be pre-allocated with len maxlen
+ * (including the terminating '\0').
+ */
+int jk_canonenc(const char *x, char *y, int maxlen)
+{
+ int i, j;
+ int ch = x[0];
+ char *allowed; /* characters which should not be encoded */
+ char *reserved; /* characters which much not be en/de-coded */
+
+/*
+ * N.B. in addition to :@&=, this allows ';' in an http path
+ * and '?' in an ftp path -- this may be revised
+ */
+ allowed = "~$-_.+!*'(),;:@&=";
+ reserved = "/";
+
+ for (i = 0, j = 0; ch != '\0' && j < maxlen; i++, j++, ch=x[i]) {
+/* always handle '/' first */
+ if (strchr(reserved, ch)) {
+ y[j] = ch;
+ continue;
+ }
+/* recode it, if necessary */
+ if (!JK_ISALNUM(ch) && !strchr(allowed, ch)) {
+ if (j+2<maxlen) {
+ jk_c2hex(ch, &y[j]);
+ j += 2;
+ }
+ else {
+ return JK_FALSE;
+ }
+ }
+ else {
+ y[j] = ch;
+ }
+ }
+ if (j<maxlen) {
+ y[j] = '\0';
+ return JK_TRUE;
+ }
+ else {
+ return JK_FALSE;
+ }
+}
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_url.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_url.h
new file mode 100644
index 00000000..a7f332e2
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_url.h
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: URL manipulation subroutines header file. (mod_proxy) *
+ * Version: $Revision: 500534 $ *
+ ***************************************************************************/
+#ifndef _JK_URL_H
+#define _JK_URL_H
+
+#include "jk_global.h"
+#include "jk_pool.h"
+#include "jk_util.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+/*
+ * Do a canonical encoding of the url x.
+ * String y contains the result and is pre-allocated
+ * for at least maxlen bytes, including a '\0' terminator.
+ */
+int jk_canonenc(const char *x, char *y, int maxlen);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* _JK_URL_H */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_url.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_url.lo
new file mode 100644
index 00000000..8b3fcdd8
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_url.lo
@@ -0,0 +1,12 @@
+# jk_url.lo - a libtool object file
+# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18)
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/jk_url.o'
+
+# Name of the non-PIC object.
+non_pic_object='jk_url.o'
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_url.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_url.o
new file mode 100644
index 00000000..fd792890
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_url.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_util.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_util.c
new file mode 100644
index 00000000..c7a16c46
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_util.c
@@ -0,0 +1,2253 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: Utility functions (mainly configuration) *
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Author: Henri Gomez <hgomez@apache.org> *
+ * Author: Rainer Jung <rjung@apache.org> *
+ * Version: $Revision: 1078846 $ *
+ ***************************************************************************/
+
+
+#include "jk_util.h"
+#include "jk_ajp12_worker.h"
+#include "jk_ajp13_worker.h"
+#include "jk_ajp14_worker.h"
+#include "jk_lb_worker.h"
+#include "jk_mt.h"
+
+#define SYSPROPS_OF_WORKER ("sysprops")
+#define STDERR_OF_WORKER ("stderr")
+#define STDOUT_OF_WORKER ("stdout")
+#define SECRET_OF_WORKER ("secret")
+#define MX_OF_WORKER ("mx")
+#define MS_OF_WORKER ("ms")
+#define CP_OF_WORKER ("class_path")
+#define BRIDGE_OF_WORKER ("bridge")
+#define JVM_OF_WORKER ("jvm_lib")
+#define LIBPATH_OF_WORKER ("ld_path")
+#define CMD_LINE_OF_WORKER ("cmd_line")
+#define NATIVE_LIB_OF_WORKER ("native_lib")
+#define REFERENCE_OF_WORKER ("reference")
+#define HOST_OF_WORKER ("host")
+#define PORT_OF_WORKER ("port")
+#define TYPE_OF_WORKER ("type")
+#define CACHE_OF_WORKER_DEPRECATED ("cachesize")
+#define CACHE_OF_WORKER ("connection_pool_size")
+#define CACHE_OF_WORKER_MIN ("connection_pool_minsize")
+#define CACHE_TIMEOUT_DEPRECATED ("cache_timeout")
+#define CACHE_TIMEOUT_OF_WORKER ("connection_pool_timeout")
+#define CACHE_ACQUIRE_OF_WORKER ("connection_acquire_timeout")
+#define RECOVERY_OPTS_OF_WORKER ("recovery_options")
+#define CONNECT_TIMEOUT_OF_WORKER ("connect_timeout")
+#define PREPOST_TIMEOUT_OF_WORKER ("prepost_timeout")
+#define REPLY_TIMEOUT_OF_WORKER ("reply_timeout")
+#define SOCKET_TIMEOUT_OF_WORKER ("socket_timeout")
+#define SOCKET_CONNECT_TIMEOUT_OF_WORKER ("socket_connect_timeout")
+#define PING_TIMEOUT_OF_WORKER ("ping_timeout")
+#define PING_MODE_OF_WORKER ("ping_mode")
+#define SOCKET_BUFFER_OF_WORKER ("socket_buffer")
+#define SOCKET_KEEPALIVE_OF_WORKER ("socket_keepalive")
+#define CONN_PING_INTERVAL_OF_WORKER ("connection_ping_interval")
+#define RECYCLE_TIMEOUT_DEPRECATED ("recycle_timeout")
+#define LOAD_FACTOR_OF_WORKER ("lbfactor")
+#define DISTANCE_OF_WORKER ("distance")
+#define BALANCED_WORKERS_DEPRECATED ("balanced_workers")
+#define BALANCE_WORKERS ("balance_workers")
+#define STICKY_SESSION ("sticky_session")
+#define STICKY_SESSION_FORCE ("sticky_session_force")
+#define SESSION_COOKIE_OF_WORKER ("session_cookie")
+#define SESSION_PATH_OF_WORKER ("session_path")
+
+#define LOCAL_WORKER_DEPRECATED ("local_worker")
+#define LOCAL_WORKER_ONLY_DEPRECATED ("local_worker_only")
+#define JVM_ROUTE_OF_WORKER_DEPRECATED ("jvm_route")
+#define ROUTE_OF_WORKER ("route")
+#define DOMAIN_OF_WORKER ("domain")
+#define REDIRECT_OF_WORKER ("redirect")
+#define MOUNT_OF_WORKER ("mount")
+#define METHOD_OF_WORKER ("method")
+#define LOCK_OF_WORKER ("lock")
+#define IS_WORKER_DISABLED_DEPRECATED ("disabled")
+#define IS_WORKER_STOPPED_DEPRECATED ("stopped")
+#define ACTIVATION_OF_WORKER ("activation")
+#define WORKER_RECOVER_TIME ("recover_time")
+#define WORKER_ERROR_ESCALATION_TIME ("error_escalation_time")
+#define MAX_REPLY_TIMEOUTS_OF_WORKER ("max_reply_timeouts")
+#define RETRY_INTERVAL_OF_WORKER ("retry_interval")
+#define WORKER_MAX_PACKET_SIZE ("max_packet_size")
+#define STYLE_SHEET_OF_WORKER ("css")
+#define NAMESPACE_OF_WORKER ("ns")
+#define XML_NAMESPACE_OF_WORKER ("xmlns")
+#define XML_DOCTYPE_OF_WORKER ("doctype")
+#define PROP_PREFIX_OF_WORKER ("prefix")
+
+#define READ_ONLY_OF_WORKER ("read_only")
+#define USER_OF_WORKER ("user")
+#define USER_CASE_OF_WORKER ("user_case_insensitive")
+#define GOOD_RATING_OF_WORKER ("good")
+#define BAD_RATING_OF_WORKER ("bad")
+
+#define DEFAULT_WORKER_TYPE JK_AJP13_WORKER_NAME
+#define SECRET_KEY_OF_WORKER ("secretkey")
+#define RETRIES_OF_WORKER ("retries")
+#define STATUS_FAIL_OF_WORKER ("fail_on_status")
+
+#define DEFAULT_WORKER JK_AJP13_WORKER_NAME
+#define WORKER_LIST_PROPERTY_NAME ("worker.list")
+#define LIST_PROPERTY_NAME ("list")
+#define WORKER_MAINTAIN_PROPERTY_NAME ("worker.maintain")
+#define MAINTAIN_PROPERTY_NAME ("maintain")
+#define DEFAULT_MAINTAIN_TIME (60)
+#define DEFAULT_LB_FACTOR (1)
+#define DEFAULT_DISTANCE (0)
+
+#define TOMCAT32_BRIDGE_NAME ("tomcat32")
+#define TOMCAT33_BRIDGE_NAME ("tomcat33")
+#define TOMCAT40_BRIDGE_NAME ("tomcat40")
+#define TOMCAT41_BRIDGE_NAME ("tomcat41")
+#define TOMCAT50_BRIDGE_NAME ("tomcat5")
+
+#define HUGE_BUFFER_SIZE (8*1024)
+
+#define MAKE_WORKER_PARAM(P) \
+ strcpy(buf, "worker."); \
+ strcat(buf, wname); \
+ strcat(buf, "."); \
+ strcat(buf, P)
+
+/*
+ * define the log format, we're using by default the one from error.log
+ *
+ * [Mon Mar 26 19:44:48.123 2001] [jk_uri_worker_map.c (155)]: Into jk_uri_worker_map_t::uri_worker_map_alloc
+ * log format used by apache in error.log
+ */
+#define JK_TIME_CONV_MILLI "%Q"
+#define JK_TIME_CONV_MICRO "%q"
+#define JK_TIME_PATTERN_MILLI "000"
+#define JK_TIME_PATTERN_MICRO "000000"
+#define JK_TIME_FORMAT_NONE "[%a %b %d %H:%M:%S %Y] "
+#define JK_TIME_FORMAT_MILLI "[%a %b %d %H:%M:%S." JK_TIME_CONV_MILLI " %Y] "
+#define JK_TIME_FORMAT_MICRO "[%a %b %d %H:%M:%S." JK_TIME_CONV_MICRO " %Y] "
+#define JK_TIME_SUBSEC_NONE (0)
+#define JK_TIME_SUBSEC_MILLI (1)
+#define JK_TIME_SUBSEC_MICRO (2)
+
+/* Visual C++ Toolkit 2003 support */
+#if defined (_MSC_VER) && (_MSC_VER == 1310)
+ extern long _ftol(double); /* defined by VC6 C libs */
+ extern long _ftol2(double dblSource) { return _ftol(dblSource); }
+#endif
+
+static const char *list_properties[] = {
+ BALANCE_WORKERS,
+ MOUNT_OF_WORKER,
+ USER_OF_WORKER,
+ GOOD_RATING_OF_WORKER,
+ BAD_RATING_OF_WORKER,
+ STATUS_FAIL_OF_WORKER,
+ "list",
+ NULL
+};
+
+static const char *unique_properties[] = {
+ SECRET_OF_WORKER,
+ REFERENCE_OF_WORKER,
+ HOST_OF_WORKER,
+ PORT_OF_WORKER,
+ TYPE_OF_WORKER,
+ CACHE_OF_WORKER_DEPRECATED,
+ CACHE_OF_WORKER,
+ CACHE_OF_WORKER_MIN,
+ CACHE_TIMEOUT_DEPRECATED,
+ CACHE_TIMEOUT_OF_WORKER,
+ CACHE_ACQUIRE_OF_WORKER,
+ RECOVERY_OPTS_OF_WORKER,
+ CONNECT_TIMEOUT_OF_WORKER,
+ PREPOST_TIMEOUT_OF_WORKER,
+ PING_TIMEOUT_OF_WORKER,
+ PING_MODE_OF_WORKER,
+ REPLY_TIMEOUT_OF_WORKER,
+ SOCKET_TIMEOUT_OF_WORKER,
+ SOCKET_CONNECT_TIMEOUT_OF_WORKER,
+ SOCKET_BUFFER_OF_WORKER,
+ SOCKET_KEEPALIVE_OF_WORKER,
+ CONN_PING_INTERVAL_OF_WORKER,
+ RECYCLE_TIMEOUT_DEPRECATED,
+ LOAD_FACTOR_OF_WORKER,
+ STICKY_SESSION,
+ STICKY_SESSION_FORCE,
+ SESSION_COOKIE_OF_WORKER,
+ SESSION_PATH_OF_WORKER,
+ LOCAL_WORKER_DEPRECATED,
+ LOCAL_WORKER_ONLY_DEPRECATED,
+ JVM_ROUTE_OF_WORKER_DEPRECATED,
+ ROUTE_OF_WORKER,
+ DOMAIN_OF_WORKER,
+ REDIRECT_OF_WORKER,
+ METHOD_OF_WORKER,
+ LOCK_OF_WORKER,
+ IS_WORKER_DISABLED_DEPRECATED,
+ IS_WORKER_STOPPED_DEPRECATED,
+ ACTIVATION_OF_WORKER,
+ WORKER_RECOVER_TIME,
+ WORKER_ERROR_ESCALATION_TIME,
+ MAX_REPLY_TIMEOUTS_OF_WORKER,
+ RETRY_INTERVAL_OF_WORKER,
+ WORKER_MAX_PACKET_SIZE,
+ STYLE_SHEET_OF_WORKER,
+ READ_ONLY_OF_WORKER,
+ RETRIES_OF_WORKER,
+ WORKER_MAINTAIN_PROPERTY_NAME,
+ NAMESPACE_OF_WORKER,
+ XML_NAMESPACE_OF_WORKER,
+ XML_DOCTYPE_OF_WORKER,
+ PROP_PREFIX_OF_WORKER,
+ USER_CASE_OF_WORKER,
+ NULL
+};
+
+static const char *deprecated_properties[] = {
+ SYSPROPS_OF_WORKER,
+ STDERR_OF_WORKER,
+ STDOUT_OF_WORKER,
+ MX_OF_WORKER,
+ MS_OF_WORKER,
+ CP_OF_WORKER,
+ BRIDGE_OF_WORKER,
+ JVM_OF_WORKER,
+ LIBPATH_OF_WORKER,
+ CMD_LINE_OF_WORKER,
+ NATIVE_LIB_OF_WORKER,
+ CACHE_OF_WORKER_DEPRECATED,
+ CACHE_TIMEOUT_DEPRECATED,
+ RECYCLE_TIMEOUT_DEPRECATED,
+ BALANCED_WORKERS_DEPRECATED,
+ JVM_ROUTE_OF_WORKER_DEPRECATED,
+ LOCAL_WORKER_DEPRECATED,
+ LOCAL_WORKER_ONLY_DEPRECATED,
+ IS_WORKER_DISABLED_DEPRECATED,
+ IS_WORKER_STOPPED_DEPRECATED,
+ NULL
+};
+
+static const char *supported_properties[] = {
+ SYSPROPS_OF_WORKER,
+ STDERR_OF_WORKER,
+ STDOUT_OF_WORKER,
+ SECRET_OF_WORKER,
+ MX_OF_WORKER,
+ MS_OF_WORKER,
+ CP_OF_WORKER,
+ BRIDGE_OF_WORKER,
+ JVM_OF_WORKER,
+ LIBPATH_OF_WORKER,
+ CMD_LINE_OF_WORKER,
+ NATIVE_LIB_OF_WORKER,
+ REFERENCE_OF_WORKER,
+ HOST_OF_WORKER,
+ PORT_OF_WORKER,
+ TYPE_OF_WORKER,
+ CACHE_OF_WORKER_DEPRECATED,
+ CACHE_OF_WORKER,
+ CACHE_OF_WORKER_MIN,
+ CACHE_TIMEOUT_DEPRECATED,
+ CACHE_TIMEOUT_OF_WORKER,
+ CACHE_ACQUIRE_OF_WORKER,
+ RECOVERY_OPTS_OF_WORKER,
+ CONNECT_TIMEOUT_OF_WORKER,
+ PREPOST_TIMEOUT_OF_WORKER,
+ PING_TIMEOUT_OF_WORKER,
+ PING_MODE_OF_WORKER,
+ REPLY_TIMEOUT_OF_WORKER,
+ SOCKET_TIMEOUT_OF_WORKER,
+ SOCKET_CONNECT_TIMEOUT_OF_WORKER,
+ SOCKET_BUFFER_OF_WORKER,
+ SOCKET_KEEPALIVE_OF_WORKER,
+ CONN_PING_INTERVAL_OF_WORKER,
+ RECYCLE_TIMEOUT_DEPRECATED,
+ LOAD_FACTOR_OF_WORKER,
+ DISTANCE_OF_WORKER,
+ BALANCED_WORKERS_DEPRECATED,
+ BALANCE_WORKERS,
+ STICKY_SESSION,
+ STICKY_SESSION_FORCE,
+ SESSION_COOKIE_OF_WORKER,
+ SESSION_PATH_OF_WORKER,
+ LOCAL_WORKER_DEPRECATED,
+ LOCAL_WORKER_ONLY_DEPRECATED,
+ JVM_ROUTE_OF_WORKER_DEPRECATED,
+ ROUTE_OF_WORKER,
+ DOMAIN_OF_WORKER,
+ REDIRECT_OF_WORKER,
+ MOUNT_OF_WORKER,
+ METHOD_OF_WORKER,
+ LOCK_OF_WORKER,
+ IS_WORKER_DISABLED_DEPRECATED,
+ IS_WORKER_STOPPED_DEPRECATED,
+ ACTIVATION_OF_WORKER,
+ WORKER_RECOVER_TIME,
+ WORKER_ERROR_ESCALATION_TIME,
+ MAX_REPLY_TIMEOUTS_OF_WORKER,
+ RETRY_INTERVAL_OF_WORKER,
+ WORKER_MAX_PACKET_SIZE,
+ STYLE_SHEET_OF_WORKER,
+ NAMESPACE_OF_WORKER,
+ XML_NAMESPACE_OF_WORKER,
+ XML_DOCTYPE_OF_WORKER,
+ PROP_PREFIX_OF_WORKER,
+ READ_ONLY_OF_WORKER,
+ USER_OF_WORKER,
+ USER_CASE_OF_WORKER,
+ GOOD_RATING_OF_WORKER,
+ BAD_RATING_OF_WORKER,
+ SECRET_KEY_OF_WORKER,
+ RETRIES_OF_WORKER,
+ STATUS_FAIL_OF_WORKER,
+ LIST_PROPERTY_NAME,
+ MAINTAIN_PROPERTY_NAME,
+ NULL
+};
+
+static const char *jk_level_verbs[] = {
+ "[" JK_LOG_TRACE_VERB "] ",
+ "[" JK_LOG_DEBUG_VERB "] ",
+ "[" JK_LOG_INFO_VERB "] ",
+ "[" JK_LOG_WARN_VERB "] ",
+ "[" JK_LOG_ERROR_VERB "] ",
+ "[" JK_LOG_EMERG_VERB "] ",
+ NULL
+};
+
+const char *jk_get_bool(int v)
+{
+ if (v == 0)
+ return "False";
+ else
+ return "True";
+}
+
+int jk_get_bool_code(const char *v, int def)
+{
+ if (!v) {
+ return def;
+ }
+ else if (!strcasecmp(v, "off") ||
+ *v == 'F' || *v == 'f' ||
+ *v == 'N' || *v == 'n' ||
+ (*v == '0' && *(v + 1) == '\0')) {
+ return 0;
+ }
+ else if (!strcasecmp(v, "on") ||
+ *v == 'T' || *v == 't' ||
+ *v == 'Y' || *v == 'y' ||
+ (*v == '1' && *(v + 1) == '\0')) {
+ return 1;
+ }
+ return def;
+}
+
+/* Sleep for 100ms */
+void jk_sleep(int ms)
+{
+#ifdef OS2
+ DosSleep(ms);
+#elif defined(BEOS)
+ snooze(ms * 1000);
+#elif defined(NETWARE)
+ delay(ms);
+#elif defined(WIN32)
+ Sleep(ms);
+#else
+ struct timeval tv;
+ tv.tv_usec = (ms % 1000) * 1000;
+ tv.tv_sec = ms / 1000;
+ select(0, NULL, NULL, NULL, &tv);
+#endif
+}
+
+/* Replace the first occurence of a sub second time format character
+ * by a series of zero digits with the right precision.
+ * We format our timestamp with strftime, but this can not handle
+ * sub second timestamps.
+ * So we first patch the milliseconds or microseconds literally into
+ * the format string, and then pass it on the strftime.
+ * In order to do that efficiently, we prepare a format string, that
+ * already has placeholder digits for the sub second time stamp
+ * and we save the position and time precision of this placeholder.
+ */
+void jk_set_time_fmt(jk_logger_t *l, const char *jk_log_fmt)
+{
+ if (l) {
+ char *s;
+
+ if (!jk_log_fmt) {
+#ifndef NO_GETTIMEOFDAY
+ jk_log_fmt = JK_TIME_FORMAT_MILLI;
+#else
+ jk_log_fmt = JK_TIME_FORMAT_NONE;
+#endif
+ }
+ l->log_fmt_type = JK_TIME_SUBSEC_NONE;
+ l->log_fmt_offset = 0;
+ l->log_fmt_size = 0;
+ l->log_fmt = jk_log_fmt;
+
+/* Look for the first occurence of JK_TIME_CONV_MILLI */
+ if ((s = strstr(jk_log_fmt, JK_TIME_CONV_MILLI))) {
+ size_t offset = s - jk_log_fmt;
+ size_t len = strlen(JK_TIME_PATTERN_MILLI);
+
+/* If we don't have enough space in our fixed-length char array,
+ * we simply stick to the default format, ignoring JK_TIME_CONV_MILLI.
+ * Otherwise we replace the first occurence of JK_TIME_CONV_MILLI by JK_TIME_PATTERN_MILLI.
+ */
+ if (offset + len < JK_TIME_MAX_SIZE) {
+ l->log_fmt_type = JK_TIME_SUBSEC_MILLI;
+ l->log_fmt_offset = offset;
+ strncpy(l->log_fmt_subsec, jk_log_fmt, offset);
+ strncpy(l->log_fmt_subsec + offset, JK_TIME_PATTERN_MILLI, len);
+ strncpy(l->log_fmt_subsec + offset + len,
+ s + strlen(JK_TIME_CONV_MILLI),
+ JK_TIME_MAX_SIZE - offset - len - 1);
+/* Now we put a stop mark into the string to make it's length at most JK_TIME_MAX_SIZE-1
+ * plus terminating '\0'.
+ */
+ l->log_fmt_subsec[JK_TIME_MAX_SIZE-1] = '\0';
+ l->log_fmt_size = strlen(l->log_fmt_subsec);
+ }
+/* Look for the first occurence of JK_TIME_CONV_MICRO */
+ }
+ else if ((s = strstr(jk_log_fmt, JK_TIME_CONV_MICRO))) {
+ size_t offset = s - jk_log_fmt;
+ size_t len = strlen(JK_TIME_PATTERN_MICRO);
+
+/* If we don't have enough space in our fixed-length char array,
+ * we simply stick to the default format, ignoring JK_TIME_CONV_MICRO.
+ * Otherwise we replace the first occurence of JK_TIME_CONV_MICRO by JK_TIME_PATTERN_MICRO.
+ */
+ if (offset + len < JK_TIME_MAX_SIZE) {
+ l->log_fmt_type = JK_TIME_SUBSEC_MICRO;
+ l->log_fmt_offset = offset;
+ strncpy(l->log_fmt_subsec, jk_log_fmt, offset);
+ strncpy(l->log_fmt_subsec + offset, JK_TIME_PATTERN_MICRO, len);
+ strncpy(l->log_fmt_subsec + offset + len,
+ s + strlen(JK_TIME_CONV_MICRO),
+ JK_TIME_MAX_SIZE - offset - len - 1);
+/* Now we put a stop mark into the string to make it's length at most JK_TIME_MAX_SIZE-1
+ * plus terminating '\0'.
+ */
+ l->log_fmt_subsec[JK_TIME_MAX_SIZE-1] = '\0';
+ l->log_fmt_size = strlen(l->log_fmt_subsec);
+ }
+ }
+ jk_log(l, JK_LOG_DEBUG, "Pre-processed log time stamp format is '%s'",
+ l->log_fmt_type == JK_TIME_SUBSEC_NONE ? l->log_fmt : l->log_fmt_subsec);
+ }
+}
+
+static int set_time_str(char *str, int len, jk_logger_t *l)
+{
+ time_t t;
+ struct tm *tms;
+#ifdef _MT_CODE_PTHREAD
+ struct tm res;
+#endif
+ int done;
+/* We want to use a fixed maximum size buffer here.
+ * If we would dynamically adjust it to the real format
+ * string length, we could support longer format strings,
+ * but we would have to allocate and free for each log line.
+ */
+ char log_fmt[JK_TIME_MAX_SIZE];
+
+ if (!l || !l->log_fmt) {
+ return 0;
+ }
+
+ log_fmt[0] = '\0';
+
+#ifndef NO_GETTIMEOFDAY
+ if ( l->log_fmt_type != JK_TIME_SUBSEC_NONE ) {
+ struct timeval tv;
+ int rc = 0;
+
+#ifdef WIN32
+ gettimeofday(&tv, NULL);
+#else
+ rc = gettimeofday(&tv, NULL);
+#endif
+ if (rc == 0) {
+/* We need this subsec buffer, because we convert
+ * the integer with sprintf(), but we don't
+ * want to write the terminating '\0' into our
+ * final log format string.
+ */
+ char subsec[7];
+ t = tv.tv_sec;
+ strncpy(log_fmt, l->log_fmt_subsec, l->log_fmt_size + 1);
+ if (l->log_fmt_type == JK_TIME_SUBSEC_MILLI) {
+ sprintf(subsec, "%03d", (int)(tv.tv_usec/1000));
+ strncpy(log_fmt + l->log_fmt_offset, subsec, 3);
+ }
+ else if (l->log_fmt_type == JK_TIME_SUBSEC_MICRO) {
+ sprintf(subsec, "%06d", (int)(tv.tv_usec));
+ strncpy(log_fmt + l->log_fmt_offset, subsec, 6);
+ }
+ }
+ else {
+ t = time(NULL);
+ }
+ }
+ else {
+ t = time(NULL);
+ }
+#else
+ t = time(NULL);
+#endif
+#ifdef _MT_CODE_PTHREAD
+ tms = localtime_r(&t, &res);
+#else
+ tms = localtime(&t);
+#endif
+ if (log_fmt[0])
+ done = (int)strftime(str, len, log_fmt, tms);
+ else
+ done = (int)strftime(str, len, l->log_fmt, tms);
+ return done;
+
+}
+
+static int JK_METHOD log_to_file(jk_logger_t *l, int level, int used, char *what)
+{
+ if (l &&
+ (l->level <= level || level == JK_LOG_REQUEST_LEVEL) &&
+ l->logger_private && what) {
+ jk_file_logger_t *p = l->logger_private;
+ if (p->logfile) {
+ what[used++] = '\n';
+ what[used] = '\0';
+#if defined(JK_LOG_LOCKING)
+#if defined(WIN32) && defined(_MSC_VER)
+ LockFile((HANDLE)_get_osfhandle(_fileno(p->logfile)),
+ 0, 0, 1, 0);
+#endif
+#endif
+ fputs(what, p->logfile);
+ /* [V] Flush the dam' thing! */
+ fflush(p->logfile);
+#if defined(JK_LOG_LOCKING)
+#if defined(WIN32) && defined(_MSC_VER)
+ UnlockFile((HANDLE)_get_osfhandle(_fileno(p->logfile)),
+ 0, 0, 1, 0);
+#endif
+#endif
+ }
+ return JK_TRUE;
+ }
+ return JK_FALSE;
+}
+
+int jk_parse_log_level(const char *level)
+{
+ if (0 == strcasecmp(level, JK_LOG_TRACE_VERB)) {
+ return JK_LOG_TRACE_LEVEL;
+ }
+
+ if (0 == strcasecmp(level, JK_LOG_DEBUG_VERB)) {
+ return JK_LOG_DEBUG_LEVEL;
+ }
+
+ if (0 == strcasecmp(level, JK_LOG_INFO_VERB)) {
+ return JK_LOG_INFO_LEVEL;
+ }
+
+ if (0 == strcasecmp(level, JK_LOG_WARN_VERB)) {
+ return JK_LOG_WARNING_LEVEL;
+ }
+
+ if (0 == strcasecmp(level, JK_LOG_ERROR_VERB)) {
+ return JK_LOG_ERROR_LEVEL;
+ }
+
+ if (0 == strcasecmp(level, JK_LOG_EMERG_VERB)) {
+ return JK_LOG_EMERG_LEVEL;
+ }
+
+ return JK_LOG_DEF_LEVEL;
+}
+
+int jk_open_file_logger(jk_logger_t **l, const char *file, int level)
+{
+ if (l && file) {
+
+ jk_logger_t *rc = (jk_logger_t *)malloc(sizeof(jk_logger_t));
+ jk_file_logger_t *p = (jk_file_logger_t *) malloc(sizeof(jk_file_logger_t));
+ if (rc && p) {
+ rc->log = log_to_file;
+ rc->level = level;
+ rc->logger_private = p;
+#if defined(AS400) && !defined(AS400_UTF8)
+ p->logfile = fopen(file, "a+, o_ccsid=0");
+#elif defined(WIN32) && defined(_MSC_VER)
+ p->logfile = fopen(file, "a+c");
+#else
+ p->logfile = fopen(file, "a+");
+#endif
+ if (p->logfile) {
+ *l = rc;
+ jk_set_time_fmt(rc, NULL);
+ return JK_TRUE;
+ }
+ }
+ if (rc) {
+ free(rc);
+ }
+ if (p) {
+ free(p);
+ }
+
+ *l = NULL;
+ }
+ return JK_FALSE;
+}
+
+int jk_attach_file_logger(jk_logger_t **l, int fd, int level)
+{
+ if (l && fd >= 0) {
+
+ jk_logger_t *rc = (jk_logger_t *)malloc(sizeof(jk_logger_t));
+ jk_file_logger_t *p = (jk_file_logger_t *) malloc(sizeof(jk_file_logger_t));
+ if (rc && p) {
+ rc->log = log_to_file;
+ rc->level = level;
+ rc->logger_private = p;
+#if defined(AS400) && !defined(AS400_UTF8)
+ p->logfile = fdopen(fd, "a+, o_ccsid=0");
+#elif defined(WIN32) && defined(_MSC_VER)
+ p->logfile = fdopen(fd, "a+c");
+#else
+ p->logfile = fdopen(fd, "a+");
+#endif
+ if (p->logfile) {
+ *l = rc;
+ jk_set_time_fmt(rc, NULL);
+ return JK_TRUE;
+ }
+ }
+ if (rc) {
+ free(rc);
+ }
+ if (p) {
+ free(p);
+ }
+
+ *l = NULL;
+ }
+ return JK_FALSE;
+}
+
+int jk_close_file_logger(jk_logger_t **l)
+{
+ if (l && *l) {
+ jk_file_logger_t *p = (*l)->logger_private;
+ if (p) {
+ fflush(p->logfile);
+ fclose(p->logfile);
+ free(p);
+ }
+ free(*l);
+ *l = NULL;
+
+ return JK_TRUE;
+ }
+ return JK_FALSE;
+}
+
+int jk_log(jk_logger_t *l,
+ const char *file, int line, const char *funcname, int level,
+ const char *fmt, ...)
+{
+ int rc = 0;
+ /*
+ * Need to reserve space for terminating zero byte
+ * and platform specific line endings added during the call
+ * to the output routing.
+ */
+ static int usable_size = HUGE_BUFFER_SIZE - 3;
+ if (!l || !file || !fmt) {
+ return -1;
+ }
+
+ if ((l->level <= level) || (level == JK_LOG_REQUEST_LEVEL)) {
+#ifdef NETWARE
+ /* On NetWare, this can get called on a thread that has a limited stack so */
+ /* we will allocate and free the temporary buffer in this function */
+ char *buf;
+#else
+ char buf[HUGE_BUFFER_SIZE];
+#endif
+ char *f = (char *)(file + strlen(file) - 1);
+ va_list args;
+ int used = 0;
+
+ while (f != file && '\\' != *f && '/' != *f) {
+ f--;
+ }
+ if (f != file) {
+ f++;
+ }
+
+#ifdef NETWARE
+ buf = (char *)malloc(HUGE_BUFFER_SIZE);
+ if (NULL == buf)
+ return -1;
+#endif
+ used = set_time_str(buf, usable_size, l);
+
+ if (line) { /* line==0 only used for request log item */
+ /* Log [pid:threadid] for all levels except REQUEST. */
+ /* This information helps to correlate lines from different logs. */
+ /* Performance is no issue, because with production log levels */
+ /* we only call it often, if we have a lot of errors */
+ rc = snprintf(buf + used, usable_size - used,
+ "[%" JK_PID_T_FMT ":%" JK_PTHREAD_T_FMT "] ", getpid(), jk_gettid());
+ used += rc;
+ if (rc < 0 ) {
+ return 0;
+ }
+
+ rc = (int)strlen(jk_level_verbs[level]);
+ if (usable_size - used >= rc) {
+ strncpy(buf + used, jk_level_verbs[level], rc);
+ used += rc;
+ }
+ else {
+ return 0; /* [V] not sure what to return... */
+ }
+
+ if (funcname) {
+ rc = (int)strlen(funcname);
+ if (usable_size - used >= rc + 2) {
+ strncpy(buf + used, funcname, rc);
+ used += rc;
+ strncpy(buf + used, "::", 2);
+ used += 2;
+ }
+ else {
+ return 0; /* [V] not sure what to return... */
+ }
+ }
+
+ rc = (int)strlen(f);
+ if (usable_size - used >= rc) {
+ strncpy(buf + used, f, rc);
+ used += rc;
+ }
+ else {
+ return 0; /* [V] not sure what to return... */
+ }
+
+ rc = snprintf(buf + used, usable_size - used,
+ " (%d): ", line);
+ used += rc;
+ if (rc < 0 || usable_size - used < 0) {
+ return 0; /* [V] not sure what to return... */
+ }
+ }
+
+ va_start(args, fmt);
+ rc = vsnprintf(buf + used, usable_size - used, fmt, args);
+ va_end(args);
+ if ( rc <= usable_size - used ) {
+ used += rc;
+ } else {
+ used = usable_size;
+ }
+ l->log(l, level, used, buf);
+
+#ifdef NETWARE
+ free(buf);
+#endif
+ }
+
+ return rc;
+}
+
+const char *jk_get_worker_type(jk_map_t *m, const char *wname)
+{
+ char buf[1024];
+
+ if (!m || !wname) {
+ return NULL;
+ }
+ MAKE_WORKER_PARAM(TYPE_OF_WORKER);
+ return jk_map_get_string(m, buf, DEFAULT_WORKER_TYPE);
+}
+
+const char *jk_get_worker_route(jk_map_t *m, const char *wname, const char *def)
+{
+ char buf[1024];
+ const char *v;
+ if (!m || !wname) {
+ return NULL;
+ }
+ MAKE_WORKER_PARAM(ROUTE_OF_WORKER);
+ v = jk_map_get_string(m, buf, NULL);
+ if (v) {
+ return v;
+ }
+ /* Try old jvm_route directive */
+ MAKE_WORKER_PARAM(JVM_ROUTE_OF_WORKER_DEPRECATED);
+ return jk_map_get_string(m, buf, def);
+}
+
+const char *jk_get_worker_domain(jk_map_t *m, const char *wname, const char *def)
+{
+ char buf[1024];
+ if (!m || !wname) {
+ return NULL;
+ }
+ MAKE_WORKER_PARAM(DOMAIN_OF_WORKER);
+ return jk_map_get_string(m, buf, def);
+}
+
+const char *jk_get_worker_redirect(jk_map_t *m, const char *wname, const char *def)
+{
+ char buf[1024];
+ if (!m || !wname) {
+ return NULL;
+ }
+ MAKE_WORKER_PARAM(REDIRECT_OF_WORKER);
+ return jk_map_get_string(m, buf, def);
+}
+
+const char *jk_get_worker_secret(jk_map_t *m, const char *wname)
+{
+ char buf[1024];
+
+ if (!m || !wname) {
+ return NULL;
+ }
+
+ MAKE_WORKER_PARAM(SECRET_OF_WORKER);
+
+ return jk_map_get_string(m, buf, NULL);
+}
+
+/* [V] I suggest that the following general purpose functions be used. */
+/* More should be added (double etc.), but now these were enough for me. */
+/* Functions that can be simulated with these should be "deprecated". */
+
+int jk_get_worker_str_prop(jk_map_t *m,
+ const char *wname, const char *pname, const char **prop)
+{
+ char buf[1024];
+
+ if (m && prop && wname && pname) {
+ MAKE_WORKER_PARAM(pname);
+ *prop = jk_map_get_string(m, buf, NULL);
+ if (*prop) {
+ return JK_TRUE;
+ }
+ }
+ return JK_FALSE;
+}
+
+int jk_get_worker_int_prop(jk_map_t *m,
+ const char *wname, const char *pname, int *prop)
+{
+ char buf[1024];
+
+ if (m && prop && wname && pname) {
+ int i;
+ MAKE_WORKER_PARAM(pname);
+ i = jk_map_get_int(m, buf, -1);
+ if (-1 != i) {
+ *prop = i;
+ return JK_TRUE;
+ }
+ }
+ return JK_FALSE;
+}
+
+const char *jk_get_worker_host(jk_map_t *m, const char *wname, const char *def)
+{
+ char buf[1024];
+
+ if (!m || !wname) {
+ return NULL;
+ }
+
+ MAKE_WORKER_PARAM(HOST_OF_WORKER);
+
+ return jk_map_get_string(m, buf, def);
+}
+
+int jk_get_worker_port(jk_map_t *m, const char *wname, int def)
+{
+ char buf[1024];
+
+ if (!m || !wname) {
+ return -1;
+ }
+
+ MAKE_WORKER_PARAM(PORT_OF_WORKER);
+
+ return jk_map_get_int(m, buf, def);
+}
+
+static int def_cache_size = -1;
+int jk_get_worker_def_cache_size(int protocol)
+{
+ if (def_cache_size < 1) {
+ if (protocol == AJP14_PROTO)
+ def_cache_size = AJP14_DEF_CACHE_SZ;
+ else
+ def_cache_size = AJP13_DEF_CACHE_SZ;
+ }
+ return def_cache_size;
+}
+
+void jk_set_worker_def_cache_size(int sz)
+{
+ def_cache_size = sz;
+}
+
+int jk_get_worker_cache_size(jk_map_t *m, const char *wname, int def)
+{
+ char buf[1024];
+ int rv;
+
+ if (!m || !wname) {
+ return -1;
+ }
+
+ MAKE_WORKER_PARAM(CACHE_OF_WORKER);
+ if ((rv = jk_map_get_int(m, buf, -1)) >= 0)
+ return rv;
+ MAKE_WORKER_PARAM(CACHE_OF_WORKER_DEPRECATED);
+ return jk_map_get_int(m, buf, def);
+}
+
+int jk_get_worker_cache_size_min(jk_map_t *m, const char *wname, int def)
+{
+ char buf[1024];
+
+ if (!m || !wname) {
+ return -1;
+ }
+
+ MAKE_WORKER_PARAM(CACHE_OF_WORKER_MIN);
+ return jk_map_get_int(m, buf, def);
+}
+
+int jk_get_worker_cache_acquire_timeout(jk_map_t *m, const char *wname, int def)
+{
+ char buf[1024];
+
+ if (!m || !wname) {
+ return -1;
+ }
+
+ MAKE_WORKER_PARAM(CACHE_ACQUIRE_OF_WORKER);
+ return jk_map_get_int(m, buf, def);
+}
+
+int jk_get_worker_socket_timeout(jk_map_t *m, const char *wname, int def)
+{
+ char buf[1024];
+
+ if (!m || !wname) {
+ return -1;
+ }
+
+ MAKE_WORKER_PARAM(SOCKET_TIMEOUT_OF_WORKER);
+
+ return jk_map_get_int(m, buf, def);
+}
+
+int jk_get_worker_socket_connect_timeout(jk_map_t *m, const char *wname, int def)
+{
+ char buf[1024];
+
+ if (!m || !wname) {
+ return -1;
+ }
+
+ MAKE_WORKER_PARAM(SOCKET_CONNECT_TIMEOUT_OF_WORKER);
+
+ return jk_map_get_int(m, buf, def);
+}
+
+int jk_get_worker_recover_timeout(jk_map_t *m, const char *wname, int def)
+{
+ char buf[1024];
+
+ if (!m || !wname) {
+ return -1;
+ }
+
+ MAKE_WORKER_PARAM(WORKER_RECOVER_TIME);
+
+ return jk_map_get_int(m, buf, def);
+}
+
+int jk_get_worker_error_escalation_time(jk_map_t *m, const char *wname, int def)
+{
+ char buf[1024];
+
+ if (!m || !wname) {
+ return -1;
+ }
+
+ MAKE_WORKER_PARAM(WORKER_ERROR_ESCALATION_TIME);
+
+ return jk_map_get_int(m, buf, def);
+}
+
+int jk_get_worker_max_reply_timeouts(jk_map_t *m, const char *wname, int def)
+{
+ char buf[1024];
+
+ if (!m || !wname) {
+ return -1;
+ }
+
+ MAKE_WORKER_PARAM(MAX_REPLY_TIMEOUTS_OF_WORKER);
+
+ return jk_map_get_int(m, buf, def);
+}
+
+int jk_get_worker_retry_interval(jk_map_t *m, const char *wname, int def)
+{
+ char buf[1024];
+
+ if (!m || !wname) {
+ return -1;
+ }
+
+ MAKE_WORKER_PARAM(RETRY_INTERVAL_OF_WORKER);
+
+ return jk_map_get_int(m, buf, def);
+}
+
+int jk_get_worker_socket_buffer(jk_map_t *m, const char *wname, int def)
+{
+ char buf[1024];
+ int i;
+ if (!m || !wname) {
+ return -1;
+ }
+
+ MAKE_WORKER_PARAM(SOCKET_BUFFER_OF_WORKER);
+
+ i = jk_map_get_int(m, buf, 0);
+ if (i > 0 && i < def)
+ i = def;
+ return i;
+}
+
+int jk_get_worker_socket_keepalive(jk_map_t *m, const char *wname, int def)
+{
+ char buf[1024];
+
+ if (!m || !wname) {
+ return -1;
+ }
+
+ MAKE_WORKER_PARAM(SOCKET_KEEPALIVE_OF_WORKER);
+
+ return jk_map_get_bool(m, buf, def);
+}
+
+int jk_get_worker_conn_ping_interval(jk_map_t *m, const char *wname, int def)
+{
+ char buf[1024];
+
+ if (!m || !wname) {
+ return -1;
+ }
+
+ MAKE_WORKER_PARAM(CONN_PING_INTERVAL_OF_WORKER);
+
+ return jk_map_get_int(m, buf, def);
+}
+
+int jk_get_worker_cache_timeout(jk_map_t *m, const char *wname, int def)
+{
+ char buf[1024];
+ int rv;
+
+ if (!m || !wname) {
+ return -1;
+ }
+
+ MAKE_WORKER_PARAM(CACHE_TIMEOUT_OF_WORKER);
+ if ((rv = jk_map_get_int(m, buf, -1)) >= 0)
+ return rv;
+ MAKE_WORKER_PARAM(CACHE_TIMEOUT_DEPRECATED);
+
+ return jk_map_get_int(m, buf, def);
+}
+
+int jk_get_worker_connect_timeout(jk_map_t *m, const char *wname, int def)
+{
+ char buf[1024];
+
+ if (!m || !wname) {
+ return -1;
+ }
+
+ MAKE_WORKER_PARAM(CONNECT_TIMEOUT_OF_WORKER);
+
+ return jk_map_get_int(m, buf, def);
+}
+
+int jk_get_worker_prepost_timeout(jk_map_t *m, const char *wname, int def)
+{
+ char buf[1024];
+
+ if (!m || !wname) {
+ return -1;
+ }
+
+ MAKE_WORKER_PARAM(PREPOST_TIMEOUT_OF_WORKER);
+
+ return jk_map_get_int(m, buf, def);
+}
+
+int jk_get_worker_ping_timeout(jk_map_t *m, const char *wname, int def)
+{
+ char buf[1024];
+
+ if (!m || !wname) {
+ return -1;
+ }
+
+ MAKE_WORKER_PARAM(PING_TIMEOUT_OF_WORKER);
+
+ return jk_map_get_int(m, buf, def);
+}
+
+int jk_get_worker_ping_mode(jk_map_t *m, const char *wname, int def)
+{
+ char buf[1024];
+ const char *v;
+
+ if (!m || !wname) {
+ return def;
+ }
+
+ MAKE_WORKER_PARAM(PING_MODE_OF_WORKER);
+
+ v = jk_map_get_string(m, buf, NULL);
+ return jk_ajp_get_cping_mode(v, def);
+}
+
+int jk_get_worker_reply_timeout(jk_map_t *m, const char *wname, int def)
+{
+ char buf[1024];
+
+ if (!m || !wname) {
+ return -1;
+ }
+
+ MAKE_WORKER_PARAM(REPLY_TIMEOUT_OF_WORKER);
+
+ return jk_map_get_int(m, buf, def);
+}
+
+int jk_get_worker_recycle_timeout(jk_map_t *m, const char *wname, int def)
+{
+ return def;
+}
+
+int jk_get_worker_retries(jk_map_t *m, const char *wname, int def)
+{
+ char buf[1024];
+ int rv;
+ if (!m || !wname) {
+ return -1;
+ }
+
+ MAKE_WORKER_PARAM(RETRIES_OF_WORKER);
+
+ rv = jk_map_get_int(m, buf, def);
+ if (rv < 1)
+ rv = 1;
+
+ return rv;
+}
+
+int jk_get_worker_recovery_opts(jk_map_t *m, const char *wname, int def)
+{
+ char buf[1024];
+
+ if (!m || !wname) {
+ return -1;
+ }
+
+ MAKE_WORKER_PARAM(RECOVERY_OPTS_OF_WORKER);
+
+ return jk_map_get_int(m, buf, def);
+}
+
+const char *jk_get_worker_secret_key(jk_map_t *m, const char *wname)
+{
+ char buf[1024];
+
+ if (!m || !wname) {
+ return NULL;
+ }
+
+ MAKE_WORKER_PARAM(SECRET_KEY_OF_WORKER);
+ return jk_map_get_string(m, buf, NULL);
+}
+
+int jk_get_worker_list(jk_map_t *m, char ***list, unsigned *num_of_workers)
+{
+ if (m && list && num_of_workers) {
+ char **ar = jk_map_get_string_list(m,
+ WORKER_LIST_PROPERTY_NAME,
+ num_of_workers,
+ DEFAULT_WORKER);
+ if (ar) {
+ *list = ar;
+ return JK_TRUE;
+ }
+ *list = NULL;
+ *num_of_workers = 0;
+ }
+
+ return JK_FALSE;
+}
+
+int jk_get_is_worker_disabled(jk_map_t *m, const char *wname)
+{
+ int rc = JK_TRUE;
+ char buf[1024];
+ if (m && wname) {
+ int value;
+ MAKE_WORKER_PARAM(IS_WORKER_DISABLED_DEPRECATED);
+ value = jk_map_get_bool(m, buf, 0);
+ if (!value)
+ rc = JK_FALSE;
+ }
+ return rc;
+}
+
+int jk_get_is_worker_stopped(jk_map_t *m, const char *wname)
+{
+ int rc = JK_TRUE;
+ char buf[1024];
+ if (m && wname) {
+ int value;
+ MAKE_WORKER_PARAM(IS_WORKER_STOPPED_DEPRECATED);
+ value = jk_map_get_bool(m, buf, 0);
+ if (!value)
+ rc = JK_FALSE;
+ }
+ return rc;
+}
+
+int jk_get_worker_activation(jk_map_t *m, const char *wname)
+{
+ char buf[1024];
+ const char *v;
+ if (!m || !wname) {
+ return JK_LB_ACTIVATION_ACTIVE;
+ }
+
+ MAKE_WORKER_PARAM(ACTIVATION_OF_WORKER);
+ v = jk_map_get_string(m, buf, NULL);
+ if (v) {
+ return jk_lb_get_activation_code(v);
+ }
+ else if (jk_get_is_worker_stopped(m, wname))
+ return JK_LB_ACTIVATION_STOPPED;
+ else if (jk_get_is_worker_disabled(m, wname))
+ return JK_LB_ACTIVATION_DISABLED;
+ else
+ return JK_LB_ACTIVATION_DEF;
+}
+
+int jk_get_lb_factor(jk_map_t *m, const char *wname)
+{
+ char buf[1024];
+
+ if (!m || !wname) {
+ return DEFAULT_LB_FACTOR;
+ }
+
+ MAKE_WORKER_PARAM(LOAD_FACTOR_OF_WORKER);
+
+ return jk_map_get_int(m, buf, DEFAULT_LB_FACTOR);
+}
+
+int jk_get_distance(jk_map_t *m, const char *wname)
+{
+ char buf[1024];
+
+ if (!m || !wname) {
+ return DEFAULT_DISTANCE;
+ }
+
+ MAKE_WORKER_PARAM(DISTANCE_OF_WORKER);
+
+ return jk_map_get_int(m, buf, DEFAULT_DISTANCE);
+}
+
+int jk_get_is_sticky_session(jk_map_t *m, const char *wname)
+{
+ int rc = JK_TRUE;
+ char buf[1024];
+ if (m && wname) {
+ int value;
+ MAKE_WORKER_PARAM(STICKY_SESSION);
+ value = jk_map_get_bool(m, buf, 1);
+ if (!value)
+ rc = JK_FALSE;
+ }
+ return rc;
+}
+
+int jk_get_is_sticky_session_force(jk_map_t *m, const char *wname)
+{
+ int rc = JK_FALSE;
+ char buf[1024];
+ if (m && wname) {
+ int value;
+ MAKE_WORKER_PARAM(STICKY_SESSION_FORCE);
+ value = jk_map_get_bool(m, buf, 0);
+ if (value)
+ rc = JK_TRUE;
+ }
+ return rc;
+}
+
+int jk_get_lb_method(jk_map_t *m, const char *wname)
+{
+ char buf[1024];
+ const char *v;
+ if (!m || !wname) {
+ return JK_LB_METHOD_DEF;
+ }
+
+ MAKE_WORKER_PARAM(METHOD_OF_WORKER);
+ v = jk_map_get_string(m, buf, NULL);
+ return jk_lb_get_method_code(v);
+}
+
+int jk_get_lb_lock(jk_map_t *m, const char *wname)
+{
+ char buf[1024];
+ const char *v;
+ if (!m || !wname) {
+ return JK_LB_LOCK_DEF;
+ }
+
+ MAKE_WORKER_PARAM(LOCK_OF_WORKER);
+ v = jk_map_get_string(m, buf, NULL);
+ return jk_lb_get_lock_code(v);
+}
+
+int jk_get_max_packet_size(jk_map_t *m, const char *wname)
+{
+ char buf[1024];
+ int sz;
+
+ if (!m || !wname) {
+ return DEF_BUFFER_SZ;
+ }
+
+ MAKE_WORKER_PARAM(WORKER_MAX_PACKET_SIZE);
+ sz = jk_map_get_int(m, buf, DEF_BUFFER_SZ);
+ sz = JK_ALIGN(sz, 1024);
+ if (sz < DEF_BUFFER_SZ)
+ sz = DEF_BUFFER_SZ;
+ else if (sz > 64*1024)
+ sz = 64*1024;
+
+ return sz;
+}
+
+int jk_get_worker_fail_on_status(jk_map_t *m, const char *wname,
+ int *list, unsigned int list_size)
+{
+ char buf[1024];
+ if (!m || !wname || !list) {
+ return 0;
+ }
+ MAKE_WORKER_PARAM(STATUS_FAIL_OF_WORKER);
+ if (list_size) {
+ return jk_map_get_int_list(m, buf,
+ list, list_size,
+ NULL);
+ }
+
+ return 0;
+}
+
+int jk_get_worker_user_case_insensitive(jk_map_t *m, const char *wname)
+{
+ int rc = JK_FALSE;
+ char buf[1024];
+ if (m && wname) {
+ int value;
+ MAKE_WORKER_PARAM(USER_CASE_OF_WORKER);
+ value = jk_map_get_bool(m, buf, 0);
+ if (value)
+ rc = JK_TRUE;
+ }
+ return rc;
+
+}
+
+const char *jk_get_worker_style_sheet(jk_map_t *m, const char *wname, const char *def)
+{
+ char buf[1024];
+
+ if (!m || !wname) {
+ return NULL;
+ }
+
+ MAKE_WORKER_PARAM(STYLE_SHEET_OF_WORKER);
+
+ return jk_map_get_string(m, buf, def);
+}
+
+const char *jk_get_worker_name_space(jk_map_t *m, const char *wname, const char *def)
+{
+ const char *rc;
+ char buf[1024];
+ if (!m || !wname) {
+ return NULL;
+ }
+ MAKE_WORKER_PARAM(NAMESPACE_OF_WORKER);
+ rc = jk_map_get_string(m, buf, def);
+ if (*rc == '-')
+ return "";
+ else
+ return rc;
+}
+
+const char *jk_get_worker_xmlns(jk_map_t *m, const char *wname, const char *def)
+{
+ const char *rc;
+ char buf[1024];
+ if (!m || !wname) {
+ return NULL;
+ }
+ MAKE_WORKER_PARAM(XML_NAMESPACE_OF_WORKER);
+ rc = jk_map_get_string(m, buf, def);
+ if (*rc == '-')
+ return "";
+ else
+ return rc;
+}
+
+const char *jk_get_worker_xml_doctype(jk_map_t *m, const char *wname, const char *def)
+{
+ char buf[1024];
+ if (!m || !wname) {
+ return NULL;
+ }
+ MAKE_WORKER_PARAM(XML_DOCTYPE_OF_WORKER);
+ return jk_map_get_string(m, buf, def);
+}
+
+const char *jk_get_worker_prop_prefix(jk_map_t *m, const char *wname, const char *def)
+{
+ char buf[1024];
+ if (!m || !wname) {
+ return NULL;
+ }
+ MAKE_WORKER_PARAM(PROP_PREFIX_OF_WORKER);
+ return jk_map_get_string(m, buf, def);
+}
+
+int jk_get_is_read_only(jk_map_t *m, const char *wname)
+{
+ int rc = JK_FALSE;
+ char buf[1024];
+ if (m && wname) {
+ int value;
+ MAKE_WORKER_PARAM(READ_ONLY_OF_WORKER);
+ value = jk_map_get_bool(m, buf, 0);
+ if (value)
+ rc = JK_TRUE;
+ }
+ return rc;
+}
+
+int jk_get_worker_user_list(jk_map_t *m,
+ const char *wname,
+ char ***list, unsigned int *num)
+{
+ char buf[1024];
+
+ if (m && list && num && wname) {
+ char **ar = NULL;
+
+ MAKE_WORKER_PARAM(USER_OF_WORKER);
+ ar = jk_map_get_string_list(m, buf, num, NULL);
+ if (ar) {
+ *list = ar;
+ return JK_TRUE;
+ }
+ *list = NULL;
+ *num = 0;
+ }
+
+ return JK_FALSE;
+}
+
+int jk_get_worker_good_rating(jk_map_t *m,
+ const char *wname,
+ char ***list, unsigned int *num)
+{
+ char buf[1024];
+
+ if (m && list && num && wname) {
+ char **ar = NULL;
+
+ MAKE_WORKER_PARAM(GOOD_RATING_OF_WORKER);
+ ar = jk_map_get_string_list(m, buf, num, NULL);
+ if (ar) {
+ *list = ar;
+ return JK_TRUE;
+ }
+ *list = NULL;
+ *num = 0;
+ }
+
+ return JK_FALSE;
+}
+
+int jk_get_worker_bad_rating(jk_map_t *m,
+ const char *wname,
+ char ***list, unsigned int *num)
+{
+ char buf[1024];
+
+ if (m && list && num && wname) {
+ char **ar = NULL;
+
+ MAKE_WORKER_PARAM(BAD_RATING_OF_WORKER);
+ ar = jk_map_get_string_list(m, buf, num, NULL);
+ if (ar) {
+ *list = ar;
+ return JK_TRUE;
+ }
+ *list = NULL;
+ *num = 0;
+ }
+
+ return JK_FALSE;
+}
+
+int jk_get_lb_worker_list(jk_map_t *m,
+ const char *wname,
+ char ***list, unsigned int *num_of_workers)
+{
+ char buf[1024];
+
+ if (m && list && num_of_workers && wname) {
+ char **ar = NULL;
+
+ MAKE_WORKER_PARAM(BALANCE_WORKERS);
+ ar = jk_map_get_string_list(m, buf, num_of_workers, NULL);
+ if (ar) {
+ *list = ar;
+ return JK_TRUE;
+ }
+ /* Try old balanced_workers directive */
+ MAKE_WORKER_PARAM(BALANCED_WORKERS_DEPRECATED);
+ ar = jk_map_get_string_list(m, buf, num_of_workers, NULL);
+ if (ar) {
+ *list = ar;
+ return JK_TRUE;
+ }
+ *list = NULL;
+ *num_of_workers = 0;
+ }
+
+ return JK_FALSE;
+}
+
+int jk_get_worker_mount_list(jk_map_t *m,
+ const char *wname,
+ char ***list, unsigned int *num_of_maps)
+{
+ char buf[1024];
+
+ if (m && list && num_of_maps && wname) {
+ char **ar = NULL;
+
+ MAKE_WORKER_PARAM(MOUNT_OF_WORKER);
+ ar = jk_map_get_string_list(m, buf, num_of_maps, NULL);
+ if (ar) {
+ *list = ar;
+ return JK_TRUE;
+ }
+ *list = NULL;
+ *num_of_maps = 0;
+ }
+
+ return JK_FALSE;
+}
+
+int jk_get_worker_maintain_time(jk_map_t *m)
+{
+ return jk_map_get_int(m, WORKER_MAINTAIN_PROPERTY_NAME,
+ DEFAULT_MAINTAIN_TIME);
+}
+
+int jk_get_worker_mx(jk_map_t *m, const char *wname, unsigned *mx)
+{
+ char buf[1024];
+
+ if (m && mx && wname) {
+ int i;
+ MAKE_WORKER_PARAM(MX_OF_WORKER);
+
+ i = jk_map_get_int(m, buf, -1);
+ if (-1 != i) {
+ *mx = (unsigned)i;
+ return JK_TRUE;
+ }
+ }
+
+ return JK_FALSE;
+}
+
+int jk_get_worker_ms(jk_map_t *m, const char *wname, unsigned *ms)
+{
+ char buf[1024];
+
+ if (m && ms && wname) {
+ int i;
+ MAKE_WORKER_PARAM(MS_OF_WORKER);
+
+ i = jk_map_get_int(m, buf, -1);
+ if (-1 != i) {
+ *ms = (unsigned)i;
+ return JK_TRUE;
+ }
+ }
+
+ return JK_FALSE;
+}
+
+int jk_get_worker_classpath(jk_map_t *m, const char *wname, const char **cp)
+{
+ char buf[1024];
+
+ if (m && cp && wname) {
+ MAKE_WORKER_PARAM(CP_OF_WORKER);
+
+ *cp = jk_map_get_string(m, buf, NULL);
+ if (*cp) {
+ return JK_TRUE;
+ }
+ }
+
+ return JK_FALSE;
+}
+
+int jk_get_worker_bridge_type(jk_map_t *m, const char *wname, unsigned *bt)
+{
+ char buf[1024];
+ const char *type;
+
+ if (m && bt && wname) {
+ MAKE_WORKER_PARAM(BRIDGE_OF_WORKER);
+
+ type = jk_map_get_string(m, buf, NULL);
+
+ if (type) {
+ if (!strcasecmp(type, TOMCAT32_BRIDGE_NAME))
+ *bt = TC32_BRIDGE_TYPE;
+ else if (!strcasecmp(type, TOMCAT33_BRIDGE_NAME))
+ *bt = TC33_BRIDGE_TYPE;
+ else if (!strcasecmp(type, TOMCAT40_BRIDGE_NAME))
+ *bt = TC40_BRIDGE_TYPE;
+ else if (!strcasecmp(type, TOMCAT41_BRIDGE_NAME))
+ *bt = TC41_BRIDGE_TYPE;
+ else if (!strcasecmp(type, TOMCAT50_BRIDGE_NAME))
+ *bt = TC50_BRIDGE_TYPE;
+
+ return JK_TRUE;
+ }
+ }
+
+ return JK_FALSE;
+}
+
+int jk_get_worker_jvm_path(jk_map_t *m, const char *wname, const char **vm_path)
+{
+ char buf[1024];
+
+ if (m && vm_path && wname) {
+ MAKE_WORKER_PARAM(JVM_OF_WORKER);
+
+ *vm_path = jk_map_get_string(m, buf, NULL);
+ if (*vm_path) {
+ return JK_TRUE;
+ }
+ }
+
+ return JK_FALSE;
+}
+
+/* [V] This is unused. currently. */
+int jk_get_worker_callback_dll(jk_map_t *m, const char *wname, const char **cb_path)
+{
+ char buf[1024];
+
+ if (m && cb_path && wname) {
+ MAKE_WORKER_PARAM(NATIVE_LIB_OF_WORKER);
+
+ *cb_path = jk_map_get_string(m, buf, NULL);
+ if (*cb_path) {
+ return JK_TRUE;
+ }
+ }
+
+ return JK_FALSE;
+}
+
+int jk_get_worker_cmd_line(jk_map_t *m, const char *wname, const char **cmd_line)
+{
+ char buf[1024];
+
+ if (m && cmd_line && wname) {
+ MAKE_WORKER_PARAM(CMD_LINE_OF_WORKER);
+
+ *cmd_line = jk_map_get_string(m, buf, NULL);
+ if (*cmd_line) {
+ return JK_TRUE;
+ }
+ }
+
+ return JK_FALSE;
+}
+
+
+int jk_stat(const char *f, struct stat * statbuf)
+{
+ int rc;
+/**
+ * i5/OS V5R4 expect filename in ASCII for fopen but required them in EBCDIC for stat()
+ */
+#ifdef AS400_UTF8
+ char *ptr;
+
+ ptr = (char *)malloc(strlen(f) + 1);
+ jk_ascii2ebcdic((char *)f, ptr);
+ rc = stat(ptr, statbuf);
+ free(ptr);
+#else
+ rc = stat(f, statbuf);
+#endif
+
+ return (rc);
+}
+
+
+int jk_file_exists(const char *f)
+{
+ if (f) {
+ struct stat st;
+
+ if ((0 == jk_stat(f, &st)) && (st.st_mode & S_IFREG))
+ return JK_TRUE;
+ }
+
+ return JK_FALSE;
+}
+
+static int jk_is_some_property(const char *prp_name, const char *suffix, const char *sep)
+{
+ char buf[1024];
+
+ if (prp_name && suffix) {
+ size_t prp_name_len;
+ size_t suffix_len;
+ strcpy(buf, sep);
+ strcat(buf, suffix);
+ prp_name_len = strlen(prp_name);
+ suffix_len = strlen(buf);
+ if (prp_name_len >= suffix_len) {
+ const char *prp_suffix = prp_name + prp_name_len - suffix_len;
+ if (0 == strcmp(buf, prp_suffix)) {
+ return JK_TRUE;
+ }
+ }
+ }
+
+ return JK_FALSE;
+}
+
+int jk_is_path_property(const char *prp_name)
+{
+ return jk_is_some_property(prp_name, "path", "_");
+}
+
+int jk_is_cmd_line_property(const char *prp_name)
+{
+ return jk_is_some_property(prp_name, CMD_LINE_OF_WORKER, ".");
+}
+
+int jk_is_list_property(const char *prp_name)
+{
+ const char **props = &list_properties[0];
+ while (*props) {
+ if (jk_is_some_property(prp_name, *props, "."))
+ return JK_TRUE;
+ props++;
+ }
+ return JK_FALSE;
+}
+
+int jk_is_unique_property(const char *prp_name)
+{
+ const char **props = &unique_properties[0];
+ while (*props) {
+ if (jk_is_some_property(prp_name, *props, "."))
+ return JK_TRUE;
+ props++;
+ }
+ return JK_FALSE;
+}
+
+int jk_is_deprecated_property(const char *prp_name)
+{
+ const char **props = &deprecated_properties[0];
+ while (*props) {
+ if (jk_is_some_property(prp_name, *props, "."))
+ return JK_TRUE;
+ props++;
+ }
+ return JK_FALSE;
+}
+/*
+ * Check that property is a valid one (to prevent user typos).
+ * Only property starting with worker.
+ */
+int jk_is_valid_property(const char *prp_name)
+{
+ const char **props;
+ if (memcmp(prp_name, "worker.", 7))
+ return JK_TRUE;
+
+ props = &supported_properties[0];
+ while (*props) {
+ if (jk_is_some_property(prp_name, *props, "."))
+ return JK_TRUE;
+ props++;
+ }
+ return JK_FALSE;
+}
+
+int jk_get_worker_stdout(jk_map_t *m, const char *wname, const char **stdout_name)
+{
+ char buf[1024];
+
+ if (m && stdout_name && wname) {
+ MAKE_WORKER_PARAM(STDOUT_OF_WORKER);
+
+ *stdout_name = jk_map_get_string(m, buf, NULL);
+ if (*stdout_name) {
+ return JK_TRUE;
+ }
+ }
+
+ return JK_FALSE;
+}
+
+int jk_get_worker_stderr(jk_map_t *m, const char *wname, const char **stderr_name)
+{
+ char buf[1024];
+
+ if (m && stderr_name && wname) {
+ MAKE_WORKER_PARAM(STDERR_OF_WORKER);
+
+ *stderr_name = jk_map_get_string(m, buf, NULL);
+ if (*stderr_name) {
+ return JK_TRUE;
+ }
+ }
+
+ return JK_FALSE;
+}
+
+int jk_get_worker_sysprops(jk_map_t *m, const char *wname, const char **sysprops)
+{
+ char buf[1024];
+
+ if (m && sysprops && wname) {
+ MAKE_WORKER_PARAM(SYSPROPS_OF_WORKER);
+
+ *sysprops = jk_map_get_string(m, buf, NULL);
+ if (*sysprops) {
+ return JK_TRUE;
+ }
+ }
+
+ return JK_FALSE;
+}
+
+int jk_get_worker_libpath(jk_map_t *m, const char *wname, const char **libpath)
+{
+ char buf[1024];
+
+ if (m && libpath && wname) {
+ MAKE_WORKER_PARAM(LIBPATH_OF_WORKER);
+
+ *libpath = jk_map_get_string(m, buf, NULL);
+ if (*libpath) {
+ return JK_TRUE;
+ }
+ }
+
+ return JK_FALSE;
+}
+
+const char *jk_get_lb_session_cookie(jk_map_t *m, const char *wname, const char *def)
+{
+ char buf[1024];
+ if (!m || !wname) {
+ return NULL;
+ }
+ MAKE_WORKER_PARAM(SESSION_COOKIE_OF_WORKER);
+ return jk_map_get_string(m, buf, def);
+}
+
+const char *jk_get_lb_session_path(jk_map_t *m, const char *wname, const char *def)
+{
+ char buf[1024];
+ if (!m || !wname) {
+ return NULL;
+ }
+ MAKE_WORKER_PARAM(SESSION_PATH_OF_WORKER);
+ return jk_map_get_string(m, buf, def);
+}
+
+
+int is_http_status_fail(unsigned int http_status_fail_num,
+ int *http_status_fail, int status)
+{
+ unsigned int i;
+ int soft_status = -1 * status;
+ for (i = 0; i < http_status_fail_num; i++) {
+ if (http_status_fail[i] == status)
+ return 1;
+ else if (http_status_fail[i] == soft_status)
+ return -1;
+ }
+ return 0;
+}
+
+char **jk_parse_sysprops(jk_pool_t *p, const char *sysprops)
+{
+ char **rc = NULL;
+#ifdef _MT_CODE_PTHREAD
+ char *lasts;
+#endif
+
+ if (p && sysprops) {
+ char *prps = jk_pool_strdup(p, sysprops);
+ if (prps && strlen(prps)) {
+ unsigned num_of_prps;
+
+ for (num_of_prps = 1; *sysprops; sysprops++) {
+ if ('*' == *sysprops) {
+ num_of_prps++;
+ }
+ }
+
+ rc = jk_pool_alloc(p, (num_of_prps + 1) * sizeof(char *));
+ if (rc) {
+ unsigned i = 0;
+#ifdef _MT_CODE_PTHREAD
+ char *tmp = strtok_r(prps, "*", &lasts);
+#else
+ char *tmp = strtok(prps, "*");
+#endif
+
+ while (tmp && i < num_of_prps) {
+ rc[i] = tmp;
+#ifdef _MT_CODE_PTHREAD
+ tmp = strtok_r(NULL, "*", &lasts);
+#else
+ tmp = strtok(NULL, "*");
+#endif
+ i++;
+ }
+ rc[i] = NULL;
+ }
+ }
+ }
+
+ return rc;
+}
+
+void jk_append_libpath(jk_pool_t *p, const char *libpath)
+{
+ char *env = NULL;
+ char *current = getenv(PATH_ENV_VARIABLE);
+
+ if (current) {
+ env = jk_pool_alloc(p, strlen(PATH_ENV_VARIABLE) +
+ strlen(current) + strlen(libpath) + 5);
+ if (env) {
+ sprintf(env, "%s=%s%c%s",
+ PATH_ENV_VARIABLE, libpath, PATH_SEPERATOR, current);
+ }
+ }
+ else {
+ env = jk_pool_alloc(p, strlen(PATH_ENV_VARIABLE) +
+ strlen(libpath) + 5);
+ if (env) {
+ sprintf(env, "%s=%s", PATH_ENV_VARIABLE, libpath);
+ }
+ }
+
+ if (env) {
+ putenv(env);
+ }
+}
+
+void jk_init_ws_service(jk_ws_service_t *s)
+{
+ s->ws_private = NULL;
+ s->pool = NULL;
+ s->method = NULL;
+ s->protocol = NULL;
+ s->req_uri = NULL;
+ s->remote_addr = NULL;
+ s->remote_port = NULL;
+ s->remote_host = NULL;
+ s->remote_user = NULL;
+ s->auth_type = NULL;
+ s->query_string = NULL;
+ s->server_name = NULL;
+ s->server_port = 80;
+ s->server_software = NULL;
+ s->content_length = 0;
+ s->is_chunked = 0;
+ s->no_more_chunks = 0;
+ s->content_read = 0;
+ s->is_ssl = JK_FALSE;
+ s->ssl_cert = NULL;
+ s->ssl_cert_len = 0;
+ s->ssl_cipher = NULL;
+ s->ssl_session = NULL;
+ s->ssl_key_size = -1;
+ s->headers_names = NULL;
+ s->headers_values = NULL;
+ s->num_headers = 0;
+ s->attributes_names = NULL;
+ s->attributes_values = NULL;
+ s->num_attributes = 0;
+ s->route = NULL;
+ s->activation = JK_LB_ACTIVATION_ACTIVE;
+ s->secret = NULL;
+ s->reco_buf = NULL;
+ s->reco_status = RECO_NONE;
+ s->flush_packets = JK_FALSE;
+ s->flush_header = JK_FALSE;
+ s->extension.reply_timeout = -1;
+ s->extension.use_server_error_pages = 0;
+ s->extension.activation = NULL;
+ s->extension.fail_on_status_size = 0;
+ s->extension.fail_on_status = NULL;
+ s->response_started = JK_FALSE;
+ s->response_blocked = JK_FALSE;
+ s->http_response_status = JK_HTTP_OK;
+ s->uw_map = NULL;
+ s->start_response = NULL;
+ s->read = NULL;
+ s->write = NULL;
+ s->flush = NULL;
+ s->done = NULL;
+ s->disable_reuse = JK_FALSE;
+ s->add_log_items = NULL;
+ s->next_vhost = NULL;
+ s->vhost_to_text = NULL;
+ s->vhost_to_uw_map = NULL;
+}
+
+/* Match = 0, NoMatch = 1, Abort = -1
+ * Based loosely on sections of wildmat.c by Rich Salz
+ */
+int jk_wildchar_match(const char *str, const char *exp, int icase)
+{
+ int x, y;
+
+ for (x = 0, y = 0; exp[y]; ++y, ++x) {
+ if (!str[x] && exp[y] != '*')
+ return -1;
+ if (exp[y] == '*') {
+ while (exp[++y] == '*');
+ if (!exp[y])
+ return 0;
+ while (str[x]) {
+ int ret;
+ if ((ret = jk_wildchar_match(&str[x++], &exp[y], icase)) != 1)
+ return ret;
+ }
+ return -1;
+ }
+ else if (exp[y] != '?') {
+ if (icase && (tolower(str[x]) != tolower(exp[y])))
+ return 1;
+ else if (!icase && str[x] != exp[y])
+ return 1;
+ }
+ }
+ return (str[x] != '\0');
+}
+
+#ifdef _MT_CODE_PTHREAD
+jk_pthread_t jk_gettid()
+{
+ union {
+ pthread_t tid;
+ jk_uint64_t alignme;
+ } u;
+#ifdef AS400
+ /* OS400 use 64 bits ThreadId */
+ pthread_id_np_t tid;
+#endif /* AS400 */
+ u.tid = pthread_self();
+#ifdef AS400
+ /* Get only low 32 bits for now */
+ pthread_getunique_np(&(u.tid), &tid);
+ return ((jk_uint32_t)(tid.intId.lo & 0xFFFFFFFF));
+#else
+ return ((jk_pthread_t)u.tid);
+#endif /* AS400 */
+}
+#endif
+
+/***
+ * ASCII <-> EBCDIC conversions
+ *
+ * For now usefull only in i5/OS V5R4 where UTF and EBCDIC mode are mixed
+ */
+
+#ifdef AS400_UTF8
+
+/* EBCDIC to ASCII translation table */
+static u_char ebcdic_to_ascii[256] =
+{
+ 0x00,0x01,0x02,0x03,0x20,0x09,0x20,0x7f, /* 00-07 */
+ 0x20,0x20,0x20,0x0b,0x0c,0x0d,0x0e,0x0f, /* 08-0f */
+ 0x10,0x11,0x12,0x13,0x20,0x0a,0x08,0x20, /* 10-17 */
+ 0x18,0x19,0x20,0x20,0x20,0x1d,0x1e,0x1f, /* 18-1f */
+ 0x20,0x20,0x1c,0x20,0x20,0x0a,0x17,0x1b, /* 20-27 */
+ 0x20,0x20,0x20,0x20,0x20,0x05,0x06,0x07, /* 28-2f */
+ 0x20,0x20,0x16,0x20,0x20,0x20,0x20,0x04, /* 30-37 */
+ 0x20,0x20,0x20,0x20,0x14,0x15,0x20,0x1a, /* 38-3f */
+ 0x20,0x20,0x83,0x84,0x85,0xa0,0xc6,0x86, /* 40-47 */
+ 0x87,0xa4,0xbd,0x2e,0x3c,0x28,0x2b,0x7c, /* 48-4f */
+ 0x26,0x82,0x88,0x89,0x8a,0xa1,0x8c,0x8b, /* 50-57 */
+ 0x8d,0xe1,0x21,0x24,0x2a,0x29,0x3b,0xaa, /* 58-5f */
+ 0x2d,0x2f,0xb6,0x8e,0xb7,0xb5,0xc7,0x8f, /* 60-67 */
+ 0x80,0xa5,0xdd,0x2c,0x25,0x5f,0x3e,0x3f, /* 68-6f */
+ 0x9b,0x90,0xd2,0xd3,0xd4,0xd6,0xd7,0xd8, /* 70-77 */
+ 0xde,0x60,0x3a,0x23,0x40,0x27,0x3d,0x22, /* 78-7f */
+ 0x9d,0x61,0x62,0x63,0x64,0x65,0x66,0x67, /* 80-87 */
+ 0x68,0x69,0xae,0xaf,0xd0,0xec,0xe7,0xf1, /* 88-8f */
+ 0xf8,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,0x70, /* 90-97 */
+ 0x71,0x72,0xa6,0xa7,0x91,0xf7,0x92,0xcf, /* 98-9f */
+ 0xe6,0x7e,0x73,0x74,0x75,0x76,0x77,0x78, /* a8-a7 */
+ 0x79,0x7a,0xad,0xa8,0xd1,0xed,0xe8,0xa9, /* a8-af */
+ 0x5e,0x9c,0xbe,0xfa,0xb8,0x15,0x14,0xac, /* b0-b7 */
+ 0xab,0xf3,0x5b,0x5d,0xee,0xf9,0xef,0x9e, /* b8-bf */
+ 0x7b,0x41,0x42,0x43,0x44,0x45,0x46,0x47, /* c0-c7 */
+ 0x48,0x49,0xf0,0x93,0x94,0x95,0xa2,0xe4, /* c8-cf */
+ 0x7d,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50, /* d0-d7 */
+ 0x51,0x52,0xfb,0x96,0x81,0x97,0xa3,0x98, /* d8-df */
+ 0x5c,0xf6,0x53,0x54,0x55,0x56,0x57,0x58, /* e0-e7 */
+ 0x59,0x5a,0xfc,0xe2,0x99,0xe3,0xe0,0xe5, /* e8-ef */
+ 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, /* f0-f7 */
+ 0x38,0x39,0xfd,0xea,0x9a,0xeb,0xe9,0xff /* f8-ff */
+};
+
+/* ASCII to EBCDIC translation table */
+static u_char ascii_to_ebcdic[256] =
+{
+ 0x00,0x01,0x02,0x03,0x37,0x2d,0x2e,0x2f, /* 00-07 */
+ 0x16,0x05,0x25,0x0b,0x0c,0x0d,0x0e,0x0f, /* 08-0f */
+ 0x10,0x11,0x12,0x13,0x3c,0x3d,0x32,0x26, /* 10-17 */
+ 0x18,0x19,0x3f,0x27,0x22,0x1d,0x1e,0x1f, /* 18-1f */
+ 0x40,0x5a,0x7f,0x7b,0x5b,0x6c,0x50,0x7d, /* 20-27 */
+ 0x4d,0x5d,0x5c,0x4e,0x6b,0x60,0x4b,0x61, /* 28-2f */
+ 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7, /* 30-37 */
+ 0xf8,0xf9,0x7a,0x5e,0x4c,0x7e,0x6e,0x6f, /* 38-3f */
+ 0x7c,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7, /* 40-47 */
+ 0xc8,0xc9,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6, /* 48-4f */
+ 0xd7,0xd8,0xd9,0xe2,0xe3,0xe4,0xe5,0xe6, /* 50-57 */
+ 0xe7,0xe8,0xe9,0xba,0xe0,0xbb,0xb0,0x6d, /* 58-5f */
+ 0x79,0x81,0x82,0x83,0x84,0x85,0x86,0x87, /* 60-67 */
+ 0x88,0x89,0x91,0x92,0x93,0x94,0x95,0x96, /* 68-6f */
+ 0x97,0x98,0x99,0xa2,0xa3,0xa4,0xa5,0xa6, /* 70-77 */
+ 0xa7,0xa8,0xa9,0xc0,0x4f,0xd0,0xa1,0x07, /* 78-7f */
+ 0x68,0xdc,0x51,0x42,0x43,0x44,0x47,0x48, /* 80-87 */
+ 0x52,0x53,0x54,0x57,0x56,0x58,0x63,0x67, /* 88-8f */
+ 0x71,0x9c,0x9e,0xcb,0xcc,0xcd,0xdb,0xdd, /* 90-97 */
+ 0xdf,0xec,0xfc,0x70,0xb1,0x80,0xbf,0x40, /* 98-9f */
+ 0x45,0x55,0xee,0xde,0x49,0x69,0x9a,0x9b, /* a8-a7 */
+ 0xab,0xaf,0x5f,0xb8,0xb7,0xaa,0x8a,0x8b, /* a8-af */
+ 0x40,0x40,0x40,0x40,0x40,0x65,0x62,0x64, /* b0-b7 */
+ 0xb4,0x40,0x40,0x40,0x40,0x4a,0xb2,0x40, /* b8-bf */
+ 0x40,0x40,0x40,0x40,0x40,0x40,0x46,0x66, /* c0-c7 */
+ 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x9f, /* c8-cf */
+ 0x8c,0xac,0x72,0x73,0x74,0x89,0x75,0x76, /* d0-d7 */
+ 0x77,0x40,0x40,0x40,0x40,0x6a,0x78,0x40, /* d8-df */
+ 0xee,0x59,0xeb,0xed,0xcf,0xef,0xa0,0x8e, /* e0-e7 */
+ 0xae,0xfe,0xfb,0xfd,0x8d,0xad,0xbc,0xbe, /* e8-ef */
+ 0xca,0x8f,0x40,0xb9,0xb6,0xb5,0xe1,0x9d, /* f0-f7 */
+ 0x90,0xbd,0xb3,0xda,0xea,0xfa,0x40,0x40 /* f8-ff */
+};
+
+void jk_ascii2ebcdic(char *src, char *dst) {
+ char c;
+
+ while ((c = *src++) != 0) {
+ *dst++ = ascii_to_ebcdic[(unsigned int)c];
+ }
+
+ *dst = 0;
+}
+
+void jk_ebcdic2ascii(char *src, char *dst) {
+ char c;
+
+ while ((c = *src++) != 0) {
+ *dst++ = ebcdic_to_ascii[(unsigned int)c];
+ }
+
+ *dst = 0;
+}
+
+#endif
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_util.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_util.h
new file mode 100644
index 00000000..b76d0283
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_util.h
@@ -0,0 +1,269 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: Various utility functions *
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Author: Henri Gomez <hgomez@apache.org> *
+ * Author: Rainer Jung <rjung@apache.org> *
+ * Version: $Revision: 751914 $ *
+ ***************************************************************************/
+#ifndef _JK_UTIL_H
+#define _JK_UTIL_H
+
+#include "jk_global.h"
+#include "jk_logger.h"
+#include "jk_map.h"
+#include "jk_pool.h"
+#include "jk_service.h"
+
+#define JK_SLEEP_DEF (100)
+
+const char *jk_get_bool(int v);
+
+int jk_get_bool_code(const char *v, int def);
+
+void jk_sleep(int ms);
+
+void jk_set_time_fmt(jk_logger_t *l, const char *jk_log_fmt);
+
+int jk_parse_log_level(const char *level);
+
+int jk_open_file_logger(jk_logger_t **l, const char *file, int level);
+
+int jk_attach_file_logger(jk_logger_t **l, int fd, int level);
+
+int jk_close_file_logger(jk_logger_t **l);
+
+int jk_log(jk_logger_t *l,
+ const char *file, int line, const char *funcname, int level,
+ const char *fmt, ...);
+
+/* [V] Two general purpose functions. Should ease the function bloat. */
+int jk_get_worker_str_prop(jk_map_t *m,
+ const char *wname, const char *pname, const char **prop);
+
+int jk_get_worker_int_prop(jk_map_t *m,
+ const char *wname, const char *pname, int *prop);
+
+const char *jk_get_worker_host(jk_map_t *m, const char *wname, const char *def);
+
+const char *jk_get_worker_type(jk_map_t *m, const char *wname);
+
+int jk_get_worker_port(jk_map_t *m, const char *wname, int def);
+
+int jk_get_worker_cache_size(jk_map_t *m, const char *wname, int def);
+
+int jk_get_worker_cache_size_min(jk_map_t *m, const char *wname, int def);
+
+int jk_get_worker_cache_acquire_timeout(jk_map_t *m, const char *wname, int def);
+
+int jk_get_worker_socket_timeout(jk_map_t *m, const char *wname, int def);
+
+int jk_get_worker_socket_connect_timeout(jk_map_t *m, const char *wname, int def);
+
+int jk_get_worker_socket_buffer(jk_map_t *m, const char *wname, int def);
+
+int jk_get_worker_socket_keepalive(jk_map_t *m, const char *wname, int def);
+
+int jk_get_worker_conn_ping_interval(jk_map_t *m, const char *wname, int def);
+
+int jk_get_worker_cache_timeout(jk_map_t *m, const char *wname, int def);
+
+int jk_get_worker_recovery_opts(jk_map_t *m, const char *wname, int def);
+
+int jk_get_worker_connect_timeout(jk_map_t *m, const char *wname, int def);
+
+int jk_get_worker_reply_timeout(jk_map_t *m, const char *wname, int def);
+
+int jk_get_worker_prepost_timeout(jk_map_t *m, const char *wname, int def);
+
+int jk_get_worker_ping_timeout(jk_map_t *m, const char *wname, int def);
+
+int jk_get_worker_ping_mode(jk_map_t *m, const char *wname, int def);
+
+int jk_get_worker_recycle_timeout(jk_map_t *m, const char *wname, int def);
+
+int jk_get_worker_recover_timeout(jk_map_t *m, const char *wname, int def);
+
+int jk_get_worker_error_escalation_time(jk_map_t *m, const char *wname, int def);
+
+int jk_get_worker_max_reply_timeouts(jk_map_t *m, const char *wname, int def);
+
+int jk_get_worker_retry_interval(jk_map_t *m, const char *wname, int def);
+
+const char *jk_get_worker_route(jk_map_t *m, const char *wname, const char *def);
+
+const char *jk_get_worker_domain(jk_map_t *m, const char *wname, const char *def);
+
+const char *jk_get_worker_redirect(jk_map_t *m, const char *wname, const char *def);
+
+const char *jk_get_worker_secret_key(jk_map_t *m, const char *wname);
+
+const char *jk_get_lb_session_cookie(jk_map_t *m, const char *wname, const char *def);
+
+const char *jk_get_lb_session_path(jk_map_t *m, const char *wname, const char *def);
+
+int jk_get_worker_retries(jk_map_t *m, const char *wname, int def);
+
+int jk_get_is_worker_disabled(jk_map_t *m, const char *wname);
+
+int jk_get_is_worker_stopped(jk_map_t *m, const char *wname);
+
+int jk_get_worker_activation(jk_map_t *m, const char *wname);
+
+int jk_get_worker_list(jk_map_t *m, char ***list, unsigned *num_of_workers);
+
+int jk_get_lb_factor(jk_map_t *m, const char *wname);
+
+int jk_get_distance(jk_map_t *m, const char *wname);
+
+int jk_get_is_sticky_session(jk_map_t *m, const char *wname);
+
+int jk_get_is_sticky_session_force(jk_map_t *m, const char *wname);
+
+int jk_get_lb_method(jk_map_t *m, const char *wname);
+
+int jk_get_lb_lock(jk_map_t *m, const char *wname);
+
+int jk_get_lb_worker_list(jk_map_t *m,
+ const char *lb_wname,
+ char ***list, unsigned int *num_of_workers);
+int jk_get_worker_mount_list(jk_map_t *m,
+ const char *wname,
+ char ***list, unsigned int *num_of_maps);
+const char *jk_get_worker_secret(jk_map_t *m, const char *wname);
+
+int jk_get_worker_mx(jk_map_t *m, const char *wname, unsigned *mx);
+
+int jk_get_worker_ms(jk_map_t *m, const char *wname, unsigned *ms);
+
+int jk_get_worker_classpath(jk_map_t *m, const char *wname, const char **cp);
+
+
+int jk_get_worker_bridge_type(jk_map_t *m, const char *wname, unsigned *bt);
+
+int jk_get_worker_jvm_path(jk_map_t *m, const char *wname, const char **vm_path);
+
+int jk_get_worker_callback_dll(jk_map_t *m,
+ const char *wname, const char **cb_path);
+
+int jk_get_worker_cmd_line(jk_map_t *m, const char *wname, const char **cmd_line);
+
+int jk_file_exists(const char *f);
+
+int jk_is_list_property(const char *prp_name);
+
+int jk_is_path_property(const char *prp_name);
+
+int jk_is_cmd_line_property(const char *prp_name);
+
+int jk_is_unique_property(const char *prp_name);
+
+int jk_is_deprecated_property(const char *prp_name);
+
+int jk_is_valid_property(const char *prp_name);
+
+int jk_get_worker_stdout(jk_map_t *m, const char *wname, const char **stdout_name);
+
+int jk_get_worker_stderr(jk_map_t *m, const char *wname, const char **stderr_name);
+
+int jk_get_worker_sysprops(jk_map_t *m, const char *wname, const char **sysprops);
+
+int jk_get_worker_libpath(jk_map_t *m, const char *wname, const char **libpath);
+
+char **jk_parse_sysprops(jk_pool_t *p, const char *sysprops);
+
+
+void jk_append_libpath(jk_pool_t *p, const char *libpath);
+
+void jk_set_worker_def_cache_size(int sz);
+
+int jk_get_worker_def_cache_size(int protocol);
+
+int jk_get_worker_maintain_time(jk_map_t *m);
+
+int jk_get_max_packet_size(jk_map_t *m, const char *wname);
+
+const char *jk_get_worker_style_sheet(jk_map_t *m, const char *wname, const char *def);
+
+int jk_get_is_read_only(jk_map_t *m, const char *wname);
+
+int jk_get_worker_user_list(jk_map_t *m,
+ const char *wname,
+ char ***list, unsigned int *num);
+
+int jk_get_worker_good_rating(jk_map_t *m,
+ const char *wname,
+ char ***list, unsigned int *num);
+
+int jk_get_worker_bad_rating(jk_map_t *m,
+ const char *wname,
+ char ***list, unsigned int *num);
+
+const char *jk_get_worker_name_space(jk_map_t *m, const char *wname, const char *def);
+
+const char *jk_get_worker_xmlns(jk_map_t *m, const char *wname, const char *def);
+
+const char *jk_get_worker_xml_doctype(jk_map_t *m, const char *wname, const char *def);
+
+const char *jk_get_worker_prop_prefix(jk_map_t *m, const char *wname, const char *def);
+
+int jk_get_worker_fail_on_status(jk_map_t *m, const char *wname,
+ int *list, unsigned int list_size);
+
+int jk_get_worker_user_case_insensitive(jk_map_t *m, const char *wname);
+
+int is_http_status_fail(unsigned int http_status_fail_num,
+ int *http_status_fail, int status);
+
+int jk_wildchar_match(const char *str, const char *exp, int icase);
+
+#define TC32_BRIDGE_TYPE 32
+#define TC33_BRIDGE_TYPE 33
+#define TC40_BRIDGE_TYPE 40
+#define TC41_BRIDGE_TYPE 41
+#define TC50_BRIDGE_TYPE 50
+
+#ifdef AS400
+
+#define S_IFREG _S_IFREG
+
+#ifdef AS400_UTF8
+
+void jk_ascii2ebcdic(char *src, char *dst);
+void jk_ebcdic2ascii(char *src, char *dst);
+
+#endif /* AS400_UTF8 */
+
+#endif
+
+/* i5/OS V5R4 need ASCII-EBCDIC conversion before stat() call */
+/* added a stat() mapper function, jk_stat, for such purpose */
+
+int jk_stat(const char *f, struct stat * statbuf);
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* _JK_UTIL_H */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_util.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_util.lo
new file mode 100644
index 00000000..a7acb278
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_util.lo
@@ -0,0 +1,12 @@
+# jk_util.lo - a libtool object file
+# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18)
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/jk_util.o'
+
+# Name of the non-PIC object.
+non_pic_object='jk_util.o'
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_util.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_util.o
new file mode 100644
index 00000000..5d343b71
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_util.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_version.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_version.h
new file mode 100644
index 00000000..9cbba921
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_version.h
@@ -0,0 +1,96 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: JK version header file *
+ * Version: $Revision: 1141394 $ *
+ ***************************************************************************/
+
+#ifndef __JK_VERSION_H
+#define __JK_VERSION_H
+
+/************** START OF AREA TO MODIFY BEFORE RELEASING *************/
+#define JK_VERMAJOR 1
+#define JK_VERMINOR 2
+#define JK_VERFIX 32
+
+/* set JK_VERISRELEASE to 1 when release (do not forget to commit!) */
+#define JK_VERISRELEASE 1
+/* Beta number */
+#define JK_VERBETA 0
+#define JK_BETASTRING "0"
+/* Release candidate */
+#define JK_VERRC 0
+#define JK_RCSTRING "0"
+/* Source Control Revision as a suffix, e.g. "-r12345" */
+#define JK_REVISION " ()"
+
+/************** END OF AREA TO MODIFY BEFORE RELEASING *************/
+
+#if !defined(PACKAGE)
+#if defined(JK_ISAPI)
+#define PACKAGE "isapi_redirector"
+#define JK_DLL_SUFFIX "dll"
+#elif defined(JK_NSAPI)
+#define PACKAGE "nsapi_redirector"
+#define JK_DLL_SUFFIX "dll"
+#else
+#define PACKAGE "mod_jk"
+#define JK_DLL_SUFFIX "so"
+#endif
+#endif
+
+/* Build JK_EXPOSED_VERSION and JK_VERSION */
+#define JK_EXPOSED_VERSION_INT PACKAGE "/" JK_VERSTRING
+
+#if (JK_VERBETA != 0)
+#define JK_EXPOSED_VERSION JK_EXPOSED_VERSION_INT "-beta-" JK_BETASTRING
+#else
+#undef JK_VERBETA
+#define JK_VERBETA 255
+#if (JK_VERRC != 0)
+#define JK_EXPOSED_VERSION JK_EXPOSED_VERSION_INT "-rc-" JK_RCSTRING
+#elif (JK_VERISRELEASE == 1)
+#define JK_EXPOSED_VERSION JK_EXPOSED_VERSION_INT
+#else
+#define JK_EXPOSED_VERSION JK_EXPOSED_VERSION_INT "-dev" JK_REVISION
+#endif
+#endif
+#define JK_FULL_EXPOSED_VERSION JK_EXPOSED_VERSION JK_REVISION
+
+#define JK_MAKEVERSION(major, minor, fix, beta) \
+ (((major) << 24) + ((minor) << 16) + ((fix) << 8) + (beta))
+
+#define JK_VERSION JK_MAKEVERSION(JK_VERMAJOR, JK_VERMINOR, JK_VERFIX, JK_VERBETA)
+
+/** Properly quote a value as a string in the C preprocessor */
+#define JK_STRINGIFY(n) JK_STRINGIFY_HELPER(n)
+/** Helper macro for JK_STRINGIFY */
+#define JK_STRINGIFY_HELPER(n) #n
+#define JK_VERSTRING \
+ JK_STRINGIFY(JK_VERMAJOR) "." \
+ JK_STRINGIFY(JK_VERMINOR) "." \
+ JK_STRINGIFY(JK_VERFIX)
+
+/* macro for Win32 .rc files using numeric csv representation */
+#define JK_VERSIONCSV JK_VERMAJOR ##, \
+ ##JK_VERMINOR ##, \
+ ##JK_VERFIX
+
+
+#endif /* __JK_VERSION_H */
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker.c
new file mode 100644
index 00000000..b75ae933
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker.c
@@ -0,0 +1,351 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: Workers controller *
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Author: Henri Gomez <hgomez@apache.org> *
+ * Version: $Revision: 708019 $ *
+ ***************************************************************************/
+
+#define _PLACE_WORKER_LIST_HERE
+#include "jk_worker_list.h"
+#include "jk_worker.h"
+#include "jk_util.h"
+#include "jk_mt.h"
+
+static void close_workers(jk_logger_t *l);
+
+static worker_factory get_factory_for(const char *type);
+
+static int build_worker_map(jk_map_t *init_data,
+ char **worker_list,
+ unsigned num_of_workers,
+ jk_worker_env_t *we, jk_logger_t *l);
+
+/* Global worker list */
+static jk_map_t *worker_map;
+#if _MT_CODE
+static JK_CRIT_SEC worker_lock;
+#endif
+static int worker_maintain_time = 0;
+
+int wc_open(jk_map_t *init_data, jk_worker_env_t *we, jk_logger_t *l)
+{
+ int rc;
+ JK_TRACE_ENTER(l);
+
+ if (!jk_map_alloc(&worker_map)) {
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ JK_INIT_CS(&worker_lock, rc);
+ if (rc == JK_FALSE) {
+ jk_log(l, JK_LOG_ERROR,
+ "creating thread lock (errno=%d)",
+ errno);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ jk_map_dump(init_data, l);
+ we->init_data = init_data;
+ if (!jk_get_worker_list(init_data, &(we->worker_list),
+ &we->num_of_workers)) {
+ JK_TRACE_EXIT(l);
+ we->num_of_workers = 0;
+ we->worker_list = NULL;
+ return JK_FALSE;
+ }
+
+ worker_maintain_time = jk_get_worker_maintain_time(init_data);
+ if(worker_maintain_time < 0)
+ worker_maintain_time = 0;
+
+ if (!build_worker_map(init_data, we->worker_list,
+ we->num_of_workers, we, l)) {
+ close_workers(l);
+ we->num_of_workers = 0;
+ we->worker_list = NULL;
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+
+void wc_close(jk_logger_t *l)
+{
+ int rc;
+ JK_TRACE_ENTER(l);
+ JK_DELETE_CS(&worker_lock, rc);
+ close_workers(l);
+ JK_TRACE_EXIT(l);
+}
+
+jk_worker_t *wc_get_worker_for_name(const char *name, jk_logger_t *l)
+{
+ jk_worker_t *rc;
+
+ JK_TRACE_ENTER(l);
+ if (!name) {
+ JK_LOG_NULL_PARAMS(l);
+ JK_TRACE_EXIT(l);
+ return NULL;
+ }
+
+ rc = jk_map_get(worker_map, name, NULL);
+
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG, "%s a worker %s",
+ rc ? "found" : "did not find", name);
+ JK_TRACE_EXIT(l);
+ return rc;
+}
+
+int wc_create_worker(const char *name, int use_map,
+ jk_map_t *init_data,
+ jk_worker_t **rc, jk_worker_env_t *we, jk_logger_t *l)
+{
+ JK_TRACE_ENTER(l);
+
+ if (rc) {
+ const char *type = jk_get_worker_type(init_data, name);
+ worker_factory fac = get_factory_for(type);
+ jk_worker_t *w = NULL;
+ unsigned int i, num_of_maps;
+ char **map_names;
+ int wtype;
+
+ *rc = NULL;
+
+ if (!fac) {
+ jk_log(l, JK_LOG_ERROR, "Unknown worker type %s for worker %s",
+ type, name);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "about to create instance %s of %s", name,
+ type);
+
+ if (((wtype = fac(&w, name, l)) == 0) || !w) {
+ jk_log(l, JK_LOG_ERROR,
+ "factory for %s failed for %s", type,
+ name);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "about to validate and init %s", name);
+ if (!w->validate(w, init_data, we, l)) {
+ w->destroy(&w, l);
+ jk_log(l, JK_LOG_ERROR,
+ "validate failed for %s", name);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ if (!w->init(w, init_data, we, l)) {
+ w->destroy(&w, l);
+ jk_log(l, JK_LOG_ERROR, "init failed for %s",
+ name);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ if (use_map &&
+ jk_get_worker_mount_list(init_data, name,
+ &map_names,
+ &num_of_maps) && num_of_maps) {
+ for (i = 0; i < num_of_maps; i++) {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "mounting %s to worker %s",
+ map_names[i], name);
+ if (uri_worker_map_add(we->uri_to_worker, map_names[i],
+ name, SOURCE_TYPE_WORKERDEF, l) == JK_FALSE) {
+ w->destroy(&w, l);
+ jk_log(l, JK_LOG_ERROR,
+ "mounting %s failed for %s",
+ map_names[i], name);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ }
+ }
+ w->type = wtype;
+ *rc = w;
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+ }
+
+ JK_LOG_NULL_PARAMS(l);
+ return JK_FALSE;
+}
+
+static void close_workers(jk_logger_t *l)
+{
+ int sz = jk_map_size(worker_map);
+
+ JK_TRACE_ENTER(l);
+
+ if (sz > 0) {
+ int i;
+ for (i = 0; i < sz; i++) {
+ jk_worker_t *w = jk_map_value_at(worker_map, i);
+ if (w) {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "close_workers will destroy worker %s",
+ jk_map_name_at(worker_map, i));
+ w->destroy(&w, l);
+ }
+ }
+ }
+ jk_map_free(&worker_map);
+ JK_TRACE_EXIT(l);
+}
+
+static int build_worker_map(jk_map_t *init_data,
+ char **worker_list,
+ unsigned num_of_workers,
+ jk_worker_env_t *we, jk_logger_t *l)
+{
+ unsigned i;
+
+ JK_TRACE_ENTER(l);
+
+ for (i = 0; i < num_of_workers; i++) {
+ jk_worker_t *w = NULL;
+
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "creating worker %s", worker_list[i]);
+
+ if (wc_create_worker(worker_list[i], 1, init_data, &w, we, l)) {
+ jk_worker_t *oldw = NULL;
+ if (!jk_map_put(worker_map, worker_list[i], w, (void *)&oldw)) {
+ w->destroy(&w, l);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+
+ if (oldw) {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "removing old %s worker",
+ worker_list[i]);
+ oldw->destroy(&oldw, l);
+ }
+ }
+ else {
+ jk_log(l, JK_LOG_ERROR,
+ "failed to create worker %s",
+ worker_list[i]);
+ JK_TRACE_EXIT(l);
+ return JK_FALSE;
+ }
+ }
+
+ JK_TRACE_EXIT(l);
+ return JK_TRUE;
+}
+
+static worker_factory get_factory_for(const char *type)
+{
+ worker_factory_record_t *factory = &worker_factories[0];
+ while (factory->name) {
+ if (0 == strcmp(factory->name, type)) {
+ return factory->fac;
+ }
+
+ factory++;
+ }
+
+ return NULL;
+}
+
+const char *wc_get_name_for_type(int type, jk_logger_t *l)
+{
+ worker_factory_record_t *factory = &worker_factories[0];
+ while (factory->name) {
+ if (type == factory->type) {
+ jk_log(l, JK_LOG_DEBUG,
+ "Found worker type '%s'",
+ factory->name);
+ return factory->name;
+ }
+
+ factory++;
+ }
+
+ return NULL;
+}
+
+void wc_maintain(jk_logger_t *l)
+{
+ static time_t last_maintain = 0;
+ static int running_maintain = 0;
+ int sz = jk_map_size(worker_map);
+
+ JK_TRACE_ENTER(l);
+
+ /* Only proceed if all of the below hold true:
+ * - there are workers
+ * - maintenance wasn't disabled by configuration
+ * - time since last maintenance is big enough
+ */
+ if (sz > 0 && worker_maintain_time > 0 &&
+ difftime(time(NULL), last_maintain) >= worker_maintain_time) {
+ int i;
+ JK_ENTER_CS(&worker_lock, i);
+ if (running_maintain ||
+ difftime(time(NULL), last_maintain) < worker_maintain_time) {
+ /* Already in maintain */
+ JK_LEAVE_CS(&worker_lock, i);
+ JK_TRACE_EXIT(l);
+ return;
+ }
+ /* Set the maintain run flag so other threads skip
+ * the maintain until we are finished.
+ */
+ running_maintain = 1;
+ JK_LEAVE_CS(&worker_lock, i);
+
+ for (i = 0; i < sz; i++) {
+ jk_worker_t *w = jk_map_value_at(worker_map, i);
+ if (w && w->maintain) {
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "Maintaining worker %s",
+ jk_map_name_at(worker_map, i));
+ w->maintain(w, time(NULL), l);
+ }
+ }
+ JK_ENTER_CS(&worker_lock, i);
+ last_maintain = time(NULL);
+ running_maintain = 0;
+ JK_LEAVE_CS(&worker_lock, i);
+ }
+ JK_TRACE_EXIT(l);
+}
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker.h
new file mode 100644
index 00000000..18e9097c
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker.h
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: Workers controller header file *
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Version: $Revision: 466585 $ *
+ ***************************************************************************/
+
+#ifndef JK_WORKER_H
+#define JK_WORKER_H
+
+#include "jk_logger.h"
+#include "jk_service.h"
+#include "jk_map.h"
+#include "jk_uri_worker_map.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+int wc_open(jk_map_t *init_data, jk_worker_env_t *we, jk_logger_t *l);
+
+void wc_close(jk_logger_t *l);
+
+jk_worker_t *wc_get_worker_for_name(const char *name, jk_logger_t *l);
+
+const char *wc_get_name_for_type(int type, jk_logger_t *l);
+
+int wc_create_worker(const char *name, int use_map,
+ jk_map_t *init_data,
+ jk_worker_t **rc,
+ jk_worker_env_t *we, jk_logger_t *l);
+
+void wc_maintain(jk_logger_t *l);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* JK_WORKER_H */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker.lo
new file mode 100644
index 00000000..45a6af4b
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker.lo
@@ -0,0 +1,12 @@
+# jk_worker.lo - a libtool object file
+# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18)
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/jk_worker.o'
+
+# Name of the non-PIC object.
+non_pic_object='jk_worker.o'
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker.o
new file mode 100644
index 00000000..756f2510
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker_list.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker_list.h
new file mode 100644
index 00000000..59518b2a
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/jk_worker_list.h
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: Worker list *
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Author: Henri Gomez <hgomez@apache.org> *
+ * Version: $Revision: 466585 $ *
+ ***************************************************************************/
+
+/*
+ * This file includes a list of all the possible workers in the jk library
+ * plus their factories.
+ *
+ * If you want to add a worker just place it in the worker_factories array
+ * with its unique name and factory.
+ *
+ * If you want to remove a worker, hjust comment out its line in the
+ * worker_factories array as well as its header file. For example, look
+ * at what we have done to the ajp23 worker.
+ *
+ * Note: This file should be included only in the jk_worker controller.
+ * Currently the jk_worker controller is located in jk_worker.c
+ */
+#ifdef _PLACE_WORKER_LIST_HERE
+#ifndef _JK_WORKER_LIST_H
+#define _JK_WORKER_LIST_H
+
+#include "jk_ajp12_worker.h"
+#include "jk_ajp13_worker.h"
+#include "jk_ajp14_worker.h"
+#ifdef HAVE_JNI
+#include "jk_jni_worker.h"
+#endif
+#include "jk_lb_worker.h"
+#include "jk_status.h"
+
+struct worker_factory_record
+{
+ const char *name;
+ int type;
+ worker_factory fac;
+};
+typedef struct worker_factory_record worker_factory_record_t;
+
+static worker_factory_record_t worker_factories[] = {
+ /*
+ * AJPv12 worker, this is the stable worker.
+ */
+ {JK_AJP12_WORKER_NAME, JK_AJP12_WORKER_TYPE, ajp12_worker_factory},
+ /*
+ * AJPv13 worker, fast bi-directional worker.
+ */
+ {JK_AJP13_WORKER_NAME, JK_AJP13_WORKER_TYPE, ajp13_worker_factory},
+ /*
+ * AJPv14 worker, next generation fast bi-directional worker.
+ */
+ {JK_AJP14_WORKER_NAME, JK_AJP14_WORKER_TYPE, ajp14_worker_factory},
+ /*
+ * In process JNI based worker. Requires the server to be
+ * multithreaded and to use native threads.
+ */
+#ifdef HAVE_JNI
+ {JK_JNI_WORKER_NAME, JK_JNI_WORKER_TYPE, jni_worker_factory},
+#endif
+ /*
+ * Load balancing worker. Performs round robin with sticky
+ * session load balancing.
+ */
+ {JK_LB_WORKER_NAME, JK_LB_WORKER_TYPE, lb_worker_factory},
+
+ /*
+ * Status worker. Performs display display and
+ * worker management.
+ */
+ {JK_STATUS_WORKER_NAME, JK_STATUS_WORKER_TYPE, status_worker_factory},
+
+ /*
+ * Marks the end of the worker factory list.
+ */
+ {NULL, 0, NULL}
+};
+#endif /* _JK_WORKER_LIST_H */
+#endif /* _PLACE_WORKER_LIST_HERE */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/list.mk b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/list.mk
new file mode 100644
index 00000000..51fa1e0e
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/list.mk
@@ -0,0 +1,27 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+## Object needed for mod_jk for Apache-1.3
+APACHE_OBJECTS= ${JK}jk_ajp12_worker${OEXT} ${JK}jk_connect${OEXT} \
+ ${JK}jk_msg_buff${OEXT} ${JK}jk_util${OEXT} \
+ ${JK}jk_ajp13${OEXT} ${JK}jk_pool${OEXT} \
+ ${JK}jk_worker${OEXT} ${JK}jk_ajp13_worker${OEXT} \
+ ${JK}jk_lb_worker${OEXT} ${JK}jk_sockbuf${OEXT} \
+ ${JK}jk_map${OEXT} ${JK}jk_uri_worker_map${OEXT} \
+ ${JK}jk_ajp14${OEXT} ${JK}jk_ajp14_worker${OEXT} \
+ ${JK}jk_md5${OEXT} ${JK}jk_shm${OEXT} ${JK}jk_jni_worker${OEXT} \
+ ${JK}jk_ajp_common${OEXT} ${JK}jk_context${OEXT} \
+ ${JK}jk_url${OEXT} \
+ ${JK}jk_status${OEXT}
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/list.mk.in b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/list.mk.in
new file mode 100644
index 00000000..abc7ffe5
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/list.mk.in
@@ -0,0 +1,27 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+## Object needed for mod_jk for Apache-1.3
+APACHE_OBJECTS= ${JK}jk_ajp12_worker${OEXT} ${JK}jk_connect${OEXT} \
+ ${JK}jk_msg_buff${OEXT} ${JK}jk_util${OEXT} \
+ ${JK}jk_ajp13${OEXT} ${JK}jk_pool${OEXT} \
+ ${JK}jk_worker${OEXT} ${JK}jk_ajp13_worker${OEXT} \
+ ${JK}jk_lb_worker${OEXT} ${JK}jk_sockbuf${OEXT} \
+ ${JK}jk_map${OEXT} ${JK}jk_uri_worker_map${OEXT} \
+ ${JK}jk_ajp14${OEXT} ${JK}jk_ajp14_worker${OEXT} \
+ ${JK}jk_md5${OEXT} ${JK}jk_shm${OEXT} @JK_JNI_WORKER@ \
+ ${JK}jk_ajp_common${OEXT} ${JK}jk_context${OEXT} \
+ ${JK}jk_url${OEXT} \
+ ${JK}jk_status${OEXT}
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/common/stamp-h1 b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/stamp-h1
new file mode 100644
index 00000000..8189b45b
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/common/stamp-h1
@@ -0,0 +1 @@
+timestamp for common/config.h
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/config.log b/rubbos/app/tomcat-connectors-1.2.32-src/native/config.log
new file mode 100644
index 00000000..3c19860e
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/config.log
@@ -0,0 +1,1840 @@
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by configure, which was
+generated by GNU Autoconf 2.59. Invocation command line was
+
+ $ ./configure --with-apxs=/bottlenecks/rubbos/app/apache2/bin/apxs --enable-jni --with-java-home=/bottlenecks/rubbos/app/jdk1.6.0_27
+
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = ubuntu
+uname -m = x86_64
+uname -r = 3.16.0-30-generic
+uname -s = Linux
+uname -v = #40~14.04.1-Ubuntu SMP Thu Jan 15 17:43:14 UTC 2015
+
+/usr/bin/uname -p = unknown
+/bin/uname -X = unknown
+
+/bin/arch = unknown
+/usr/bin/arch -k = unknown
+/usr/convex/getsysinfo = unknown
+hostinfo = unknown
+/bin/machine = unknown
+/usr/bin/oslevel = unknown
+/bin/universe = unknown
+
+PATH: /bottlenecks/rubbos/app/jdk1.6.0_27/bin
+PATH: /bin/unix
+PATH: /bottlenecks/rubbos/app/apache-ant-1.6.5/bin
+PATH: /bottlenecks/rubbos/app/apache-tomcat-5.5.17/bin
+PATH: /usr/local/sbin
+PATH: /usr/local/bin
+PATH: /usr/sbin
+PATH: /usr/bin
+PATH: /sbin
+PATH: /bin
+PATH: /usr/games
+PATH: /usr/local/games
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+configure:1558: checking build system type
+configure:1576: result: x86_64-unknown-linux-gnu
+configure:1584: checking host system type
+configure:1598: result: x86_64-unknown-linux-gnu
+configure:1606: checking target system type
+configure:1620: result: x86_64-unknown-linux-gnu
+configure:1652: checking for a BSD-compatible install
+configure:1707: result: /usr/bin/install -c
+configure:1718: checking whether build environment is sane
+configure:1761: result: yes
+configure:1826: checking for gawk
+configure:1842: found /usr/bin/gawk
+configure:1852: result: gawk
+configure:1862: checking whether make sets $(MAKE)
+configure:1882: result: yes
+configure:2126: checking for test
+configure:2144: found /usr/bin/test
+configure:2157: result: /usr/bin/test
+configure:2167: checking for rm
+configure:2185: found /bin/rm
+configure:2198: result: /bin/rm
+configure:2208: checking for grep
+configure:2226: found /bin/grep
+configure:2239: result: /bin/grep
+configure:2249: checking for echo
+configure:2267: found /bin/echo
+configure:2280: result: /bin/echo
+configure:2290: checking for sed
+configure:2308: found /bin/sed
+configure:2321: result: /bin/sed
+configure:2331: checking for cp
+configure:2349: found /bin/cp
+configure:2362: result: /bin/cp
+configure:2372: checking for mkdir
+configure:2390: found /bin/mkdir
+configure:2403: result: /bin/mkdir
+configure:2431: result: need to check for Perl first, apxs depends on it...
+configure:2435: checking for perl
+configure:2453: found /usr/bin/perl
+configure:2466: result: /usr/bin/perl
+configure:2551: result: APRINCLUDEDIR is -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include
+configure:2560: result: building connector for "apache-2.0"
+configure:2629: checking for gcc
+configure:2655: result: gcc
+configure:2899: checking for C compiler version
+configure:2902: gcc --version </dev/null >&5
+gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4
+Copyright (C) 2013 Free Software Foundation, Inc.
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+configure:2905: $? = 0
+configure:2907: gcc -v </dev/null >&5
+Using built-in specs.
+COLLECT_GCC=gcc
+COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper
+Target: x86_64-linux-gnu
+Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.4-2ubuntu1~14.04' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
+Thread model: posix
+gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04)
+configure:2910: $? = 0
+configure:2912: gcc -V </dev/null >&5
+gcc: error: unrecognized command line option '-V'
+gcc: fatal error: no input files
+compilation terminated.
+configure:2915: $? = 4
+configure:2938: checking for C compiler default output file name
+configure:2941: gcc -DHAVE_CONFIG_H conftest.c >&5
+configure:2944: $? = 0
+configure:2990: result: a.out
+configure:2995: checking whether the C compiler works
+configure:3001: ./a.out
+configure:3004: $? = 0
+configure:3021: result: yes
+configure:3028: checking whether we are cross compiling
+configure:3030: result: no
+configure:3033: checking for suffix of executables
+configure:3035: gcc -o conftest -DHAVE_CONFIG_H conftest.c >&5
+configure:3038: $? = 0
+configure:3063: result:
+configure:3069: checking for suffix of object files
+configure:3090: gcc -c -DHAVE_CONFIG_H conftest.c >&5
+configure:3093: $? = 0
+configure:3115: result: o
+configure:3119: checking whether we are using the GNU C compiler
+configure:3143: gcc -c -DHAVE_CONFIG_H conftest.c >&5
+configure:3149: $? = 0
+configure:3153: test -z
+ || test ! -s conftest.err
+configure:3156: $? = 0
+configure:3159: test -s conftest.o
+configure:3162: $? = 0
+configure:3175: result: yes
+configure:3181: checking whether gcc accepts -g
+configure:3202: gcc -c -g conftest.c >&5
+configure:3208: $? = 0
+configure:3212: test -z
+ || test ! -s conftest.err
+configure:3215: $? = 0
+configure:3218: test -s conftest.o
+configure:3221: $? = 0
+configure:3232: result: yes
+configure:3249: checking for gcc option to accept ANSI C
+configure:3319: gcc -c -DHAVE_CONFIG_H conftest.c >&5
+configure:3325: $? = 0
+configure:3329: test -z
+ || test ! -s conftest.err
+configure:3332: $? = 0
+configure:3335: test -s conftest.o
+configure:3338: $? = 0
+configure:3356: result: none needed
+configure:3374: gcc -c -DHAVE_CONFIG_H conftest.c >&5
+conftest.c:2:3: error: unknown type name 'choke'
+ choke me
+ ^
+conftest.c:2:3: error: expected '=', ',', ';', 'asm' or '__attribute__' at end of input
+configure:3380: $? = 1
+configure: failed program was:
+| #ifndef __cplusplus
+| choke me
+| #endif
+configure:3524: checking for style of include used by make
+configure:3552: result: GNU
+configure:3580: checking dependency style of gcc
+configure:3670: result: none
+configure:3687: checking for a sed that does not truncate output
+configure:3741: result: /bin/sed
+configure:3744: checking for egrep
+configure:3754: result: grep -E
+configure:3770: checking for ld used by gcc
+configure:3837: result: /usr/bin/ld
+configure:3846: checking if the linker (/usr/bin/ld) is GNU ld
+configure:3861: result: yes
+configure:3944: checking for /usr/bin/ld option to reload object files
+configure:3951: result: -r
+configure:3960: checking for BSD-compatible nm
+configure:4002: result: /usr/bin/nm -B
+configure:4006: checking whether ln -s works
+configure:4010: result: yes
+configure:4017: checking how to recognise dependent libraries
+configure:4200: result: pass_all
+configure:4285: gcc -c -DHAVE_CONFIG_H conftest.c >&5
+configure:4288: $? = 0
+configure:4414: checking how to run the C preprocessor
+configure:4449: gcc -E conftest.c
+configure:4455: $? = 0
+configure:4487: gcc -E conftest.c
+conftest.c:11:28: fatal error: ac_nonexistent.h: No such file or directory
+ #include <ac_nonexistent.h>
+ ^
+compilation terminated.
+configure:4493: $? = 1
+configure: failed program was:
+| /* confdefs.h. */
+|
+| #define PACKAGE_NAME ""
+| #define PACKAGE_TARNAME ""
+| #define PACKAGE_VERSION ""
+| #define PACKAGE_STRING ""
+| #define PACKAGE_BUGREPORT ""
+| #define PACKAGE "mod_jk"
+| #define VERSION "1.2.32"
+| /* end confdefs.h. */
+| #include <ac_nonexistent.h>
+configure:4532: result: gcc -E
+configure:4556: gcc -E conftest.c
+configure:4562: $? = 0
+configure:4594: gcc -E conftest.c
+conftest.c:11:28: fatal error: ac_nonexistent.h: No such file or directory
+ #include <ac_nonexistent.h>
+ ^
+compilation terminated.
+configure:4600: $? = 1
+configure: failed program was:
+| /* confdefs.h. */
+|
+| #define PACKAGE_NAME ""
+| #define PACKAGE_TARNAME ""
+| #define PACKAGE_VERSION ""
+| #define PACKAGE_STRING ""
+| #define PACKAGE_BUGREPORT ""
+| #define PACKAGE "mod_jk"
+| #define VERSION "1.2.32"
+| /* end confdefs.h. */
+| #include <ac_nonexistent.h>
+configure:4644: checking for ANSI C header files
+configure:4669: gcc -c -DHAVE_CONFIG_H conftest.c >&5
+configure:4675: $? = 0
+configure:4679: test -z
+ || test ! -s conftest.err
+configure:4682: $? = 0
+configure:4685: test -s conftest.o
+configure:4688: $? = 0
+configure:4777: gcc -o conftest -DHAVE_CONFIG_H conftest.c >&5
+conftest.c: In function 'main':
+conftest.c:28:7: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default]
+ exit(2);
+ ^
+configure:4780: $? = 0
+configure:4782: ./conftest
+configure:4785: $? = 0
+configure:4800: result: yes
+configure:4824: checking for sys/types.h
+configure:4840: gcc -c -DHAVE_CONFIG_H conftest.c >&5
+configure:4846: $? = 0
+configure:4850: test -z
+ || test ! -s conftest.err
+configure:4853: $? = 0
+configure:4856: test -s conftest.o
+configure:4859: $? = 0
+configure:4870: result: yes
+configure:4824: checking for sys/stat.h
+configure:4840: gcc -c -DHAVE_CONFIG_H conftest.c >&5
+configure:4846: $? = 0
+configure:4850: test -z
+ || test ! -s conftest.err
+configure:4853: $? = 0
+configure:4856: test -s conftest.o
+configure:4859: $? = 0
+configure:4870: result: yes
+configure:4824: checking for stdlib.h
+configure:4840: gcc -c -DHAVE_CONFIG_H conftest.c >&5
+configure:4846: $? = 0
+configure:4850: test -z
+ || test ! -s conftest.err
+configure:4853: $? = 0
+configure:4856: test -s conftest.o
+configure:4859: $? = 0
+configure:4870: result: yes
+configure:4824: checking for string.h
+configure:4840: gcc -c -DHAVE_CONFIG_H conftest.c >&5
+configure:4846: $? = 0
+configure:4850: test -z
+ || test ! -s conftest.err
+configure:4853: $? = 0
+configure:4856: test -s conftest.o
+configure:4859: $? = 0
+configure:4870: result: yes
+configure:4824: checking for memory.h
+configure:4840: gcc -c -DHAVE_CONFIG_H conftest.c >&5
+configure:4846: $? = 0
+configure:4850: test -z
+ || test ! -s conftest.err
+configure:4853: $? = 0
+configure:4856: test -s conftest.o
+configure:4859: $? = 0
+configure:4870: result: yes
+configure:4824: checking for strings.h
+configure:4840: gcc -c -DHAVE_CONFIG_H conftest.c >&5
+configure:4846: $? = 0
+configure:4850: test -z
+ || test ! -s conftest.err
+configure:4853: $? = 0
+configure:4856: test -s conftest.o
+configure:4859: $? = 0
+configure:4870: result: yes
+configure:4824: checking for inttypes.h
+configure:4840: gcc -c -DHAVE_CONFIG_H conftest.c >&5
+configure:4846: $? = 0
+configure:4850: test -z
+ || test ! -s conftest.err
+configure:4853: $? = 0
+configure:4856: test -s conftest.o
+configure:4859: $? = 0
+configure:4870: result: yes
+configure:4824: checking for stdint.h
+configure:4840: gcc -c -DHAVE_CONFIG_H conftest.c >&5
+configure:4846: $? = 0
+configure:4850: test -z
+ || test ! -s conftest.err
+configure:4853: $? = 0
+configure:4856: test -s conftest.o
+configure:4859: $? = 0
+configure:4870: result: yes
+configure:4824: checking for unistd.h
+configure:4840: gcc -c -DHAVE_CONFIG_H conftest.c >&5
+configure:4846: $? = 0
+configure:4850: test -z
+ || test ! -s conftest.err
+configure:4853: $? = 0
+configure:4856: test -s conftest.o
+configure:4859: $? = 0
+configure:4870: result: yes
+configure:4896: checking dlfcn.h usability
+configure:4908: gcc -c -DHAVE_CONFIG_H conftest.c >&5
+configure:4914: $? = 0
+configure:4918: test -z
+ || test ! -s conftest.err
+configure:4921: $? = 0
+configure:4924: test -s conftest.o
+configure:4927: $? = 0
+configure:4937: result: yes
+configure:4941: checking dlfcn.h presence
+configure:4951: gcc -E conftest.c
+configure:4957: $? = 0
+configure:4977: result: yes
+configure:5012: checking for dlfcn.h
+configure:5019: result: yes
+configure:5084: checking for g++
+configure:5100: found /usr/bin/g++
+configure:5110: result: g++
+configure:5126: checking for C++ compiler version
+configure:5129: g++ --version </dev/null >&5
+g++ (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4
+Copyright (C) 2013 Free Software Foundation, Inc.
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+configure:5132: $? = 0
+configure:5134: g++ -v </dev/null >&5
+Using built-in specs.
+COLLECT_GCC=g++
+COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper
+Target: x86_64-linux-gnu
+Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.4-2ubuntu1~14.04' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
+Thread model: posix
+gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04)
+configure:5137: $? = 0
+configure:5139: g++ -V </dev/null >&5
+g++: error: unrecognized command line option '-V'
+g++: fatal error: no input files
+compilation terminated.
+configure:5142: $? = 4
+configure:5145: checking whether we are using the GNU C++ compiler
+configure:5169: g++ -c conftest.cc >&5
+configure:5175: $? = 0
+configure:5179: test -z
+ || test ! -s conftest.err
+configure:5182: $? = 0
+configure:5185: test -s conftest.o
+configure:5188: $? = 0
+configure:5201: result: yes
+configure:5207: checking whether g++ accepts -g
+configure:5228: g++ -c -g conftest.cc >&5
+configure:5234: $? = 0
+configure:5238: test -z
+ || test ! -s conftest.err
+configure:5241: $? = 0
+configure:5244: test -s conftest.o
+configure:5247: $? = 0
+configure:5258: result: yes
+configure:5300: g++ -c -g -O2 conftest.cc >&5
+configure:5306: $? = 0
+configure:5310: test -z
+ || test ! -s conftest.err
+configure:5313: $? = 0
+configure:5316: test -s conftest.o
+configure:5319: $? = 0
+configure:5345: g++ -c -g -O2 conftest.cc >&5
+conftest.cc: In function 'int main()':
+conftest.cc:26:9: error: 'exit' was not declared in this scope
+ exit (42);
+ ^
+configure:5351: $? = 1
+configure: failed program was:
+| /* confdefs.h. */
+|
+| #define PACKAGE_NAME ""
+| #define PACKAGE_TARNAME ""
+| #define PACKAGE_VERSION ""
+| #define PACKAGE_STRING ""
+| #define PACKAGE_BUGREPORT ""
+| #define PACKAGE "mod_jk"
+| #define VERSION "1.2.32"
+| #define STDC_HEADERS 1
+| #define HAVE_SYS_TYPES_H 1
+| #define HAVE_SYS_STAT_H 1
+| #define HAVE_STDLIB_H 1
+| #define HAVE_STRING_H 1
+| #define HAVE_MEMORY_H 1
+| #define HAVE_STRINGS_H 1
+| #define HAVE_INTTYPES_H 1
+| #define HAVE_STDINT_H 1
+| #define HAVE_UNISTD_H 1
+| #define HAVE_DLFCN_H 1
+| /* end confdefs.h. */
+|
+| int
+| main ()
+| {
+| exit (42);
+| ;
+| return 0;
+| }
+configure:5300: g++ -c -g -O2 conftest.cc >&5
+conftest.cc:22:40: error: 'void std::exit(int)' should have been declared inside 'std'
+ extern "C" void std::exit (int) throw (); using std::exit;
+ ^
+configure:5306: $? = 1
+configure: failed program was:
+| /* confdefs.h. */
+|
+| #define PACKAGE_NAME ""
+| #define PACKAGE_TARNAME ""
+| #define PACKAGE_VERSION ""
+| #define PACKAGE_STRING ""
+| #define PACKAGE_BUGREPORT ""
+| #define PACKAGE "mod_jk"
+| #define VERSION "1.2.32"
+| #define STDC_HEADERS 1
+| #define HAVE_SYS_TYPES_H 1
+| #define HAVE_SYS_STAT_H 1
+| #define HAVE_STDLIB_H 1
+| #define HAVE_STRING_H 1
+| #define HAVE_MEMORY_H 1
+| #define HAVE_STRINGS_H 1
+| #define HAVE_INTTYPES_H 1
+| #define HAVE_STDINT_H 1
+| #define HAVE_UNISTD_H 1
+| #define HAVE_DLFCN_H 1
+| /* end confdefs.h. */
+| extern "C" void std::exit (int) throw (); using std::exit;
+| #include <stdlib.h>
+| int
+| main ()
+| {
+| exit (42);
+| ;
+| return 0;
+| }
+configure:5300: g++ -c -g -O2 conftest.cc >&5
+conftest.cc:22:31: error: 'void std::exit(int)' should have been declared inside 'std'
+ extern "C" void std::exit (int); using std::exit;
+ ^
+In file included from conftest.cc:23:0:
+/usr/include/stdlib.h:543:70: error: declaration of 'void std::exit(int) throw ()' has a different exception specifier
+ extern void exit (int __status) __THROW __attribute__ ((__noreturn__));
+ ^
+conftest.cc:22:17: error: from previous declaration 'void std::exit(int)'
+ extern "C" void std::exit (int); using std::exit;
+ ^
+configure:5306: $? = 1
+configure: failed program was:
+| /* confdefs.h. */
+|
+| #define PACKAGE_NAME ""
+| #define PACKAGE_TARNAME ""
+| #define PACKAGE_VERSION ""
+| #define PACKAGE_STRING ""
+| #define PACKAGE_BUGREPORT ""
+| #define PACKAGE "mod_jk"
+| #define VERSION "1.2.32"
+| #define STDC_HEADERS 1
+| #define HAVE_SYS_TYPES_H 1
+| #define HAVE_SYS_STAT_H 1
+| #define HAVE_STDLIB_H 1
+| #define HAVE_STRING_H 1
+| #define HAVE_MEMORY_H 1
+| #define HAVE_STRINGS_H 1
+| #define HAVE_INTTYPES_H 1
+| #define HAVE_STDINT_H 1
+| #define HAVE_UNISTD_H 1
+| #define HAVE_DLFCN_H 1
+| /* end confdefs.h. */
+| extern "C" void std::exit (int); using std::exit;
+| #include <stdlib.h>
+| int
+| main ()
+| {
+| exit (42);
+| ;
+| return 0;
+| }
+configure:5300: g++ -c -g -O2 conftest.cc >&5
+configure:5306: $? = 0
+configure:5310: test -z
+ || test ! -s conftest.err
+configure:5313: $? = 0
+configure:5316: test -s conftest.o
+configure:5319: $? = 0
+configure:5345: g++ -c -g -O2 conftest.cc >&5
+configure:5351: $? = 0
+configure:5355: test -z
+ || test ! -s conftest.err
+configure:5358: $? = 0
+configure:5361: test -s conftest.o
+configure:5364: $? = 0
+configure:5389: checking dependency style of g++
+configure:5479: result: none
+configure:5501: checking how to run the C++ preprocessor
+configure:5532: g++ -E conftest.cc
+configure:5538: $? = 0
+configure:5570: g++ -E conftest.cc
+conftest.cc:25:28: fatal error: ac_nonexistent.h: No such file or directory
+ #include <ac_nonexistent.h>
+ ^
+compilation terminated.
+configure:5576: $? = 1
+configure: failed program was:
+| /* confdefs.h. */
+|
+| #define PACKAGE_NAME ""
+| #define PACKAGE_TARNAME ""
+| #define PACKAGE_VERSION ""
+| #define PACKAGE_STRING ""
+| #define PACKAGE_BUGREPORT ""
+| #define PACKAGE "mod_jk"
+| #define VERSION "1.2.32"
+| #define STDC_HEADERS 1
+| #define HAVE_SYS_TYPES_H 1
+| #define HAVE_SYS_STAT_H 1
+| #define HAVE_STDLIB_H 1
+| #define HAVE_STRING_H 1
+| #define HAVE_MEMORY_H 1
+| #define HAVE_STRINGS_H 1
+| #define HAVE_INTTYPES_H 1
+| #define HAVE_STDINT_H 1
+| #define HAVE_UNISTD_H 1
+| #define HAVE_DLFCN_H 1
+| #ifdef __cplusplus
+| extern "C" void exit (int) throw ();
+| #endif
+| /* end confdefs.h. */
+| #include <ac_nonexistent.h>
+configure:5615: result: g++ -E
+configure:5639: g++ -E conftest.cc
+configure:5645: $? = 0
+configure:5677: g++ -E conftest.cc
+conftest.cc:25:28: fatal error: ac_nonexistent.h: No such file or directory
+ #include <ac_nonexistent.h>
+ ^
+compilation terminated.
+configure:5683: $? = 1
+configure: failed program was:
+| /* confdefs.h. */
+|
+| #define PACKAGE_NAME ""
+| #define PACKAGE_TARNAME ""
+| #define PACKAGE_VERSION ""
+| #define PACKAGE_STRING ""
+| #define PACKAGE_BUGREPORT ""
+| #define PACKAGE "mod_jk"
+| #define VERSION "1.2.32"
+| #define STDC_HEADERS 1
+| #define HAVE_SYS_TYPES_H 1
+| #define HAVE_SYS_STAT_H 1
+| #define HAVE_STDLIB_H 1
+| #define HAVE_STRING_H 1
+| #define HAVE_MEMORY_H 1
+| #define HAVE_STRINGS_H 1
+| #define HAVE_INTTYPES_H 1
+| #define HAVE_STDINT_H 1
+| #define HAVE_UNISTD_H 1
+| #define HAVE_DLFCN_H 1
+| #ifdef __cplusplus
+| extern "C" void exit (int) throw ();
+| #endif
+| /* end confdefs.h. */
+| #include <ac_nonexistent.h>
+configure:5778: checking for g77
+configure:5807: result: no
+configure:5778: checking for f77
+configure:5807: result: no
+configure:5778: checking for xlf
+configure:5807: result: no
+configure:5778: checking for frt
+configure:5807: result: no
+configure:5778: checking for pgf77
+configure:5807: result: no
+configure:5778: checking for fort77
+configure:5807: result: no
+configure:5778: checking for fl32
+configure:5807: result: no
+configure:5778: checking for af77
+configure:5807: result: no
+configure:5778: checking for f90
+configure:5807: result: no
+configure:5778: checking for xlf90
+configure:5807: result: no
+configure:5778: checking for pgf90
+configure:5807: result: no
+configure:5778: checking for epcf90
+configure:5807: result: no
+configure:5778: checking for f95
+configure:5807: result: no
+configure:5778: checking for fort
+configure:5807: result: no
+configure:5778: checking for xlf95
+configure:5807: result: no
+configure:5778: checking for ifc
+configure:5807: result: no
+configure:5778: checking for efc
+configure:5807: result: no
+configure:5778: checking for pgf95
+configure:5807: result: no
+configure:5778: checking for lf95
+configure:5807: result: no
+configure:5778: checking for gfortran
+configure:5807: result: no
+configure:5819: checking for Fortran 77 compiler version
+configure:5822: --version </dev/null >&5
+./configure: line 5823: --version: command not found
+configure:5825: $? = 127
+configure:5827: -v </dev/null >&5
+./configure: line 5828: -v: command not found
+configure:5830: $? = 127
+configure:5832: -V </dev/null >&5
+./configure: line 5833: -V: command not found
+configure:5835: $? = 127
+configure:5843: checking whether we are using the GNU Fortran 77 compiler
+configure:5857: -c conftest.F >&5
+./configure: line 5858: -c: command not found
+configure:5863: $? = 127
+configure: failed program was:
+| program main
+| #ifndef __GNUC__
+| choke me
+| #endif
+|
+| end
+configure:5889: result: no
+configure:5895: checking whether accepts -g
+configure:5907: -c -g conftest.f >&5
+./configure: line 5908: -c: command not found
+configure:5913: $? = 127
+configure: failed program was:
+| program main
+|
+| end
+configure:5938: result: no
+configure:5968: checking the maximum length of command line arguments
+configure:6033: result: 32768
+configure:6044: checking command to parse /usr/bin/nm -B output from gcc object
+configure:6133: gcc -c -DHAVE_CONFIG_H conftest.c >&5
+configure:6136: $? = 0
+configure:6140: /usr/bin/nm -B conftest.o \| sed -n -e 's/^.*[ ]\([ABCDGIRSTW][ABCDGIRSTW]*\)[ ][ ]*\(\)\([_A-Za-z][_A-Za-z0-9]*\)$/\1 \2\3 \3/p' \> conftest.nm
+configure:6143: $? = 0
+configure:6195: gcc -o conftest -DHAVE_CONFIG_H conftest.c conftstm.o >&5
+configure:6198: $? = 0
+configure:6236: result: ok
+configure:6240: checking for objdir
+configure:6255: result: .libs
+configure:6345: checking for ar
+configure:6361: found /usr/bin/ar
+configure:6372: result: ar
+configure:6425: checking for ranlib
+configure:6441: found /usr/bin/ranlib
+configure:6452: result: ranlib
+configure:6505: checking for strip
+configure:6521: found /usr/bin/strip
+configure:6532: result: strip
+configure:6794: checking if gcc static flag works
+configure:6817: result: yes
+configure:6835: checking if gcc supports -fno-rtti -fno-exceptions
+configure:6853: gcc -c -DHAVE_CONFIG_H -fno-rtti -fno-exceptions conftest.c >&5
+cc1: warning: command line option '-fno-rtti' is valid for C++/ObjC++ but not for C [enabled by default]
+configure:6857: $? = 0
+configure:6868: result: no
+configure:6883: checking for gcc option to produce PIC
+configure:7060: result: -fPIC
+configure:7068: checking if gcc PIC flag -fPIC works
+configure:7086: gcc -c -DHAVE_CONFIG_H -fPIC -DPIC conftest.c >&5
+configure:7090: $? = 0
+configure:7101: result: yes
+configure:7125: checking if gcc supports -c -o file.o
+configure:7146: gcc -c -DHAVE_CONFIG_H -o out/conftest2.o conftest.c >&5
+configure:7150: $? = 0
+configure:7170: result: yes
+configure:7196: checking whether the gcc linker (/usr/bin/ld -m elf_x86_64) supports shared libraries
+configure:8044: result: yes
+configure:8070: checking whether -lc should be explicitly linked in
+configure:8075: gcc -c -DHAVE_CONFIG_H conftest.c >&5
+configure:8078: $? = 0
+configure:8092: gcc -shared conftest.o -v -Wl,-soname -Wl,conftest -o conftest 2\>\&1 \| grep -lc \>/dev/null 2\>\&1
+configure:8095: $? = 0
+configure:8107: result: no
+configure:8115: checking dynamic linker characteristics
+configure:8481: gcc -c -DHAVE_CONFIG_H conftest.c >&5
+configure:8484: $? = 0
+configure:8676: result: GNU/Linux ld.so
+configure:8680: checking how to hardcode library paths into programs
+configure:8705: result: immediate
+configure:8719: checking whether stripping libraries is possible
+configure:8724: result: yes
+configure:8850: checking for shl_load
+configure:8907: gcc -o conftest -DHAVE_CONFIG_H conftest.c >&5
+/tmp/ccrm71Xg.o: In function `main':
+conftest.c:(.text+0xd): undefined reference to `shl_load'
+/tmp/ccrm71Xg.o:(.data+0x0): undefined reference to `shl_load'
+collect2: error: ld returned 1 exit status
+configure:8913: $? = 1
+configure: failed program was:
+| /* confdefs.h. */
+|
+| #define PACKAGE_NAME ""
+| #define PACKAGE_TARNAME ""
+| #define PACKAGE_VERSION ""
+| #define PACKAGE_STRING ""
+| #define PACKAGE_BUGREPORT ""
+| #define PACKAGE "mod_jk"
+| #define VERSION "1.2.32"
+| #define STDC_HEADERS 1
+| #define HAVE_SYS_TYPES_H 1
+| #define HAVE_SYS_STAT_H 1
+| #define HAVE_STDLIB_H 1
+| #define HAVE_STRING_H 1
+| #define HAVE_MEMORY_H 1
+| #define HAVE_STRINGS_H 1
+| #define HAVE_INTTYPES_H 1
+| #define HAVE_STDINT_H 1
+| #define HAVE_UNISTD_H 1
+| #define HAVE_DLFCN_H 1
+| #ifdef __cplusplus
+| extern "C" void exit (int) throw ();
+| #endif
+| /* end confdefs.h. */
+| /* Define shl_load to an innocuous variant, in case <limits.h> declares shl_load.
+| For example, HP-UX 11i <limits.h> declares gettimeofday. */
+| #define shl_load innocuous_shl_load
+|
+| /* System header to define __stub macros and hopefully few prototypes,
+| which can conflict with char shl_load (); below.
+| Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+| <limits.h> exists even on freestanding compilers. */
+|
+| #ifdef __STDC__
+| # include <limits.h>
+| #else
+| # include <assert.h>
+| #endif
+|
+| #undef shl_load
+|
+| /* Override any gcc2 internal prototype to avoid an error. */
+| #ifdef __cplusplus
+| extern "C"
+| {
+| #endif
+| /* We use char because int might match the return type of a gcc2
+| builtin and then its argument prototype would still apply. */
+| char shl_load ();
+| /* The GNU C library defines this for functions which it implements
+| to always fail with ENOSYS. Some functions are actually named
+| something starting with __ and the normal name is an alias. */
+| #if defined (__stub_shl_load) || defined (__stub___shl_load)
+| choke me
+| #else
+| char (*f) () = shl_load;
+| #endif
+| #ifdef __cplusplus
+| }
+| #endif
+|
+| int
+| main ()
+| {
+| return f != shl_load;
+| ;
+| return 0;
+| }
+configure:8938: result: no
+configure:8943: checking for shl_load in -ldld
+configure:8973: gcc -o conftest -DHAVE_CONFIG_H conftest.c -ldld >&5
+/usr/bin/ld: cannot find -ldld
+collect2: error: ld returned 1 exit status
+configure:8979: $? = 1
+configure: failed program was:
+| /* confdefs.h. */
+|
+| #define PACKAGE_NAME ""
+| #define PACKAGE_TARNAME ""
+| #define PACKAGE_VERSION ""
+| #define PACKAGE_STRING ""
+| #define PACKAGE_BUGREPORT ""
+| #define PACKAGE "mod_jk"
+| #define VERSION "1.2.32"
+| #define STDC_HEADERS 1
+| #define HAVE_SYS_TYPES_H 1
+| #define HAVE_SYS_STAT_H 1
+| #define HAVE_STDLIB_H 1
+| #define HAVE_STRING_H 1
+| #define HAVE_MEMORY_H 1
+| #define HAVE_STRINGS_H 1
+| #define HAVE_INTTYPES_H 1
+| #define HAVE_STDINT_H 1
+| #define HAVE_UNISTD_H 1
+| #define HAVE_DLFCN_H 1
+| #ifdef __cplusplus
+| extern "C" void exit (int) throw ();
+| #endif
+| /* end confdefs.h. */
+|
+| /* Override any gcc2 internal prototype to avoid an error. */
+| #ifdef __cplusplus
+| extern "C"
+| #endif
+| /* We use char because int might match the return type of a gcc2
+| builtin and then its argument prototype would still apply. */
+| char shl_load ();
+| int
+| main ()
+| {
+| shl_load ();
+| ;
+| return 0;
+| }
+configure:9005: result: no
+configure:9010: checking for dlopen
+configure:9067: gcc -o conftest -DHAVE_CONFIG_H conftest.c >&5
+/tmp/ccIXcDgl.o: In function `main':
+conftest.c:(.text+0xd): undefined reference to `dlopen'
+/tmp/ccIXcDgl.o:(.data+0x0): undefined reference to `dlopen'
+collect2: error: ld returned 1 exit status
+configure:9073: $? = 1
+configure: failed program was:
+| /* confdefs.h. */
+|
+| #define PACKAGE_NAME ""
+| #define PACKAGE_TARNAME ""
+| #define PACKAGE_VERSION ""
+| #define PACKAGE_STRING ""
+| #define PACKAGE_BUGREPORT ""
+| #define PACKAGE "mod_jk"
+| #define VERSION "1.2.32"
+| #define STDC_HEADERS 1
+| #define HAVE_SYS_TYPES_H 1
+| #define HAVE_SYS_STAT_H 1
+| #define HAVE_STDLIB_H 1
+| #define HAVE_STRING_H 1
+| #define HAVE_MEMORY_H 1
+| #define HAVE_STRINGS_H 1
+| #define HAVE_INTTYPES_H 1
+| #define HAVE_STDINT_H 1
+| #define HAVE_UNISTD_H 1
+| #define HAVE_DLFCN_H 1
+| #ifdef __cplusplus
+| extern "C" void exit (int) throw ();
+| #endif
+| /* end confdefs.h. */
+| /* Define dlopen to an innocuous variant, in case <limits.h> declares dlopen.
+| For example, HP-UX 11i <limits.h> declares gettimeofday. */
+| #define dlopen innocuous_dlopen
+|
+| /* System header to define __stub macros and hopefully few prototypes,
+| which can conflict with char dlopen (); below.
+| Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+| <limits.h> exists even on freestanding compilers. */
+|
+| #ifdef __STDC__
+| # include <limits.h>
+| #else
+| # include <assert.h>
+| #endif
+|
+| #undef dlopen
+|
+| /* Override any gcc2 internal prototype to avoid an error. */
+| #ifdef __cplusplus
+| extern "C"
+| {
+| #endif
+| /* We use char because int might match the return type of a gcc2
+| builtin and then its argument prototype would still apply. */
+| char dlopen ();
+| /* The GNU C library defines this for functions which it implements
+| to always fail with ENOSYS. Some functions are actually named
+| something starting with __ and the normal name is an alias. */
+| #if defined (__stub_dlopen) || defined (__stub___dlopen)
+| choke me
+| #else
+| char (*f) () = dlopen;
+| #endif
+| #ifdef __cplusplus
+| }
+| #endif
+|
+| int
+| main ()
+| {
+| return f != dlopen;
+| ;
+| return 0;
+| }
+configure:9098: result: no
+configure:9103: checking for dlopen in -ldl
+configure:9133: gcc -o conftest -DHAVE_CONFIG_H conftest.c -ldl >&5
+configure:9139: $? = 0
+configure:9143: test -z
+ || test ! -s conftest.err
+configure:9146: $? = 0
+configure:9149: test -s conftest
+configure:9152: $? = 0
+configure:9165: result: yes
+configure:9340: checking whether a program can dlopen itself
+configure:9412: gcc -o conftest -DHAVE_CONFIG_H -DHAVE_DLFCN_H -Wl,--export-dynamic conftest.c -ldl >&5
+configure: In function 'main':
+configure:9408:5: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default]
+
+ ^
+configure:9415: $? = 0
+configure:9433: result: yes
+configure:9438: checking whether a statically linked program can dlopen itself
+configure:9510: gcc -o conftest -DHAVE_CONFIG_H -DHAVE_DLFCN_H -Wl,--export-dynamic conftest.c -ldl >&5
+configure: In function 'main':
+configure:9506:5: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default]
+
+ ^
+configure:9513: $? = 0
+configure:9531: result: yes
+configure:9554: checking if libtool supports shared libraries
+configure:9556: result: yes
+configure:9559: checking whether to build shared libraries
+configure:9617: result: yes
+configure:9620: checking whether to build static libraries
+configure:9624: result: yes
+configure:9716: creating libtool
+configure:10263: checking for ld used by g++
+configure:10330: result: /usr/bin/ld -m elf_x86_64
+configure:10339: checking if the linker (/usr/bin/ld -m elf_x86_64) is GNU ld
+configure:10354: result: yes
+configure:10405: checking whether the g++ linker (/usr/bin/ld -m elf_x86_64) supports shared libraries
+configure:11233: result: yes
+configure:11251: g++ -c -g -O2 conftest.cc >&5
+configure:11254: $? = 0
+configure:11350: checking for g++ option to produce PIC
+configure:11602: result: -fPIC
+configure:11610: checking if g++ PIC flag -fPIC works
+configure:11628: g++ -c -g -O2 -fPIC -DPIC conftest.cc >&5
+configure:11632: $? = 0
+configure:11643: result: yes
+configure:11667: checking if g++ supports -c -o file.o
+configure:11688: g++ -c -g -O2 -o out/conftest2.o conftest.cc >&5
+configure:11692: $? = 0
+configure:11712: result: yes
+configure:11738: checking whether the g++ linker (/usr/bin/ld -m elf_x86_64) supports shared libraries
+configure:11763: result: yes
+configure:11834: checking dynamic linker characteristics
+configure:12200: g++ -c -g -O2 conftest.cc >&5
+configure:12203: $? = 0
+configure:12395: result: GNU/Linux ld.so
+configure:12399: checking how to hardcode library paths into programs
+configure:12424: result: immediate
+configure:12438: checking whether stripping libraries is possible
+configure:12443: result: yes
+configure:12569: checking for shl_load
+configure:12657: result: no
+configure:12662: checking for shl_load in -ldld
+configure:12724: result: no
+configure:12729: checking for dlopen
+configure:12817: result: no
+configure:12822: checking for dlopen in -ldl
+configure:12884: result: yes
+configure:13059: checking whether a program can dlopen itself
+configure:13152: result: yes
+configure:13157: checking whether a statically linked program can dlopen itself
+configure:13250: result: yes
+configure:19724: result: LIBTOOL="/bin/bash /bottlenecks/rubbos/app/apache2/build/libtool --silent"
+configure:19730: checking for char
+configure:19754: gcc -c -DHAVE_CONFIG_H conftest.c >&5
+configure:19760: $? = 0
+configure:19764: test -z
+ || test ! -s conftest.err
+configure:19767: $? = 0
+configure:19770: test -s conftest.o
+configure:19773: $? = 0
+configure:19784: result: yes
+configure:19787: checking size of char
+configure:20106: gcc -o conftest -DHAVE_CONFIG_H conftest.c >&5
+configure:20109: $? = 0
+configure:20111: ./conftest
+configure:20114: $? = 0
+configure:20137: result: 1
+configure:20144: checking for int
+configure:20168: gcc -c -DHAVE_CONFIG_H conftest.c >&5
+configure:20174: $? = 0
+configure:20178: test -z
+ || test ! -s conftest.err
+configure:20181: $? = 0
+configure:20184: test -s conftest.o
+configure:20187: $? = 0
+configure:20198: result: yes
+configure:20201: checking size of int
+configure:20520: gcc -o conftest -DHAVE_CONFIG_H conftest.c >&5
+configure:20523: $? = 0
+configure:20525: ./conftest
+configure:20528: $? = 0
+configure:20551: result: 4
+configure:20558: checking for long
+configure:20582: gcc -c -DHAVE_CONFIG_H conftest.c >&5
+configure:20588: $? = 0
+configure:20592: test -z
+ || test ! -s conftest.err
+configure:20595: $? = 0
+configure:20598: test -s conftest.o
+configure:20601: $? = 0
+configure:20612: result: yes
+configure:20615: checking size of long
+configure:20934: gcc -o conftest -DHAVE_CONFIG_H conftest.c >&5
+configure:20937: $? = 0
+configure:20939: ./conftest
+configure:20942: $? = 0
+configure:20965: result: 8
+configure:20972: checking for short
+configure:20996: gcc -c -DHAVE_CONFIG_H conftest.c >&5
+configure:21002: $? = 0
+configure:21006: test -z
+ || test ! -s conftest.err
+configure:21009: $? = 0
+configure:21012: test -s conftest.o
+configure:21015: $? = 0
+configure:21026: result: yes
+configure:21029: checking size of short
+configure:21348: gcc -o conftest -DHAVE_CONFIG_H conftest.c >&5
+configure:21351: $? = 0
+configure:21353: ./conftest
+configure:21356: $? = 0
+configure:21379: result: 2
+configure:21386: checking for long double
+configure:21410: gcc -c -DHAVE_CONFIG_H conftest.c >&5
+configure:21416: $? = 0
+configure:21420: test -z
+ || test ! -s conftest.err
+configure:21423: $? = 0
+configure:21426: test -s conftest.o
+configure:21429: $? = 0
+configure:21440: result: yes
+configure:21443: checking size of long double
+configure:21762: gcc -o conftest -DHAVE_CONFIG_H conftest.c >&5
+configure:21765: $? = 0
+configure:21767: ./conftest
+configure:21770: $? = 0
+configure:21793: result: 16
+configure:21800: checking for long long
+configure:21824: gcc -c -DHAVE_CONFIG_H conftest.c >&5
+configure:21830: $? = 0
+configure:21834: test -z
+ || test ! -s conftest.err
+configure:21837: $? = 0
+configure:21840: test -s conftest.o
+configure:21843: $? = 0
+configure:21854: result: yes
+configure:21857: checking size of long long
+configure:22176: gcc -o conftest -DHAVE_CONFIG_H conftest.c >&5
+configure:22179: $? = 0
+configure:22181: ./conftest
+configure:22184: $? = 0
+configure:22207: result: 8
+configure:22214: checking for longlong
+configure:22238: gcc -c -DHAVE_CONFIG_H conftest.c >&5
+conftest.c: In function 'main':
+conftest.c:68:6: error: 'longlong' undeclared (first use in this function)
+ if ((longlong *) 0)
+ ^
+conftest.c:68:6: note: each undeclared identifier is reported only once for each function it appears in
+conftest.c:68:16: error: expected expression before ')' token
+ if ((longlong *) 0)
+ ^
+configure:22244: $? = 1
+configure: failed program was:
+| /* confdefs.h. */
+|
+| #define PACKAGE_NAME ""
+| #define PACKAGE_TARNAME ""
+| #define PACKAGE_VERSION ""
+| #define PACKAGE_STRING ""
+| #define PACKAGE_BUGREPORT ""
+| #define PACKAGE "mod_jk"
+| #define VERSION "1.2.32"
+| #define STDC_HEADERS 1
+| #define HAVE_SYS_TYPES_H 1
+| #define HAVE_SYS_STAT_H 1
+| #define HAVE_STDLIB_H 1
+| #define HAVE_STRING_H 1
+| #define HAVE_MEMORY_H 1
+| #define HAVE_STRINGS_H 1
+| #define HAVE_INTTYPES_H 1
+| #define HAVE_STDINT_H 1
+| #define HAVE_UNISTD_H 1
+| #define HAVE_DLFCN_H 1
+| #ifdef __cplusplus
+| extern "C" void exit (int) throw ();
+| #endif
+| #define SIZEOF_CHAR 1
+| #define SIZEOF_INT 4
+| #define SIZEOF_LONG 8
+| #define SIZEOF_SHORT 2
+| #define SIZEOF_LONG_DOUBLE 16
+| #define SIZEOF_LONG_LONG 8
+| /* end confdefs.h. */
+| #include <stdio.h>
+| #if HAVE_SYS_TYPES_H
+| # include <sys/types.h>
+| #endif
+| #if HAVE_SYS_STAT_H
+| # include <sys/stat.h>
+| #endif
+| #if STDC_HEADERS
+| # include <stdlib.h>
+| # include <stddef.h>
+| #else
+| # if HAVE_STDLIB_H
+| # include <stdlib.h>
+| # endif
+| #endif
+| #if HAVE_STRING_H
+| # if !STDC_HEADERS && HAVE_MEMORY_H
+| # include <memory.h>
+| # endif
+| # include <string.h>
+| #endif
+| #if HAVE_STRINGS_H
+| # include <strings.h>
+| #endif
+| #if HAVE_INTTYPES_H
+| # include <inttypes.h>
+| #else
+| # if HAVE_STDINT_H
+| # include <stdint.h>
+| # endif
+| #endif
+| #if HAVE_UNISTD_H
+| # include <unistd.h>
+| #endif
+| int
+| main ()
+| {
+| if ((longlong *) 0)
+| return 0;
+| if (sizeof (longlong))
+| return 0;
+| ;
+| return 0;
+| }
+configure:22268: result: no
+configure:22271: checking size of longlong
+configure:22621: result: 0
+configure:22690: checking size of pid_t
+configure:22715: gcc -o conftest -DHAVE_CONFIG_H conftest.c >&5
+conftest.c: In function 'main':
+conftest.c:37:11: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default]
+ if (!f) exit(1);
+ ^
+conftest.c:38:3: warning: format '%d' expects argument of type 'int', but argument 3 has type 'long unsigned int' [-Wformat=]
+ fprintf(f, "%d\n", sizeof(pid_t));
+ ^
+configure:22718: $? = 0
+configure:22720: ./conftest
+configure:22723: $? = 0
+configure:22737: result: 4
+configure:22758: checking size of pthread_t
+configure:22783: gcc -o conftest -DHAVE_CONFIG_H conftest.c >&5
+conftest.c: In function 'main':
+conftest.c:38:11: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default]
+ if (!f) exit(1);
+ ^
+conftest.c:39:3: warning: format '%d' expects argument of type 'int', but argument 3 has type 'long unsigned int' [-Wformat=]
+ fprintf(f, "%d\n", sizeof(pthread_t));
+ ^
+configure:22786: $? = 0
+configure:22788: ./conftest
+configure:22791: $? = 0
+configure:22805: result: 8
+configure:22854: checking for snprintf
+configure:22911: gcc -o conftest -DHAVE_CONFIG_H conftest.c >&5
+conftest.c:58:6: warning: conflicting types for built-in function 'snprintf' [enabled by default]
+ char snprintf ();
+ ^
+configure:22917: $? = 0
+configure:22921: test -z
+ || test ! -s conftest.err
+configure:22924: $? = 0
+configure:22927: test -s conftest
+configure:22930: $? = 0
+configure:22942: result: yes
+configure:22952: checking for vsnprintf
+configure:23009: gcc -o conftest -DHAVE_CONFIG_H conftest.c >&5
+conftest.c:59:6: warning: conflicting types for built-in function 'vsnprintf' [enabled by default]
+ char vsnprintf ();
+ ^
+configure:23015: $? = 0
+configure:23019: test -z
+ || test ! -s conftest.err
+configure:23022: $? = 0
+configure:23025: test -s conftest
+configure:23028: $? = 0
+configure:23040: result: yes
+configure:23050: checking for flock
+configure:23107: gcc -o conftest -DHAVE_CONFIG_H conftest.c >&5
+configure:23113: $? = 0
+configure:23117: test -z
+ || test ! -s conftest.err
+configure:23120: $? = 0
+configure:23123: test -s conftest
+configure:23126: $? = 0
+configure:23138: result: yes
+configure:23149: checking for setsockopt in -lsocket
+configure:23179: gcc -o conftest -DHAVE_CONFIG_H conftest.c -lsocket >&5
+/usr/bin/ld: cannot find -lsocket
+collect2: error: ld returned 1 exit status
+configure:23185: $? = 1
+configure: failed program was:
+| /* confdefs.h. */
+|
+| #define PACKAGE_NAME ""
+| #define PACKAGE_TARNAME ""
+| #define PACKAGE_VERSION ""
+| #define PACKAGE_STRING ""
+| #define PACKAGE_BUGREPORT ""
+| #define PACKAGE "mod_jk"
+| #define VERSION "1.2.32"
+| #define STDC_HEADERS 1
+| #define HAVE_SYS_TYPES_H 1
+| #define HAVE_SYS_STAT_H 1
+| #define HAVE_STDLIB_H 1
+| #define HAVE_STRING_H 1
+| #define HAVE_MEMORY_H 1
+| #define HAVE_STRINGS_H 1
+| #define HAVE_INTTYPES_H 1
+| #define HAVE_STDINT_H 1
+| #define HAVE_UNISTD_H 1
+| #define HAVE_DLFCN_H 1
+| #ifdef __cplusplus
+| extern "C" void exit (int) throw ();
+| #endif
+| #define SIZEOF_CHAR 1
+| #define SIZEOF_INT 4
+| #define SIZEOF_LONG 8
+| #define SIZEOF_SHORT 2
+| #define SIZEOF_LONG_DOUBLE 16
+| #define SIZEOF_LONG_LONG 8
+| #define SIZEOF_LONGLONG 0
+| #define SIZEOF_PID_T 4
+| #define SIZEOF_PTHREAD_T 8
+| #define HAVE_SNPRINTF 1
+| #define HAVE_VSNPRINTF 1
+| #define HAVE_FLOCK 1
+| /* end confdefs.h. */
+|
+| /* Override any gcc2 internal prototype to avoid an error. */
+| #ifdef __cplusplus
+| extern "C"
+| #endif
+| /* We use char because int might match the return type of a gcc2
+| builtin and then its argument prototype would still apply. */
+| char setsockopt ();
+| int
+| main ()
+| {
+| setsockopt ();
+| ;
+| return 0;
+| }
+configure:23211: result: no
+configure:23232: checking sys/filio.h usability
+configure:23244: gcc -c -DHAVE_CONFIG_H conftest.c >&5
+conftest.c:71:23: fatal error: sys/filio.h: No such file or directory
+ #include <sys/filio.h>
+ ^
+compilation terminated.
+configure:23250: $? = 1
+configure: failed program was:
+| /* confdefs.h. */
+|
+| #define PACKAGE_NAME ""
+| #define PACKAGE_TARNAME ""
+| #define PACKAGE_VERSION ""
+| #define PACKAGE_STRING ""
+| #define PACKAGE_BUGREPORT ""
+| #define PACKAGE "mod_jk"
+| #define VERSION "1.2.32"
+| #define STDC_HEADERS 1
+| #define HAVE_SYS_TYPES_H 1
+| #define HAVE_SYS_STAT_H 1
+| #define HAVE_STDLIB_H 1
+| #define HAVE_STRING_H 1
+| #define HAVE_MEMORY_H 1
+| #define HAVE_STRINGS_H 1
+| #define HAVE_INTTYPES_H 1
+| #define HAVE_STDINT_H 1
+| #define HAVE_UNISTD_H 1
+| #define HAVE_DLFCN_H 1
+| #ifdef __cplusplus
+| extern "C" void exit (int) throw ();
+| #endif
+| #define SIZEOF_CHAR 1
+| #define SIZEOF_INT 4
+| #define SIZEOF_LONG 8
+| #define SIZEOF_SHORT 2
+| #define SIZEOF_LONG_DOUBLE 16
+| #define SIZEOF_LONG_LONG 8
+| #define SIZEOF_LONGLONG 0
+| #define SIZEOF_PID_T 4
+| #define SIZEOF_PTHREAD_T 8
+| #define HAVE_SNPRINTF 1
+| #define HAVE_VSNPRINTF 1
+| #define HAVE_FLOCK 1
+| /* end confdefs.h. */
+| #include <stdio.h>
+| #if HAVE_SYS_TYPES_H
+| # include <sys/types.h>
+| #endif
+| #if HAVE_SYS_STAT_H
+| # include <sys/stat.h>
+| #endif
+| #if STDC_HEADERS
+| # include <stdlib.h>
+| # include <stddef.h>
+| #else
+| # if HAVE_STDLIB_H
+| # include <stdlib.h>
+| # endif
+| #endif
+| #if HAVE_STRING_H
+| # if !STDC_HEADERS && HAVE_MEMORY_H
+| # include <memory.h>
+| # endif
+| # include <string.h>
+| #endif
+| #if HAVE_STRINGS_H
+| # include <strings.h>
+| #endif
+| #if HAVE_INTTYPES_H
+| # include <inttypes.h>
+| #else
+| # if HAVE_STDINT_H
+| # include <stdint.h>
+| # endif
+| #endif
+| #if HAVE_UNISTD_H
+| # include <unistd.h>
+| #endif
+| #include <sys/filio.h>
+configure:23273: result: no
+configure:23277: checking sys/filio.h presence
+configure:23287: gcc -E conftest.c
+conftest.c:37:23: fatal error: sys/filio.h: No such file or directory
+ #include <sys/filio.h>
+ ^
+compilation terminated.
+configure:23293: $? = 1
+configure: failed program was:
+| /* confdefs.h. */
+|
+| #define PACKAGE_NAME ""
+| #define PACKAGE_TARNAME ""
+| #define PACKAGE_VERSION ""
+| #define PACKAGE_STRING ""
+| #define PACKAGE_BUGREPORT ""
+| #define PACKAGE "mod_jk"
+| #define VERSION "1.2.32"
+| #define STDC_HEADERS 1
+| #define HAVE_SYS_TYPES_H 1
+| #define HAVE_SYS_STAT_H 1
+| #define HAVE_STDLIB_H 1
+| #define HAVE_STRING_H 1
+| #define HAVE_MEMORY_H 1
+| #define HAVE_STRINGS_H 1
+| #define HAVE_INTTYPES_H 1
+| #define HAVE_STDINT_H 1
+| #define HAVE_UNISTD_H 1
+| #define HAVE_DLFCN_H 1
+| #ifdef __cplusplus
+| extern "C" void exit (int) throw ();
+| #endif
+| #define SIZEOF_CHAR 1
+| #define SIZEOF_INT 4
+| #define SIZEOF_LONG 8
+| #define SIZEOF_SHORT 2
+| #define SIZEOF_LONG_DOUBLE 16
+| #define SIZEOF_LONG_LONG 8
+| #define SIZEOF_LONGLONG 0
+| #define SIZEOF_PID_T 4
+| #define SIZEOF_PTHREAD_T 8
+| #define HAVE_SNPRINTF 1
+| #define HAVE_VSNPRINTF 1
+| #define HAVE_FLOCK 1
+| /* end confdefs.h. */
+| #include <sys/filio.h>
+configure:23313: result: no
+configure:23348: checking for sys/filio.h
+configure:23355: result: no
+configure:23371: checking whether to use SO_RCVTIMEO with setsockopt()
+configure:23416: gcc -o conftest -DHAVE_CONFIG_H conftest.c >&5
+conftest.c: In function 'main':
+conftest.c:53:9: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default]
+ exit(2);
+ ^
+configure:23419: $? = 0
+configure:23421: ./conftest
+configure:23424: $? = 0
+configure:23426: result: yes
+configure:23447: checking whether to use SO_SNDTIMEO with setsockopt()
+configure:23492: gcc -o conftest -DHAVE_CONFIG_H conftest.c >&5
+conftest.c: In function 'main':
+conftest.c:54:9: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default]
+ exit(2);
+ ^
+configure:23495: $? = 0
+configure:23497: ./conftest
+configure:23500: $? = 0
+configure:23502: result: yes
+configure:23525: checking whether to use SOCK_CLOEXEC with socket()
+configure:23562: gcc -o conftest -DHAVE_CONFIG_H conftest.c >&5
+conftest.c: In function 'main':
+conftest.c:52:9: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default]
+ exit(2);
+ ^
+configure:23565: $? = 0
+configure:23567: ./conftest
+configure:23570: $? = 0
+configure:23572: result: yes
+configure:23607: checking poll.h usability
+configure:23619: gcc -c -DHAVE_CONFIG_H conftest.c >&5
+configure:23625: $? = 0
+configure:23629: test -z
+ || test ! -s conftest.err
+configure:23632: $? = 0
+configure:23635: test -s conftest.o
+configure:23638: $? = 0
+configure:23648: result: yes
+configure:23652: checking poll.h presence
+configure:23662: gcc -E conftest.c
+configure:23668: $? = 0
+configure:23688: result: yes
+configure:23723: checking for poll.h
+configure:23730: result: yes
+configure:23743: checking for poll
+configure:23800: gcc -o conftest -DHAVE_CONFIG_H conftest.c >&5
+configure:23806: $? = 0
+configure:23810: test -z
+ || test ! -s conftest.err
+configure:23813: $? = 0
+configure:23816: test -s conftest
+configure:23819: $? = 0
+configure:23831: result: yes
+configure:23844: checking for target platform
+configure:23868: result: unix
+configure:23955: result: no apache given
+configure:23981: result: no netscape given
+configure:23991: result: jni enable (need JDK)
+configure:24133: checking for JDK location (please wait)
+configure:24163: result: /bottlenecks/rubbos/app/jdk1.6.0_27
+configure:24256: checking Java platform
+configure:24269: result: forced Java 1
+configure:24296: checking os_type directory
+configure:24480: creating ./config.status
+
+## ---------------------- ##
+## Running config.status. ##
+## ---------------------- ##
+
+This file was extended by config.status, which was
+generated by GNU Autoconf 2.59. Invocation command line was
+
+ CONFIG_FILES =
+ CONFIG_HEADERS =
+ CONFIG_LINKS =
+ CONFIG_COMMANDS =
+ $ ./config.status
+
+on ubuntu
+
+config.status:760: creating Makefile
+config.status:760: creating apache-1.3/Makefile
+config.status:760: creating apache-1.3/Makefile.apxs
+config.status:760: creating apache-2.0/Makefile
+config.status:760: creating apache-2.0/Makefile.apxs
+config.status:760: creating common/Makefile
+config.status:760: creating common/list.mk
+config.status:760: creating common/jk_types.h
+config.status:760: creating jni/Makefile
+config.status:864: creating common/config.h
+config.status:1006: common/config.h is unchanged
+config.status:1186: executing depfiles commands
+configure:25838: WARNING: ===========================================
+configure:25840: WARNING: You have used one of the following options:
+configure:25842: WARNING: --enable-jni
+configure:25844: WARNING: --with-java-home
+configure:25846: WARNING: --with-java-platform
+configure:25848: WARNING: --with-os-type
+configure:25850: WARNING: These options are only necessary if
+configure:25852: WARNING: you want to use a worker of type jni.
+configure:25854: WARNING: These workers have been deprecated.
+configure:25856: WARNING: They do not work and will be removed from
+configure:25858: WARNING: a future release
+configure:25860: WARNING: ===========================================
+
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+
+ac_cv_build=x86_64-unknown-linux-gnu
+ac_cv_build_alias=x86_64-unknown-linux-gnu
+ac_cv_c_compiler_gnu=yes
+ac_cv_cxx_compiler_gnu=yes
+ac_cv_env_CC_set=
+ac_cv_env_CC_value=
+ac_cv_env_CFLAGS_set=
+ac_cv_env_CFLAGS_value=
+ac_cv_env_CPPFLAGS_set=
+ac_cv_env_CPPFLAGS_value=
+ac_cv_env_CPP_set=
+ac_cv_env_CPP_value=
+ac_cv_env_CXXCPP_set=
+ac_cv_env_CXXCPP_value=
+ac_cv_env_CXXFLAGS_set=
+ac_cv_env_CXXFLAGS_value=
+ac_cv_env_CXX_set=
+ac_cv_env_CXX_value=
+ac_cv_env_F77_set=
+ac_cv_env_F77_value=
+ac_cv_env_FFLAGS_set=
+ac_cv_env_FFLAGS_value=
+ac_cv_env_LDFLAGS_set=
+ac_cv_env_LDFLAGS_value=
+ac_cv_env_build_alias_set=
+ac_cv_env_build_alias_value=
+ac_cv_env_host_alias_set=
+ac_cv_env_host_alias_value=
+ac_cv_env_target_alias_set=
+ac_cv_env_target_alias_value=
+ac_cv_exeext=
+ac_cv_f77_compiler_gnu=no
+ac_cv_func_dlopen=no
+ac_cv_func_flock=yes
+ac_cv_func_poll=yes
+ac_cv_func_shl_load=no
+ac_cv_func_snprintf=yes
+ac_cv_func_vsnprintf=yes
+ac_cv_header_dlfcn_h=yes
+ac_cv_header_inttypes_h=yes
+ac_cv_header_memory_h=yes
+ac_cv_header_poll_h=yes
+ac_cv_header_stdc=yes
+ac_cv_header_stdint_h=yes
+ac_cv_header_stdlib_h=yes
+ac_cv_header_string_h=yes
+ac_cv_header_strings_h=yes
+ac_cv_header_sys_filio_h=no
+ac_cv_header_sys_stat_h=yes
+ac_cv_header_sys_types_h=yes
+ac_cv_header_unistd_h=yes
+ac_cv_host=x86_64-unknown-linux-gnu
+ac_cv_host_alias=x86_64-unknown-linux-gnu
+ac_cv_lib_dl_dlopen=yes
+ac_cv_lib_dld_shl_load=no
+ac_cv_lib_socket_setsockopt=no
+ac_cv_objext=o
+ac_cv_path_CP=/bin/cp
+ac_cv_path_ECHO=/bin/echo
+ac_cv_path_GREP=/bin/grep
+ac_cv_path_MKDIR=/bin/mkdir
+ac_cv_path_PERL=/usr/bin/perl
+ac_cv_path_RM=/bin/rm
+ac_cv_path_SED=/bin/sed
+ac_cv_path_TEST=/usr/bin/test
+ac_cv_path_install='/usr/bin/install -c'
+ac_cv_prog_AWK=gawk
+ac_cv_prog_CPP='gcc -E'
+ac_cv_prog_CXXCPP='g++ -E'
+ac_cv_prog_ac_ct_AR=ar
+ac_cv_prog_ac_ct_CC=gcc
+ac_cv_prog_ac_ct_CXX=g++
+ac_cv_prog_ac_ct_RANLIB=ranlib
+ac_cv_prog_ac_ct_STRIP=strip
+ac_cv_prog_cc_g=yes
+ac_cv_prog_cc_stdc=
+ac_cv_prog_cxx_g=yes
+ac_cv_prog_egrep='grep -E'
+ac_cv_prog_f77_g=no
+ac_cv_prog_make_make_set=yes
+ac_cv_sizeof_char=1
+ac_cv_sizeof_int=4
+ac_cv_sizeof_long=8
+ac_cv_sizeof_long_double=16
+ac_cv_sizeof_long_long=8
+ac_cv_sizeof_longlong=0
+ac_cv_sizeof_pid_t=4
+ac_cv_sizeof_pthread_t=8
+ac_cv_sizeof_short=2
+ac_cv_target=x86_64-unknown-linux-gnu
+ac_cv_target_alias=x86_64-unknown-linux-gnu
+ac_cv_type_char=yes
+ac_cv_type_int=yes
+ac_cv_type_long=yes
+ac_cv_type_long_double=yes
+ac_cv_type_long_long=yes
+ac_cv_type_longlong=no
+ac_cv_type_short=yes
+am_cv_CC_dependencies_compiler_type=none
+am_cv_CXX_dependencies_compiler_type=none
+lt_cv_deplibs_check_method=pass_all
+lt_cv_dlopen=dlopen
+lt_cv_dlopen_libs=-ldl
+lt_cv_dlopen_self=yes
+lt_cv_dlopen_self_static=yes
+lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file='/lib/libc.so* /lib/libc-*.so'
+lt_cv_ld_reload_flag=-r
+lt_cv_objdir=.libs
+lt_cv_path_LD=/usr/bin/ld
+lt_cv_path_LDCXX='/usr/bin/ld -m elf_x86_64'
+lt_cv_path_NM='/usr/bin/nm -B'
+lt_cv_path_SED=/bin/sed
+lt_cv_prog_compiler_c_o=yes
+lt_cv_prog_compiler_c_o_CXX=yes
+lt_cv_prog_compiler_rtti_exceptions=no
+lt_cv_prog_gnu_ld=yes
+lt_cv_prog_gnu_ldcxx=yes
+lt_cv_sys_global_symbol_pipe='sed -n -e '\''s/^.*[ ]\([ABCDGIRSTW][ABCDGIRSTW]*\)[ ][ ]*\(\)\([_A-Za-z][_A-Za-z0-9]*\)$/\1 \2\3 \3/p'\'''
+lt_cv_sys_global_symbol_to_c_name_address='sed -n -e '\''s/^: \([^ ]*\) $/ {\"\1\", (lt_ptr) 0},/p'\'' -e '\''s/^[BCDEGRST] \([^ ]*\) \([^ ]*\)$/ {"\2", (lt_ptr) \&\2},/p'\'''
+lt_cv_sys_global_symbol_to_cdecl='sed -n -e '\''s/^. .* \(.*\)$/extern int \1;/p'\'''
+lt_cv_sys_max_cmd_len=32768
+lt_lt_cv_prog_compiler_c_o='"yes"'
+lt_lt_cv_prog_compiler_c_o_CXX='"yes"'
+lt_lt_cv_sys_global_symbol_pipe='"sed -n -e '\''s/^.*[ ]\\([ABCDGIRSTW][ABCDGIRSTW]*\\)[ ][ ]*\\(\\)\\([_A-Za-z][_A-Za-z0-9]*\\)\$/\\1 \\2\\3 \\3/p'\''"'
+lt_lt_cv_sys_global_symbol_to_c_name_address='"sed -n -e '\''s/^: \\([^ ]*\\) \$/ {\\\"\\1\\\", (lt_ptr) 0},/p'\'' -e '\''s/^[BCDEGRST] \\([^ ]*\\) \\([^ ]*\\)\$/ {\"\\2\", (lt_ptr) \\&\\2},/p'\''"'
+lt_lt_cv_sys_global_symbol_to_cdecl='"sed -n -e '\''s/^. .* \\(.*\\)\$/extern int \\1;/p'\''"'
+
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+
+ACLOCAL='${SHELL} /bottlenecks/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/missing --run aclocal-1.9'
+AMDEPBACKSLASH='\'
+AMDEP_FALSE='#'
+AMDEP_TRUE=''
+AMTAR='${SHELL} /bottlenecks/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/missing --run tar'
+APACHE20_OEXT='.c'
+APACHE_CONFIG_VARS='/bottlenecks/rubbos/app/apache2/build/config_vars.mk'
+APACHE_DIR='/bottlenecks/rubbos/app/apache2'
+APXS='/bottlenecks/rubbos/app/apache2/bin/apxs'
+APXSCFLAGS=' -g -O2 -pthread -DHAVE_APR -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include -DHAVE_CONFIG_H -DHAVE_JNI'
+APXSCPPFLAGS='-D_REENTRANT -D_GNU_SOURCE'
+APXSLDFLAGS=''
+AR='ar'
+AUTOCONF='${SHELL} /bottlenecks/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/missing --run autoconf'
+AUTOHEADER='${SHELL} /bottlenecks/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/missing --run autoheader'
+AUTOMAKE='${SHELL} /bottlenecks/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/missing --run automake-1.9'
+AWK='gawk'
+CC='gcc'
+CCDEPMODE='depmode=none'
+CFLAGS=' -DHAVE_CONFIG_H -DHAVE_JNI'
+CP='/bin/cp'
+CPP='gcc -E'
+CPPFLAGS=''
+CXX='g++'
+CXXCPP='g++ -E'
+CXXDEPMODE='depmode=none'
+CXXFLAGS='-g -O2'
+CYGPATH_W='echo'
+DEFS='-DHAVE_CONFIG_H'
+DEPDIR='.deps'
+ECHO='/bin/echo'
+ECHO_C=''
+ECHO_N='-n'
+ECHO_T=''
+EGREP='grep -E'
+EXEEXT=''
+F77=''
+FFLAGS=''
+GREP='/bin/grep'
+INSTALL_DATA='${INSTALL} -m 644'
+INSTALL_PROGRAM='${INSTALL}'
+INSTALL_SCRIPT='${INSTALL}'
+INSTALL_STRIP_PROGRAM='${SHELL} $(install_sh) -c -s'
+INSTALL_TYPE='install_dynamic'
+JAVA_HOME='/bottlenecks/rubbos/app/jdk1.6.0_27'
+JK_JNI_WORKER='${JK}jk_jni_worker${OEXT}'
+LDFLAGS=''
+LIBOBJS=''
+LIBS=''
+LIBTOOL='/bin/bash /bottlenecks/rubbos/app/apache2/build/libtool --silent'
+LIB_JK_TYPE='mod_jk.so'
+LN_S='ln -s'
+LTLIBOBJS=''
+MAKEINFO='${SHELL} /bottlenecks/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/missing --run makeinfo'
+MAKE_DYNAMIC_APACHE_FALSE='#'
+MAKE_DYNAMIC_APACHE_TRUE=''
+MKDIR='/bin/mkdir'
+OBJEXT='o'
+OS='linux'
+PACKAGE='mod_jk'
+PACKAGE_BUGREPORT=''
+PACKAGE_NAME=''
+PACKAGE_STRING=''
+PACKAGE_TARNAME=''
+PACKAGE_VERSION=''
+PATH_SEPARATOR=':'
+PERL='/usr/bin/perl'
+RANLIB='ranlib'
+RM='/bin/rm'
+SED='/bin/sed'
+SET_MAKE=''
+SHELL='/bin/bash'
+STRIP='strip'
+TEST='/usr/bin/test'
+VERSION='1.2.32'
+WEBSERVER='common jni apache-2.0'
+ac_ct_AR='ar'
+ac_ct_CC='gcc'
+ac_ct_CXX='g++'
+ac_ct_F77=''
+ac_ct_RANLIB='ranlib'
+ac_ct_STRIP='strip'
+am__fastdepCC_FALSE=''
+am__fastdepCC_TRUE='#'
+am__fastdepCXX_FALSE=''
+am__fastdepCXX_TRUE='#'
+am__include='include'
+am__leading_dot='.'
+am__quote=''
+am__tar='${AMTAR} chof - "$$tardir"'
+am__untar='${AMTAR} xf -'
+apache_include='-I/bottlenecks/rubbos/app/apache2/include'
+bindir='${exec_prefix}/bin'
+build='x86_64-unknown-linux-gnu'
+build_alias=''
+build_cpu='x86_64'
+build_os='linux-gnu'
+build_vendor='unknown'
+datadir='${prefix}/share'
+exec_prefix='${prefix}'
+host='x86_64-unknown-linux-gnu'
+host_alias=''
+host_cpu='x86_64'
+host_os='linux-gnu'
+host_vendor='unknown'
+includedir='${prefix}/include'
+infodir='${prefix}/info'
+install_sh='/bottlenecks/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/install-sh'
+int32_t_fmt='#define JK_INT32_T_FMT "d"'
+int32_value='int'
+int64_t_fmt='#define JK_INT64_T_FMT "ld"'
+int64_value='long'
+libdir='${exec_prefix}/lib'
+libexecdir='${exec_prefix}/libexec'
+localstatedir='${prefix}/var'
+mandir='${prefix}/man'
+mkdir_p='mkdir -p --'
+oldincludedir='/usr/include'
+pid_t_fmt='#define JK_PID_T_FMT "d"'
+prefix='/usr/local'
+program_transform_name='s,x,x,'
+pthread_t_fmt='#define JK_PTHREAD_T_FMT "lu"'
+pthread_t_value='long'
+sbindir='${exec_prefix}/sbin'
+sharedstatedir='${prefix}/com'
+sysconfdir='${prefix}/etc'
+target='x86_64-unknown-linux-gnu'
+target_alias=''
+target_cpu='x86_64'
+target_os='linux-gnu'
+target_vendor='unknown'
+uint32_t_fmt='#define JK_UINT32_T_FMT "u"'
+uint32_t_hex_fmt='#define JK_UINT32_T_HEX_FMT "x"'
+uint64_t_fmt='#define JK_UINT64_T_FMT "lu"'
+uint64_t_hex_fmt='#define JK_UINT64_T_HEX_FMT "lx"'
+
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+
+#define HAVE_DLFCN_H 1
+#define HAVE_FLOCK 1
+#define HAVE_INTTYPES_H 1
+#define HAVE_MEMORY_H 1
+#define HAVE_POLL 1
+#define HAVE_POLL_H 1
+#define HAVE_SNPRINTF 1
+#define HAVE_STDINT_H 1
+#define HAVE_STDLIB_H 1
+#define HAVE_STRINGS_H 1
+#define HAVE_STRING_H 1
+#define HAVE_SYS_STAT_H 1
+#define HAVE_SYS_TYPES_H 1
+#define HAVE_UNISTD_H 1
+#define HAVE_VSNPRINTF 1
+#define PACKAGE "mod_jk"
+#define PACKAGE_BUGREPORT ""
+#define PACKAGE_NAME ""
+#define PACKAGE_STRING ""
+#define PACKAGE_TARNAME ""
+#define PACKAGE_VERSION ""
+#define SIZEOF_CHAR 1
+#define SIZEOF_INT 4
+#define SIZEOF_LONG 8
+#define SIZEOF_LONGLONG 0
+#define SIZEOF_LONG_DOUBLE 16
+#define SIZEOF_LONG_LONG 8
+#define SIZEOF_PID_T 4
+#define SIZEOF_PTHREAD_T 8
+#define SIZEOF_SHORT 2
+#define STDC_HEADERS 1
+#define USE_SOCK_CLOEXEC 1
+#define USE_SO_RCVTIMEO 1
+#define USE_SO_SNDTIMEO 1
+#define VERSION "1.2.32"
+#endif
+#ifdef __cplusplus
+extern "C" void exit (int) throw ();
+
+configure: exit 0
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/config.nice b/rubbos/app/tomcat-connectors-1.2.32-src/native/config.nice
new file mode 100755
index 00000000..3eb6e7f7
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/config.nice
@@ -0,0 +1,9 @@
+#! /bin/sh
+#
+# Created by configure
+
+"./configure" \
+"--with-apxs=/bottlenecks/rubbos/app/apache2/bin/apxs" \
+"--enable-jni" \
+"--with-java-home=/bottlenecks/rubbos/app/jdk1.6.0_27" \
+"$@"
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/config.status b/rubbos/app/tomcat-connectors-1.2.32-src/native/config.status
new file mode 100755
index 00000000..f67e4715
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/config.status
@@ -0,0 +1,1277 @@
+#! /bin/bash
+# Generated by configure.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=${CONFIG_SHELL-/bin/bash}
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)$' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+ /^X\/\(\/\/\)$/{ s//\1/; q; }
+ /^X\/\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" || {
+ # Find who we are. Look in the path if we contain no path at all
+ # relative or not.
+ case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+ ;;
+ esac
+ # We did not find ourselves, most probably we were run as `sh COMMAND'
+ # in which case we are not to be found in the path.
+ if test "x$as_myself" = x; then
+ as_myself=$0
+ fi
+ if test ! -f "$as_myself"; then
+ { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ case $CONFIG_SHELL in
+ '')
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for as_base in sh bash ksh sh5; do
+ case $as_dir in
+ /*)
+ if ("$as_dir/$as_base" -c '
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
+ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+ CONFIG_SHELL=$as_dir/$as_base
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+ fi;;
+ esac
+ done
+done
+;;
+ esac
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line before each line; the second 'sed' does the real
+ # work. The second script uses 'N' to pair each line-number line
+ # with the numbered line, and appends trailing '-' during
+ # substitution so that $LINENO is not a special case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
+ sed '=' <$as_myself |
+ sed '
+ N
+ s,$,-,
+ : loop
+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+ t loop
+ s,-$,,
+ s,^['$as_cr_digits']*\n,,
+ ' >$as_me.lineno &&
+ chmod +x $as_me.lineno ||
+ { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensible to this).
+ . ./$as_me.lineno
+ # Exit status is that of the last command.
+ exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling. Logging --version etc. is OK.
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by $as_me, which was
+generated by GNU Autoconf 2.59. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+config_files=" Makefile apache-1.3/Makefile apache-1.3/Makefile.apxs apache-2.0/Makefile apache-2.0/Makefile.apxs common/Makefile common/list.mk common/jk_types.h jni/Makefile"
+config_headers=" common/config.h"
+config_commands=" depfiles"
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number, then exit
+ -q, --quiet do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <bug-autoconf@gnu.org>."
+ac_cs_version="\
+config.status
+configured by ./configure, generated by GNU Autoconf 2.59,
+ with options \"'--with-apxs=/bottlenecks/rubbos/app/apache2/bin/apxs' '--enable-jni' '--with-java-home=/bottlenecks/rubbos/app/jdk1.6.0_27'\"
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=.
+INSTALL="/usr/bin/install -c"
+# If no file are specified by the user, then we need to provide default
+# value. By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=*)
+ ac_option=`expr "x$1" : 'x\([^=]*\)='`
+ ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ -*)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ *) # This is not an option, so the user has probably given explicit
+ # arguments.
+ ac_option=$1
+ ac_need_defaults=false;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --vers* | -V )
+ echo "$ac_cs_version"; exit 0 ;;
+ --he | --h)
+ # Conflict between --help and --header
+ { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; };;
+ --help | --hel | -h )
+ echo "$ac_cs_usage"; exit 0 ;;
+ --debug | --d* | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+ ac_need_defaults=false;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; } ;;
+
+ *) ac_config_targets="$ac_config_targets $1" ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+if $ac_cs_recheck; then
+ echo "running /bin/bash ./configure " '--with-apxs=/bottlenecks/rubbos/app/apache2/bin/apxs' '--enable-jni' '--with-java-home=/bottlenecks/rubbos/app/jdk1.6.0_27' $ac_configure_extra_args " --no-create --no-recursion" >&6
+ exec /bin/bash ./configure '--with-apxs=/bottlenecks/rubbos/app/apache2/bin/apxs' '--enable-jni' '--with-java-home=/bottlenecks/rubbos/app/jdk1.6.0_27' $ac_configure_extra_args --no-create --no-recursion
+fi
+
+#
+# INIT-COMMANDS section.
+#
+
+AMDEP_TRUE="" ac_aux_dir="scripts/build/unix"
+
+for ac_config_target in $ac_config_targets
+do
+ case "$ac_config_target" in
+ # Handling of arguments.
+ "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "apache-1.3/Makefile" ) CONFIG_FILES="$CONFIG_FILES apache-1.3/Makefile" ;;
+ "apache-1.3/Makefile.apxs" ) CONFIG_FILES="$CONFIG_FILES apache-1.3/Makefile.apxs" ;;
+ "apache-2.0/Makefile" ) CONFIG_FILES="$CONFIG_FILES apache-2.0/Makefile" ;;
+ "apache-2.0/Makefile.apxs" ) CONFIG_FILES="$CONFIG_FILES apache-2.0/Makefile.apxs" ;;
+ "common/Makefile" ) CONFIG_FILES="$CONFIG_FILES common/Makefile" ;;
+ "common/list.mk" ) CONFIG_FILES="$CONFIG_FILES common/list.mk" ;;
+ "common/jk_types.h" ) CONFIG_FILES="$CONFIG_FILES common/jk_types.h" ;;
+ "jni/Makefile" ) CONFIG_FILES="$CONFIG_FILES jni/Makefile" ;;
+ "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+ "common/config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS common/config.h" ;;
+ *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+ test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason to put it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+ trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+ trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+} ||
+{
+ tmp=./confstat$$-$RANDOM
+ (umask 077 && mkdir $tmp)
+} ||
+{
+ echo "$me: cannot create a temporary directory in ." >&2
+ { (exit 1); exit 1; }
+}
+
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "$CONFIG_FILES"; then
+ # Protect against being on the right side of a sed subst in config.status.
+ sed 's/,@/@@/; s/@,/@@/; s/,;t t$/@;t t/; /@;t t$/s/[\\&,]/\\&/g;
+ s/@@/,@/; s/@@/@,/; s/@;t t$/,;t t/' >$tmp/subs.sed <<\CEOF
+s,@SHELL@,/bin/bash,;t t
+s,@PATH_SEPARATOR@,:,;t t
+s,@PACKAGE_NAME@,,;t t
+s,@PACKAGE_TARNAME@,,;t t
+s,@PACKAGE_VERSION@,,;t t
+s,@PACKAGE_STRING@,,;t t
+s,@PACKAGE_BUGREPORT@,,;t t
+s,@exec_prefix@,${prefix},;t t
+s,@prefix@,/usr/local,;t t
+s,@program_transform_name@,s,x,x,,;t t
+s,@bindir@,${exec_prefix}/bin,;t t
+s,@sbindir@,${exec_prefix}/sbin,;t t
+s,@libexecdir@,${exec_prefix}/libexec,;t t
+s,@datadir@,${prefix}/share,;t t
+s,@sysconfdir@,${prefix}/etc,;t t
+s,@sharedstatedir@,${prefix}/com,;t t
+s,@localstatedir@,${prefix}/var,;t t
+s,@libdir@,${exec_prefix}/lib,;t t
+s,@includedir@,${prefix}/include,;t t
+s,@oldincludedir@,/usr/include,;t t
+s,@infodir@,${prefix}/info,;t t
+s,@mandir@,${prefix}/man,;t t
+s,@build_alias@,,;t t
+s,@host_alias@,,;t t
+s,@target_alias@,,;t t
+s,@DEFS@,-DHAVE_CONFIG_H,;t t
+s,@ECHO_C@,,;t t
+s,@ECHO_N@,-n,;t t
+s,@ECHO_T@,,;t t
+s,@LIBS@,,;t t
+s,@build@,x86_64-unknown-linux-gnu,;t t
+s,@build_cpu@,x86_64,;t t
+s,@build_vendor@,unknown,;t t
+s,@build_os@,linux-gnu,;t t
+s,@host@,x86_64-unknown-linux-gnu,;t t
+s,@host_cpu@,x86_64,;t t
+s,@host_vendor@,unknown,;t t
+s,@host_os@,linux-gnu,;t t
+s,@target@,x86_64-unknown-linux-gnu,;t t
+s,@target_cpu@,x86_64,;t t
+s,@target_vendor@,unknown,;t t
+s,@target_os@,linux-gnu,;t t
+s,@INSTALL_PROGRAM@,${INSTALL},;t t
+s,@INSTALL_SCRIPT@,${INSTALL},;t t
+s,@INSTALL_DATA@,${INSTALL} -m 644,;t t
+s,@CYGPATH_W@,echo,;t t
+s,@PACKAGE@,mod_jk,;t t
+s,@VERSION@,1.2.32,;t t
+s,@ACLOCAL@,${SHELL} /bottlenecks/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/missing --run aclocal-1.9,;t t
+s,@AUTOCONF@,${SHELL} /bottlenecks/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/missing --run autoconf,;t t
+s,@AUTOMAKE@,${SHELL} /bottlenecks/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/missing --run automake-1.9,;t t
+s,@AUTOHEADER@,${SHELL} /bottlenecks/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/missing --run autoheader,;t t
+s,@MAKEINFO@,${SHELL} /bottlenecks/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/missing --run makeinfo,;t t
+s,@install_sh@,/bottlenecks/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/install-sh,;t t
+s,@STRIP@,strip,;t t
+s,@ac_ct_STRIP@,strip,;t t
+s,@INSTALL_STRIP_PROGRAM@,${SHELL} $(install_sh) -c -s,;t t
+s,@mkdir_p@,mkdir -p --,;t t
+s,@AWK@,gawk,;t t
+s,@SET_MAKE@,,;t t
+s,@am__leading_dot@,.,;t t
+s,@AMTAR@,${SHELL} /bottlenecks/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/missing --run tar,;t t
+s,@am__tar@,${AMTAR} chof - "$$tardir",;t t
+s,@am__untar@,${AMTAR} xf -,;t t
+s,@TEST@,/usr/bin/test,;t t
+s,@RM@,/bin/rm,;t t
+s,@GREP@,/bin/grep,;t t
+s,@ECHO@,/bin/echo,;t t
+s,@SED@,/bin/sed,;t t
+s,@CP@,/bin/cp,;t t
+s,@MKDIR@,/bin/mkdir,;t t
+s,@CFLAGS@, -DHAVE_CONFIG_H -DHAVE_JNI,;t t
+s,@PERL@,/usr/bin/perl,;t t
+s,@APXS@,/bottlenecks/rubbos/app/apache2/bin/apxs,;t t
+s,@APACHE_CONFIG_VARS@,/bottlenecks/rubbos/app/apache2/build/config_vars.mk,;t t
+s,@CC@,gcc,;t t
+s,@LDFLAGS@,,;t t
+s,@CPPFLAGS@,,;t t
+s,@ac_ct_CC@,gcc,;t t
+s,@EXEEXT@,,;t t
+s,@OBJEXT@,o,;t t
+s,@DEPDIR@,.deps,;t t
+s,@am__include@,include,;t t
+s,@am__quote@,,;t t
+s,@AMDEP_TRUE@,,;t t
+s,@AMDEP_FALSE@,#,;t t
+s,@AMDEPBACKSLASH@,\,;t t
+s,@CCDEPMODE@,depmode=none,;t t
+s,@am__fastdepCC_TRUE@,#,;t t
+s,@am__fastdepCC_FALSE@,,;t t
+s,@EGREP@,grep -E,;t t
+s,@LN_S@,ln -s,;t t
+s,@AR@,ar,;t t
+s,@ac_ct_AR@,ar,;t t
+s,@RANLIB@,ranlib,;t t
+s,@ac_ct_RANLIB@,ranlib,;t t
+s,@CPP@,gcc -E,;t t
+s,@CXX@,g++,;t t
+s,@CXXFLAGS@,-g -O2,;t t
+s,@ac_ct_CXX@,g++,;t t
+s,@CXXDEPMODE@,depmode=none,;t t
+s,@am__fastdepCXX_TRUE@,#,;t t
+s,@am__fastdepCXX_FALSE@,,;t t
+s,@CXXCPP@,g++ -E,;t t
+s,@F77@,,;t t
+s,@FFLAGS@,,;t t
+s,@ac_ct_F77@,,;t t
+s,@LIBTOOL@,/bin/bash /bottlenecks/rubbos/app/apache2/build/libtool --silent,;t t
+s,@int32_value@,int,;t t
+s,@int32_t_fmt@,#define JK_INT32_T_FMT "d",;t t
+s,@uint32_t_fmt@,#define JK_UINT32_T_FMT "u",;t t
+s,@uint32_t_hex_fmt@,#define JK_UINT32_T_HEX_FMT "x",;t t
+s,@int64_value@,long,;t t
+s,@int64_t_fmt@,#define JK_INT64_T_FMT "ld",;t t
+s,@uint64_t_fmt@,#define JK_UINT64_T_FMT "lu",;t t
+s,@uint64_t_hex_fmt@,#define JK_UINT64_T_HEX_FMT "lx",;t t
+s,@pid_t_fmt@,#define JK_PID_T_FMT "d",;t t
+s,@pthread_t_fmt@,#define JK_PTHREAD_T_FMT "lu",;t t
+s,@pthread_t_value@,long,;t t
+s,@apache_include@,-I/bottlenecks/rubbos/app/apache2/include,;t t
+s,@APACHE_DIR@,/bottlenecks/rubbos/app/apache2,;t t
+s,@JK_JNI_WORKER@,${JK}jk_jni_worker${OEXT},;t t
+s,@APXSCFLAGS@, -g -O2 -pthread -DHAVE_APR -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include -DHAVE_CONFIG_H -DHAVE_JNI,;t t
+s,@APXSCPPFLAGS@,-D_REENTRANT -D_GNU_SOURCE,;t t
+s,@APXSLDFLAGS@,,;t t
+s,@JAVA_HOME@,/bottlenecks/rubbos/app/jdk1.6.0_27,;t t
+s,@OS@,linux,;t t
+s,@WEBSERVER@,common jni apache-2.0,;t t
+s,@MAKE_DYNAMIC_APACHE_TRUE@,,;t t
+s,@MAKE_DYNAMIC_APACHE_FALSE@,#,;t t
+s,@APACHE20_OEXT@,.c,;t t
+s,@LIB_JK_TYPE@,mod_jk.so,;t t
+s,@INSTALL_TYPE@,install_dynamic,;t t
+s,@LIBOBJS@,,;t t
+s,@LTLIBOBJS@,,;t t
+CEOF
+
+ # Split the substitutions into bite-sized pieces for seds with
+ # small command number limits, like on Digital OSF/1 and HP-UX.
+ ac_max_sed_lines=48
+ ac_sed_frag=1 # Number of current file.
+ ac_beg=1 # First line for current file.
+ ac_end=$ac_max_sed_lines # Line after last line for current file.
+ ac_more_lines=:
+ ac_sed_cmds=
+ while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ else
+ sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ fi
+ if test ! -s $tmp/subs.frag; then
+ ac_more_lines=false
+ else
+ # The purpose of the label and of the branching condition is to
+ # speed up the sed processing (if there are no `@' at all, there
+ # is no need to browse any of the substitutions).
+ # These are the two extra sed commands mentioned above.
+ (echo ':t
+ /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+ fi
+ ac_sed_frag=`expr $ac_sed_frag + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_lines`
+ fi
+ done
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+ fi
+fi # test -n "$CONFIG_FILES"
+
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case $ac_file in
+ - | *:- | *:-:* ) # input from stdin
+ cat >$tmp/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
+ esac
+
+ # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+ ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
+ esac
+
+ if test x"$ac_file" != x-; then
+ { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+ rm -f "$ac_file"
+ fi
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ if test x"$ac_file" = x-; then
+ configure_input=
+ else
+ configure_input="$ac_file. "
+ fi
+ configure_input=$configure_input"Generated from `echo $ac_file_in |
+ sed 's,.*/,,'` by configure."
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo $tmp/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ echo "$f";;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo "$f"
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo "$srcdir/$f"
+ else
+ # /dev/null tree
+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+ sed "/^[ ]*VPATH[ ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[ ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[ ]*$//;
+}
+
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s,@configure_input@,$configure_input,;t t
+s,@srcdir@,$ac_srcdir,;t t
+s,@abs_srcdir@,$ac_abs_srcdir,;t t
+s,@top_srcdir@,$ac_top_srcdir,;t t
+s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s,@builddir@,$ac_builddir,;t t
+s,@abs_builddir@,$ac_abs_builddir,;t t
+s,@top_builddir@,$ac_top_builddir,;t t
+s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
+s,@INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+ rm -f $tmp/stdin
+ if test x"$ac_file" != x-; then
+ mv $tmp/out $ac_file
+ else
+ cat $tmp/out
+ rm -f $tmp/out
+ fi
+
+done
+
+#
+# CONFIG_HEADER section.
+#
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)'
+ac_dB='[ ].*$,\1#\2'
+ac_dC=' '
+ac_dD=',;t'
+# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_uB='$,\1#\2define\3'
+ac_uC=' '
+ac_uD=',;t'
+
+for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case $ac_file in
+ - | *:- | *:-:* ) # input from stdin
+ cat >$tmp/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
+ esac
+
+ test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo $tmp/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ # Do quote $f, to prevent DOS paths from being IFS'd.
+ echo "$f";;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo "$f"
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo "$srcdir/$f"
+ else
+ # /dev/null tree
+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+ # Remove the trailing spaces.
+ sed 's/[ ]*$//' $ac_file_inputs >$tmp/in
+
+ # Handle all the #define templates only if necessary.
+ if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then
+ # If there are no defines, we may have an empty if/fi
+ :
+ cat >$tmp/defines.sed <<CEOF
+/^[ ]*#[ ]*define/!b
+t clr
+: clr
+${ac_dA}PACKAGE_NAME${ac_dB}PACKAGE_NAME${ac_dC}""${ac_dD}
+${ac_dA}PACKAGE_TARNAME${ac_dB}PACKAGE_TARNAME${ac_dC}""${ac_dD}
+${ac_dA}PACKAGE_VERSION${ac_dB}PACKAGE_VERSION${ac_dC}""${ac_dD}
+${ac_dA}PACKAGE_STRING${ac_dB}PACKAGE_STRING${ac_dC}""${ac_dD}
+${ac_dA}PACKAGE_BUGREPORT${ac_dB}PACKAGE_BUGREPORT${ac_dC}""${ac_dD}
+${ac_dA}PACKAGE${ac_dB}PACKAGE${ac_dC}"mod_jk"${ac_dD}
+${ac_dA}VERSION${ac_dB}VERSION${ac_dC}"1.2.32"${ac_dD}
+${ac_dA}STDC_HEADERS${ac_dB}STDC_HEADERS${ac_dC}1${ac_dD}
+${ac_dA}HAVE_SYS_TYPES_H${ac_dB}HAVE_SYS_TYPES_H${ac_dC}1${ac_dD}
+${ac_dA}HAVE_SYS_STAT_H${ac_dB}HAVE_SYS_STAT_H${ac_dC}1${ac_dD}
+${ac_dA}HAVE_STDLIB_H${ac_dB}HAVE_STDLIB_H${ac_dC}1${ac_dD}
+${ac_dA}HAVE_STRING_H${ac_dB}HAVE_STRING_H${ac_dC}1${ac_dD}
+${ac_dA}HAVE_MEMORY_H${ac_dB}HAVE_MEMORY_H${ac_dC}1${ac_dD}
+${ac_dA}HAVE_STRINGS_H${ac_dB}HAVE_STRINGS_H${ac_dC}1${ac_dD}
+${ac_dA}HAVE_INTTYPES_H${ac_dB}HAVE_INTTYPES_H${ac_dC}1${ac_dD}
+${ac_dA}HAVE_STDINT_H${ac_dB}HAVE_STDINT_H${ac_dC}1${ac_dD}
+${ac_dA}HAVE_UNISTD_H${ac_dB}HAVE_UNISTD_H${ac_dC}1${ac_dD}
+${ac_dA}HAVE_DLFCN_H${ac_dB}HAVE_DLFCN_H${ac_dC}1${ac_dD}
+${ac_dA}SIZEOF_CHAR${ac_dB}SIZEOF_CHAR${ac_dC}1${ac_dD}
+${ac_dA}SIZEOF_INT${ac_dB}SIZEOF_INT${ac_dC}4${ac_dD}
+${ac_dA}SIZEOF_LONG${ac_dB}SIZEOF_LONG${ac_dC}8${ac_dD}
+${ac_dA}SIZEOF_SHORT${ac_dB}SIZEOF_SHORT${ac_dC}2${ac_dD}
+${ac_dA}SIZEOF_LONG_DOUBLE${ac_dB}SIZEOF_LONG_DOUBLE${ac_dC}16${ac_dD}
+${ac_dA}SIZEOF_LONG_LONG${ac_dB}SIZEOF_LONG_LONG${ac_dC}8${ac_dD}
+${ac_dA}SIZEOF_LONGLONG${ac_dB}SIZEOF_LONGLONG${ac_dC}0${ac_dD}
+${ac_dA}SIZEOF_PID_T${ac_dB}SIZEOF_PID_T${ac_dC}4${ac_dD}
+${ac_dA}SIZEOF_PTHREAD_T${ac_dB}SIZEOF_PTHREAD_T${ac_dC}8${ac_dD}
+${ac_dA}HAVE_SNPRINTF${ac_dB}HAVE_SNPRINTF${ac_dC}1${ac_dD}
+${ac_dA}HAVE_VSNPRINTF${ac_dB}HAVE_VSNPRINTF${ac_dC}1${ac_dD}
+${ac_dA}HAVE_FLOCK${ac_dB}HAVE_FLOCK${ac_dC}1${ac_dD}
+${ac_dA}USE_SO_RCVTIMEO${ac_dB}USE_SO_RCVTIMEO${ac_dC}1${ac_dD}
+${ac_dA}USE_SO_SNDTIMEO${ac_dB}USE_SO_SNDTIMEO${ac_dC}1${ac_dD}
+${ac_dA}USE_SOCK_CLOEXEC${ac_dB}USE_SOCK_CLOEXEC${ac_dC}1${ac_dD}
+${ac_dA}HAVE_POLL_H${ac_dB}HAVE_POLL_H${ac_dC}1${ac_dD}
+${ac_dA}HAVE_POLL${ac_dB}HAVE_POLL${ac_dC}1${ac_dD}
+CEOF
+ sed -f $tmp/defines.sed $tmp/in >$tmp/out
+ rm -f $tmp/in
+ mv $tmp/out $tmp/in
+
+ fi # grep
+
+ # Handle all the #undef templates
+ cat >$tmp/undefs.sed <<CEOF
+/^[ ]*#[ ]*undef/!b
+t clr
+: clr
+${ac_uA}PACKAGE_NAME${ac_uB}PACKAGE_NAME${ac_uC}""${ac_uD}
+${ac_uA}PACKAGE_TARNAME${ac_uB}PACKAGE_TARNAME${ac_uC}""${ac_uD}
+${ac_uA}PACKAGE_VERSION${ac_uB}PACKAGE_VERSION${ac_uC}""${ac_uD}
+${ac_uA}PACKAGE_STRING${ac_uB}PACKAGE_STRING${ac_uC}""${ac_uD}
+${ac_uA}PACKAGE_BUGREPORT${ac_uB}PACKAGE_BUGREPORT${ac_uC}""${ac_uD}
+${ac_uA}PACKAGE${ac_uB}PACKAGE${ac_uC}"mod_jk"${ac_uD}
+${ac_uA}VERSION${ac_uB}VERSION${ac_uC}"1.2.32"${ac_uD}
+${ac_uA}STDC_HEADERS${ac_uB}STDC_HEADERS${ac_uC}1${ac_uD}
+${ac_uA}HAVE_SYS_TYPES_H${ac_uB}HAVE_SYS_TYPES_H${ac_uC}1${ac_uD}
+${ac_uA}HAVE_SYS_STAT_H${ac_uB}HAVE_SYS_STAT_H${ac_uC}1${ac_uD}
+${ac_uA}HAVE_STDLIB_H${ac_uB}HAVE_STDLIB_H${ac_uC}1${ac_uD}
+${ac_uA}HAVE_STRING_H${ac_uB}HAVE_STRING_H${ac_uC}1${ac_uD}
+${ac_uA}HAVE_MEMORY_H${ac_uB}HAVE_MEMORY_H${ac_uC}1${ac_uD}
+${ac_uA}HAVE_STRINGS_H${ac_uB}HAVE_STRINGS_H${ac_uC}1${ac_uD}
+${ac_uA}HAVE_INTTYPES_H${ac_uB}HAVE_INTTYPES_H${ac_uC}1${ac_uD}
+${ac_uA}HAVE_STDINT_H${ac_uB}HAVE_STDINT_H${ac_uC}1${ac_uD}
+${ac_uA}HAVE_UNISTD_H${ac_uB}HAVE_UNISTD_H${ac_uC}1${ac_uD}
+${ac_uA}HAVE_DLFCN_H${ac_uB}HAVE_DLFCN_H${ac_uC}1${ac_uD}
+${ac_uA}SIZEOF_CHAR${ac_uB}SIZEOF_CHAR${ac_uC}1${ac_uD}
+${ac_uA}SIZEOF_INT${ac_uB}SIZEOF_INT${ac_uC}4${ac_uD}
+${ac_uA}SIZEOF_LONG${ac_uB}SIZEOF_LONG${ac_uC}8${ac_uD}
+${ac_uA}SIZEOF_SHORT${ac_uB}SIZEOF_SHORT${ac_uC}2${ac_uD}
+${ac_uA}SIZEOF_LONG_DOUBLE${ac_uB}SIZEOF_LONG_DOUBLE${ac_uC}16${ac_uD}
+${ac_uA}SIZEOF_LONG_LONG${ac_uB}SIZEOF_LONG_LONG${ac_uC}8${ac_uD}
+${ac_uA}SIZEOF_LONGLONG${ac_uB}SIZEOF_LONGLONG${ac_uC}0${ac_uD}
+${ac_uA}SIZEOF_PID_T${ac_uB}SIZEOF_PID_T${ac_uC}4${ac_uD}
+${ac_uA}SIZEOF_PTHREAD_T${ac_uB}SIZEOF_PTHREAD_T${ac_uC}8${ac_uD}
+${ac_uA}HAVE_SNPRINTF${ac_uB}HAVE_SNPRINTF${ac_uC}1${ac_uD}
+${ac_uA}HAVE_VSNPRINTF${ac_uB}HAVE_VSNPRINTF${ac_uC}1${ac_uD}
+${ac_uA}HAVE_FLOCK${ac_uB}HAVE_FLOCK${ac_uC}1${ac_uD}
+${ac_uA}USE_SO_RCVTIMEO${ac_uB}USE_SO_RCVTIMEO${ac_uC}1${ac_uD}
+${ac_uA}USE_SO_SNDTIMEO${ac_uB}USE_SO_SNDTIMEO${ac_uC}1${ac_uD}
+${ac_uA}USE_SOCK_CLOEXEC${ac_uB}USE_SOCK_CLOEXEC${ac_uC}1${ac_uD}
+${ac_uA}HAVE_POLL_H${ac_uB}HAVE_POLL_H${ac_uC}1${ac_uD}
+${ac_uA}HAVE_POLL${ac_uB}HAVE_POLL${ac_uC}1${ac_uD}
+s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
+CEOF
+ sed -f $tmp/undefs.sed $tmp/in >$tmp/out
+ rm -f $tmp/in
+ mv $tmp/out $tmp/in
+
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ if test x"$ac_file" = x-; then
+ echo "/* Generated by configure. */" >$tmp/config.h
+ else
+ echo "/* $ac_file. Generated by configure. */" >$tmp/config.h
+ fi
+ cat $tmp/in >>$tmp/config.h
+ rm -f $tmp/in
+ if test x"$ac_file" != x-; then
+ if diff $ac_file $tmp/config.h >/dev/null 2>&1; then
+ { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+ else
+ ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ rm -f $ac_file
+ mv $tmp/config.h $ac_file
+ fi
+ else
+ cat $tmp/config.h
+ rm -f $tmp/config.h
+ fi
+# Compute $ac_file's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $ac_file | $ac_file:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null ||
+$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X$ac_file : 'X\(//\)[^/]' \| \
+ X$ac_file : 'X\(//\)$' \| \
+ X$ac_file : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X$ac_file |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`/stamp-h$_am_stamp_count
+done
+
+#
+# CONFIG_COMMANDS section.
+#
+for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
+ ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
+ ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_dir=`(dirname "$ac_dest") 2>/dev/null ||
+$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_dest" : 'X\(//\)[^/]' \| \
+ X"$ac_dest" : 'X\(//\)$' \| \
+ X"$ac_dest" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_dest" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+
+ { echo "$as_me:$LINENO: executing $ac_dest commands" >&5
+echo "$as_me: executing $ac_dest commands" >&6;}
+ case $ac_dest in
+ depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
+ # Strip MF so we end up with the name of the file.
+ mf=`echo "$mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile or not.
+ # We used to match only the files named `Makefile.in', but
+ # some people rename them; so instead we look at the file content.
+ # Grep'ing the first line is not enough: some people post-process
+ # each Makefile.in and add a new line on top of each file to say so.
+ # So let's grep whole file.
+ if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+ dirpart=`(dirname "$mf") 2>/dev/null ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$mf" : 'X\(//\)[^/]' \| \
+ X"$mf" : 'X\(//\)$' \| \
+ X"$mf" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$mf" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ else
+ continue
+ fi
+ # Extract the definition of DEPDIR, am__include, and am__quote
+ # from the Makefile without running `make'.
+ DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+ test -z "$DEPDIR" && continue
+ am__include=`sed -n 's/^am__include = //p' < "$mf"`
+ test -z "am__include" && continue
+ am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+ # When using ansi2knr, U may be empty or an underscore; expand it
+ U=`sed -n 's/^U = //p' < "$mf"`
+ # Find all dependency output files, they are included files with
+ # $(DEPDIR) in their names. We invoke sed twice because it is the
+ # simplest approach to changing $(DEPDIR) to its actual value in the
+ # expansion.
+ for file in `sed -n "
+ s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+ # Make sure the directory exists.
+ test -f "$dirpart/$file" && continue
+ fdir=`(dirname "$file") 2>/dev/null ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$file" : 'X\(//\)[^/]' \| \
+ X"$file" : 'X\(//\)$' \| \
+ X"$file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p $dirpart/$fdir
+ else
+ as_dir=$dirpart/$fdir
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5
+echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ # echo "creating $dirpart/$file"
+ echo '# dummy' > "$dirpart/$file"
+ done
+done
+ ;;
+ esac
+done
+
+{ (exit 0); exit 0; }
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/configure b/rubbos/app/tomcat-connectors-1.2.32-src/native/configure
new file mode 100755
index 00000000..a7f0250a
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/configure
@@ -0,0 +1,25887 @@
+#! /bin/sh
+# From configure.in Id: configure.in 1054607 2011-01-03 13:13:49Z rjung .
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.59.
+#
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)$' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+ /^X\/\(\/\/\)$/{ s//\1/; q; }
+ /^X\/\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" || {
+ # Find who we are. Look in the path if we contain no path at all
+ # relative or not.
+ case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+ ;;
+ esac
+ # We did not find ourselves, most probably we were run as `sh COMMAND'
+ # in which case we are not to be found in the path.
+ if test "x$as_myself" = x; then
+ as_myself=$0
+ fi
+ if test ! -f "$as_myself"; then
+ { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
+ { (exit 1); exit 1; }; }
+ fi
+ case $CONFIG_SHELL in
+ '')
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for as_base in sh bash ksh sh5; do
+ case $as_dir in
+ /*)
+ if ("$as_dir/$as_base" -c '
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
+ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+ CONFIG_SHELL=$as_dir/$as_base
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+ fi;;
+ esac
+ done
+done
+;;
+ esac
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line before each line; the second 'sed' does the real
+ # work. The second script uses 'N' to pair each line-number line
+ # with the numbered line, and appends trailing '-' during
+ # substitution so that $LINENO is not a special case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
+ sed '=' <$as_myself |
+ sed '
+ N
+ s,$,-,
+ : loop
+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+ t loop
+ s,-$,,
+ s,^['$as_cr_digits']*\n,,
+ ' >$as_me.lineno &&
+ chmod +x $as_me.lineno ||
+ { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensible to this).
+ . ./$as_me.lineno
+ # Exit status is that of the last command.
+ exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+
+
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+case X$ECHO in
+X*--fallback-echo)
+ # Remove one level of quotation (which was required for Make).
+ ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','`
+ ;;
+esac
+
+echo=${ECHO-echo}
+if test "X$1" = X--no-reexec; then
+ # Discard the --no-reexec flag, and continue.
+ shift
+elif test "X$1" = X--fallback-echo; then
+ # Avoid inline document here, it may be left over
+ :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then
+ # Yippee, $echo works!
+ :
+else
+ # Restart under the correct shell.
+ exec $SHELL "$0" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+ # used as fallback echo
+ shift
+ cat <<EOF
+$*
+EOF
+ exit 0
+fi
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+if test "X${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi
+
+if test -z "$ECHO"; then
+if test "X${echo_test_string+set}" != Xset; then
+# find a string as large as possible, as long as the shell can cope with it
+ for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do
+ # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+ if (echo_test_string="`eval $cmd`") 2>/dev/null &&
+ echo_test_string="`eval $cmd`" &&
+ (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null
+ then
+ break
+ fi
+ done
+fi
+
+if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ :
+else
+ # The Solaris, AIX, and Digital Unix default echo programs unquote
+ # backslashes. This makes it impossible to quote backslashes using
+ # echo "$something" | sed 's/\\/\\\\/g'
+ #
+ # So, first we look for a working echo in the user's PATH.
+
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for dir in $PATH /usr/ucb; do
+ IFS="$lt_save_ifs"
+ if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+ test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ echo="$dir/echo"
+ break
+ fi
+ done
+ IFS="$lt_save_ifs"
+
+ if test "X$echo" = Xecho; then
+ # We didn't find a better echo, so look for alternatives.
+ if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ # This shell has a builtin print -r that does the trick.
+ echo='print -r'
+ elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
+ test "X$CONFIG_SHELL" != X/bin/ksh; then
+ # If we have ksh, try running configure again with it.
+ ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+ export ORIGINAL_CONFIG_SHELL
+ CONFIG_SHELL=/bin/ksh
+ export CONFIG_SHELL
+ exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"}
+ else
+ # Try using printf.
+ echo='printf %s\n'
+ if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ # Cool, printf works
+ :
+ elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
+ test "X$echo_testing_string" = 'X\t' &&
+ echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+ export CONFIG_SHELL
+ SHELL="$CONFIG_SHELL"
+ export SHELL
+ echo="$CONFIG_SHELL $0 --fallback-echo"
+ elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
+ test "X$echo_testing_string" = 'X\t' &&
+ echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ echo="$CONFIG_SHELL $0 --fallback-echo"
+ else
+ # maybe with a smaller string...
+ prev=:
+
+ for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do
+ if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null
+ then
+ break
+ fi
+ prev="$cmd"
+ done
+
+ if test "$prev" != 'sed 50q "$0"'; then
+ echo_test_string=`eval $prev`
+ export echo_test_string
+ exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"}
+ else
+ # Oops. We lost completely, so just stick with echo.
+ echo=echo
+ fi
+ fi
+ fi
+ fi
+fi
+fi
+
+# Copy echo and quote the copy suitably for passing to libtool from
+# the Makefile, instead of quoting the original, which is used later.
+ECHO=$echo
+if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then
+ ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo"
+fi
+
+
+
+
+tagnames=${tagnames+${tagnames},}CXX
+
+tagnames=${tagnames+${tagnames},}F77
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_config_libobj_dir=.
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete. It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: ${ac_max_here_lines=38}
+
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+
+ac_unique_file="common/jk_worker.h"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#if STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# if HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+#if HAVE_STRING_H
+# if !STDC_HEADERS && HAVE_MEMORY_H
+# include <memory.h>
+# endif
+# include <string.h>
+#endif
+#if HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+# include <stdint.h>
+# endif
+#endif
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar TEST RM GREP ECHO SED CP MKDIR CFLAGS PERL APXS APACHE_CONFIG_VARS CC LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE EGREP LN_S AR ac_ct_AR RANLIB ac_ct_RANLIB CPP CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL int32_value int32_t_fmt uint32_t_fmt uint32_t_hex_fmt int64_value int64_t_fmt uint64_t_fmt uint64_t_hex_fmt pid_t_fmt pthread_t_fmt pthread_t_value apache_include APACHE_DIR JK_JNI_WORKER APXSCFLAGS APXSCPPFLAGS APXSLDFLAGS JAVA_HOME OS WEBSERVER MAKE_DYNAMIC_APACHE_TRUE MAKE_DYNAMIC_APACHE_FALSE APACHE20_OEXT LIB_JK_TYPE INSTALL_TYPE LIBOBJS LTLIBOBJS'
+ac_subst_files=''
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+ac_prev=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $ac_option in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ eval "enable_$ac_feature=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ case $ac_option in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_$ac_feature='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case $ac_option in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_$ac_package='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package | sed 's/-/_/g'`
+ eval "with_$ac_package=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+ { (exit 1); exit 1; }; }
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+ { (exit 1); exit 1; }; }
+ ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+ eval "$ac_envvar='$ac_optarg'"
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ { echo "$as_me: error: missing argument to $ac_option" >&2
+ { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+ eval ac_val=$`echo $ac_var`
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
+ localstatedir libdir includedir oldincludedir infodir mandir
+do
+ eval ac_val=$`echo $ac_var`
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) ;;
+ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+ If a cross compiler is detected then cross compile mode will be used." >&2
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_confdir=`(dirname "$0") 2>/dev/null ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$0" : 'X\(//\)[^/]' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$0" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+ { (exit 1); exit 1; }; }
+ else
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+ { (exit 1); exit 1; }; }
+ fi
+fi
+(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
+ { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
+ { (exit 1); exit 1; }; }
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_CC_set=${CC+set}
+ac_env_CC_value=$CC
+ac_cv_env_CC_set=${CC+set}
+ac_cv_env_CC_value=$CC
+ac_env_CFLAGS_set=${CFLAGS+set}
+ac_env_CFLAGS_value=$CFLAGS
+ac_cv_env_CFLAGS_set=${CFLAGS+set}
+ac_cv_env_CFLAGS_value=$CFLAGS
+ac_env_LDFLAGS_set=${LDFLAGS+set}
+ac_env_LDFLAGS_value=$LDFLAGS
+ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
+ac_cv_env_LDFLAGS_value=$LDFLAGS
+ac_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_env_CPPFLAGS_value=$CPPFLAGS
+ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_cv_env_CPPFLAGS_value=$CPPFLAGS
+ac_env_CPP_set=${CPP+set}
+ac_env_CPP_value=$CPP
+ac_cv_env_CPP_set=${CPP+set}
+ac_cv_env_CPP_value=$CPP
+ac_env_CXX_set=${CXX+set}
+ac_env_CXX_value=$CXX
+ac_cv_env_CXX_set=${CXX+set}
+ac_cv_env_CXX_value=$CXX
+ac_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_env_CXXFLAGS_value=$CXXFLAGS
+ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_cv_env_CXXFLAGS_value=$CXXFLAGS
+ac_env_CXXCPP_set=${CXXCPP+set}
+ac_env_CXXCPP_value=$CXXCPP
+ac_cv_env_CXXCPP_set=${CXXCPP+set}
+ac_cv_env_CXXCPP_value=$CXXCPP
+ac_env_F77_set=${F77+set}
+ac_env_F77_value=$F77
+ac_cv_env_F77_set=${F77+set}
+ac_cv_env_F77_value=$F77
+ac_env_FFLAGS_set=${FFLAGS+set}
+ac_env_FFLAGS_value=$FFLAGS
+ac_cv_env_FFLAGS_set=${FFLAGS+set}
+ac_cv_env_FFLAGS_value=$FFLAGS
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+_ACEOF
+
+ cat <<_ACEOF
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --infodir=DIR info documentation [PREFIX/info]
+ --mandir=DIR man documentation [PREFIX/man]
+_ACEOF
+
+ cat <<\_ACEOF
+
+Program names:
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM run sed PROGRAM on installed program names
+
+System types:
+ --build=BUILD configure for building on BUILD [guessed]
+ --host=HOST cross-compile to build programs to run on HOST [BUILD]
+ --target=TARGET configure for building compilers for TARGET [HOST]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --disable-dependency-tracking speeds up one-time build
+ --enable-dependency-tracking do not reject slow dependency extractors
+ --enable-shared[=PKGS]
+ build shared libraries [default=yes]
+ --enable-static[=PKGS]
+ build static libraries [default=yes]
+ --enable-fast-install[=PKGS]
+ optimize for fast installation [default=yes]
+ --disable-libtool-lock avoid locking (might break parallel builds)
+ --enable-netscape=DIR Build Netscape/iPlanet/SunONE nsapi redirector
+ plugin
+ --enable-jni DEPRECATED: Build jni_connect.so and enable
+ jni_worker
+ --enable-EAPI Enable EAPI support (mod_ssl, Apache 1.3)
+ --enable-maintainer-mode
+ Turn on debugging and compile time warnings
+ --enable-prefork Turn on prefork web server mode (single-threaded)
+ --disable-trace Exclude trace log code from compilation
+ --enable-api-compatibility
+ Only use httpd API functions available in all
+ production releases. This improves binary
+ compatibility of module builds with httpd releases
+ older than the release against we build (only
+ between minor versions).
+ --enable-flock Turn on flock for shared locking if present
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-apxs[=FILE] Build shared Apache module.
+ FILE is the optional pathname to the apxs tool;
+ defaults to finding apxs in your PATH.
+ --with-gnu-ld assume the C compiler uses GNU ld [default=no]
+ --with-pic try to use only PIC/non-PIC objects [default=use
+ both]
+ --with-tags[=TAGS]
+ include additional configurations [automatic]
+ --with-apache=DIR Build static Apache module. DIR is the pathname to
+ the Apache source directory.
+ --with-java-home=DIR DEPRECATED: Where is your JDK root directory
+ --with-java-platform=VAL
+ DEPRECATED: Force the Java platform (value is 1 for
+ 1.1.x or 2 for 1.2.x or greater)
+ --with-os-type=SUBDIR DEPRECATED: Where is your JDK os-type subdirectory
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ CPPFLAGS C/C++ preprocessor flags, e.g. -I<include dir> if you have
+ headers in a nonstandard directory <include dir>
+ CPP C preprocessor
+ CXX C++ compiler command
+ CXXFLAGS C++ compiler flags
+ CXXCPP C++ preprocessor
+ F77 Fortran 77 compiler command
+ FFLAGS Fortran 77 compiler flags
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+_ACEOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ ac_popdir=`pwd`
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d $ac_dir || continue
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+ cd $ac_dir
+ # Check for guested configure; otherwise get Cygnus style configure.
+ if test -f $ac_srcdir/configure.gnu; then
+ echo
+ $SHELL $ac_srcdir/configure.gnu --help=recursive
+ elif test -f $ac_srcdir/configure; then
+ echo
+ $SHELL $ac_srcdir/configure --help=recursive
+ elif test -f $ac_srcdir/configure.ac ||
+ test -f $ac_srcdir/configure.in; then
+ echo
+ $ac_configure --help
+ else
+ echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi
+ cd $ac_popdir
+ done
+fi
+
+test -n "$ac_init_help" && exit 0
+if $ac_init_version; then
+ cat <<\_ACEOF
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit 0
+fi
+exec 5>config.log
+cat >&5 <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by $as_me, which was
+generated by GNU Autoconf 2.59. Invocation command line was
+
+ $ $0 $@
+
+_ACEOF
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+hostinfo = `(hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ echo "PATH: $as_dir"
+done
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_sep=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+ ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+ 2)
+ ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+ # Get rid of the leading space.
+ ac_sep=" "
+ ;;
+ esac
+ done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Be sure not to use single quotes in there, as some shells,
+# such as our DU 5.0 friend, will then `close' the trap.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+{
+ (set) 2>&1 |
+ case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ sed -n \
+ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+ ;;
+ *)
+ sed -n \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+}
+ echo
+
+ cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=$`echo $ac_var`
+ echo "$ac_var='"'"'$ac_val'"'"'"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ cat <<\_ASBOX
+## ------------- ##
+## Output files. ##
+## ------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=$`echo $ac_var`
+ echo "$ac_var='"'"'$ac_val'"'"'"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+ echo
+ sed "/^$/d" confdefs.h | sort
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ echo "$as_me: caught signal $ac_signal"
+ echo "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core &&
+ rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+ ' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special
+ # files actually), so we avoid doing that.
+ if test -f "$cache_file"; then
+ { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . $cache_file;;
+ *) . ./$cache_file;;
+ esac
+ fi
+else
+ { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+ sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+ eval ac_new_val="\$ac_env_${ac_var}_value"
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ { echo "$as_me:$LINENO: former value: $ac_old_val" >&5
+echo "$as_me: former value: $ac_old_val" >&2;}
+ { echo "$as_me:$LINENO: current value: $ac_new_val" >&5
+echo "$as_me: current value: $ac_new_val" >&2;}
+ ac_cache_corrupted=:
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+ ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ac_config_headers="$ac_config_headers common/config.h"
+
+ac_aux_dir=
+for ac_dir in scripts/build/unix $srcdir/scripts/build/unix; do
+ if test -f $ac_dir/install-sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f $ac_dir/install.sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ elif test -f $ac_dir/shtool; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/shtool install -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in scripts/build/unix $srcdir/scripts/build/unix" >&5
+echo "$as_me: error: cannot find install-sh or install.sh in scripts/build/unix $srcdir/scripts/build/unix" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"
+ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+# Make sure we can run config.sub.
+$ac_config_sub sun4 >/dev/null 2>&1 ||
+ { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5
+echo "$as_me: error: cannot run $ac_config_sub" >&2;}
+ { (exit 1); exit 1; }; }
+
+echo "$as_me:$LINENO: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6
+if test "${ac_cv_build+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_build_alias=$build_alias
+test -z "$ac_cv_build_alias" &&
+ ac_cv_build_alias=`$ac_config_guess`
+test -z "$ac_cv_build_alias" &&
+ { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
+echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+ { (exit 1); exit 1; }; }
+ac_cv_build=`$ac_config_sub $ac_cv_build_alias` ||
+ { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6
+build=$ac_cv_build
+build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+echo "$as_me:$LINENO: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6
+if test "${ac_cv_host+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_host_alias=$host_alias
+test -z "$ac_cv_host_alias" &&
+ ac_cv_host_alias=$ac_cv_build_alias
+ac_cv_host=`$ac_config_sub $ac_cv_host_alias` ||
+ { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6
+host=$ac_cv_host
+host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+echo "$as_me:$LINENO: checking target system type" >&5
+echo $ECHO_N "checking target system type... $ECHO_C" >&6
+if test "${ac_cv_target+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_target_alias=$target_alias
+test "x$ac_cv_target_alias" = "x" &&
+ ac_cv_target_alias=$ac_cv_host_alias
+ac_cv_target=`$ac_config_sub $ac_cv_target_alias` ||
+ { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_target_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_target_alias failed" >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_target" >&5
+echo "${ECHO_T}$ac_cv_target" >&6
+target=$ac_cv_target
+target_cpu=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+target_vendor=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+target_os=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+test -n "$target_alias" &&
+ test "$program_prefix$program_suffix$program_transform_name" = \
+ NONENONEs,x,x, &&
+ program_prefix=${target_alias}-
+
+PACKAGE=mod_jk
+VERSION=1.2.32
+
+am__api_version="1.9"
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+ ./ | .// | /cC/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+done
+
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL=$ac_install_sh
+ fi
+fi
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+ if test "$*" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftest.file`
+ fi
+ rm -f conftest.file
+ if test "$*" != "X $srcdir/configure conftest.file" \
+ && test "$*" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" >&5
+echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+ test "$2" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ { { echo "$as_me:$LINENO: error: newly created file is older than distributed files!
+Check your system clock" >&5
+echo "$as_me: error: newly created file is older than distributed files!
+Check your system clock" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+test "$program_prefix" != NONE &&
+ program_transform_name="s,^,$program_prefix,;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+ program_transform_name="s,\$,$program_suffix,;$program_transform_name"
+# Double any \ or $. echo might interpret backslashes.
+# By default was `s,x,x', remove it if useless.
+cat <<\_ACEOF >conftest.sed
+s/[\\$]/&&/g;s/;s,x,x,$//
+_ACEOF
+program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
+rm conftest.sed
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+ am_missing_run="$MISSING --run "
+else
+ am_missing_run=
+ { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5
+echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+ # We used to keeping the `.' as first argument, in order to
+ # allow $(mkdir_p) to be used without argument. As in
+ # $(mkdir_p) $(somedir)
+ # where $(somedir) is conditionally defined. However this is wrong
+ # for two reasons:
+ # 1. if the package is installed by a user who cannot write `.'
+ # make install will fail,
+ # 2. the above comment should most certainly read
+ # $(mkdir_p) $(DESTDIR)$(somedir)
+ # so it does not work when $(somedir) is undefined and
+ # $(DESTDIR) is not.
+ # To support the latter case, we have to write
+ # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+ # so the `.' trick is pointless.
+ mkdir_p='mkdir -p --'
+else
+ # On NextStep and OpenStep, the `mkdir' command does not
+ # recognize any option. It will interpret all options as
+ # directories to create, and then abort because `.' already
+ # exists.
+ for d in ./-p ./--version;
+ do
+ test -d $d && rmdir $d
+ done
+ # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+ if test -f "$ac_aux_dir/mkinstalldirs"; then
+ mkdir_p='$(mkinstalldirs)'
+ else
+ mkdir_p='$(install_sh) -d'
+ fi
+fi
+
+for ac_prog in gawk mawk nawk awk
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AWK+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$AWK"; then
+ ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AWK="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+ echo "$as_me:$LINENO: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$AWK" && break
+done
+
+echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.make <<\_ACEOF
+all:
+ @echo 'ac_maketemp="$(MAKE)"'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+ eval ac_cv_prog_make_${ac_make}_set=yes
+else
+ eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftest.make
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ SET_MAKE=
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+ test -f $srcdir/config.status; then
+ { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
+echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE=${PACKAGE}
+ VERSION=${VERSION}
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'. However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ STRIP=$ac_ct_STRIP
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+
+# We need awk for the "check" target. The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ rm -f config.nice
+ cat >config.nice<<EOF
+#! /bin/sh
+#
+# Created by configure
+
+EOF
+ if test -n "$CC"; then
+ echo "CC=\"$CC\"; export CC" >> config.nice
+ fi
+ if test -n "$CFLAGS"; then
+ echo "CFLAGS=\"$CFLAGS\"; export CFLAGS" >> config.nice
+ fi
+ if test -n "$CPPFLAGS"; then
+ echo "CPPFLAGS=\"$CPPFLAGS\"; export CPPFLAGS" >> config.nice
+ fi
+ if test -n "$LDFLAGS"; then
+ echo "LDFLAGS=\"$LDFLAGS\"; export LDFLAGS" >> config.nice
+ fi
+ if test -n "$LTFLAGS"; then
+ echo "LTFLAGS=\"$LTFLAGS\"; export LTFLAGS" >> config.nice
+ fi
+ if test -n "$LIBS"; then
+ echo "LIBS=\"$LIBS\"; export LIBS" >> config.nice
+ fi
+ if test -n "$INCLUDES"; then
+ echo "INCLUDES=\"$INCLUDES\"; export INCLUDES" >> config.nice
+ fi
+ if test -n "$NOTEST_CFLAGS"; then
+ echo "NOTEST_CFLAGS=\"$NOTEST_CFLAGS\"; export NOTEST_CFLAGS" >> config.nice
+ fi
+ if test -n "$NOTEST_CPPFLAGS"; then
+ echo "NOTEST_CPPFLAGS=\"$NOTEST_CPPFLAGS\"; export NOTEST_CPPFLAGS" >> config.nice
+ fi
+ if test -n "$NOTEST_LDFLAGS"; then
+ echo "NOTEST_LDFLAGS=\"$NOTEST_LDFLAGS\"; export NOTEST_LDFLAGS" >> config.nice
+ fi
+ if test -n "$NOTEST_LIBS"; then
+ echo "NOTEST_LIBS=\"$NOTEST_LIBS\"; export NOTEST_LIBS" >> config.nice
+ fi
+
+ # Retrieve command-line arguments.
+ eval "set x $0 $ac_configure_args"
+ shift
+
+ for arg
+ do
+
+jk_last=
+jk_cur="$arg"
+while test "x${jk_cur}" != "x${jk_last}";
+do
+ jk_last="${jk_cur}"
+ jk_cur=`eval "echo ${jk_cur}"`
+done
+arg="${jk_cur}"
+
+ echo "\"$arg\" \\" >> config.nice
+ done
+ echo '"$@"' >> config.nice
+ chmod +x config.nice
+
+
+# Extract the first word of "test", so it can be a program name with args.
+set dummy test; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_TEST+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $TEST in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_TEST="$TEST" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_TEST="$as_dir/$ac_word$ac_exec_ext"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_path_TEST" && ac_cv_path_TEST="$PATH"
+ ;;
+esac
+fi
+TEST=$ac_cv_path_TEST
+
+if test -n "$TEST"; then
+ echo "$as_me:$LINENO: result: $TEST" >&5
+echo "${ECHO_T}$TEST" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+
+# Extract the first word of "rm", so it can be a program name with args.
+set dummy rm; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_RM+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $RM in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_RM="$RM" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_RM="$as_dir/$ac_word$ac_exec_ext"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_path_RM" && ac_cv_path_RM="$PATH"
+ ;;
+esac
+fi
+RM=$ac_cv_path_RM
+
+if test -n "$RM"; then
+ echo "$as_me:$LINENO: result: $RM" >&5
+echo "${ECHO_T}$RM" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+
+# Extract the first word of "grep", so it can be a program name with args.
+set dummy grep; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_GREP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $GREP in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_GREP="$GREP" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_GREP="$as_dir/$ac_word$ac_exec_ext"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_path_GREP" && ac_cv_path_GREP="$PATH"
+ ;;
+esac
+fi
+GREP=$ac_cv_path_GREP
+
+if test -n "$GREP"; then
+ echo "$as_me:$LINENO: result: $GREP" >&5
+echo "${ECHO_T}$GREP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+
+# Extract the first word of "echo", so it can be a program name with args.
+set dummy echo; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_ECHO+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $ECHO in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_ECHO="$ECHO" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_ECHO="$as_dir/$ac_word$ac_exec_ext"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_path_ECHO" && ac_cv_path_ECHO="echo"
+ ;;
+esac
+fi
+ECHO=$ac_cv_path_ECHO
+
+if test -n "$ECHO"; then
+ echo "$as_me:$LINENO: result: $ECHO" >&5
+echo "${ECHO_T}$ECHO" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+
+# Extract the first word of "sed", so it can be a program name with args.
+set dummy sed; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_SED+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $SED in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_SED="$SED" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_SED="$as_dir/$ac_word$ac_exec_ext"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_path_SED" && ac_cv_path_SED="$PATH"
+ ;;
+esac
+fi
+SED=$ac_cv_path_SED
+
+if test -n "$SED"; then
+ echo "$as_me:$LINENO: result: $SED" >&5
+echo "${ECHO_T}$SED" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+
+# Extract the first word of "cp", so it can be a program name with args.
+set dummy cp; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_CP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $CP in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_CP="$CP" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_CP="$as_dir/$ac_word$ac_exec_ext"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_path_CP" && ac_cv_path_CP="$PATH"
+ ;;
+esac
+fi
+CP=$ac_cv_path_CP
+
+if test -n "$CP"; then
+ echo "$as_me:$LINENO: result: $CP" >&5
+echo "${ECHO_T}$CP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+
+# Extract the first word of "mkdir", so it can be a program name with args.
+set dummy mkdir; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_MKDIR+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $MKDIR in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_MKDIR="$MKDIR" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_MKDIR="$as_dir/$ac_word$ac_exec_ext"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_path_MKDIR" && ac_cv_path_MKDIR="$PATH"
+ ;;
+esac
+fi
+MKDIR=$ac_cv_path_MKDIR
+
+if test -n "$MKDIR"; then
+ echo "$as_me:$LINENO: result: $MKDIR" >&5
+echo "${ECHO_T}$MKDIR" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+
+CFLAGS="${CFLAGS} -DHAVE_CONFIG_H"
+
+
+APACHE_CONFIG_VARS=`pwd`/scripts/build/config_vars.mk
+WEBSERVER=""
+apache_dir=""
+apache_include=""
+APXS="apxs"
+
+# Check whether --with-apxs or --without-apxs was given.
+if test "${with_apxs+set}" = set; then
+ withval="$with_apxs"
+
+ case "${withval}" in
+ y | yes | true) find_apxs=true ;;
+ n | no | false) find_apxs= ;;
+ *) find_apxs=${withval} ;;
+ esac
+
+ if ${TEST} ${find_apxs} ; then
+ echo "$as_me:$LINENO: result: need to check for Perl first, apxs depends on it..." >&5
+echo "${ECHO_T}need to check for Perl first, apxs depends on it..." >&6
+ # Extract the first word of "perl", so it can be a program name with args.
+set dummy perl; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_PERL+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $PERL in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_PERL="$PERL" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_path_PERL" && ac_cv_path_PERL="$PATH"
+ ;;
+esac
+fi
+PERL=$ac_cv_path_PERL
+
+if test -n "$PERL"; then
+ echo "$as_me:$LINENO: result: $PERL" >&5
+echo "${ECHO_T}$PERL" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ if ${TEST} ${find_apxs} = true ; then
+ # Extract the first word of "apxs", so it can be a program name with args.
+set dummy apxs; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_APXS+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $APXS in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_APXS="$APXS" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_APXS="$as_dir/$ac_word$ac_exec_ext"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_path_APXS" && ac_cv_path_APXS="$PATH"
+ ;;
+esac
+fi
+APXS=$ac_cv_path_APXS
+
+if test -n "$APXS"; then
+ echo "$as_me:$LINENO: result: $APXS" >&5
+echo "${ECHO_T}$APXS" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+ else
+ APXS=${find_apxs}
+ fi
+
+ if ${TEST} -n "${APXS}" ; then
+ if ${TEST} ! -x "${APXS}" ; then
+ { { echo "$as_me:$LINENO: error: Invalid location for apxs: '${APXS}'" >&5
+echo "$as_me: error: Invalid location for apxs: '${APXS}'" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+ ${APXS} -q PREFIX >/dev/null 2>/dev/null || apxs_support=false
+
+ if ${TEST} "${apxs_support}" = "false" ; then
+ echo "$as_me:$LINENO: result: could not find ${APXS}" >&5
+echo "${ECHO_T}could not find ${APXS}" >&6
+ { { echo "$as_me:$LINENO: error: You must specify a valid --with-apxs path" >&5
+echo "$as_me: error: You must specify a valid --with-apxs path" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+ apache_dir=`$APXS -q PREFIX`
+ apache_include="-I`$APXS -q INCLUDEDIR`"
+
+ APA=`${GREP} STANDARD20 ${APXS}`
+ if ${TEST} -z "$APA" ; then
+ WEBSERVER="apache-1.3"
+ APXSCC="`$APXS -q CC`"
+ APXSCFLAGS="`$APXS -q CFLAGS` -DJK_PREFORK"
+ APXSCPPFLAGS=""
+ APXSLDFLAGS="`$APXS -q LDFLAGS_SHLIB`"
+ else
+ WEBSERVER="apache-2.0"
+ APRINCLUDEDIR=""
+ INCTEMP="`$APXS -q APR_INCLUDEDIR` `$APXS -q APU_INCLUDEDIR`"
+ for INC in ${INCTEMP}; do
+ APRINCLUDEDIR="${APRINCLUDEDIR} -I${INC}"
+ done
+ echo "$as_me:$LINENO: result: APRINCLUDEDIR is $APRINCLUDEDIR" >&5
+echo "${ECHO_T}APRINCLUDEDIR is $APRINCLUDEDIR" >&6
+ APXSCC="`$APXS -q CC`"
+ APXSCFLAGS="`${APXS} -q CFLAGS` `${APXS} -q EXTRA_CFLAGS` -DHAVE_APR ${APRINCLUDEDIR}"
+ APXSCPPFLAGS="`${APXS} -q EXTRA_CPPFLAGS`"
+ APXSLDFLAGS="`$APXS -q LDFLAGS`"
+ APACHE_CONFIG_VARS="`${APXS} -q exp_installbuilddir`/config_vars.mk"
+ LIBTOOL=`$APXS -q LIBTOOL`
+ fi
+ echo "$as_me:$LINENO: result: building connector for \"$WEBSERVER\"" >&5
+echo "${ECHO_T}building connector for \"$WEBSERVER\"" >&6
+ if ${TEST} -z "${CC}" ; then
+ CC="${APXSCC}"
+ else
+ if ${TEST} "${CC}" != "$APXSCC" ; then
+ WARN_CC=1
+ fi
+ fi
+
+
+ fi
+ fi
+
+else
+
+ echo "$as_me:$LINENO: result: no apxs given" >&5
+echo "${ECHO_T}no apxs given" >&6
+
+fi;
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$ac_ct_CC" && break
+done
+
+ CC=$ac_ct_CC
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+ "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+ (eval $ac_compiler --version </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+ (eval $ac_compiler -v </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+ (eval $ac_compiler -V </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
+ (eval $ac_link_default) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # Find the output, starting from the most likely. This scheme is
+# not robust to junk in `.', hence go to wildcards (a.*) only as a last
+# resort.
+
+# Be careful to initialize this variable, since it used to be cached.
+# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
+ac_cv_exeext=
+# b.out is created by i960 compilers.
+for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
+ ;;
+ conftest.$ac_ext )
+ # This is the source file.
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ # FIXME: I believe we export ac_cv_exeext for Libtool,
+ # but it would be cool to find out if it's true. Does anybody
+ # maintain Libtool? --akim.
+ export ac_cv_exeext
+ break;;
+ * )
+ break;;
+ esac
+done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C compiler cannot create executables
+See \`config.log' for more details." >&2;}
+ { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6
+
+# Check the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+ if { ac_try='./$ac_file'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ fi
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6
+
+echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ export ac_cv_exeext
+ break;;
+ * ) break;;
+ esac
+done
+else
+ { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
+if test "${ac_cv_objext+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_compiler_gnu=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_g=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cc_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not '\xHH' hex character constants.
+ These don't provoke an error unfortunately, instead are silently treated
+ as 'x'. The following induces an error, until -std1 is added to get
+ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
+ array size at least. It's necessary to write '\x00'==0 to get something
+ that's true only with -std1. */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+ ;
+ return 0;
+}
+_ACEOF
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX -qlanglvl=ansi
+# Ultrix and OSF/1 -std1
+# HP-UX 10.20 and later -Ae
+# HP-UX older versions -Aa -D_HPUX_SOURCE
+# SVR4 -Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext
+done
+rm -f conftest.$ac_ext conftest.$ac_objext
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+ x|xno)
+ echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+ *)
+ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+ CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+# Some people use a C++ compiler to compile C. Since we use `exit',
+# in C++ we need to declare it. In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >conftest.$ac_ext <<_ACEOF
+#ifndef __cplusplus
+ choke me
+#endif
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ for ac_declaration in \
+ '' \
+ 'extern "C" void std::exit (int) throw (); using std::exit;' \
+ 'extern "C" void std::exit (int); using std::exit;' \
+ 'extern "C" void exit (int) throw ();' \
+ 'extern "C" void exit (int);' \
+ 'void exit (int);'
+do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+ echo '#ifdef __cplusplus' >>confdefs.h
+ echo $ac_declaration >>confdefs.h
+ echo '#endif' >>confdefs.h
+fi
+
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+DEPDIR="${am__leading_dot}deps"
+
+ ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+ @echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
+echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+ am__include=include
+ am__quote=
+ _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ fi
+fi
+
+
+echo "$as_me:$LINENO: result: $_am_result" >&5
+echo "${ECHO_T}$_am_result" >&6
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then
+ enableval="$enable_dependency_tracking"
+
+fi;
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+fi
+
+
+if test "x$enable_dependency_tracking" != xno; then
+ AMDEP_TRUE=
+ AMDEP_FALSE='#'
+else
+ AMDEP_TRUE='#'
+ AMDEP_FALSE=
+fi
+
+
+
+
+depcc="$CC" am_compiler_list=
+
+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named `D' -- because `-MD' means `put the output
+ # in D'.
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CC_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+ # Solaris 8's {/usr,}/bin/sh.
+ touch sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ case $depmode in
+ nosideeffect)
+ # after this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ none) break ;;
+ esac
+ # We check with `-c' and `-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle `-M -o', and we need to detect this.
+ if depmode=$depmode \
+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CC_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+
+
+if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+ am__fastdepCC_TRUE=
+ am__fastdepCC_FALSE='#'
+else
+ am__fastdepCC_TRUE='#'
+ am__fastdepCC_FALSE=
+fi
+
+
+echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5
+echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6
+if test "${lt_cv_path_SED+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for lt_ac_prog in sed gsed; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
+ lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+ fi
+ done
+ done
+done
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+ test ! -f $lt_ac_sed && break
+ cat /dev/null > conftest.in
+ lt_ac_count=0
+ echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+ # Check for GNU sed and select it if it is found.
+ if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+ lt_cv_path_SED=$lt_ac_sed
+ break
+ fi
+ while true; do
+ cat conftest.in conftest.in >conftest.tmp
+ mv conftest.tmp conftest.in
+ cp conftest.in conftest.nl
+ echo >>conftest.nl
+ $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+ cmp -s conftest.out conftest.nl || break
+ # 10000 chars as input seems more than enough
+ test $lt_ac_count -gt 10 && break
+ lt_ac_count=`expr $lt_ac_count + 1`
+ if test $lt_ac_count -gt $lt_ac_max; then
+ lt_ac_max=$lt_ac_count
+ lt_cv_path_SED=$lt_ac_sed
+ fi
+ done
+done
+SED=$lt_cv_path_SED
+
+fi
+
+echo "$as_me:$LINENO: result: $SED" >&5
+echo "${ECHO_T}$SED" >&6
+
+echo "$as_me:$LINENO: checking for egrep" >&5
+echo $ECHO_N "checking for egrep... $ECHO_C" >&6
+if test "${ac_cv_prog_egrep+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if echo a | (grep -E '(a|b)') >/dev/null 2>&1
+ then ac_cv_prog_egrep='grep -E'
+ else ac_cv_prog_egrep='egrep'
+ fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5
+echo "${ECHO_T}$ac_cv_prog_egrep" >&6
+ EGREP=$ac_cv_prog_egrep
+
+
+
+# Check whether --with-gnu-ld or --without-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then
+ withval="$with_gnu_ld"
+ test "$withval" = no || with_gnu_ld=yes
+else
+ with_gnu_ld=no
+fi;
+ac_prog=ld
+if test "$GCC" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ echo "$as_me:$LINENO: checking for ld used by $CC" >&5
+echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [\\/]* | ?:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+ # Canonicalize the pathname of ld
+ ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'`
+ while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ echo "$as_me:$LINENO: checking for GNU ld" >&5
+echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6
+else
+ echo "$as_me:$LINENO: checking for non-GNU ld" >&5
+echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6
+fi
+if test "${lt_cv_path_LD+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -z "$LD"; then
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ lt_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some GNU ld's only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test "$with_gnu_ld" != no && break
+ ;;
+ *)
+ test "$with_gnu_ld" != yes && break
+ ;;
+ esac
+ fi
+ done
+ IFS="$lt_save_ifs"
+else
+ lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+ echo "$as_me:$LINENO: result: $LD" >&5
+echo "${ECHO_T}$LD" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
+echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
+ { (exit 1); exit 1; }; }
+echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
+echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6
+if test "${lt_cv_prog_gnu_ld+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # I'd rather use --version here, but apparently some GNU ld's only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ lt_cv_prog_gnu_ld=yes
+ ;;
+*)
+ lt_cv_prog_gnu_ld=no
+ ;;
+esac
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5
+echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+SAVE_LIBTOOL="$LIBTOOL"
+
+
+
+
+# Check whether --enable-shared or --disable-shared was given.
+if test "${enable_shared+set}" = set; then
+ enableval="$enable_shared"
+ p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_shared=yes ;;
+ no) enable_shared=no ;;
+ *)
+ enable_shared=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for pkg in $enableval; do
+ IFS="$lt_save_ifs"
+ if test "X$pkg" = "X$p"; then
+ enable_shared=yes
+ fi
+ done
+ IFS="$lt_save_ifs"
+ ;;
+ esac
+else
+ enable_shared=yes
+fi;
+
+# Check whether --enable-static or --disable-static was given.
+if test "${enable_static+set}" = set; then
+ enableval="$enable_static"
+ p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_static=yes ;;
+ no) enable_static=no ;;
+ *)
+ enable_static=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for pkg in $enableval; do
+ IFS="$lt_save_ifs"
+ if test "X$pkg" = "X$p"; then
+ enable_static=yes
+ fi
+ done
+ IFS="$lt_save_ifs"
+ ;;
+ esac
+else
+ enable_static=yes
+fi;
+
+# Check whether --enable-fast-install or --disable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then
+ enableval="$enable_fast_install"
+ p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_fast_install=yes ;;
+ no) enable_fast_install=no ;;
+ *)
+ enable_fast_install=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for pkg in $enableval; do
+ IFS="$lt_save_ifs"
+ if test "X$pkg" = "X$p"; then
+ enable_fast_install=yes
+ fi
+ done
+ IFS="$lt_save_ifs"
+ ;;
+ esac
+else
+ enable_fast_install=yes
+fi;
+
+echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5
+echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6
+if test "${lt_cv_ld_reload_flag+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_ld_reload_flag='-r'
+fi
+echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5
+echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+
+echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5
+echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6
+if test "${lt_cv_path_NM+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$NM"; then
+ # Let the user override the test.
+ lt_cv_path_NM="$NM"
+else
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ tmp_nm="$ac_dir/${ac_tool_prefix}nm"
+ if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+ # Check to see if the nm accepts a BSD-compat flag.
+ # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+ # nm: unknown option "B" ignored
+ # Tru64's nm complains that /dev/null is an invalid object file
+ case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+ */dev/null* | *'Invalid file or object type'*)
+ lt_cv_path_NM="$tmp_nm -B"
+ break
+ ;;
+ *)
+ case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+ */dev/null*)
+ lt_cv_path_NM="$tmp_nm -p"
+ break
+ ;;
+ *)
+ lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+ continue # so that we can try to find one that supports BSD flags
+ ;;
+ esac
+ esac
+ fi
+ done
+ IFS="$lt_save_ifs"
+ test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm
+fi
+fi
+echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5
+echo "${ECHO_T}$lt_cv_path_NM" >&6
+NM="$lt_cv_path_NM"
+
+echo "$as_me:$LINENO: checking whether ln -s works" >&5
+echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+ echo "$as_me:$LINENO: result: no, using $LN_S" >&5
+echo "${ECHO_T}no, using $LN_S" >&6
+fi
+
+echo "$as_me:$LINENO: checking how to recognise dependent libraries" >&5
+echo $ECHO_N "checking how to recognise dependent libraries... $ECHO_C" >&6
+if test "${lt_cv_deplibs_check_method+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix4* | aix5*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+beos*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+bsdi4*)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+ lt_cv_file_magic_cmd='/usr/bin/file -L'
+ lt_cv_file_magic_test_file=/shlib/libc.so
+ ;;
+
+cygwin*)
+ # func_win32_libid is a shell function defined in ltmain.sh
+ lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+ lt_cv_file_magic_cmd='func_win32_libid'
+ ;;
+
+mingw* | pw32*)
+ # Base MSYS/MinGW do not provide the 'file' command needed by
+ # func_win32_libid shell function, so use a weaker test based on 'objdump'.
+ lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+ lt_cv_file_magic_cmd='$OBJDUMP -f'
+ ;;
+
+darwin* | rhapsody*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+freebsd* | kfreebsd*-gnu)
+ if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+ case $host_cpu in
+ i*86 )
+ # Not sure whether the presence of OpenBSD here was a mistake.
+ # Let's accept both of them until this is cleared up.
+ lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[3-9]86 (compact )?demand paged shared library'
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+ ;;
+ esac
+ else
+ lt_cv_deplibs_check_method=pass_all
+ fi
+ ;;
+
+gnu*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+hpux10.20* | hpux11*)
+ lt_cv_file_magic_cmd=/usr/bin/file
+ case "$host_cpu" in
+ ia64*)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
+ lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+ ;;
+ hppa*64*)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'
+ lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+ ;;
+ *)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
+ lt_cv_file_magic_test_file=/usr/lib/libc.sl
+ ;;
+ esac
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $LD in
+ *-32|*"-32 ") libmagic=32-bit;;
+ *-n32|*"-n32 ") libmagic=N32;;
+ *-64|*"-64 ") libmagic=64-bit;;
+ *) libmagic=never-match;;
+ esac
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+# This must be Linux ELF.
+linux*)
+ case $host_cpu in
+ alpha*|hppa*|i*86|ia64*|m68*|mips*|powerpc*|sparc*|s390*|sh*|x86_64*)
+ lt_cv_deplibs_check_method=pass_all ;;
+ *)
+ # glibc up to 2.1.1 does not perform some relocations on ARM
+ # this will be overridden with pass_all, but let us keep it just in case
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;;
+ esac
+ lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so`
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+ fi
+ ;;
+
+newos6*)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=/usr/lib/libnls.so
+ ;;
+
+nto-qnx*)
+ lt_cv_deplibs_check_method=unknown
+ ;;
+
+openbsd*)
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB shared object'
+ else
+ lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library'
+ fi
+ ;;
+
+osf3* | osf4* | osf5*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+sco3.2v5*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+solaris*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ case $host_vendor in
+ motorola)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+ ;;
+ ncr)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ sequent)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+ ;;
+ sni)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+ lt_cv_file_magic_test_file=/lib/libc.so
+ ;;
+ siemens)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ esac
+ ;;
+
+sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7* | sysv4*uw2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+esac
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5
+echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# Check whether --enable-libtool-lock or --disable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then
+ enableval="$enable_libtool_lock"
+
+fi;
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+ # Find out which ABI we are using.
+ echo 'int i;' > conftest.$ac_ext
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *ELF-32*)
+ HPUX_IA64_MODE="32"
+ ;;
+ *ELF-64*)
+ HPUX_IA64_MODE="64"
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+*-*-irix6*)
+ # Find out which ABI we are using.
+ echo '#line 4247 "configure"' > conftest.$ac_ext
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ if test "$lt_cv_prog_gnu_ld" = yes; then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -melf32bsmip"
+ ;;
+ *N32*)
+ LD="${LD-ld} -melf32bmipn32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -melf64bmip"
+ ;;
+ esac
+ else
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -32"
+ ;;
+ *N32*)
+ LD="${LD-ld} -n32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -64"
+ ;;
+ esac
+ fi
+ fi
+ rm -rf conftest*
+ ;;
+
+x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*)
+ # Find out which ABI we are using.
+ echo 'int i;' > conftest.$ac_ext
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ case "`/usr/bin/file conftest.o`" in
+ *32-bit*)
+ case $host in
+ x86_64-*linux*)
+ LD="${LD-ld} -m elf_i386"
+ ;;
+ ppc64-*linux*|powerpc64-*linux*)
+ LD="${LD-ld} -m elf32ppclinux"
+ ;;
+ s390x-*linux*)
+ LD="${LD-ld} -m elf_s390"
+ ;;
+ sparc64-*linux*)
+ LD="${LD-ld} -m elf32_sparc"
+ ;;
+ esac
+ ;;
+ *64-bit*)
+ case $host in
+ x86_64-*linux*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ ppc*-*linux*|powerpc*-*linux*)
+ LD="${LD-ld} -m elf64ppc"
+ ;;
+ s390*-*linux*)
+ LD="${LD-ld} -m elf64_s390"
+ ;;
+ sparc*-*linux*)
+ LD="${LD-ld} -m elf64_sparc"
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+*-*-sco3.2v5*)
+ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+ SAVE_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -belf"
+ echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5
+echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6
+if test "${lt_cv_cc_needs_belf+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ lt_cv_cc_needs_belf=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+lt_cv_cc_needs_belf=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5
+echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6
+ if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+ # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+ CFLAGS="$SAVE_CFLAGS"
+ fi
+ ;;
+
+esac
+
+need_locks="$enable_libtool_lock"
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if test "${ac_cv_prog_CPP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # Double quotes because CPP needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ break
+fi
+
+ done
+ ac_cv_prog_CPP=$CPP
+
+fi
+ CPP=$ac_cv_prog_CPP
+else
+ ac_cv_prog_CPP=$CPP
+fi
+echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ :
+else
+ { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
+if test "${ac_cv_header_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_header_stdc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_header_stdc=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "memchr" >/dev/null 2>&1; then
+ :
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "free" >/dev/null 2>&1; then
+ :
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then
+ :
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ctype.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+ (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ exit(2);
+ exit (0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_header_stdc=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define STDC_HEADERS 1
+_ACEOF
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+
+
+
+
+
+
+
+
+
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+ inttypes.h stdint.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_Header=no"
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+for ac_header in dlfcn.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## ------------------------------------------ ##
+## Report this to the AC_PACKAGE_NAME lists. ##
+## ------------------------------------------ ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CXX+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CXX"; then
+ ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+ echo "$as_me:$LINENO: result: $CXX" >&5
+echo "${ECHO_T}$CXX" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$CXX" && break
+ done
+fi
+if test -z "$CXX"; then
+ ac_ct_CXX=$CXX
+ for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CXX"; then
+ ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CXX="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5
+echo "${ECHO_T}$ac_ct_CXX" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$ac_ct_CXX" && break
+done
+test -n "$ac_ct_CXX" || ac_ct_CXX="g++"
+
+ CXX=$ac_ct_CXX
+fi
+
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+ "checking for C++ compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+ (eval $ac_compiler --version </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+ (eval $ac_compiler -v </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+ (eval $ac_compiler -V </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+
+echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6
+if test "${ac_cv_cxx_compiler_gnu+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_compiler_gnu=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6
+GXX=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+CXXFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5
+echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cxx_g+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cxx_g=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cxx_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6
+if test "$ac_test_CXXFLAGS" = set; then
+ CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+ if test "$GXX" = yes; then
+ CXXFLAGS="-g -O2"
+ else
+ CXXFLAGS="-g"
+ fi
+else
+ if test "$GXX" = yes; then
+ CXXFLAGS="-O2"
+ else
+ CXXFLAGS=
+ fi
+fi
+for ac_declaration in \
+ '' \
+ 'extern "C" void std::exit (int) throw (); using std::exit;' \
+ 'extern "C" void std::exit (int); using std::exit;' \
+ 'extern "C" void exit (int) throw ();' \
+ 'extern "C" void exit (int);' \
+ 'void exit (int);'
+do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+ echo '#ifdef __cplusplus' >>confdefs.h
+ echo $ac_declaration >>confdefs.h
+ echo '#endif' >>confdefs.h
+fi
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+depcc="$CXX" am_compiler_list=
+
+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named `D' -- because `-MD' means `put the output
+ # in D'.
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CXX_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+ # Solaris 8's {/usr,}/bin/sh.
+ touch sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ case $depmode in
+ nosideeffect)
+ # after this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ none) break ;;
+ esac
+ # We check with `-c' and `-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle `-M -o', and we need to detect this.
+ if depmode=$depmode \
+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CXX_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+
+
+if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+ am__fastdepCXX_TRUE=
+ am__fastdepCXX_FALSE='#'
+else
+ am__fastdepCXX_TRUE='#'
+ am__fastdepCXX_FALSE=
+fi
+
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5
+echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6
+if test -z "$CXXCPP"; then
+ if test "${ac_cv_prog_CXXCPP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # Double quotes because CXXCPP needs to be expanded
+ for CXXCPP in "$CXX -E" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ break
+fi
+
+ done
+ ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+ CXXCPP=$ac_cv_prog_CXXCPP
+else
+ ac_cv_prog_CXXCPP=$CXXCPP
+fi
+echo "$as_me:$LINENO: result: $CXXCPP" >&5
+echo "${ECHO_T}$CXXCPP" >&6
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ :
+else
+ { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+ac_ext=f
+ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5'
+ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_f77_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_F77+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$F77"; then
+ ac_cv_prog_F77="$F77" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_F77="$ac_tool_prefix$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+F77=$ac_cv_prog_F77
+if test -n "$F77"; then
+ echo "$as_me:$LINENO: result: $F77" >&5
+echo "${ECHO_T}$F77" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$F77" && break
+ done
+fi
+if test -z "$F77"; then
+ ac_ct_F77=$F77
+ for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_F77+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_F77"; then
+ ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_F77="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_F77=$ac_cv_prog_ac_ct_F77
+if test -n "$ac_ct_F77"; then
+ echo "$as_me:$LINENO: result: $ac_ct_F77" >&5
+echo "${ECHO_T}$ac_ct_F77" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$ac_ct_F77" && break
+done
+
+ F77=$ac_ct_F77
+fi
+
+
+# Provide some information about the compiler.
+echo "$as_me:5819:" \
+ "checking for Fortran 77 compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+ (eval $ac_compiler --version </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+ (eval $ac_compiler -v </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+ (eval $ac_compiler -V </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+rm -f a.out
+
+# If we don't use `.F' as extension, the preprocessor is not run on the
+# input file. (Note that this only needs to work for GNU compilers.)
+ac_save_ext=$ac_ext
+ac_ext=F
+echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU Fortran 77 compiler... $ECHO_C" >&6
+if test "${ac_cv_f77_compiler_gnu+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+ program main
+#ifndef __GNUC__
+ choke me
+#endif
+
+ end
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_f77_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_compiler_gnu=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_f77_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_f77_compiler_gnu" >&6
+ac_ext=$ac_save_ext
+ac_test_FFLAGS=${FFLAGS+set}
+ac_save_FFLAGS=$FFLAGS
+FFLAGS=
+echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5
+echo $ECHO_N "checking whether $F77 accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_f77_g+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ FFLAGS=-g
+cat >conftest.$ac_ext <<_ACEOF
+ program main
+
+ end
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_f77_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_f77_g=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_f77_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5
+echo "${ECHO_T}$ac_cv_prog_f77_g" >&6
+if test "$ac_test_FFLAGS" = set; then
+ FFLAGS=$ac_save_FFLAGS
+elif test $ac_cv_prog_f77_g = yes; then
+ if test "x$ac_cv_f77_compiler_gnu" = xyes; then
+ FFLAGS="-g -O2"
+ else
+ FFLAGS="-g"
+ fi
+else
+ if test "x$ac_cv_f77_compiler_gnu" = xyes; then
+ FFLAGS="-O2"
+ else
+ FFLAGS=
+ fi
+fi
+
+G77=`test $ac_compiler_gnu = yes && echo yes`
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers!
+
+# find the maximum length of command line arguments
+echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5
+echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6
+if test "${lt_cv_sys_max_cmd_len+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ i=0
+ teststring="ABCD"
+
+ case $build_os in
+ msdosdjgpp*)
+ # On DJGPP, this test can blow up pretty badly due to problems in libc
+ # (any single argument exceeding 2000 bytes causes a buffer overrun
+ # during glob expansion). Even if it were fixed, the result of this
+ # check would be larger than it should be.
+ lt_cv_sys_max_cmd_len=12288; # 12K is about right
+ ;;
+
+ gnu*)
+ # Under GNU Hurd, this test is not required because there is
+ # no limit to the length of command line arguments.
+ # Libtool will interpret -1 as no limit whatsoever
+ lt_cv_sys_max_cmd_len=-1;
+ ;;
+
+ cygwin* | mingw*)
+ # On Win9x/ME, this test blows up -- it succeeds, but takes
+ # about 5 minutes as the teststring grows exponentially.
+ # Worse, since 9x/ME are not pre-emptively multitasking,
+ # you end up with a "frozen" computer, even though with patience
+ # the test eventually succeeds (with a max line length of 256k).
+ # Instead, let's just punt: use the minimum linelength reported by
+ # all of the supported platforms: 8192 (on NT/2K/XP).
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ amigaos*)
+ # On AmigaOS with pdksh, this test takes hours, literally.
+ # So we just punt and use a minimum line length of 8192.
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ *)
+ # If test is not a shell built-in, we'll probably end up computing a
+ # maximum length that is only half of the actual maximum length, but
+ # we can't tell.
+ while (test "X"`$CONFIG_SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \
+ = "XX$teststring") >/dev/null 2>&1 &&
+ new_result=`expr "X$teststring" : ".*" 2>&1` &&
+ lt_cv_sys_max_cmd_len=$new_result &&
+ test $i != 17 # 1/2 MB should be enough
+ do
+ i=`expr $i + 1`
+ teststring=$teststring$teststring
+ done
+ teststring=
+ # Add a significant safety factor because C++ compilers can tack on massive
+ # amounts of additional arguments before passing them to the linker.
+ # It appears as though 1/2 is a usable value.
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+ ;;
+ esac
+
+fi
+
+if test -n $lt_cv_sys_max_cmd_len ; then
+ echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5
+echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6
+else
+ echo "$as_me:$LINENO: result: none" >&5
+echo "${ECHO_T}none" >&6
+fi
+
+
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5
+echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6
+if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix. What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Transform the above into a raw symbol and a C symbol.
+symxfrm='\1 \2\3 \3'
+
+# Transform an extracted symbol line into a proper C declaration
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+ symcode='[BCDT]'
+ ;;
+cygwin* | mingw* | pw32*)
+ symcode='[ABCDGISTW]'
+ ;;
+hpux*) # Its linker distinguishes data from code symbols
+ if test "$host_cpu" = ia64; then
+ symcode='[ABCDEGRST]'
+ fi
+ lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+ lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+ ;;
+irix* | nonstopux*)
+ symcode='[BCDEGRST]'
+ ;;
+osf*)
+ symcode='[BCDEGQRST]'
+ ;;
+solaris* | sysv5*)
+ symcode='[BDRT]'
+ ;;
+sysv4)
+ symcode='[DFNSTU]'
+ ;;
+esac
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+ opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+ ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+ symcode='[ABCDGIRSTW]' ;;
+esac
+
+# Try without a prefix undercore, then with it.
+for ac_symprfx in "" "_"; do
+
+ # Write the raw and C identifiers.
+ lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'"
+
+ # Check to see that the pipe works correctly.
+ pipe_works=no
+
+ rm -f conftest*
+ cat > conftest.$ac_ext <<EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+EOF
+
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # Now try to grab the symbols.
+ nlist=conftest.nm
+ if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5
+ (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && test -s "$nlist"; then
+ # Try sorting and uniquifying the output.
+ if sort "$nlist" | uniq > "$nlist"T; then
+ mv -f "$nlist"T "$nlist"
+ else
+ rm -f "$nlist"T
+ fi
+
+ # Make sure that we snagged all the symbols we need.
+ if grep ' nm_test_var$' "$nlist" >/dev/null; then
+ if grep ' nm_test_func$' "$nlist" >/dev/null; then
+ cat <<EOF > conftest.$ac_ext
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EOF
+ # Now generate the symbol file.
+ eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext'
+
+ cat <<EOF >> conftest.$ac_ext
+#if defined (__STDC__) && __STDC__
+# define lt_ptr_t void *
+#else
+# define lt_ptr_t char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+ const char *name;
+ lt_ptr_t address;
+}
+lt_preloaded_symbols[] =
+{
+EOF
+ $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext
+ cat <<\EOF >> conftest.$ac_ext
+ {0, (lt_ptr_t) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif
+EOF
+ # Now try linking the two files.
+ mv conftest.$ac_objext conftstm.$ac_objext
+ lt_save_LIBS="$LIBS"
+ lt_save_CFLAGS="$CFLAGS"
+ LIBS="conftstm.$ac_objext"
+ CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && test -s conftest${ac_exeext}; then
+ pipe_works=yes
+ fi
+ LIBS="$lt_save_LIBS"
+ CFLAGS="$lt_save_CFLAGS"
+ else
+ echo "cannot find nm_test_func in $nlist" >&5
+ fi
+ else
+ echo "cannot find nm_test_var in $nlist" >&5
+ fi
+ else
+ echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
+ fi
+ else
+ echo "$progname: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ fi
+ rm -f conftest* conftst*
+
+ # Do not use the global_symbol_pipe unless it works.
+ if test "$pipe_works" = yes; then
+ break
+ else
+ lt_cv_sys_global_symbol_pipe=
+ fi
+done
+
+fi
+
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+ lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+ echo "$as_me:$LINENO: result: failed" >&5
+echo "${ECHO_T}failed" >&6
+else
+ echo "$as_me:$LINENO: result: ok" >&5
+echo "${ECHO_T}ok" >&6
+fi
+
+echo "$as_me:$LINENO: checking for objdir" >&5
+echo $ECHO_N "checking for objdir... $ECHO_C" >&6
+if test "${lt_cv_objdir+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+ lt_cv_objdir=.libs
+else
+ # MS-DOS does not allow filenames that begin with a dot.
+ lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+fi
+echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5
+echo "${ECHO_T}$lt_cv_objdir" >&6
+objdir=$lt_cv_objdir
+
+
+
+
+
+case $host_os in
+aix3*)
+ # AIX sometimes has problems with the GCC collect2 program. For some
+ # reason, if we set the COLLECT_NAMES environment variable, the problems
+ # vanish in a puff of smoke.
+ if test "X${COLLECT_NAMES+set}" != Xset; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+ fi
+ ;;
+esac
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='sed -e s/^X//'
+sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+# Constants:
+rm="rm -f"
+
+# Global variables:
+default_ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except M$VC,
+# which needs '.lib').
+libext=a
+ltmain="$ac_aux_dir/ltmain.sh"
+ofile="$default_ofile"
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ar; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AR+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$AR"; then
+ ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AR="${ac_tool_prefix}ar"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+ echo "$as_me:$LINENO: result: $AR" >&5
+echo "${ECHO_T}$AR" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_AR"; then
+ ac_ct_AR=$AR
+ # Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_AR+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_AR"; then
+ ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_AR="ar"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="false"
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+ echo "$as_me:$LINENO: result: $ac_ct_AR" >&5
+echo "${ECHO_T}$ac_ct_AR" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ AR=$ac_ct_AR
+else
+ AR="$ac_cv_prog_AR"
+fi
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_RANLIB+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+ echo "$as_me:$LINENO: result: $RANLIB" >&5
+echo "${ECHO_T}$RANLIB" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+ ac_ct_RANLIB=$RANLIB
+ # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_RANLIB"; then
+ ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_RANLIB="ranlib"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":"
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+ echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
+echo "${ECHO_T}$ac_ct_RANLIB" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ RANLIB=$ac_ct_RANLIB
+else
+ RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ STRIP=$ac_ct_STRIP
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+test -z "$AS" && AS=as
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+test -z "$LD" && LD=ld
+test -z "$LN_S" && LN_S="ln -s"
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+test -z "$NM" && NM=nm
+test -z "$SED" && SED=sed
+test -z "$OBJDUMP" && OBJDUMP=objdump
+test -z "$RANLIB" && RANLIB=:
+test -z "$STRIP" && STRIP=:
+test -z "$ac_objext" && ac_objext=o
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+ case $host_os in
+ openbsd*)
+ old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds"
+ ;;
+ *)
+ old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds"
+ ;;
+ esac
+ old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
+
+# Only perform the check for file, if the check method requires it
+case $deplibs_check_method in
+file_magic*)
+ if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+ echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5
+echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6
+if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $MAGIC_CMD in
+[\\/*] | ?:[\\/]*)
+ lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+ ;;
+*)
+ lt_save_MAGIC_CMD="$MAGIC_CMD"
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+ for ac_dir in $ac_dummy; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/${ac_tool_prefix}file; then
+ lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`"
+ MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS="$lt_save_ifs"
+ MAGIC_CMD="$lt_save_MAGIC_CMD"
+ ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+ echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
+echo "${ECHO_T}$MAGIC_CMD" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+ if test -n "$ac_tool_prefix"; then
+ echo "$as_me:$LINENO: checking for file" >&5
+echo $ECHO_N "checking for file... $ECHO_C" >&6
+if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $MAGIC_CMD in
+[\\/*] | ?:[\\/]*)
+ lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+ ;;
+*)
+ lt_save_MAGIC_CMD="$MAGIC_CMD"
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+ for ac_dir in $ac_dummy; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/file; then
+ lt_cv_path_MAGIC_CMD="$ac_dir/file"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`"
+ MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS="$lt_save_ifs"
+ MAGIC_CMD="$lt_save_MAGIC_CMD"
+ ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+ echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
+echo "${ECHO_T}$MAGIC_CMD" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ else
+ MAGIC_CMD=:
+ fi
+fi
+
+ fi
+ ;;
+esac
+
+enable_dlopen=yes
+enable_win32_dll=no
+
+# Check whether --enable-libtool-lock or --disable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then
+ enableval="$enable_libtool_lock"
+
+fi;
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+
+# Check whether --with-pic or --without-pic was given.
+if test "${with_pic+set}" = set; then
+ withval="$with_pic"
+ pic_mode="$withval"
+else
+ pic_mode=default
+fi;
+test -z "$pic_mode" && pic_mode=default
+
+# Use C for the default configuration in the libtool script
+tagname=
+lt_save_CC="$CC"
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+objext=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}\n'
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+#
+# Check for any special shared library compilation flags.
+#
+lt_prog_cc_shlib=
+if test "$GCC" = no; then
+ case $host_os in
+ sco3.2v5*)
+ lt_prog_cc_shlib='-belf'
+ ;;
+ esac
+fi
+if test -n "$lt_prog_cc_shlib"; then
+ { echo "$as_me:$LINENO: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&5
+echo "$as_me: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&2;}
+ if echo "$old_CC $old_CFLAGS " | grep "[ ]$lt_prog_cc_shlib[ ]" >/dev/null; then :
+ else
+ { echo "$as_me:$LINENO: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&5
+echo "$as_me: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&2;}
+ lt_cv_prog_cc_can_build_shared=no
+ fi
+fi
+
+
+#
+# Check to make sure the static flag actually works.
+#
+echo "$as_me:$LINENO: checking if $compiler static flag $lt_prog_compiler_static works" >&5
+echo $ECHO_N "checking if $compiler static flag $lt_prog_compiler_static works... $ECHO_C" >&6
+if test "${lt_prog_compiler_static_works+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_prog_compiler_static_works=no
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $lt_prog_compiler_static"
+ printf "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ else
+ lt_prog_compiler_static_works=yes
+ fi
+ fi
+ $rm conftest*
+ LDFLAGS="$save_LDFLAGS"
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5
+echo "${ECHO_T}$lt_prog_compiler_static_works" >&6
+
+if test x"$lt_prog_compiler_static_works" = xyes; then
+ :
+else
+ lt_prog_compiler_static=
+fi
+
+
+
+
+lt_prog_compiler_no_builtin_flag=
+
+if test "$GCC" = yes; then
+ lt_prog_compiler_no_builtin_flag=' -fno-builtin'
+
+
+echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_prog_compiler_rtti_exceptions=no
+ ac_outfile=conftest.$ac_objext
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="-fno-rtti -fno-exceptions"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:6853: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:6857: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test ! -s conftest.err; then
+ lt_cv_prog_compiler_rtti_exceptions=yes
+ fi
+ fi
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6
+
+if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+ lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
+else
+ :
+fi
+
+fi
+
+lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
+
+echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
+
+ if test "$GCC" = yes; then
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_static='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static='-Bstatic'
+ fi
+ ;;
+
+ amigaos*)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the `-m68020' flag to GCC prevents building anything better,
+ # like `-m68040'.
+ lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+ ;;
+
+ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+
+ mingw* | pw32* | os2*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_prog_compiler_pic='-DDLL_EXPORT'
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic='-fno-common'
+ ;;
+
+ msdosdjgpp*)
+ # Just because we use GCC doesn't mean we suddenly get shared libraries
+ # on systems that don't support them.
+ lt_prog_compiler_can_build_shared=no
+ enable_shared=no
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic=-Kconform_pic
+ fi
+ ;;
+
+ hpux*)
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case "$host_cpu" in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ esac
+ ;;
+
+ *)
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ esac
+ else
+ # PORTME Check for flag to pass linker flags through the system compiler.
+ case $host_os in
+ aix*)
+ lt_prog_compiler_wl='-Wl,'
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static='-Bstatic'
+ else
+ lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+
+ mingw* | pw32* | os2*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_prog_compiler_pic='-DDLL_EXPORT'
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ lt_prog_compiler_wl='-Wl,'
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case "$host_cpu" in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic='+Z'
+ ;;
+ esac
+ # Is there a better lt_prog_compiler_static that works with the bundled CC?
+ lt_prog_compiler_static='${wl}-a ${wl}archive'
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ lt_prog_compiler_wl='-Wl,'
+ # PIC (with -KPIC) is the default.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ newsos6)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ linux*)
+ case $CC in
+ icc* | ecc*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ ccc*)
+ lt_prog_compiler_wl='-Wl,'
+ # All Alpha code is PIC.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+ esac
+ ;;
+
+ osf3* | osf4* | osf5*)
+ lt_prog_compiler_wl='-Wl,'
+ # All OSF/1 code is PIC.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ sco3.2v5*)
+ lt_prog_compiler_pic='-Kpic'
+ lt_prog_compiler_static='-dn'
+ ;;
+
+ solaris*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ sunos4*)
+ lt_prog_compiler_wl='-Qoption ld '
+ lt_prog_compiler_pic='-PIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec ;then
+ lt_prog_compiler_pic='-Kconform_pic'
+ lt_prog_compiler_static='-Bstatic'
+ fi
+ ;;
+
+ uts4*)
+ lt_prog_compiler_pic='-pic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ *)
+ lt_prog_compiler_can_build_shared=no
+ ;;
+ esac
+ fi
+
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic" >&6
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+
+echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6
+if test "${lt_prog_compiler_pic_works+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_prog_compiler_pic_works=no
+ ac_outfile=conftest.$ac_objext
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:7086: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:7090: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test ! -s conftest.err; then
+ lt_prog_compiler_pic_works=yes
+ fi
+ fi
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6
+
+if test x"$lt_prog_compiler_pic_works" = xyes; then
+ case $lt_prog_compiler_pic in
+ "" | " "*) ;;
+ *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+ esac
+else
+ lt_prog_compiler_pic=
+ lt_prog_compiler_can_build_shared=no
+fi
+
+fi
+case "$host_os" in
+ # For platforms which do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ lt_prog_compiler_pic=
+ ;;
+ *)
+ lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
+ ;;
+esac
+
+echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_c_o+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_prog_compiler_c_o=no
+ $rm -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:7146: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:7150: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test ! -s out/conftest.err; then
+ lt_cv_prog_compiler_c_o=yes
+ fi
+ fi
+ chmod u+w .
+ $rm conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
+ $rm out/* && rmdir out
+ cd ..
+ rmdir conftest
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
+ # do not overwrite the value of need_locks provided by the user
+ echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6
+ hard_links=yes
+ $rm conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ echo "$as_me:$LINENO: result: $hard_links" >&5
+echo "${ECHO_T}$hard_links" >&6
+ if test "$hard_links" = no; then
+ { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+
+echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
+
+ runpath_var=
+ allow_undefined_flag=
+ enable_shared_with_static_runtimes=no
+ archive_cmds=
+ archive_expsym_cmds=
+ old_archive_From_new_cmds=
+ old_archive_from_expsyms_cmds=
+ export_dynamic_flag_spec=
+ whole_archive_flag_spec=
+ thread_safe_flag_spec=
+ hardcode_libdir_flag_spec=
+ hardcode_libdir_flag_spec_ld=
+ hardcode_libdir_separator=
+ hardcode_direct=no
+ hardcode_minus_L=no
+ hardcode_shlibpath_var=unsupported
+ link_all_deplibs=unknown
+ hardcode_automatic=no
+ module_cmds=
+ module_expsym_cmds=
+ always_export_symbols=no
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ # include_expsyms should be a list of space-separated symbols to be *always*
+ # included in the symbol list
+ include_expsyms=
+ # exclude_expsyms can be an extended regexp of symbols to exclude
+ # it will be wrapped by ` (' and `)$', so one must not match beginning or
+ # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+ # as well as any symbol that contains `d'.
+ exclude_expsyms="_GLOBAL_OFFSET_TABLE_"
+ # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+ # platforms (ab)use it in PIC code, but their linkers get confused if
+ # the symbol is explicitly referenced. Since portable code cannot
+ # rely on this symbol name, it's probably fine to never include it in
+ # preloaded symbol tables.
+ extract_expsyms_cmds=
+
+ case $host_os in
+ cygwin* | mingw* | pw32*)
+ # FIXME: the MSVC++ port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ if test "$GCC" != yes; then
+ with_gnu_ld=no
+ fi
+ ;;
+ openbsd*)
+ with_gnu_ld=no
+ ;;
+ esac
+
+ ld_shlibs=yes
+ if test "$with_gnu_ld" = yes; then
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ wlarc='${wl}'
+
+ # See if GNU ld supports shared libraries.
+ case $host_os in
+ aix3* | aix4* | aix5*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test "$host_cpu" != ia64; then
+ ld_shlibs=no
+ cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support. If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+ fi
+ ;;
+
+ amigaos*)
+ archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+
+ # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
+ # that the semantics of dynamic libraries on AmigaOS, at least up
+ # to version 4, is to share data among multiple programs linked
+ # with the same dynamic library. Since this doesn't match the
+ # behavior of shared libraries on other platforms, we can't use
+ # them.
+ ld_shlibs=no
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ allow_undefined_flag=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+ # as there is no search path for DLLs.
+ hardcode_libdir_flag_spec='-L$libdir'
+ allow_undefined_flag=unsupported
+ always_export_symbols=no
+ enable_shared_with_static_runtimes=yes
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
+
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib'
+ # If the export-symbols file already is a .def file (1st line
+ # is EXPORTS), use it as is; otherwise, prepend...
+ archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+ wlarc=
+ else
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ fi
+ ;;
+
+ solaris* | sysv5*)
+ if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+ ld_shlibs=no
+ cat <<EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+EOF
+ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ sunos4*)
+ archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ wlarc=
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ linux*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_cmds="$tmp_archive_cmds"
+ supports_anon_versioning=no
+ case `$LD -v 2>/dev/null` in
+ *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+ *\ 2.11.*) ;; # other 2.11 versions
+ *) supports_anon_versioning=yes ;;
+ esac
+ if test $supports_anon_versioning = yes; then
+ archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~
+cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+$echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+ else
+ archive_expsym_cmds="$tmp_archive_cmds"
+ fi
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+
+ if test "$ld_shlibs" = yes; then
+ runpath_var=LD_RUN_PATH
+ hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir'
+ export_dynamic_flag_spec='${wl}--export-dynamic'
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
+ whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ whole_archive_flag_spec=
+ fi
+ fi
+ else
+ # PORTME fill in a description of your system's linker (not GNU ld)
+ case $host_os in
+ aix3*)
+ allow_undefined_flag=unsupported
+ always_export_symbols=yes
+ archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ hardcode_minus_L=yes
+ if test "$GCC" = yes && test -z "$link_static_flag"; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ hardcode_direct=unsupported
+ fi
+ ;;
+
+ aix4* | aix5*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=""
+ else
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to AIX nm, but means don't demangle with GNU nm
+ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+ export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+ else
+ export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+ fi
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # need to do runtime linking.
+ case $host_os in aix4.[23]|aix4.[23].*|aix5*)
+ for ld_flag in $LDFLAGS; do
+ if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ archive_cmds=''
+ hardcode_direct=yes
+ hardcode_libdir_separator=':'
+ link_all_deplibs=yes
+
+ if test "$GCC" = yes; then
+ case $host_os in aix4.012|aix4.012.*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" && \
+ strings "$collect2name" | grep resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ hardcode_direct=yes
+ else
+ # We have old collect2
+ hardcode_direct=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ hardcode_minus_L=yes
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_libdir_separator=
+ fi
+ esac
+ shared_flag='-shared'
+ else
+ # not using gcc
+ if test "$host_cpu" = ia64; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag='${wl}-G'
+ else
+ shared_flag='${wl}-bM:SRE'
+ fi
+ fi
+ fi
+
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to export.
+ always_export_symbols=yes
+ if test "$aix_use_runtimelinking" = yes; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ allow_undefined_flag='-berok'
+ # Determine the default libpath from the value encoded in an empty executable.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+ hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+ archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ else
+ if test "$host_cpu" = ia64; then
+ hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+ allow_undefined_flag="-z nodefs"
+ archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an empty executable.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+ hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ no_undefined_flag=' ${wl}-bernotok'
+ allow_undefined_flag=' ${wl}-berok'
+ # -bexpall does not export symbols beginning with underscore (_)
+ always_export_symbols=yes
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec=' '
+ archive_cmds_need_lc=yes
+ # This is similar to how AIX traditionally builds it's shared libraries.
+ archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+ fi
+ fi
+ ;;
+
+ amigaos*)
+ archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ # see comment about different semantics on the GNU ld section
+ ld_shlibs=no
+ ;;
+
+ bsdi4*)
+ export_dynamic_flag_spec=-rdynamic
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec=' '
+ allow_undefined_flag=unsupported
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=".dll"
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ old_archive_From_new_cmds='true'
+ # FIXME: Should let the user specify the lib program.
+ old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs'
+ fix_srcfile_path='`cygpath -w "$srcfile"`'
+ enable_shared_with_static_runtimes=yes
+ ;;
+
+ darwin* | rhapsody*)
+ if test "$GXX" = yes ; then
+ archive_cmds_need_lc=no
+ case "$host_os" in
+ rhapsody* | darwin1.[012])
+ allow_undefined_flag='-undefined suppress'
+ ;;
+ *) # Darwin 1.3 on
+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+ allow_undefined_flag='-flat_namespace -undefined suppress'
+ else
+ case ${MACOSX_DEPLOYMENT_TARGET} in
+ 10.[012])
+ allow_undefined_flag='-flat_namespace -undefined suppress'
+ ;;
+ 10.*)
+ allow_undefined_flag='-undefined dynamic_lookup'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ lt_int_apple_cc_single_mod=no
+ output_verbose_link_cmd='echo'
+ if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then
+ lt_int_apple_cc_single_mod=yes
+ fi
+ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+ archive_cmds='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+ else
+ archive_cmds='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+ fi
+ module_cmds='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's
+ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+ archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ else
+ archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ fi
+ module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ hardcode_direct=no
+ hardcode_automatic=yes
+ hardcode_shlibpath_var=unsupported
+ whole_archive_flag_spec='-all_load $convenience'
+ link_all_deplibs=yes
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ dgux*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_shlibpath_var=no
+ ;;
+
+ freebsd1*)
+ ld_shlibs=no
+ ;;
+
+ # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+ # support. Future versions do this automatically, but an explicit c++rt0.o
+ # does not break anything, and helps significantly (at the cost of a little
+ # extra space).
+ freebsd2.2*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+ freebsd2*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+ freebsd* | kfreebsd*-gnu)
+ archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ hpux9*)
+ if test "$GCC" = yes; then
+ archive_cmds='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ else
+ archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ fi
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ export_dynamic_flag_spec='${wl}-E'
+ ;;
+
+ hpux10* | hpux11*)
+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ case "$host_cpu" in
+ hppa*64*|ia64*)
+ archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ else
+ case "$host_cpu" in
+ hppa*64*|ia64*)
+ archive_cmds='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags'
+ ;;
+ *)
+ archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+ ;;
+ esac
+ fi
+ if test "$with_gnu_ld" = no; then
+ case "$host_cpu" in
+ hppa*64*)
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_flag_spec_ld='+b $libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=no
+ hardcode_shlibpath_var=no
+ ;;
+ ia64*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_direct=no
+ hardcode_shlibpath_var=no
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ ;;
+ *)
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+ export_dynamic_flag_spec='${wl}-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ ;;
+ esac
+ fi
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ if test "$GCC" = yes; then
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ hardcode_libdir_flag_spec_ld='-rpath $libdir'
+ fi
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ link_all_deplibs=yes
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
+ else
+ archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
+ fi
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ newsos6)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_shlibpath_var=no
+ ;;
+
+ openbsd*)
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ export_dynamic_flag_spec='${wl}-E'
+ else
+ case $host_os in
+ openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-R$libdir'
+ ;;
+ *)
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ ;;
+ esac
+ fi
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ allow_undefined_flag=unsupported
+ archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+ old_archive_From_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+ ;;
+
+ osf3*)
+ if test "$GCC" = yes; then
+ allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ allow_undefined_flag=' -expect_unresolved \*'
+ archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ fi
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+
+ osf4* | osf5*) # as osf3* with the addition of -msym flag
+ if test "$GCC" = yes; then
+ allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ else
+ allow_undefined_flag=' -expect_unresolved \*'
+ archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
+ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp'
+
+ # Both c and cxx compiler support -rpath directly
+ hardcode_libdir_flag_spec='-rpath $libdir'
+ fi
+ hardcode_libdir_separator=:
+ ;;
+
+ sco3.2v5*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var=no
+ export_dynamic_flag_spec='${wl}-Bexport'
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ ;;
+
+ solaris*)
+ no_undefined_flag=' -z text'
+ if test "$GCC" = yes; then
+ archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
+ else
+ archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+ fi
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_shlibpath_var=no
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *) # Supported since Solaris 2.6 (maybe 2.5.1?)
+ whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;;
+ esac
+ link_all_deplibs=yes
+ ;;
+
+ sunos4*)
+ if test "x$host_vendor" = xsequent; then
+ # Use $CC to link under sequent, because it throws in some extra .o
+ # files that make .init and .fini sections work.
+ archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ sysv4)
+ case $host_vendor in
+ sni)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes # is this really true???
+ ;;
+ siemens)
+ ## LD is ld it makes a PLAMLIB
+ ## CC just makes a GrossModule.
+ archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ reload_cmds='$CC -r -o $output$reload_objs'
+ hardcode_direct=no
+ ;;
+ motorola)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ runpath_var='LD_RUN_PATH'
+ hardcode_shlibpath_var=no
+ ;;
+
+ sysv4.3*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var=no
+ export_dynamic_flag_spec='-Bexport'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ ld_shlibs=yes
+ fi
+ ;;
+
+ sysv4.2uw2*)
+ archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes
+ hardcode_minus_L=no
+ hardcode_shlibpath_var=no
+ hardcode_runpath_var=yes
+ runpath_var=LD_RUN_PATH
+ ;;
+
+ sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*)
+ no_undefined_flag='${wl}-z ${wl}text'
+ if test "$GCC" = yes; then
+ archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ runpath_var='LD_RUN_PATH'
+ hardcode_shlibpath_var=no
+ ;;
+
+ sysv5*)
+ no_undefined_flag=' -z text'
+ # $CC -shared without GNU ld will not create a library from C++
+ # object files and a static libstdc++, better avoid it by now
+ archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+ hardcode_libdir_flag_spec=
+ hardcode_shlibpath_var=no
+ runpath_var='LD_RUN_PATH'
+ ;;
+
+ uts4*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_shlibpath_var=no
+ ;;
+
+ *)
+ ld_shlibs=no
+ ;;
+ esac
+ fi
+
+echo "$as_me:$LINENO: result: $ld_shlibs" >&5
+echo "${ECHO_T}$ld_shlibs" >&6
+test "$ld_shlibs" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc" in
+x|xyes)
+ # Assume -lc should be added
+ archive_cmds_need_lc=yes
+
+ if test "$enable_shared" = yes && test "$GCC" = yes; then
+ case $archive_cmds in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
+ $rm conftest*
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$lt_prog_compiler_wl
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$allow_undefined_flag
+ allow_undefined_flag=
+ if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
+ (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ then
+ archive_cmds_need_lc=no
+ else
+ archive_cmds_need_lc=yes
+ fi
+ allow_undefined_flag=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $rm conftest*
+ echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5
+echo "${ECHO_T}$archive_cmds_need_lc" >&6
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
+ # if the path contains ";" then we assume it to be the separator
+ # otherwise default to the standard path separator (i.e. ":") - it is
+ # assumed that no part of a normal pathname contains ";" but that should
+ # okay in the real world where ";" in dirpaths is itself problematic.
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+else
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX 3 has no versioning support, so we append a major version to the name.
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+
+aix4* | aix5*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ hardcode_into_libs=yes
+ if test "$host_cpu" = ia64; then
+ # AIX 5 supports IA64
+ library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line `#! .'. This would cause the generated library to
+ # depend on `.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[01] | aix4.[01].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ if test "$aix_use_runtimelinking" = yes; then
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ else
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='${libname}${release}.a $libname.a'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ fi
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ ;;
+
+beos*)
+ library_names_spec='${libname}${shared_ext}'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi4*)
+ version_type=linux
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32*)
+ version_type=windows
+ shrext_cmds=".dll"
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$host_os in
+ yes,cygwin* | yes,mingw* | yes,pw32*)
+ library_names_spec='$libname.dll.a'
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \${file}`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $rm \$dlpath'
+ shlibpath_overrides_runpath=yes
+
+ case $host_os in
+ cygwin*)
+ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+ soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+ ;;
+ mingw*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH printed by
+ # mingw gcc, but we are running on Cygwin. Gcc prints its search
+ # path with ; separators, and with drive letters. We can handle the
+ # drive letters (cygwin fileutils understands them), so leave them,
+ # especially as we might pass files found there to a mingw objdump,
+ # which wouldn't understand a cygwinified path. Ahh.
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ ;;
+ pw32*)
+ # pw32 DLLs use 'pw' prefix rather than 'lib'
+ library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}'
+ ;;
+ esac
+ ;;
+
+ *)
+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+ soname_spec='${libname}${release}${major}$shared_ext'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)'
+ # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
+ if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
+ else
+ sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
+ fi
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+freebsd1*)
+ dynamic_linker=no
+ ;;
+
+kfreebsd*-gnu)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='GNU ld.so'
+ ;;
+
+freebsd*)
+ objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout`
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ freebsd3.01* | freebsdelf3.01*)
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ *) # from 3.2 on
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+gnu*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ case "$host_cpu" in
+ ia64*)
+ shrext_cmds='.so'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.so"
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ if test "X$HPUX_IA64_MODE" = X32; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ fi
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ hppa*64*)
+ shrext_cmds='.sl'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ *)
+ shrext_cmds='.sl'
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+ esac
+ # HP-UX runs *really* slowly unless shared libraries are mode 555.
+ postinstall_cmds='chmod 555 $lib'
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $host_os in
+ nonstopux*) version_type=nonstopux ;;
+ *)
+ if test "$lt_cv_prog_gnu_ld" = yes; then
+ version_type=linux
+ else
+ version_type=irix
+ fi ;;
+ esac
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+ case $host_os in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+ libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+ libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+ libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+ sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+ hardcode_into_libs=yes
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+ dynamic_linker=no
+ ;;
+
+# This must be Linux ELF.
+linux*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ # find out which ABI we are using
+ libsuff=
+ case "$host_cpu" in
+ x86_64*|s390x*|powerpc64*)
+ echo '#line 8480 "configure"' > conftest.$ac_ext
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *64-bit*)
+ libsuff=64
+ sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}"
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+ esac
+
+ # Append ld.so.conf contents to the search path
+ if test -f /etc/ld.so.conf; then
+ lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '`
+ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra"
+ fi
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+knetbsd*-gnu)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='GNU ld.so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+nto-qnx*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+openbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=yes
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ case $host_os in
+ openbsd2.[89] | openbsd2.[89].*)
+ shlibpath_overrides_runpath=no
+ ;;
+ *)
+ shlibpath_overrides_runpath=yes
+ ;;
+ esac
+ else
+ shlibpath_overrides_runpath=yes
+ fi
+ ;;
+
+os2*)
+ libname_spec='$name'
+ shrext_cmds=".dll"
+ need_lib_prefix=no
+ library_names_spec='$libname${shared_ext} $libname.a'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=LIBPATH
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+ ;;
+
+sco3.2v5*)
+ version_type=osf
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+solaris*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test "$with_gnu_ld" = yes; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ need_lib_prefix=no
+ export_dynamic_flag_spec='${wl}-Blargedynsym'
+ runpath_var=LD_RUN_PATH
+ ;;
+ siemens)
+ need_lib_prefix=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec ;then
+ version_type=linux
+ library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+ soname_spec='$libname${shared_ext}.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+uts4*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+echo "${ECHO_T}$dynamic_linker" >&6
+test "$dynamic_linker" = no && can_build_shared=no
+
+echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" || \
+ test -n "$runpath_var " || \
+ test "X$hardcode_automatic"="Xyes" ; then
+
+ # We can hardcode non-existant directories.
+ if test "$hardcode_direct" != no &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, )" != no &&
+ test "$hardcode_minus_L" != no; then
+ # Linking always hardcodes the temporary library directory.
+ hardcode_action=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ hardcode_action=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ hardcode_action=unsupported
+fi
+echo "$as_me:$LINENO: result: $hardcode_action" >&5
+echo "${ECHO_T}$hardcode_action" >&6
+
+if test "$hardcode_action" = relink; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+ test "$enable_shared" = no; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+
+striplib=
+old_striplib=
+echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5
+echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6
+if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then
+ test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+ test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+ case $host_os in
+ darwin*)
+ if test -n "$STRIP" ; then
+ striplib="$STRIP -x"
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+ ;;
+ *)
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ ;;
+ esac
+fi
+
+if test "x$enable_dlopen" != xyes; then
+ enable_dlopen=unknown
+ enable_dlopen_self=unknown
+ enable_dlopen_self_static=unknown
+else
+ lt_cv_dlopen=no
+ lt_cv_dlopen_libs=
+
+ case $host_os in
+ beos*)
+ lt_cv_dlopen="load_add_on"
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ;;
+
+ mingw* | pw32*)
+ lt_cv_dlopen="LoadLibrary"
+ lt_cv_dlopen_libs=
+ ;;
+
+ cygwin*)
+ lt_cv_dlopen="dlopen"
+ lt_cv_dlopen_libs=
+ ;;
+
+ darwin*)
+ # if libdl is installed we need to link against it
+ echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
+echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main ()
+{
+dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_dl_dlopen=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dl_dlopen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6
+if test $ac_cv_lib_dl_dlopen = yes; then
+ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+
+ lt_cv_dlopen="dyld"
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+
+fi
+
+ ;;
+
+ *)
+ echo "$as_me:$LINENO: checking for shl_load" >&5
+echo $ECHO_N "checking for shl_load... $ECHO_C" >&6
+if test "${ac_cv_func_shl_load+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define shl_load to an innocuous variant, in case <limits.h> declares shl_load.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define shl_load innocuous_shl_load
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char shl_load (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef shl_load
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char shl_load ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_shl_load) || defined (__stub___shl_load)
+choke me
+#else
+char (*f) () = shl_load;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != shl_load;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_shl_load=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_shl_load=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5
+echo "${ECHO_T}$ac_cv_func_shl_load" >&6
+if test $ac_cv_func_shl_load = yes; then
+ lt_cv_dlopen="shl_load"
+else
+ echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5
+echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6
+if test "${ac_cv_lib_dld_shl_load+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char shl_load ();
+int
+main ()
+{
+shl_load ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_dld_shl_load=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dld_shl_load=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5
+echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6
+if test $ac_cv_lib_dld_shl_load = yes; then
+ lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"
+else
+ echo "$as_me:$LINENO: checking for dlopen" >&5
+echo $ECHO_N "checking for dlopen... $ECHO_C" >&6
+if test "${ac_cv_func_dlopen+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define dlopen to an innocuous variant, in case <limits.h> declares dlopen.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define dlopen innocuous_dlopen
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char dlopen (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef dlopen
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_dlopen) || defined (__stub___dlopen)
+choke me
+#else
+char (*f) () = dlopen;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != dlopen;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_dlopen=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_dlopen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5
+echo "${ECHO_T}$ac_cv_func_dlopen" >&6
+if test $ac_cv_func_dlopen = yes; then
+ lt_cv_dlopen="dlopen"
+else
+ echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
+echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main ()
+{
+dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_dl_dlopen=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dl_dlopen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6
+if test $ac_cv_lib_dl_dlopen = yes; then
+ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+ echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5
+echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6
+if test "${ac_cv_lib_svld_dlopen+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main ()
+{
+dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_svld_dlopen=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_svld_dlopen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6
+if test $ac_cv_lib_svld_dlopen = yes; then
+ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
+else
+ echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5
+echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6
+if test "${ac_cv_lib_dld_dld_link+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dld_link ();
+int
+main ()
+{
+dld_link ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_dld_dld_link=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dld_dld_link=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5
+echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6
+if test $ac_cv_lib_dld_dld_link = yes; then
+ lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+ ;;
+ esac
+
+ if test "x$lt_cv_dlopen" != xno; then
+ enable_dlopen=yes
+ else
+ enable_dlopen=no
+ fi
+
+ case $lt_cv_dlopen in
+ dlopen)
+ save_CPPFLAGS="$CPPFLAGS"
+ test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+ save_LDFLAGS="$LDFLAGS"
+ eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+ save_LIBS="$LIBS"
+ LIBS="$lt_cv_dlopen_libs $LIBS"
+
+ echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5
+echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6
+if test "${lt_cv_dlopen_self+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then :
+ lt_cv_dlopen_self=cross
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<EOF
+#line 9351 "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ /* dlclose (self); */
+ }
+
+ exit (status);
+}
+EOF
+ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then
+ (./conftest; exit; ) 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+ x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+ x$lt_unknown|x*) lt_cv_dlopen_self=no ;;
+ esac
+ else :
+ # compilation failed
+ lt_cv_dlopen_self=no
+ fi
+fi
+rm -fr conftest*
+
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5
+echo "${ECHO_T}$lt_cv_dlopen_self" >&6
+
+ if test "x$lt_cv_dlopen_self" = xyes; then
+ LDFLAGS="$LDFLAGS $link_static_flag"
+ echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5
+echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6
+if test "${lt_cv_dlopen_self_static+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then :
+ lt_cv_dlopen_self_static=cross
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<EOF
+#line 9449 "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ /* dlclose (self); */
+ }
+
+ exit (status);
+}
+EOF
+ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then
+ (./conftest; exit; ) 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+ x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+ x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;;
+ esac
+ else :
+ # compilation failed
+ lt_cv_dlopen_self_static=no
+ fi
+fi
+rm -fr conftest*
+
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5
+echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6
+ fi
+
+ CPPFLAGS="$save_CPPFLAGS"
+ LDFLAGS="$save_LDFLAGS"
+ LIBS="$save_LIBS"
+ ;;
+ esac
+
+ case $lt_cv_dlopen_self in
+ yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+ *) enable_dlopen_self=unknown ;;
+ esac
+
+ case $lt_cv_dlopen_self_static in
+ yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+ *) enable_dlopen_self_static=unknown ;;
+ esac
+fi
+
+
+# Report which librarie types wil actually be built
+echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5
+echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $can_build_shared" >&5
+echo "${ECHO_T}$can_build_shared" >&6
+
+echo "$as_me:$LINENO: checking whether to build shared libraries" >&5
+echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6
+test "$can_build_shared" = "no" && enable_shared=no
+
+# On AIX, shared libraries and static libraries use the same namespace, and
+# are all built from PIC.
+case "$host_os" in
+aix3*)
+ test "$enable_shared" = yes && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+
+aix4* | aix5*)
+ if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+ test "$enable_shared" = yes && enable_static=no
+ fi
+ ;;
+ darwin* | rhapsody*)
+ if test "$GCC" = yes; then
+ archive_cmds_need_lc=no
+ case "$host_os" in
+ rhapsody* | darwin1.[012])
+ allow_undefined_flag='-undefined suppress'
+ ;;
+ *) # Darwin 1.3 on
+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+ allow_undefined_flag='-flat_namespace -undefined suppress'
+ else
+ case ${MACOSX_DEPLOYMENT_TARGET} in
+ 10.[012])
+ allow_undefined_flag='-flat_namespace -undefined suppress'
+ ;;
+ 10.*)
+ allow_undefined_flag='-undefined dynamic_lookup'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ output_verbose_link_cmd='echo'
+ archive_cmds='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring'
+ module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's
+ archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ hardcode_direct=no
+ hardcode_automatic=yes
+ hardcode_shlibpath_var=unsupported
+ whole_archive_flag_spec='-all_load $convenience'
+ link_all_deplibs=yes
+ else
+ ld_shlibs=no
+ fi
+ ;;
+esac
+echo "$as_me:$LINENO: result: $enable_shared" >&5
+echo "${ECHO_T}$enable_shared" >&6
+
+echo "$as_me:$LINENO: checking whether to build static libraries" >&5
+echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+echo "$as_me:$LINENO: result: $enable_static" >&5
+echo "${ECHO_T}$enable_static" >&6
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+ # See if we are running on zsh, and set the options which allow our commands through
+ # without removal of \ escapes.
+ if test -n "${ZSH_VERSION+set}" ; then
+ setopt NO_GLOB_SUBST
+ fi
+ # Now quote all the things that may contain metacharacters while being
+ # careful not to overquote the AC_SUBSTed values. We take copies of the
+ # variables and quote the copies for generation of the libtool script.
+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \
+ SED SHELL STRIP \
+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+ deplibs_check_method reload_flag reload_cmds need_locks \
+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+ lt_cv_sys_global_symbol_to_c_name_address \
+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+ old_postinstall_cmds old_postuninstall_cmds \
+ compiler \
+ CC \
+ LD \
+ lt_prog_compiler_wl \
+ lt_prog_compiler_pic \
+ lt_prog_compiler_static \
+ lt_prog_compiler_no_builtin_flag \
+ export_dynamic_flag_spec \
+ thread_safe_flag_spec \
+ whole_archive_flag_spec \
+ enable_shared_with_static_runtimes \
+ old_archive_cmds \
+ old_archive_from_new_cmds \
+ predep_objects \
+ postdep_objects \
+ predeps \
+ postdeps \
+ compiler_lib_search_path \
+ archive_cmds \
+ archive_expsym_cmds \
+ postinstall_cmds \
+ postuninstall_cmds \
+ old_archive_from_expsyms_cmds \
+ allow_undefined_flag \
+ no_undefined_flag \
+ export_symbols_cmds \
+ hardcode_libdir_flag_spec \
+ hardcode_libdir_flag_spec_ld \
+ hardcode_libdir_separator \
+ hardcode_automatic \
+ module_cmds \
+ module_expsym_cmds \
+ lt_cv_prog_compiler_c_o \
+ exclude_expsyms \
+ include_expsyms; do
+
+ case $var in
+ old_archive_cmds | \
+ old_archive_from_new_cmds | \
+ archive_cmds | \
+ archive_expsym_cmds | \
+ module_cmds | \
+ module_expsym_cmds | \
+ old_archive_from_expsyms_cmds | \
+ export_symbols_cmds | \
+ extract_expsyms_cmds | reload_cmds | finish_cmds | \
+ postinstall_cmds | postuninstall_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | \
+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+ # Double-quote double-evaled strings.
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+ ;;
+ *)
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+ ;;
+ esac
+ done
+
+ case $lt_echo in
+ *'\$0 --fallback-echo"')
+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+ ;;
+ esac
+
+cfgfile="${ofile}T"
+ trap "$rm \"$cfgfile\"; exit 1" 1 2 15
+ $rm -f "$cfgfile"
+ { echo "$as_me:$LINENO: creating $ofile" >&5
+echo "$as_me: creating $ofile" >&6;}
+
+ cat <<__EOF__ >> "$cfgfile"
+#! $SHELL
+
+# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
+# Free Software Foundation, Inc.
+#
+# This file is part of GNU Libtool:
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# This program 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 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="$SED -e s/^X//"
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi
+
+# The names of the tagged configurations supported by this script.
+available_tags=
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# A language-specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Must we lock files when doing compilation ?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_predep_objects
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_postdep_objects
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$hardcode_automatic
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# ### END LIBTOOL CONFIG
+
+__EOF__
+
+
+ case $host_os in
+ aix3*)
+ cat <<\EOF >> "$cfgfile"
+
+# AIX sometimes has problems with the GCC collect2 program. For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+fi
+EOF
+ ;;
+ esac
+
+ # We use sed instead of cat because bash on DJGPP gets confused if
+ # if finds mixed CR/LF and LF-only lines. Since sed operates in
+ # text mode, it properly converts lines to CR/LF. This bash problem
+ # is reportedly fixed, but why not run on old versions too?
+ sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1)
+
+ mv -f "$cfgfile" "$ofile" || \
+ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+ chmod +x "$ofile"
+
+else
+ # If there is no Makefile yet, we rely on a make rule to execute
+ # `config.status --recheck' to rerun these tests and create the
+ # libtool script then.
+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+ if test -f "$ltmain_in"; then
+ test -f Makefile && make "$ltmain"
+ fi
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC="$lt_save_CC"
+
+
+# Check whether --with-tags or --without-tags was given.
+if test "${with_tags+set}" = set; then
+ withval="$with_tags"
+ tagnames="$withval"
+fi;
+
+if test -f "$ltmain" && test -n "$tagnames"; then
+ if test ! -f "${ofile}"; then
+ { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not exist" >&5
+echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;}
+ fi
+
+ if test -z "$LTCC"; then
+ eval "`$SHELL ${ofile} --config | grep '^LTCC='`"
+ if test -z "$LTCC"; then
+ { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not look like a libtool script" >&5
+echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;}
+ else
+ { echo "$as_me:$LINENO: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5
+echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;}
+ fi
+ fi
+
+ # Extract list of available tagged configurations in $ofile.
+ # Note that this assumes the entire list is on one line.
+ available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'`
+
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for tagname in $tagnames; do
+ IFS="$lt_save_ifs"
+ # Check whether tagname contains only valid characters
+ case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in
+ "") ;;
+ *) { { echo "$as_me:$LINENO: error: invalid tag name: $tagname" >&5
+echo "$as_me: error: invalid tag name: $tagname" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+ esac
+
+ if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null
+ then
+ { { echo "$as_me:$LINENO: error: tag name \"$tagname\" already exists" >&5
+echo "$as_me: error: tag name \"$tagname\" already exists" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+ # Update the list of available tags.
+ if test -n "$tagname"; then
+ echo appending configuration tag \"$tagname\" to $ofile
+
+ case $tagname in
+ CXX)
+ if test -n "$CXX" && test "X$CXX" != "Xno"; then
+ ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+
+
+archive_cmds_need_lc_CXX=no
+allow_undefined_flag_CXX=
+always_export_symbols_CXX=no
+archive_expsym_cmds_CXX=
+export_dynamic_flag_spec_CXX=
+hardcode_direct_CXX=no
+hardcode_libdir_flag_spec_CXX=
+hardcode_libdir_flag_spec_ld_CXX=
+hardcode_libdir_separator_CXX=
+hardcode_minus_L_CXX=no
+hardcode_automatic_CXX=no
+module_cmds_CXX=
+module_expsym_cmds_CXX=
+link_all_deplibs_CXX=unknown
+old_archive_cmds_CXX=$old_archive_cmds
+no_undefined_flag_CXX=
+whole_archive_flag_spec_CXX=
+enable_shared_with_static_runtimes_CXX=no
+
+# Dependencies to place before and after the object being linked:
+predep_objects_CXX=
+postdep_objects_CXX=
+predeps_CXX=
+postdeps_CXX=
+compiler_lib_search_path_CXX=
+
+# Source file extension for C++ test sources.
+ac_ext=cc
+
+# Object file extension for compiled C++ test sources.
+objext=o
+objext_CXX=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(int, char *) { return(0); }\n'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_LD=$LD
+lt_save_GCC=$GCC
+GCC=$GXX
+lt_save_with_gnu_ld=$with_gnu_ld
+lt_save_path_LD=$lt_cv_path_LD
+if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+ lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+else
+ unset lt_cv_prog_gnu_ld
+fi
+if test -n "${lt_cv_path_LDCXX+set}"; then
+ lt_cv_path_LD=$lt_cv_path_LDCXX
+else
+ unset lt_cv_path_LD
+fi
+test -z "${LDCXX+set}" || LD=$LDCXX
+CC=${CXX-"c++"}
+compiler=$CC
+compiler_CXX=$CC
+cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'`
+
+# We don't want -fno-exception wen compiling C++ code, so set the
+# no_builtin_flag separately
+if test "$GXX" = yes; then
+ lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
+else
+ lt_prog_compiler_no_builtin_flag_CXX=
+fi
+
+if test "$GXX" = yes; then
+ # Set up default GNU C++ configuration
+
+
+# Check whether --with-gnu-ld or --without-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then
+ withval="$with_gnu_ld"
+ test "$withval" = no || with_gnu_ld=yes
+else
+ with_gnu_ld=no
+fi;
+ac_prog=ld
+if test "$GCC" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ echo "$as_me:$LINENO: checking for ld used by $CC" >&5
+echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [\\/]* | ?:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+ # Canonicalize the pathname of ld
+ ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'`
+ while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ echo "$as_me:$LINENO: checking for GNU ld" >&5
+echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6
+else
+ echo "$as_me:$LINENO: checking for non-GNU ld" >&5
+echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6
+fi
+if test "${lt_cv_path_LD+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -z "$LD"; then
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ lt_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some GNU ld's only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test "$with_gnu_ld" != no && break
+ ;;
+ *)
+ test "$with_gnu_ld" != yes && break
+ ;;
+ esac
+ fi
+ done
+ IFS="$lt_save_ifs"
+else
+ lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+ echo "$as_me:$LINENO: result: $LD" >&5
+echo "${ECHO_T}$LD" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
+echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
+ { (exit 1); exit 1; }; }
+echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
+echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6
+if test "${lt_cv_prog_gnu_ld+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # I'd rather use --version here, but apparently some GNU ld's only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ lt_cv_prog_gnu_ld=yes
+ ;;
+*)
+ lt_cv_prog_gnu_ld=no
+ ;;
+esac
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5
+echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+ # Check if GNU C++ uses GNU ld as the underlying linker, since the
+ # archiving commands below assume that GNU ld is being used.
+ if test "$with_gnu_ld" = yes; then
+ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+ hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'
+ export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+ # investigate it a little bit more. (MM)
+ wlarc='${wl}'
+
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if eval "`$CC -print-prog-name=ld` --help 2>&1" | \
+ grep 'no-whole-archive' > /dev/null; then
+ whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ whole_archive_flag_spec_CXX=
+ fi
+ else
+ with_gnu_ld=no
+ wlarc=
+
+ # A generic and very simple default shared library creation
+ # command for GNU C++ for the case where it uses the native
+ # linker, instead of GNU ld. If possible, this setting should
+ # overridden to take advantage of the native linker features on
+ # the platform it is being used on.
+ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+ fi
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+else
+ GXX=no
+ with_gnu_ld=no
+ wlarc=
+fi
+
+# PORTME: fill in a description of your system's C++ link characteristics
+echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
+ld_shlibs_CXX=yes
+case $host_os in
+ aix3*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ aix4* | aix5*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=""
+ else
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # need to do runtime linking.
+ case $host_os in aix4.[23]|aix4.[23].*|aix5*)
+ for ld_flag in $LDFLAGS; do
+ case $ld_flag in
+ *-brtl*)
+ aix_use_runtimelinking=yes
+ break
+ ;;
+ esac
+ done
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ archive_cmds_CXX=''
+ hardcode_direct_CXX=yes
+ hardcode_libdir_separator_CXX=':'
+ link_all_deplibs_CXX=yes
+
+ if test "$GXX" = yes; then
+ case $host_os in aix4.012|aix4.012.*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" && \
+ strings "$collect2name" | grep resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ hardcode_direct_CXX=yes
+ else
+ # We have old collect2
+ hardcode_direct_CXX=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ hardcode_minus_L_CXX=yes
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ hardcode_libdir_separator_CXX=
+ fi
+ esac
+ shared_flag='-shared'
+ else
+ # not using gcc
+ if test "$host_cpu" = ia64; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag='${wl}-G'
+ else
+ shared_flag='${wl}-bM:SRE'
+ fi
+ fi
+ fi
+
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to export.
+ always_export_symbols_CXX=yes
+ if test "$aix_use_runtimelinking" = yes; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ allow_undefined_flag_CXX='-berok'
+ # Determine the default libpath from the value encoded in an empty executable.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+ hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+ archive_expsym_cmds_CXX="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ else
+ if test "$host_cpu" = ia64; then
+ hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib'
+ allow_undefined_flag_CXX="-z nodefs"
+ archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an empty executable.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+ hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ no_undefined_flag_CXX=' ${wl}-bernotok'
+ allow_undefined_flag_CXX=' ${wl}-berok'
+ # -bexpall does not export symbols beginning with underscore (_)
+ always_export_symbols_CXX=yes
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec_CXX=' '
+ archive_cmds_need_lc_CXX=yes
+ # This is similar to how AIX traditionally builds it's shared libraries.
+ archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+ fi
+ fi
+ ;;
+ chorus*)
+ case $cc_basename in
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
+ # as there is no search path for DLLs.
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ allow_undefined_flag_CXX=unsupported
+ always_export_symbols_CXX=no
+ enable_shared_with_static_runtimes_CXX=yes
+
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib'
+ # If the export-symbols file already is a .def file (1st line
+ # is EXPORTS), use it as is; otherwise, prepend...
+ archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib'
+ else
+ ld_shlibs_CXX=no
+ fi
+ ;;
+
+ darwin* | rhapsody*)
+ if test "$GXX" = yes; then
+ archive_cmds_need_lc_CXX=no
+ case "$host_os" in
+ rhapsody* | darwin1.[012])
+ allow_undefined_flag_CXX='-undefined suppress'
+ ;;
+ *) # Darwin 1.3 on
+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+ allow_undefined_flag_CXX='-flat_namespace -undefined suppress'
+ else
+ case ${MACOSX_DEPLOYMENT_TARGET} in
+ 10.[012])
+ allow_undefined_flag_CXX='-flat_namespace -undefined suppress'
+ ;;
+ 10.*)
+ allow_undefined_flag_CXX='-undefined dynamic_lookup'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ lt_int_apple_cc_single_mod=no
+ output_verbose_link_cmd='echo'
+ if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then
+ lt_int_apple_cc_single_mod=yes
+ fi
+ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+ archive_cmds_CXX='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+ else
+ archive_cmds_CXX='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+ fi
+ module_cmds_CXX='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's
+ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+ archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ else
+ archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ fi
+ module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ hardcode_direct_CXX=no
+ hardcode_automatic_CXX=yes
+ hardcode_shlibpath_var_CXX=unsupported
+ whole_archive_flag_spec_CXX='-all_load $convenience'
+ link_all_deplibs_CXX=yes
+ else
+ ld_shlibs_CXX=no
+ fi
+ ;;
+
+ dgux*)
+ case $cc_basename in
+ ec++)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ ghcx)
+ # Green Hills C++ Compiler
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+ freebsd12*)
+ # C++ shared libraries reported to be fairly broken before switch to ELF
+ ld_shlibs_CXX=no
+ ;;
+ freebsd-elf*)
+ archive_cmds_need_lc_CXX=no
+ ;;
+ freebsd* | kfreebsd*-gnu)
+ # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+ # conventions
+ ld_shlibs_CXX=yes
+ ;;
+ gnu*)
+ ;;
+ hpux9*)
+ hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator_CXX=:
+ export_dynamic_flag_spec_CXX='${wl}-E'
+ hardcode_direct_CXX=yes
+ hardcode_minus_L_CXX=yes # Not in the search PATH,
+ # but as the default
+ # location of the library.
+
+ case $cc_basename in
+ CC)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ aCC)
+ archive_cmds_CXX='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ archive_cmds_CXX='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ else
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+ hpux10*|hpux11*)
+ if test $with_gnu_ld = no; then
+ case "$host_cpu" in
+ hppa*64*)
+ hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+ hardcode_libdir_flag_spec_ld_CXX='+b $libdir'
+ hardcode_libdir_separator_CXX=:
+ ;;
+ ia64*)
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ ;;
+ *)
+ hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator_CXX=:
+ export_dynamic_flag_spec_CXX='${wl}-E'
+ ;;
+ esac
+ fi
+ case "$host_cpu" in
+ hppa*64*)
+ hardcode_direct_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ ;;
+ ia64*)
+ hardcode_direct_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ hardcode_minus_L_CXX=yes # Not in the search PATH,
+ # but as the default
+ # location of the library.
+ ;;
+ *)
+ hardcode_direct_CXX=yes
+ hardcode_minus_L_CXX=yes # Not in the search PATH,
+ # but as the default
+ # location of the library.
+ ;;
+ esac
+
+ case $cc_basename in
+ CC)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ aCC)
+ case "$host_cpu" in
+ hppa*64*|ia64*)
+ archive_cmds_CXX='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ esac
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ if test $with_gnu_ld = no; then
+ case "$host_cpu" in
+ ia64*|hppa*64*)
+ archive_cmds_CXX='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ esac
+ fi
+ else
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+ irix5* | irix6*)
+ case $cc_basename in
+ CC)
+ # SGI C++
+ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib'
+
+ # Archives containing C++ object files must be created using
+ # "CC -ar", where "CC" is the IRIX C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ if test "$with_gnu_ld" = no; then
+ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib'
+ else
+ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib'
+ fi
+ fi
+ link_all_deplibs_CXX=yes
+ ;;
+ esac
+ hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_CXX=:
+ ;;
+ linux*)
+ case $cc_basename in
+ KCC)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+ archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+
+ hardcode_libdir_flag_spec_CXX='${wl}--rpath,$libdir'
+ export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+
+ # Archives containing C++ object files must be created using
+ # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+ old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
+ ;;
+ icpc)
+ # Intel C++
+ with_gnu_ld=yes
+ archive_cmds_need_lc_CXX=no
+ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+ export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+ whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+ ;;
+ cxx)
+ # Compaq C++
+ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+ runpath_var=LD_RUN_PATH
+ hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ esac
+ ;;
+ lynxos*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ m88k*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ mvs*)
+ case $cc_basename in
+ cxx)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+ wlarc=
+ hardcode_libdir_flag_spec_CXX='-R$libdir'
+ hardcode_direct_CXX=yes
+ hardcode_shlibpath_var_CXX=no
+ fi
+ # Workaround some broken pre-1.5 toolchains
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+ ;;
+ osf3*)
+ case $cc_basename in
+ KCC)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+ hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Archives containing C++ object files must be created using
+ # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+ old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
+
+ ;;
+ RCC)
+ # Rational C++ 2.4.1
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ cxx)
+ allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib'
+
+ hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+ allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib'
+
+ hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+ else
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+ osf4* | osf5*)
+ case $cc_basename in
+ KCC)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+ hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Archives containing C++ object files must be created using
+ # the KAI C++ compiler.
+ old_archive_cmds_CXX='$CC -o $oldlib $oldobjs'
+ ;;
+ RCC)
+ # Rational C++ 2.4.1
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ cxx)
+ allow_undefined_flag_CXX=' -expect_unresolved \*'
+ archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib'
+ archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+ echo "-hidden">> $lib.exp~
+ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~
+ $rm $lib.exp'
+
+ hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+ allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib'
+
+ hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+ else
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+ psos*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ sco*)
+ archive_cmds_need_lc_CXX=no
+ case $cc_basename in
+ CC)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+ sunos4*)
+ case $cc_basename in
+ CC)
+ # Sun C++ 4.x
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ lcc)
+ # Lucid
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+ solaris*)
+ case $cc_basename in
+ CC)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ no_undefined_flag_CXX=' -zdefs'
+ archive_cmds_CXX='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+ hardcode_libdir_flag_spec_CXX='-R$libdir'
+ hardcode_shlibpath_var_CXX=no
+ case $host_os in
+ solaris2.0-5 | solaris2.0-5.*) ;;
+ *)
+ # The C++ compiler is used as linker so we must use $wl
+ # flag to pass the commands to the underlying system
+ # linker.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+ ;;
+ esac
+ link_all_deplibs_CXX=yes
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[LR]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+
+ # Archives containing C++ object files must be created using
+ # "CC -xar", where "CC" is the Sun C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+ ;;
+ gcx)
+ # Green Hills C++ Compiler
+ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+ # The C++ compiler must be used to create the archive.
+ old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+ ;;
+ *)
+ # GNU C++ compiler with Solaris linker
+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+ no_undefined_flag_CXX=' ${wl}-z ${wl}defs'
+ if $CC --version | grep -v '^2\.7' > /dev/null; then
+ archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
+ else
+ # g++ 2.7 appears to require `-G' NOT `-shared' on this
+ # platform.
+ archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
+ fi
+
+ hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir'
+ fi
+ ;;
+ esac
+ ;;
+ sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*)
+ archive_cmds_need_lc_CXX=no
+ ;;
+ tandem*)
+ case $cc_basename in
+ NCC)
+ # NonStop-UX NCC 3.20
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+ vxworks*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+esac
+echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5
+echo "${ECHO_T}$ld_shlibs_CXX" >&6
+test "$ld_shlibs_CXX" = no && can_build_shared=no
+
+GCC_CXX="$GXX"
+LD_CXX="$LD"
+
+
+cat > conftest.$ac_ext <<EOF
+class Foo
+{
+public:
+ Foo (void) { a = 0; }
+private:
+ int a;
+};
+EOF
+
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # Parse the compiler output and extract the necessary
+ # objects, libraries and library flags.
+
+ # Sentinel used to keep track of whether or not we are before
+ # the conftest object file.
+ pre_test_object_deps_done=no
+
+ # The `*' in the case matches for architectures that use `case' in
+ # $output_verbose_cmd can trigger glob expansion during the loop
+ # eval without this substitution.
+ output_verbose_link_cmd="`$echo \"X$output_verbose_link_cmd\" | $Xsed -e \"$no_glob_subst\"`"
+
+ for p in `eval $output_verbose_link_cmd`; do
+ case $p in
+
+ -L* | -R* | -l*)
+ # Some compilers place space between "-{L,R}" and the path.
+ # Remove the space.
+ if test $p = "-L" \
+ || test $p = "-R"; then
+ prev=$p
+ continue
+ else
+ prev=
+ fi
+
+ if test "$pre_test_object_deps_done" = no; then
+ case $p in
+ -L* | -R*)
+ # Internal compiler library paths should come after those
+ # provided the user. The postdeps already come after the
+ # user supplied libs so there is no need to process them.
+ if test -z "$compiler_lib_search_path_CXX"; then
+ compiler_lib_search_path_CXX="${prev}${p}"
+ else
+ compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}"
+ fi
+ ;;
+ # The "-l" case would never come before the object being
+ # linked, so don't bother handling this case.
+ esac
+ else
+ if test -z "$postdeps_CXX"; then
+ postdeps_CXX="${prev}${p}"
+ else
+ postdeps_CXX="${postdeps_CXX} ${prev}${p}"
+ fi
+ fi
+ ;;
+
+ *.$objext)
+ # This assumes that the test object file only shows up
+ # once in the compiler output.
+ if test "$p" = "conftest.$objext"; then
+ pre_test_object_deps_done=yes
+ continue
+ fi
+
+ if test "$pre_test_object_deps_done" = no; then
+ if test -z "$predep_objects_CXX"; then
+ predep_objects_CXX="$p"
+ else
+ predep_objects_CXX="$predep_objects_CXX $p"
+ fi
+ else
+ if test -z "$postdep_objects_CXX"; then
+ postdep_objects_CXX="$p"
+ else
+ postdep_objects_CXX="$postdep_objects_CXX $p"
+ fi
+ fi
+ ;;
+
+ *) ;; # Ignore the rest.
+
+ esac
+ done
+
+ # Clean up.
+ rm -f a.out a.exe
+else
+ echo "libtool.m4: error: problem compiling CXX test program"
+fi
+
+$rm -f confest.$objext
+
+case " $postdeps_CXX " in
+*" -lc "*) archive_cmds_need_lc_CXX=no ;;
+esac
+
+lt_prog_compiler_wl_CXX=
+lt_prog_compiler_pic_CXX=
+lt_prog_compiler_static_CXX=
+
+echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
+
+ # C++ specific cases for pic, static, wl, etc.
+ if test "$GXX" = yes; then
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_CXX='-Bstatic'
+ fi
+ ;;
+ amigaos*)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the `-m68020' flag to GCC prevents building anything better,
+ # like `-m68040'.
+ lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
+ ;;
+ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+ mingw* | os2* | pw32*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+ ;;
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic_CXX='-fno-common'
+ ;;
+ *djgpp*)
+ # DJGPP does not support shared libraries at all
+ lt_prog_compiler_pic_CXX=
+ ;;
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic_CXX=-Kconform_pic
+ fi
+ ;;
+ hpux*)
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case "$host_cpu" in
+ hppa*64*|ia64*)
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ esac
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ esac
+ else
+ case $host_os in
+ aix4* | aix5*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_CXX='-Bstatic'
+ else
+ lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+ chorus*)
+ case $cc_basename in
+ cxch68)
+ # Green Hills C++ Compiler
+ # _LT_AC_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+ ;;
+ esac
+ ;;
+ dgux*)
+ case $cc_basename in
+ ec++)
+ lt_prog_compiler_pic_CXX='-KPIC'
+ ;;
+ ghcx)
+ # Green Hills C++ Compiler
+ lt_prog_compiler_pic_CXX='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ freebsd* | kfreebsd*-gnu)
+ # FreeBSD uses GNU C++
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ case $cc_basename in
+ CC)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive"
+ if test "$host_cpu" != ia64; then
+ lt_prog_compiler_pic_CXX='+Z'
+ fi
+ ;;
+ aCC)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive"
+ case "$host_cpu" in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX='+Z'
+ ;;
+ esac
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ irix5* | irix6* | nonstopux*)
+ case $cc_basename in
+ CC)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='-non_shared'
+ # CC pic flag -KPIC is the default.
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ linux*)
+ case $cc_basename in
+ KCC)
+ # KAI C++ Compiler
+ lt_prog_compiler_wl_CXX='--backend -Wl,'
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ icpc)
+ # Intel C++
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-static'
+ ;;
+ cxx)
+ # Compaq C++
+ # Make sure the PIC flag is empty. It appears that all Alpha
+ # Linux and Compaq Tru64 Unix objects are PIC.
+ lt_prog_compiler_pic_CXX=
+ lt_prog_compiler_static_CXX='-non_shared'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ lynxos*)
+ ;;
+ m88k*)
+ ;;
+ mvs*)
+ case $cc_basename in
+ cxx)
+ lt_prog_compiler_pic_CXX='-W c,exportall'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ netbsd*)
+ ;;
+ osf3* | osf4* | osf5*)
+ case $cc_basename in
+ KCC)
+ lt_prog_compiler_wl_CXX='--backend -Wl,'
+ ;;
+ RCC)
+ # Rational C++ 2.4.1
+ lt_prog_compiler_pic_CXX='-pic'
+ ;;
+ cxx)
+ # Digital/Compaq C++
+ lt_prog_compiler_wl_CXX='-Wl,'
+ # Make sure the PIC flag is empty. It appears that all Alpha
+ # Linux and Compaq Tru64 Unix objects are PIC.
+ lt_prog_compiler_pic_CXX=
+ lt_prog_compiler_static_CXX='-non_shared'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ psos*)
+ ;;
+ sco*)
+ case $cc_basename in
+ CC)
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ solaris*)
+ case $cc_basename in
+ CC)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ lt_prog_compiler_wl_CXX='-Qoption ld '
+ ;;
+ gcx)
+ # Green Hills C++ Compiler
+ lt_prog_compiler_pic_CXX='-PIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ sunos4*)
+ case $cc_basename in
+ CC)
+ # Sun C++ 4.x
+ lt_prog_compiler_pic_CXX='-pic'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ ;;
+ lcc)
+ # Lucid
+ lt_prog_compiler_pic_CXX='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ tandem*)
+ case $cc_basename in
+ NCC)
+ # NonStop-UX NCC 3.20
+ lt_prog_compiler_pic_CXX='-KPIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ unixware*)
+ ;;
+ vxworks*)
+ ;;
+ *)
+ lt_prog_compiler_can_build_shared_CXX=no
+ ;;
+ esac
+ fi
+
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_CXX" >&6
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_CXX"; then
+
+echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... $ECHO_C" >&6
+if test "${lt_prog_compiler_pic_works_CXX+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_prog_compiler_pic_works_CXX=no
+ ac_outfile=conftest.$ac_objext
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:11628: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:11632: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test ! -s conftest.err; then
+ lt_prog_compiler_pic_works_CXX=yes
+ fi
+ fi
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_CXX" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_works_CXX" >&6
+
+if test x"$lt_prog_compiler_pic_works_CXX" = xyes; then
+ case $lt_prog_compiler_pic_CXX in
+ "" | " "*) ;;
+ *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
+ esac
+else
+ lt_prog_compiler_pic_CXX=
+ lt_prog_compiler_can_build_shared_CXX=no
+fi
+
+fi
+case "$host_os" in
+ # For platforms which do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ lt_prog_compiler_pic_CXX=
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC"
+ ;;
+esac
+
+echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_prog_compiler_c_o_CXX=no
+ $rm -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:11688: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:11692: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test ! -s out/conftest.err; then
+ lt_cv_prog_compiler_c_o_CXX=yes
+ fi
+ fi
+ chmod u+w .
+ $rm conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
+ $rm out/* && rmdir out
+ cd ..
+ rmdir conftest
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then
+ # do not overwrite the value of need_locks provided by the user
+ echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6
+ hard_links=yes
+ $rm conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ echo "$as_me:$LINENO: result: $hard_links" >&5
+echo "${ECHO_T}$hard_links" >&6
+ if test "$hard_links" = no; then
+ { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+
+echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
+
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ case $host_os in
+ aix4* | aix5*)
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to AIX nm, but means don't demangle with GNU nm
+ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+ export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+ else
+ export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+ fi
+ ;;
+ pw32*)
+ export_symbols_cmds_CXX="$ltdll_cmds"
+ ;;
+ cygwin* | mingw*)
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
+ ;;
+ *)
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ ;;
+ esac
+
+echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5
+echo "${ECHO_T}$ld_shlibs_CXX" >&6
+test "$ld_shlibs_CXX" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_CXX" in
+x|xyes)
+ # Assume -lc should be added
+ archive_cmds_need_lc_CXX=yes
+
+ if test "$enable_shared" = yes && test "$GCC" = yes; then
+ case $archive_cmds_CXX in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
+ $rm conftest*
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$lt_prog_compiler_wl_CXX
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$allow_undefined_flag_CXX
+ allow_undefined_flag_CXX=
+ if { (eval echo "$as_me:$LINENO: \"$archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
+ (eval $archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ then
+ archive_cmds_need_lc_CXX=no
+ else
+ archive_cmds_need_lc_CXX=yes
+ fi
+ allow_undefined_flag_CXX=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $rm conftest*
+ echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5
+echo "${ECHO_T}$archive_cmds_need_lc_CXX" >&6
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
+ # if the path contains ";" then we assume it to be the separator
+ # otherwise default to the standard path separator (i.e. ":") - it is
+ # assumed that no part of a normal pathname contains ";" but that should
+ # okay in the real world where ";" in dirpaths is itself problematic.
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+else
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX 3 has no versioning support, so we append a major version to the name.
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+
+aix4* | aix5*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ hardcode_into_libs=yes
+ if test "$host_cpu" = ia64; then
+ # AIX 5 supports IA64
+ library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line `#! .'. This would cause the generated library to
+ # depend on `.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[01] | aix4.[01].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ if test "$aix_use_runtimelinking" = yes; then
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ else
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='${libname}${release}.a $libname.a'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ fi
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ ;;
+
+beos*)
+ library_names_spec='${libname}${shared_ext}'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi4*)
+ version_type=linux
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32*)
+ version_type=windows
+ shrext_cmds=".dll"
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$host_os in
+ yes,cygwin* | yes,mingw* | yes,pw32*)
+ library_names_spec='$libname.dll.a'
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \${file}`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $rm \$dlpath'
+ shlibpath_overrides_runpath=yes
+
+ case $host_os in
+ cygwin*)
+ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+ soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+ ;;
+ mingw*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH printed by
+ # mingw gcc, but we are running on Cygwin. Gcc prints its search
+ # path with ; separators, and with drive letters. We can handle the
+ # drive letters (cygwin fileutils understands them), so leave them,
+ # especially as we might pass files found there to a mingw objdump,
+ # which wouldn't understand a cygwinified path. Ahh.
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ ;;
+ pw32*)
+ # pw32 DLLs use 'pw' prefix rather than 'lib'
+ library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}'
+ ;;
+ esac
+ ;;
+
+ *)
+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+ soname_spec='${libname}${release}${major}$shared_ext'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)'
+ # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
+ if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
+ else
+ sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
+ fi
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+freebsd1*)
+ dynamic_linker=no
+ ;;
+
+kfreebsd*-gnu)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='GNU ld.so'
+ ;;
+
+freebsd*)
+ objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout`
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ freebsd3.01* | freebsdelf3.01*)
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ *) # from 3.2 on
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+gnu*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ case "$host_cpu" in
+ ia64*)
+ shrext_cmds='.so'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.so"
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ if test "X$HPUX_IA64_MODE" = X32; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ fi
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ hppa*64*)
+ shrext_cmds='.sl'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ *)
+ shrext_cmds='.sl'
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+ esac
+ # HP-UX runs *really* slowly unless shared libraries are mode 555.
+ postinstall_cmds='chmod 555 $lib'
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $host_os in
+ nonstopux*) version_type=nonstopux ;;
+ *)
+ if test "$lt_cv_prog_gnu_ld" = yes; then
+ version_type=linux
+ else
+ version_type=irix
+ fi ;;
+ esac
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+ case $host_os in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+ libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+ libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+ libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+ sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+ hardcode_into_libs=yes
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+ dynamic_linker=no
+ ;;
+
+# This must be Linux ELF.
+linux*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ # find out which ABI we are using
+ libsuff=
+ case "$host_cpu" in
+ x86_64*|s390x*|powerpc64*)
+ echo '#line 12199 "configure"' > conftest.$ac_ext
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *64-bit*)
+ libsuff=64
+ sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}"
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+ esac
+
+ # Append ld.so.conf contents to the search path
+ if test -f /etc/ld.so.conf; then
+ lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '`
+ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra"
+ fi
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+knetbsd*-gnu)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='GNU ld.so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+nto-qnx*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+openbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=yes
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ case $host_os in
+ openbsd2.[89] | openbsd2.[89].*)
+ shlibpath_overrides_runpath=no
+ ;;
+ *)
+ shlibpath_overrides_runpath=yes
+ ;;
+ esac
+ else
+ shlibpath_overrides_runpath=yes
+ fi
+ ;;
+
+os2*)
+ libname_spec='$name'
+ shrext_cmds=".dll"
+ need_lib_prefix=no
+ library_names_spec='$libname${shared_ext} $libname.a'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=LIBPATH
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+ ;;
+
+sco3.2v5*)
+ version_type=osf
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+solaris*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test "$with_gnu_ld" = yes; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ need_lib_prefix=no
+ export_dynamic_flag_spec='${wl}-Blargedynsym'
+ runpath_var=LD_RUN_PATH
+ ;;
+ siemens)
+ need_lib_prefix=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec ;then
+ version_type=linux
+ library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+ soname_spec='$libname${shared_ext}.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+uts4*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+echo "${ECHO_T}$dynamic_linker" >&6
+test "$dynamic_linker" = no && can_build_shared=no
+
+echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
+hardcode_action_CXX=
+if test -n "$hardcode_libdir_flag_spec_CXX" || \
+ test -n "$runpath_var CXX" || \
+ test "X$hardcode_automatic_CXX"="Xyes" ; then
+
+ # We can hardcode non-existant directories.
+ if test "$hardcode_direct_CXX" != no &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, CXX)" != no &&
+ test "$hardcode_minus_L_CXX" != no; then
+ # Linking always hardcodes the temporary library directory.
+ hardcode_action_CXX=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ hardcode_action_CXX=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ hardcode_action_CXX=unsupported
+fi
+echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5
+echo "${ECHO_T}$hardcode_action_CXX" >&6
+
+if test "$hardcode_action_CXX" = relink; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+ test "$enable_shared" = no; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+
+striplib=
+old_striplib=
+echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5
+echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6
+if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then
+ test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+ test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+ case $host_os in
+ darwin*)
+ if test -n "$STRIP" ; then
+ striplib="$STRIP -x"
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+ ;;
+ *)
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ ;;
+ esac
+fi
+
+if test "x$enable_dlopen" != xyes; then
+ enable_dlopen=unknown
+ enable_dlopen_self=unknown
+ enable_dlopen_self_static=unknown
+else
+ lt_cv_dlopen=no
+ lt_cv_dlopen_libs=
+
+ case $host_os in
+ beos*)
+ lt_cv_dlopen="load_add_on"
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ;;
+
+ mingw* | pw32*)
+ lt_cv_dlopen="LoadLibrary"
+ lt_cv_dlopen_libs=
+ ;;
+
+ cygwin*)
+ lt_cv_dlopen="dlopen"
+ lt_cv_dlopen_libs=
+ ;;
+
+ darwin*)
+ # if libdl is installed we need to link against it
+ echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
+echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main ()
+{
+dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_dl_dlopen=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dl_dlopen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6
+if test $ac_cv_lib_dl_dlopen = yes; then
+ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+
+ lt_cv_dlopen="dyld"
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+
+fi
+
+ ;;
+
+ *)
+ echo "$as_me:$LINENO: checking for shl_load" >&5
+echo $ECHO_N "checking for shl_load... $ECHO_C" >&6
+if test "${ac_cv_func_shl_load+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define shl_load to an innocuous variant, in case <limits.h> declares shl_load.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define shl_load innocuous_shl_load
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char shl_load (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef shl_load
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char shl_load ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_shl_load) || defined (__stub___shl_load)
+choke me
+#else
+char (*f) () = shl_load;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != shl_load;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_shl_load=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_shl_load=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5
+echo "${ECHO_T}$ac_cv_func_shl_load" >&6
+if test $ac_cv_func_shl_load = yes; then
+ lt_cv_dlopen="shl_load"
+else
+ echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5
+echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6
+if test "${ac_cv_lib_dld_shl_load+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char shl_load ();
+int
+main ()
+{
+shl_load ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_dld_shl_load=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dld_shl_load=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5
+echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6
+if test $ac_cv_lib_dld_shl_load = yes; then
+ lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"
+else
+ echo "$as_me:$LINENO: checking for dlopen" >&5
+echo $ECHO_N "checking for dlopen... $ECHO_C" >&6
+if test "${ac_cv_func_dlopen+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define dlopen to an innocuous variant, in case <limits.h> declares dlopen.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define dlopen innocuous_dlopen
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char dlopen (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef dlopen
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_dlopen) || defined (__stub___dlopen)
+choke me
+#else
+char (*f) () = dlopen;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != dlopen;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_dlopen=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_dlopen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5
+echo "${ECHO_T}$ac_cv_func_dlopen" >&6
+if test $ac_cv_func_dlopen = yes; then
+ lt_cv_dlopen="dlopen"
+else
+ echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
+echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main ()
+{
+dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_dl_dlopen=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dl_dlopen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6
+if test $ac_cv_lib_dl_dlopen = yes; then
+ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+ echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5
+echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6
+if test "${ac_cv_lib_svld_dlopen+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main ()
+{
+dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_svld_dlopen=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_svld_dlopen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6
+if test $ac_cv_lib_svld_dlopen = yes; then
+ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
+else
+ echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5
+echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6
+if test "${ac_cv_lib_dld_dld_link+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dld_link ();
+int
+main ()
+{
+dld_link ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_dld_dld_link=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dld_dld_link=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5
+echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6
+if test $ac_cv_lib_dld_dld_link = yes; then
+ lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+ ;;
+ esac
+
+ if test "x$lt_cv_dlopen" != xno; then
+ enable_dlopen=yes
+ else
+ enable_dlopen=no
+ fi
+
+ case $lt_cv_dlopen in
+ dlopen)
+ save_CPPFLAGS="$CPPFLAGS"
+ test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+ save_LDFLAGS="$LDFLAGS"
+ eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+ save_LIBS="$LIBS"
+ LIBS="$lt_cv_dlopen_libs $LIBS"
+
+ echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5
+echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6
+if test "${lt_cv_dlopen_self+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then :
+ lt_cv_dlopen_self=cross
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<EOF
+#line 13070 "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ /* dlclose (self); */
+ }
+
+ exit (status);
+}
+EOF
+ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then
+ (./conftest; exit; ) 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+ x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+ x$lt_unknown|x*) lt_cv_dlopen_self=no ;;
+ esac
+ else :
+ # compilation failed
+ lt_cv_dlopen_self=no
+ fi
+fi
+rm -fr conftest*
+
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5
+echo "${ECHO_T}$lt_cv_dlopen_self" >&6
+
+ if test "x$lt_cv_dlopen_self" = xyes; then
+ LDFLAGS="$LDFLAGS $link_static_flag"
+ echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5
+echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6
+if test "${lt_cv_dlopen_self_static+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then :
+ lt_cv_dlopen_self_static=cross
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<EOF
+#line 13168 "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ /* dlclose (self); */
+ }
+
+ exit (status);
+}
+EOF
+ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then
+ (./conftest; exit; ) 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+ x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+ x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;;
+ esac
+ else :
+ # compilation failed
+ lt_cv_dlopen_self_static=no
+ fi
+fi
+rm -fr conftest*
+
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5
+echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6
+ fi
+
+ CPPFLAGS="$save_CPPFLAGS"
+ LDFLAGS="$save_LDFLAGS"
+ LIBS="$save_LIBS"
+ ;;
+ esac
+
+ case $lt_cv_dlopen_self in
+ yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+ *) enable_dlopen_self=unknown ;;
+ esac
+
+ case $lt_cv_dlopen_self_static in
+ yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+ *) enable_dlopen_self_static=unknown ;;
+ esac
+fi
+
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+ # See if we are running on zsh, and set the options which allow our commands through
+ # without removal of \ escapes.
+ if test -n "${ZSH_VERSION+set}" ; then
+ setopt NO_GLOB_SUBST
+ fi
+ # Now quote all the things that may contain metacharacters while being
+ # careful not to overquote the AC_SUBSTed values. We take copies of the
+ # variables and quote the copies for generation of the libtool script.
+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \
+ SED SHELL STRIP \
+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+ deplibs_check_method reload_flag reload_cmds need_locks \
+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+ lt_cv_sys_global_symbol_to_c_name_address \
+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+ old_postinstall_cmds old_postuninstall_cmds \
+ compiler_CXX \
+ CC_CXX \
+ LD_CXX \
+ lt_prog_compiler_wl_CXX \
+ lt_prog_compiler_pic_CXX \
+ lt_prog_compiler_static_CXX \
+ lt_prog_compiler_no_builtin_flag_CXX \
+ export_dynamic_flag_spec_CXX \
+ thread_safe_flag_spec_CXX \
+ whole_archive_flag_spec_CXX \
+ enable_shared_with_static_runtimes_CXX \
+ old_archive_cmds_CXX \
+ old_archive_from_new_cmds_CXX \
+ predep_objects_CXX \
+ postdep_objects_CXX \
+ predeps_CXX \
+ postdeps_CXX \
+ compiler_lib_search_path_CXX \
+ archive_cmds_CXX \
+ archive_expsym_cmds_CXX \
+ postinstall_cmds_CXX \
+ postuninstall_cmds_CXX \
+ old_archive_from_expsyms_cmds_CXX \
+ allow_undefined_flag_CXX \
+ no_undefined_flag_CXX \
+ export_symbols_cmds_CXX \
+ hardcode_libdir_flag_spec_CXX \
+ hardcode_libdir_flag_spec_ld_CXX \
+ hardcode_libdir_separator_CXX \
+ hardcode_automatic_CXX \
+ module_cmds_CXX \
+ module_expsym_cmds_CXX \
+ lt_cv_prog_compiler_c_o_CXX \
+ exclude_expsyms_CXX \
+ include_expsyms_CXX; do
+
+ case $var in
+ old_archive_cmds_CXX | \
+ old_archive_from_new_cmds_CXX | \
+ archive_cmds_CXX | \
+ archive_expsym_cmds_CXX | \
+ module_cmds_CXX | \
+ module_expsym_cmds_CXX | \
+ old_archive_from_expsyms_cmds_CXX | \
+ export_symbols_cmds_CXX | \
+ extract_expsyms_cmds | reload_cmds | finish_cmds | \
+ postinstall_cmds | postuninstall_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | \
+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+ # Double-quote double-evaled strings.
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+ ;;
+ *)
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+ ;;
+ esac
+ done
+
+ case $lt_echo in
+ *'\$0 --fallback-echo"')
+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+ ;;
+ esac
+
+cfgfile="$ofile"
+
+ cat <<__EOF__ >> "$cfgfile"
+# ### BEGIN LIBTOOL TAG CONFIG: $tagname
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_CXX
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# A language-specific compiler.
+CC=$lt_compiler_CXX
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC_CXX
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD_CXX
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_CXX
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_CXX
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
+
+# Must we lock files when doing compilation ?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_CXX
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds_CXX
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds_CXX
+archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds_CXX
+module_expsym_cmds=$lt_module_expsym_cmds_CXX
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_predep_objects_CXX
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_postdep_objects_CXX
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps_CXX
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps_CXX
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_CXX
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_CXX
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_CXX
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_CXX
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct_CXX
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L_CXX
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$hardcode_automatic_CXX
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_CXX
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path_CXX"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols_CXX
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_CXX
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_CXX
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_CXX
+
+# ### END LIBTOOL TAG CONFIG: $tagname
+
+__EOF__
+
+
+else
+ # If there is no Makefile yet, we rely on a make rule to execute
+ # `config.status --recheck' to rerun these tests and create the
+ # libtool script then.
+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+ if test -f "$ltmain_in"; then
+ test -f Makefile && make "$ltmain"
+ fi
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC=$lt_save_CC
+LDCXX=$LD
+LD=$lt_save_LD
+GCC=$lt_save_GCC
+with_gnu_ldcxx=$with_gnu_ld
+with_gnu_ld=$lt_save_with_gnu_ld
+lt_cv_path_LDCXX=$lt_cv_path_LD
+lt_cv_path_LD=$lt_save_path_LD
+lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+
+ else
+ tagname=""
+ fi
+ ;;
+
+ F77)
+ if test -n "$F77" && test "X$F77" != "Xno"; then
+
+ac_ext=f
+ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5'
+ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_f77_compiler_gnu
+
+
+archive_cmds_need_lc_F77=no
+allow_undefined_flag_F77=
+always_export_symbols_F77=no
+archive_expsym_cmds_F77=
+export_dynamic_flag_spec_F77=
+hardcode_direct_F77=no
+hardcode_libdir_flag_spec_F77=
+hardcode_libdir_flag_spec_ld_F77=
+hardcode_libdir_separator_F77=
+hardcode_minus_L_F77=no
+hardcode_automatic_F77=no
+module_cmds_F77=
+module_expsym_cmds_F77=
+link_all_deplibs_F77=unknown
+old_archive_cmds_F77=$old_archive_cmds
+no_undefined_flag_F77=
+whole_archive_flag_spec_F77=
+enable_shared_with_static_runtimes_F77=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+objext_F77=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code=" subroutine t\n return\n end\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code=" program t\n end\n"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${F77-"f77"}
+compiler=$CC
+compiler_F77=$CC
+cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'`
+
+echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5
+echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $can_build_shared" >&5
+echo "${ECHO_T}$can_build_shared" >&6
+
+echo "$as_me:$LINENO: checking whether to build shared libraries" >&5
+echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6
+test "$can_build_shared" = "no" && enable_shared=no
+
+# On AIX, shared libraries and static libraries use the same namespace, and
+# are all built from PIC.
+case "$host_os" in
+aix3*)
+ test "$enable_shared" = yes && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+aix4* | aix5*)
+ test "$enable_shared" = yes && enable_static=no
+ ;;
+esac
+echo "$as_me:$LINENO: result: $enable_shared" >&5
+echo "${ECHO_T}$enable_shared" >&6
+
+echo "$as_me:$LINENO: checking whether to build static libraries" >&5
+echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+echo "$as_me:$LINENO: result: $enable_static" >&5
+echo "${ECHO_T}$enable_static" >&6
+
+test "$ld_shlibs_F77" = no && can_build_shared=no
+
+GCC_F77="$G77"
+LD_F77="$LD"
+
+lt_prog_compiler_wl_F77=
+lt_prog_compiler_pic_F77=
+lt_prog_compiler_static_F77=
+
+echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
+
+ if test "$GCC" = yes; then
+ lt_prog_compiler_wl_F77='-Wl,'
+ lt_prog_compiler_static_F77='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_F77='-Bstatic'
+ fi
+ ;;
+
+ amigaos*)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the `-m68020' flag to GCC prevents building anything better,
+ # like `-m68040'.
+ lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4'
+ ;;
+
+ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+
+ mingw* | pw32* | os2*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_prog_compiler_pic_F77='-DDLL_EXPORT'
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic_F77='-fno-common'
+ ;;
+
+ msdosdjgpp*)
+ # Just because we use GCC doesn't mean we suddenly get shared libraries
+ # on systems that don't support them.
+ lt_prog_compiler_can_build_shared_F77=no
+ enable_shared=no
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic_F77=-Kconform_pic
+ fi
+ ;;
+
+ hpux*)
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case "$host_cpu" in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic_F77='-fPIC'
+ ;;
+ esac
+ ;;
+
+ *)
+ lt_prog_compiler_pic_F77='-fPIC'
+ ;;
+ esac
+ else
+ # PORTME Check for flag to pass linker flags through the system compiler.
+ case $host_os in
+ aix*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_F77='-Bstatic'
+ else
+ lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+
+ mingw* | pw32* | os2*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_prog_compiler_pic_F77='-DDLL_EXPORT'
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case "$host_cpu" in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic_F77='+Z'
+ ;;
+ esac
+ # Is there a better lt_prog_compiler_static that works with the bundled CC?
+ lt_prog_compiler_static_F77='${wl}-a ${wl}archive'
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ # PIC (with -KPIC) is the default.
+ lt_prog_compiler_static_F77='-non_shared'
+ ;;
+
+ newsos6)
+ lt_prog_compiler_pic_F77='-KPIC'
+ lt_prog_compiler_static_F77='-Bstatic'
+ ;;
+
+ linux*)
+ case $CC in
+ icc* | ecc*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ lt_prog_compiler_pic_F77='-KPIC'
+ lt_prog_compiler_static_F77='-static'
+ ;;
+ ccc*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ # All Alpha code is PIC.
+ lt_prog_compiler_static_F77='-non_shared'
+ ;;
+ esac
+ ;;
+
+ osf3* | osf4* | osf5*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ # All OSF/1 code is PIC.
+ lt_prog_compiler_static_F77='-non_shared'
+ ;;
+
+ sco3.2v5*)
+ lt_prog_compiler_pic_F77='-Kpic'
+ lt_prog_compiler_static_F77='-dn'
+ ;;
+
+ solaris*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ lt_prog_compiler_pic_F77='-KPIC'
+ lt_prog_compiler_static_F77='-Bstatic'
+ ;;
+
+ sunos4*)
+ lt_prog_compiler_wl_F77='-Qoption ld '
+ lt_prog_compiler_pic_F77='-PIC'
+ lt_prog_compiler_static_F77='-Bstatic'
+ ;;
+
+ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ lt_prog_compiler_pic_F77='-KPIC'
+ lt_prog_compiler_static_F77='-Bstatic'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec ;then
+ lt_prog_compiler_pic_F77='-Kconform_pic'
+ lt_prog_compiler_static_F77='-Bstatic'
+ fi
+ ;;
+
+ uts4*)
+ lt_prog_compiler_pic_F77='-pic'
+ lt_prog_compiler_static_F77='-Bstatic'
+ ;;
+
+ *)
+ lt_prog_compiler_can_build_shared_F77=no
+ ;;
+ esac
+ fi
+
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_F77" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_F77" >&6
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_F77"; then
+
+echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5
+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... $ECHO_C" >&6
+if test "${lt_prog_compiler_pic_works_F77+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_prog_compiler_pic_works_F77=no
+ ac_outfile=conftest.$ac_objext
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$lt_prog_compiler_pic_F77"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:13995: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:13999: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test ! -s conftest.err; then
+ lt_prog_compiler_pic_works_F77=yes
+ fi
+ fi
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_F77" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_works_F77" >&6
+
+if test x"$lt_prog_compiler_pic_works_F77" = xyes; then
+ case $lt_prog_compiler_pic_F77 in
+ "" | " "*) ;;
+ *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;;
+ esac
+else
+ lt_prog_compiler_pic_F77=
+ lt_prog_compiler_can_build_shared_F77=no
+fi
+
+fi
+case "$host_os" in
+ # For platforms which do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ lt_prog_compiler_pic_F77=
+ ;;
+ *)
+ lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77"
+ ;;
+esac
+
+echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_prog_compiler_c_o_F77=no
+ $rm -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:14055: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:14059: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test ! -s out/conftest.err; then
+ lt_cv_prog_compiler_c_o_F77=yes
+ fi
+ fi
+ chmod u+w .
+ $rm conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
+ $rm out/* && rmdir out
+ cd ..
+ rmdir conftest
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_F77" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_c_o_F77" >&6
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then
+ # do not overwrite the value of need_locks provided by the user
+ echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6
+ hard_links=yes
+ $rm conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ echo "$as_me:$LINENO: result: $hard_links" >&5
+echo "${ECHO_T}$hard_links" >&6
+ if test "$hard_links" = no; then
+ { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+
+echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
+
+ runpath_var=
+ allow_undefined_flag_F77=
+ enable_shared_with_static_runtimes_F77=no
+ archive_cmds_F77=
+ archive_expsym_cmds_F77=
+ old_archive_From_new_cmds_F77=
+ old_archive_from_expsyms_cmds_F77=
+ export_dynamic_flag_spec_F77=
+ whole_archive_flag_spec_F77=
+ thread_safe_flag_spec_F77=
+ hardcode_libdir_flag_spec_F77=
+ hardcode_libdir_flag_spec_ld_F77=
+ hardcode_libdir_separator_F77=
+ hardcode_direct_F77=no
+ hardcode_minus_L_F77=no
+ hardcode_shlibpath_var_F77=unsupported
+ link_all_deplibs_F77=unknown
+ hardcode_automatic_F77=no
+ module_cmds_F77=
+ module_expsym_cmds_F77=
+ always_export_symbols_F77=no
+ export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ # include_expsyms should be a list of space-separated symbols to be *always*
+ # included in the symbol list
+ include_expsyms_F77=
+ # exclude_expsyms can be an extended regexp of symbols to exclude
+ # it will be wrapped by ` (' and `)$', so one must not match beginning or
+ # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+ # as well as any symbol that contains `d'.
+ exclude_expsyms_F77="_GLOBAL_OFFSET_TABLE_"
+ # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+ # platforms (ab)use it in PIC code, but their linkers get confused if
+ # the symbol is explicitly referenced. Since portable code cannot
+ # rely on this symbol name, it's probably fine to never include it in
+ # preloaded symbol tables.
+ extract_expsyms_cmds=
+
+ case $host_os in
+ cygwin* | mingw* | pw32*)
+ # FIXME: the MSVC++ port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ if test "$GCC" != yes; then
+ with_gnu_ld=no
+ fi
+ ;;
+ openbsd*)
+ with_gnu_ld=no
+ ;;
+ esac
+
+ ld_shlibs_F77=yes
+ if test "$with_gnu_ld" = yes; then
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ wlarc='${wl}'
+
+ # See if GNU ld supports shared libraries.
+ case $host_os in
+ aix3* | aix4* | aix5*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test "$host_cpu" != ia64; then
+ ld_shlibs_F77=no
+ cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support. If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+ fi
+ ;;
+
+ amigaos*)
+ archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec_F77='-L$libdir'
+ hardcode_minus_L_F77=yes
+
+ # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
+ # that the semantics of dynamic libraries on AmigaOS, at least up
+ # to version 4, is to share data among multiple programs linked
+ # with the same dynamic library. Since this doesn't match the
+ # behavior of shared libraries on other platforms, we can't use
+ # them.
+ ld_shlibs_F77=no
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ allow_undefined_flag_F77=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ else
+ ld_shlibs_F77=no
+ fi
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless,
+ # as there is no search path for DLLs.
+ hardcode_libdir_flag_spec_F77='-L$libdir'
+ allow_undefined_flag_F77=unsupported
+ always_export_symbols_F77=no
+ enable_shared_with_static_runtimes_F77=yes
+ export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
+
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib'
+ # If the export-symbols file already is a .def file (1st line
+ # is EXPORTS), use it as is; otherwise, prepend...
+ archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+ wlarc=
+ else
+ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ fi
+ ;;
+
+ solaris* | sysv5*)
+ if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+ ld_shlibs_F77=no
+ cat <<EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+EOF
+ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs_F77=no
+ fi
+ ;;
+
+ sunos4*)
+ archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ wlarc=
+ hardcode_direct_F77=yes
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ linux*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_cmds_F77="$tmp_archive_cmds"
+ supports_anon_versioning=no
+ case `$LD -v 2>/dev/null` in
+ *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+ *\ 2.11.*) ;; # other 2.11 versions
+ *) supports_anon_versioning=yes ;;
+ esac
+ if test $supports_anon_versioning = yes; then
+ archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~
+cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+$echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+ else
+ archive_expsym_cmds_F77="$tmp_archive_cmds"
+ fi
+ else
+ ld_shlibs_F77=no
+ fi
+ ;;
+
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs_F77=no
+ fi
+ ;;
+ esac
+
+ if test "$ld_shlibs_F77" = yes; then
+ runpath_var=LD_RUN_PATH
+ hardcode_libdir_flag_spec_F77='${wl}--rpath ${wl}$libdir'
+ export_dynamic_flag_spec_F77='${wl}--export-dynamic'
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
+ whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ whole_archive_flag_spec_F77=
+ fi
+ fi
+ else
+ # PORTME fill in a description of your system's linker (not GNU ld)
+ case $host_os in
+ aix3*)
+ allow_undefined_flag_F77=unsupported
+ always_export_symbols_F77=yes
+ archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ hardcode_minus_L_F77=yes
+ if test "$GCC" = yes && test -z "$link_static_flag"; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ hardcode_direct_F77=unsupported
+ fi
+ ;;
+
+ aix4* | aix5*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=""
+ else
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to AIX nm, but means don't demangle with GNU nm
+ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+ export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+ else
+ export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+ fi
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # need to do runtime linking.
+ case $host_os in aix4.[23]|aix4.[23].*|aix5*)
+ for ld_flag in $LDFLAGS; do
+ if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ archive_cmds_F77=''
+ hardcode_direct_F77=yes
+ hardcode_libdir_separator_F77=':'
+ link_all_deplibs_F77=yes
+
+ if test "$GCC" = yes; then
+ case $host_os in aix4.012|aix4.012.*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" && \
+ strings "$collect2name" | grep resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ hardcode_direct_F77=yes
+ else
+ # We have old collect2
+ hardcode_direct_F77=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ hardcode_minus_L_F77=yes
+ hardcode_libdir_flag_spec_F77='-L$libdir'
+ hardcode_libdir_separator_F77=
+ fi
+ esac
+ shared_flag='-shared'
+ else
+ # not using gcc
+ if test "$host_cpu" = ia64; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag='${wl}-G'
+ else
+ shared_flag='${wl}-bM:SRE'
+ fi
+ fi
+ fi
+
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to export.
+ always_export_symbols_F77=yes
+ if test "$aix_use_runtimelinking" = yes; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ allow_undefined_flag_F77='-berok'
+ # Determine the default libpath from the value encoded in an empty executable.
+ cat >conftest.$ac_ext <<_ACEOF
+ program main
+
+ end
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_f77_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+ hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath"
+ archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ else
+ if test "$host_cpu" = ia64; then
+ hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib'
+ allow_undefined_flag_F77="-z nodefs"
+ archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an empty executable.
+ cat >conftest.$ac_ext <<_ACEOF
+ program main
+
+ end
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_f77_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+ hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ no_undefined_flag_F77=' ${wl}-bernotok'
+ allow_undefined_flag_F77=' ${wl}-berok'
+ # -bexpall does not export symbols beginning with underscore (_)
+ always_export_symbols_F77=yes
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec_F77=' '
+ archive_cmds_need_lc_F77=yes
+ # This is similar to how AIX traditionally builds it's shared libraries.
+ archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+ fi
+ fi
+ ;;
+
+ amigaos*)
+ archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec_F77='-L$libdir'
+ hardcode_minus_L_F77=yes
+ # see comment about different semantics on the GNU ld section
+ ld_shlibs_F77=no
+ ;;
+
+ bsdi4*)
+ export_dynamic_flag_spec_F77=-rdynamic
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec_F77=' '
+ allow_undefined_flag_F77=unsupported
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=".dll"
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ old_archive_From_new_cmds_F77='true'
+ # FIXME: Should let the user specify the lib program.
+ old_archive_cmds_F77='lib /OUT:$oldlib$oldobjs$old_deplibs'
+ fix_srcfile_path='`cygpath -w "$srcfile"`'
+ enable_shared_with_static_runtimes_F77=yes
+ ;;
+
+ darwin* | rhapsody*)
+ if test "$GXX" = yes ; then
+ archive_cmds_need_lc_F77=no
+ case "$host_os" in
+ rhapsody* | darwin1.[012])
+ allow_undefined_flag_F77='-undefined suppress'
+ ;;
+ *) # Darwin 1.3 on
+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+ allow_undefined_flag_F77='-flat_namespace -undefined suppress'
+ else
+ case ${MACOSX_DEPLOYMENT_TARGET} in
+ 10.[012])
+ allow_undefined_flag_F77='-flat_namespace -undefined suppress'
+ ;;
+ 10.*)
+ allow_undefined_flag_F77='-undefined dynamic_lookup'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ lt_int_apple_cc_single_mod=no
+ output_verbose_link_cmd='echo'
+ if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then
+ lt_int_apple_cc_single_mod=yes
+ fi
+ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+ archive_cmds_F77='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+ else
+ archive_cmds_F77='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+ fi
+ module_cmds_F77='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's
+ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+ archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ else
+ archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ fi
+ module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ hardcode_direct_F77=no
+ hardcode_automatic_F77=yes
+ hardcode_shlibpath_var_F77=unsupported
+ whole_archive_flag_spec_F77='-all_load $convenience'
+ link_all_deplibs_F77=yes
+ else
+ ld_shlibs_F77=no
+ fi
+ ;;
+
+ dgux*)
+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec_F77='-L$libdir'
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ freebsd1*)
+ ld_shlibs_F77=no
+ ;;
+
+ # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+ # support. Future versions do this automatically, but an explicit c++rt0.o
+ # does not break anything, and helps significantly (at the cost of a little
+ # extra space).
+ freebsd2.2*)
+ archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+ hardcode_libdir_flag_spec_F77='-R$libdir'
+ hardcode_direct_F77=yes
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+ freebsd2*)
+ archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_F77=yes
+ hardcode_minus_L_F77=yes
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+ freebsd* | kfreebsd*-gnu)
+ archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec_F77='-R$libdir'
+ hardcode_direct_F77=yes
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ hpux9*)
+ if test "$GCC" = yes; then
+ archive_cmds_F77='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ else
+ archive_cmds_F77='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ fi
+ hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator_F77=:
+ hardcode_direct_F77=yes
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L_F77=yes
+ export_dynamic_flag_spec_F77='${wl}-E'
+ ;;
+
+ hpux10* | hpux11*)
+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ case "$host_cpu" in
+ hppa*64*|ia64*)
+ archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ else
+ case "$host_cpu" in
+ hppa*64*|ia64*)
+ archive_cmds_F77='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags'
+ ;;
+ *)
+ archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+ ;;
+ esac
+ fi
+ if test "$with_gnu_ld" = no; then
+ case "$host_cpu" in
+ hppa*64*)
+ hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir'
+ hardcode_libdir_flag_spec_ld_F77='+b $libdir'
+ hardcode_libdir_separator_F77=:
+ hardcode_direct_F77=no
+ hardcode_shlibpath_var_F77=no
+ ;;
+ ia64*)
+ hardcode_libdir_flag_spec_F77='-L$libdir'
+ hardcode_direct_F77=no
+ hardcode_shlibpath_var_F77=no
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L_F77=yes
+ ;;
+ *)
+ hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator_F77=:
+ hardcode_direct_F77=yes
+ export_dynamic_flag_spec_F77='${wl}-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L_F77=yes
+ ;;
+ esac
+ fi
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ if test "$GCC" = yes; then
+ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ hardcode_libdir_flag_spec_ld_F77='-rpath $libdir'
+ fi
+ hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_F77=:
+ link_all_deplibs_F77=yes
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
+ else
+ archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
+ fi
+ hardcode_libdir_flag_spec_F77='-R$libdir'
+ hardcode_direct_F77=yes
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ newsos6)
+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_F77=yes
+ hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_F77=:
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ openbsd*)
+ hardcode_direct_F77=yes
+ hardcode_shlibpath_var_F77=no
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir'
+ export_dynamic_flag_spec_F77='${wl}-E'
+ else
+ case $host_os in
+ openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+ archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec_F77='-R$libdir'
+ ;;
+ *)
+ archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir'
+ ;;
+ esac
+ fi
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec_F77='-L$libdir'
+ hardcode_minus_L_F77=yes
+ allow_undefined_flag_F77=unsupported
+ archive_cmds_F77='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+ old_archive_From_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+ ;;
+
+ osf3*)
+ if test "$GCC" = yes; then
+ allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ allow_undefined_flag_F77=' -expect_unresolved \*'
+ archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ fi
+ hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_F77=:
+ ;;
+
+ osf4* | osf5*) # as osf3* with the addition of -msym flag
+ if test "$GCC" = yes; then
+ allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+ else
+ allow_undefined_flag_F77=' -expect_unresolved \*'
+ archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
+ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp'
+
+ # Both c and cxx compiler support -rpath directly
+ hardcode_libdir_flag_spec_F77='-rpath $libdir'
+ fi
+ hardcode_libdir_separator_F77=:
+ ;;
+
+ sco3.2v5*)
+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var_F77=no
+ export_dynamic_flag_spec_F77='${wl}-Bexport'
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ ;;
+
+ solaris*)
+ no_undefined_flag_F77=' -z text'
+ if test "$GCC" = yes; then
+ archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
+ else
+ archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+ fi
+ hardcode_libdir_flag_spec_F77='-R$libdir'
+ hardcode_shlibpath_var_F77=no
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *) # Supported since Solaris 2.6 (maybe 2.5.1?)
+ whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' ;;
+ esac
+ link_all_deplibs_F77=yes
+ ;;
+
+ sunos4*)
+ if test "x$host_vendor" = xsequent; then
+ # Use $CC to link under sequent, because it throws in some extra .o
+ # files that make .init and .fini sections work.
+ archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ hardcode_libdir_flag_spec_F77='-L$libdir'
+ hardcode_direct_F77=yes
+ hardcode_minus_L_F77=yes
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ sysv4)
+ case $host_vendor in
+ sni)
+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_F77=yes # is this really true???
+ ;;
+ siemens)
+ ## LD is ld it makes a PLAMLIB
+ ## CC just makes a GrossModule.
+ archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ reload_cmds_F77='$CC -r -o $output$reload_objs'
+ hardcode_direct_F77=no
+ ;;
+ motorola)
+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ runpath_var='LD_RUN_PATH'
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ sysv4.3*)
+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var_F77=no
+ export_dynamic_flag_spec_F77='-Bexport'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var_F77=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ ld_shlibs_F77=yes
+ fi
+ ;;
+
+ sysv4.2uw2*)
+ archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_F77=yes
+ hardcode_minus_L_F77=no
+ hardcode_shlibpath_var_F77=no
+ hardcode_runpath_var=yes
+ runpath_var=LD_RUN_PATH
+ ;;
+
+ sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*)
+ no_undefined_flag_F77='${wl}-z ${wl}text'
+ if test "$GCC" = yes; then
+ archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds_F77='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ runpath_var='LD_RUN_PATH'
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ sysv5*)
+ no_undefined_flag_F77=' -z text'
+ # $CC -shared without GNU ld will not create a library from C++
+ # object files and a static libstdc++, better avoid it by now
+ archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+ hardcode_libdir_flag_spec_F77=
+ hardcode_shlibpath_var_F77=no
+ runpath_var='LD_RUN_PATH'
+ ;;
+
+ uts4*)
+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec_F77='-L$libdir'
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ *)
+ ld_shlibs_F77=no
+ ;;
+ esac
+ fi
+
+echo "$as_me:$LINENO: result: $ld_shlibs_F77" >&5
+echo "${ECHO_T}$ld_shlibs_F77" >&6
+test "$ld_shlibs_F77" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_F77" in
+x|xyes)
+ # Assume -lc should be added
+ archive_cmds_need_lc_F77=yes
+
+ if test "$enable_shared" = yes && test "$GCC" = yes; then
+ case $archive_cmds_F77 in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
+ $rm conftest*
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$lt_prog_compiler_wl_F77
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$allow_undefined_flag_F77
+ allow_undefined_flag_F77=
+ if { (eval echo "$as_me:$LINENO: \"$archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
+ (eval $archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ then
+ archive_cmds_need_lc_F77=no
+ else
+ archive_cmds_need_lc_F77=yes
+ fi
+ allow_undefined_flag_F77=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $rm conftest*
+ echo "$as_me:$LINENO: result: $archive_cmds_need_lc_F77" >&5
+echo "${ECHO_T}$archive_cmds_need_lc_F77" >&6
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
+ # if the path contains ";" then we assume it to be the separator
+ # otherwise default to the standard path separator (i.e. ":") - it is
+ # assumed that no part of a normal pathname contains ";" but that should
+ # okay in the real world where ";" in dirpaths is itself problematic.
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+else
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX 3 has no versioning support, so we append a major version to the name.
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+
+aix4* | aix5*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ hardcode_into_libs=yes
+ if test "$host_cpu" = ia64; then
+ # AIX 5 supports IA64
+ library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line `#! .'. This would cause the generated library to
+ # depend on `.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[01] | aix4.[01].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ if test "$aix_use_runtimelinking" = yes; then
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ else
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='${libname}${release}.a $libname.a'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ fi
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ ;;
+
+beos*)
+ library_names_spec='${libname}${shared_ext}'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi4*)
+ version_type=linux
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32*)
+ version_type=windows
+ shrext_cmds=".dll"
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$host_os in
+ yes,cygwin* | yes,mingw* | yes,pw32*)
+ library_names_spec='$libname.dll.a'
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \${file}`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $rm \$dlpath'
+ shlibpath_overrides_runpath=yes
+
+ case $host_os in
+ cygwin*)
+ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+ soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+ ;;
+ mingw*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH printed by
+ # mingw gcc, but we are running on Cygwin. Gcc prints its search
+ # path with ; separators, and with drive letters. We can handle the
+ # drive letters (cygwin fileutils understands them), so leave them,
+ # especially as we might pass files found there to a mingw objdump,
+ # which wouldn't understand a cygwinified path. Ahh.
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ ;;
+ pw32*)
+ # pw32 DLLs use 'pw' prefix rather than 'lib'
+ library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}'
+ ;;
+ esac
+ ;;
+
+ *)
+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+ soname_spec='${libname}${release}${major}$shared_ext'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)'
+ # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
+ if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
+ else
+ sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
+ fi
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+freebsd1*)
+ dynamic_linker=no
+ ;;
+
+kfreebsd*-gnu)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='GNU ld.so'
+ ;;
+
+freebsd*)
+ objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout`
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ freebsd3.01* | freebsdelf3.01*)
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ *) # from 3.2 on
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+gnu*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ case "$host_cpu" in
+ ia64*)
+ shrext_cmds='.so'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.so"
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ if test "X$HPUX_IA64_MODE" = X32; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ fi
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ hppa*64*)
+ shrext_cmds='.sl'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ *)
+ shrext_cmds='.sl'
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+ esac
+ # HP-UX runs *really* slowly unless shared libraries are mode 555.
+ postinstall_cmds='chmod 555 $lib'
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $host_os in
+ nonstopux*) version_type=nonstopux ;;
+ *)
+ if test "$lt_cv_prog_gnu_ld" = yes; then
+ version_type=linux
+ else
+ version_type=irix
+ fi ;;
+ esac
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+ case $host_os in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+ libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+ libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+ libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+ sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+ hardcode_into_libs=yes
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+ dynamic_linker=no
+ ;;
+
+# This must be Linux ELF.
+linux*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ # find out which ABI we are using
+ libsuff=
+ case "$host_cpu" in
+ x86_64*|s390x*|powerpc64*)
+ echo '#line 15369 "configure"' > conftest.$ac_ext
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *64-bit*)
+ libsuff=64
+ sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}"
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+ esac
+
+ # Append ld.so.conf contents to the search path
+ if test -f /etc/ld.so.conf; then
+ lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '`
+ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra"
+ fi
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+knetbsd*-gnu)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='GNU ld.so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+nto-qnx*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+openbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=yes
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ case $host_os in
+ openbsd2.[89] | openbsd2.[89].*)
+ shlibpath_overrides_runpath=no
+ ;;
+ *)
+ shlibpath_overrides_runpath=yes
+ ;;
+ esac
+ else
+ shlibpath_overrides_runpath=yes
+ fi
+ ;;
+
+os2*)
+ libname_spec='$name'
+ shrext_cmds=".dll"
+ need_lib_prefix=no
+ library_names_spec='$libname${shared_ext} $libname.a'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=LIBPATH
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+ ;;
+
+sco3.2v5*)
+ version_type=osf
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+solaris*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test "$with_gnu_ld" = yes; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ need_lib_prefix=no
+ export_dynamic_flag_spec='${wl}-Blargedynsym'
+ runpath_var=LD_RUN_PATH
+ ;;
+ siemens)
+ need_lib_prefix=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec ;then
+ version_type=linux
+ library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+ soname_spec='$libname${shared_ext}.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+uts4*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+echo "${ECHO_T}$dynamic_linker" >&6
+test "$dynamic_linker" = no && can_build_shared=no
+
+echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
+hardcode_action_F77=
+if test -n "$hardcode_libdir_flag_spec_F77" || \
+ test -n "$runpath_var F77" || \
+ test "X$hardcode_automatic_F77"="Xyes" ; then
+
+ # We can hardcode non-existant directories.
+ if test "$hardcode_direct_F77" != no &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, F77)" != no &&
+ test "$hardcode_minus_L_F77" != no; then
+ # Linking always hardcodes the temporary library directory.
+ hardcode_action_F77=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ hardcode_action_F77=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ hardcode_action_F77=unsupported
+fi
+echo "$as_me:$LINENO: result: $hardcode_action_F77" >&5
+echo "${ECHO_T}$hardcode_action_F77" >&6
+
+if test "$hardcode_action_F77" = relink; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+ test "$enable_shared" = no; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+
+striplib=
+old_striplib=
+echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5
+echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6
+if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then
+ test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+ test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+ case $host_os in
+ darwin*)
+ if test -n "$STRIP" ; then
+ striplib="$STRIP -x"
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+ ;;
+ *)
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ ;;
+ esac
+fi
+
+
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+ # See if we are running on zsh, and set the options which allow our commands through
+ # without removal of \ escapes.
+ if test -n "${ZSH_VERSION+set}" ; then
+ setopt NO_GLOB_SUBST
+ fi
+ # Now quote all the things that may contain metacharacters while being
+ # careful not to overquote the AC_SUBSTed values. We take copies of the
+ # variables and quote the copies for generation of the libtool script.
+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \
+ SED SHELL STRIP \
+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+ deplibs_check_method reload_flag reload_cmds need_locks \
+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+ lt_cv_sys_global_symbol_to_c_name_address \
+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+ old_postinstall_cmds old_postuninstall_cmds \
+ compiler_F77 \
+ CC_F77 \
+ LD_F77 \
+ lt_prog_compiler_wl_F77 \
+ lt_prog_compiler_pic_F77 \
+ lt_prog_compiler_static_F77 \
+ lt_prog_compiler_no_builtin_flag_F77 \
+ export_dynamic_flag_spec_F77 \
+ thread_safe_flag_spec_F77 \
+ whole_archive_flag_spec_F77 \
+ enable_shared_with_static_runtimes_F77 \
+ old_archive_cmds_F77 \
+ old_archive_from_new_cmds_F77 \
+ predep_objects_F77 \
+ postdep_objects_F77 \
+ predeps_F77 \
+ postdeps_F77 \
+ compiler_lib_search_path_F77 \
+ archive_cmds_F77 \
+ archive_expsym_cmds_F77 \
+ postinstall_cmds_F77 \
+ postuninstall_cmds_F77 \
+ old_archive_from_expsyms_cmds_F77 \
+ allow_undefined_flag_F77 \
+ no_undefined_flag_F77 \
+ export_symbols_cmds_F77 \
+ hardcode_libdir_flag_spec_F77 \
+ hardcode_libdir_flag_spec_ld_F77 \
+ hardcode_libdir_separator_F77 \
+ hardcode_automatic_F77 \
+ module_cmds_F77 \
+ module_expsym_cmds_F77 \
+ lt_cv_prog_compiler_c_o_F77 \
+ exclude_expsyms_F77 \
+ include_expsyms_F77; do
+
+ case $var in
+ old_archive_cmds_F77 | \
+ old_archive_from_new_cmds_F77 | \
+ archive_cmds_F77 | \
+ archive_expsym_cmds_F77 | \
+ module_cmds_F77 | \
+ module_expsym_cmds_F77 | \
+ old_archive_from_expsyms_cmds_F77 | \
+ export_symbols_cmds_F77 | \
+ extract_expsyms_cmds | reload_cmds | finish_cmds | \
+ postinstall_cmds | postuninstall_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | \
+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+ # Double-quote double-evaled strings.
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+ ;;
+ *)
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+ ;;
+ esac
+ done
+
+ case $lt_echo in
+ *'\$0 --fallback-echo"')
+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+ ;;
+ esac
+
+cfgfile="$ofile"
+
+ cat <<__EOF__ >> "$cfgfile"
+# ### BEGIN LIBTOOL TAG CONFIG: $tagname
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_F77
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# A language-specific compiler.
+CC=$lt_compiler_F77
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC_F77
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD_F77
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_F77
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_F77
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77
+
+# Must we lock files when doing compilation ?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_F77
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec_F77
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds_F77
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds_F77
+archive_expsym_cmds=$lt_archive_expsym_cmds_F77
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds_F77
+module_expsym_cmds=$lt_module_expsym_cmds_F77
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_predep_objects_F77
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_postdep_objects_F77
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps_F77
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps_F77
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_F77
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_F77
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_F77
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_F77
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_F77
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct_F77
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L_F77
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_F77
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$hardcode_automatic_F77
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_F77
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path_F77"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols_F77
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_F77
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_F77
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_F77
+
+# ### END LIBTOOL TAG CONFIG: $tagname
+
+__EOF__
+
+
+else
+ # If there is no Makefile yet, we rely on a make rule to execute
+ # `config.status --recheck' to rerun these tests and create the
+ # libtool script then.
+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+ if test -f "$ltmain_in"; then
+ test -f Makefile && make "$ltmain"
+ fi
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC="$lt_save_CC"
+
+ else
+ tagname=""
+ fi
+ ;;
+
+ GCJ)
+ if test -n "$GCJ" && test "X$GCJ" != "Xno"; then
+
+
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+objext_GCJ=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String argv) {}; }\n'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${GCJ-"gcj"}
+compiler=$CC
+compiler_GCJ=$CC
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+archive_cmds_need_lc_GCJ=no
+
+
+lt_prog_compiler_no_builtin_flag_GCJ=
+
+if test "$GCC" = yes; then
+ lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin'
+
+
+echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_prog_compiler_rtti_exceptions=no
+ ac_outfile=conftest.$ac_objext
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="-fno-rtti -fno-exceptions"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:16110: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:16114: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test ! -s conftest.err; then
+ lt_cv_prog_compiler_rtti_exceptions=yes
+ fi
+ fi
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6
+
+if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+ lt_prog_compiler_no_builtin_flag_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions"
+else
+ :
+fi
+
+fi
+
+lt_prog_compiler_wl_GCJ=
+lt_prog_compiler_pic_GCJ=
+lt_prog_compiler_static_GCJ=
+
+echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
+
+ if test "$GCC" = yes; then
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ lt_prog_compiler_static_GCJ='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ fi
+ ;;
+
+ amigaos*)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the `-m68020' flag to GCC prevents building anything better,
+ # like `-m68040'.
+ lt_prog_compiler_pic_GCJ='-m68020 -resident32 -malways-restore-a4'
+ ;;
+
+ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+
+ mingw* | pw32* | os2*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_prog_compiler_pic_GCJ='-DDLL_EXPORT'
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic_GCJ='-fno-common'
+ ;;
+
+ msdosdjgpp*)
+ # Just because we use GCC doesn't mean we suddenly get shared libraries
+ # on systems that don't support them.
+ lt_prog_compiler_can_build_shared_GCJ=no
+ enable_shared=no
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic_GCJ=-Kconform_pic
+ fi
+ ;;
+
+ hpux*)
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case "$host_cpu" in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic_GCJ='-fPIC'
+ ;;
+ esac
+ ;;
+
+ *)
+ lt_prog_compiler_pic_GCJ='-fPIC'
+ ;;
+ esac
+ else
+ # PORTME Check for flag to pass linker flags through the system compiler.
+ case $host_os in
+ aix*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ else
+ lt_prog_compiler_static_GCJ='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+
+ mingw* | pw32* | os2*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_prog_compiler_pic_GCJ='-DDLL_EXPORT'
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case "$host_cpu" in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic_GCJ='+Z'
+ ;;
+ esac
+ # Is there a better lt_prog_compiler_static that works with the bundled CC?
+ lt_prog_compiler_static_GCJ='${wl}-a ${wl}archive'
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ # PIC (with -KPIC) is the default.
+ lt_prog_compiler_static_GCJ='-non_shared'
+ ;;
+
+ newsos6)
+ lt_prog_compiler_pic_GCJ='-KPIC'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ ;;
+
+ linux*)
+ case $CC in
+ icc* | ecc*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ lt_prog_compiler_pic_GCJ='-KPIC'
+ lt_prog_compiler_static_GCJ='-static'
+ ;;
+ ccc*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ # All Alpha code is PIC.
+ lt_prog_compiler_static_GCJ='-non_shared'
+ ;;
+ esac
+ ;;
+
+ osf3* | osf4* | osf5*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ # All OSF/1 code is PIC.
+ lt_prog_compiler_static_GCJ='-non_shared'
+ ;;
+
+ sco3.2v5*)
+ lt_prog_compiler_pic_GCJ='-Kpic'
+ lt_prog_compiler_static_GCJ='-dn'
+ ;;
+
+ solaris*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ lt_prog_compiler_pic_GCJ='-KPIC'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ ;;
+
+ sunos4*)
+ lt_prog_compiler_wl_GCJ='-Qoption ld '
+ lt_prog_compiler_pic_GCJ='-PIC'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ ;;
+
+ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ lt_prog_compiler_pic_GCJ='-KPIC'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec ;then
+ lt_prog_compiler_pic_GCJ='-Kconform_pic'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ fi
+ ;;
+
+ uts4*)
+ lt_prog_compiler_pic_GCJ='-pic'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ ;;
+
+ *)
+ lt_prog_compiler_can_build_shared_GCJ=no
+ ;;
+ esac
+ fi
+
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_GCJ" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_GCJ" >&6
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_GCJ"; then
+
+echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5
+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... $ECHO_C" >&6
+if test "${lt_prog_compiler_pic_works_GCJ+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_prog_compiler_pic_works_GCJ=no
+ ac_outfile=conftest.$ac_objext
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$lt_prog_compiler_pic_GCJ"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:16343: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:16347: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test ! -s conftest.err; then
+ lt_prog_compiler_pic_works_GCJ=yes
+ fi
+ fi
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_GCJ" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_works_GCJ" >&6
+
+if test x"$lt_prog_compiler_pic_works_GCJ" = xyes; then
+ case $lt_prog_compiler_pic_GCJ in
+ "" | " "*) ;;
+ *) lt_prog_compiler_pic_GCJ=" $lt_prog_compiler_pic_GCJ" ;;
+ esac
+else
+ lt_prog_compiler_pic_GCJ=
+ lt_prog_compiler_can_build_shared_GCJ=no
+fi
+
+fi
+case "$host_os" in
+ # For platforms which do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ lt_prog_compiler_pic_GCJ=
+ ;;
+ *)
+ lt_prog_compiler_pic_GCJ="$lt_prog_compiler_pic_GCJ"
+ ;;
+esac
+
+echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_prog_compiler_c_o_GCJ=no
+ $rm -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:16403: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:16407: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test ! -s out/conftest.err; then
+ lt_cv_prog_compiler_c_o_GCJ=yes
+ fi
+ fi
+ chmod u+w .
+ $rm conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
+ $rm out/* && rmdir out
+ cd ..
+ rmdir conftest
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_GCJ" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_c_o_GCJ" >&6
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then
+ # do not overwrite the value of need_locks provided by the user
+ echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6
+ hard_links=yes
+ $rm conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ echo "$as_me:$LINENO: result: $hard_links" >&5
+echo "${ECHO_T}$hard_links" >&6
+ if test "$hard_links" = no; then
+ { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+
+echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
+
+ runpath_var=
+ allow_undefined_flag_GCJ=
+ enable_shared_with_static_runtimes_GCJ=no
+ archive_cmds_GCJ=
+ archive_expsym_cmds_GCJ=
+ old_archive_From_new_cmds_GCJ=
+ old_archive_from_expsyms_cmds_GCJ=
+ export_dynamic_flag_spec_GCJ=
+ whole_archive_flag_spec_GCJ=
+ thread_safe_flag_spec_GCJ=
+ hardcode_libdir_flag_spec_GCJ=
+ hardcode_libdir_flag_spec_ld_GCJ=
+ hardcode_libdir_separator_GCJ=
+ hardcode_direct_GCJ=no
+ hardcode_minus_L_GCJ=no
+ hardcode_shlibpath_var_GCJ=unsupported
+ link_all_deplibs_GCJ=unknown
+ hardcode_automatic_GCJ=no
+ module_cmds_GCJ=
+ module_expsym_cmds_GCJ=
+ always_export_symbols_GCJ=no
+ export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ # include_expsyms should be a list of space-separated symbols to be *always*
+ # included in the symbol list
+ include_expsyms_GCJ=
+ # exclude_expsyms can be an extended regexp of symbols to exclude
+ # it will be wrapped by ` (' and `)$', so one must not match beginning or
+ # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+ # as well as any symbol that contains `d'.
+ exclude_expsyms_GCJ="_GLOBAL_OFFSET_TABLE_"
+ # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+ # platforms (ab)use it in PIC code, but their linkers get confused if
+ # the symbol is explicitly referenced. Since portable code cannot
+ # rely on this symbol name, it's probably fine to never include it in
+ # preloaded symbol tables.
+ extract_expsyms_cmds=
+
+ case $host_os in
+ cygwin* | mingw* | pw32*)
+ # FIXME: the MSVC++ port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ if test "$GCC" != yes; then
+ with_gnu_ld=no
+ fi
+ ;;
+ openbsd*)
+ with_gnu_ld=no
+ ;;
+ esac
+
+ ld_shlibs_GCJ=yes
+ if test "$with_gnu_ld" = yes; then
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ wlarc='${wl}'
+
+ # See if GNU ld supports shared libraries.
+ case $host_os in
+ aix3* | aix4* | aix5*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test "$host_cpu" != ia64; then
+ ld_shlibs_GCJ=no
+ cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support. If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+ fi
+ ;;
+
+ amigaos*)
+ archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec_GCJ='-L$libdir'
+ hardcode_minus_L_GCJ=yes
+
+ # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
+ # that the semantics of dynamic libraries on AmigaOS, at least up
+ # to version 4, is to share data among multiple programs linked
+ # with the same dynamic library. Since this doesn't match the
+ # behavior of shared libraries on other platforms, we can't use
+ # them.
+ ld_shlibs_GCJ=no
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ allow_undefined_flag_GCJ=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ archive_cmds_GCJ='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ else
+ ld_shlibs_GCJ=no
+ fi
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, GCJ) is actually meaningless,
+ # as there is no search path for DLLs.
+ hardcode_libdir_flag_spec_GCJ='-L$libdir'
+ allow_undefined_flag_GCJ=unsupported
+ always_export_symbols_GCJ=no
+ enable_shared_with_static_runtimes_GCJ=yes
+ export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
+
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib'
+ # If the export-symbols file already is a .def file (1st line
+ # is EXPORTS), use it as is; otherwise, prepend...
+ archive_expsym_cmds_GCJ='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ archive_cmds_GCJ='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+ wlarc=
+ else
+ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ fi
+ ;;
+
+ solaris* | sysv5*)
+ if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+ ld_shlibs_GCJ=no
+ cat <<EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+EOF
+ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs_GCJ=no
+ fi
+ ;;
+
+ sunos4*)
+ archive_cmds_GCJ='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ wlarc=
+ hardcode_direct_GCJ=yes
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ linux*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_cmds_GCJ="$tmp_archive_cmds"
+ supports_anon_versioning=no
+ case `$LD -v 2>/dev/null` in
+ *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+ *\ 2.11.*) ;; # other 2.11 versions
+ *) supports_anon_versioning=yes ;;
+ esac
+ if test $supports_anon_versioning = yes; then
+ archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~
+cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+$echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+ else
+ archive_expsym_cmds_GCJ="$tmp_archive_cmds"
+ fi
+ else
+ ld_shlibs_GCJ=no
+ fi
+ ;;
+
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs_GCJ=no
+ fi
+ ;;
+ esac
+
+ if test "$ld_shlibs_GCJ" = yes; then
+ runpath_var=LD_RUN_PATH
+ hardcode_libdir_flag_spec_GCJ='${wl}--rpath ${wl}$libdir'
+ export_dynamic_flag_spec_GCJ='${wl}--export-dynamic'
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
+ whole_archive_flag_spec_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ whole_archive_flag_spec_GCJ=
+ fi
+ fi
+ else
+ # PORTME fill in a description of your system's linker (not GNU ld)
+ case $host_os in
+ aix3*)
+ allow_undefined_flag_GCJ=unsupported
+ always_export_symbols_GCJ=yes
+ archive_expsym_cmds_GCJ='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ hardcode_minus_L_GCJ=yes
+ if test "$GCC" = yes && test -z "$link_static_flag"; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ hardcode_direct_GCJ=unsupported
+ fi
+ ;;
+
+ aix4* | aix5*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=""
+ else
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to AIX nm, but means don't demangle with GNU nm
+ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+ export_symbols_cmds_GCJ='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+ else
+ export_symbols_cmds_GCJ='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+ fi
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # need to do runtime linking.
+ case $host_os in aix4.[23]|aix4.[23].*|aix5*)
+ for ld_flag in $LDFLAGS; do
+ if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ archive_cmds_GCJ=''
+ hardcode_direct_GCJ=yes
+ hardcode_libdir_separator_GCJ=':'
+ link_all_deplibs_GCJ=yes
+
+ if test "$GCC" = yes; then
+ case $host_os in aix4.012|aix4.012.*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" && \
+ strings "$collect2name" | grep resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ hardcode_direct_GCJ=yes
+ else
+ # We have old collect2
+ hardcode_direct_GCJ=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ hardcode_minus_L_GCJ=yes
+ hardcode_libdir_flag_spec_GCJ='-L$libdir'
+ hardcode_libdir_separator_GCJ=
+ fi
+ esac
+ shared_flag='-shared'
+ else
+ # not using gcc
+ if test "$host_cpu" = ia64; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag='${wl}-G'
+ else
+ shared_flag='${wl}-bM:SRE'
+ fi
+ fi
+ fi
+
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to export.
+ always_export_symbols_GCJ=yes
+ if test "$aix_use_runtimelinking" = yes; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ allow_undefined_flag_GCJ='-berok'
+ # Determine the default libpath from the value encoded in an empty executable.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+ hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath"
+ archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ else
+ if test "$host_cpu" = ia64; then
+ hardcode_libdir_flag_spec_GCJ='${wl}-R $libdir:/usr/lib:/lib'
+ allow_undefined_flag_GCJ="-z nodefs"
+ archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an empty executable.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+ hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ no_undefined_flag_GCJ=' ${wl}-bernotok'
+ allow_undefined_flag_GCJ=' ${wl}-berok'
+ # -bexpall does not export symbols beginning with underscore (_)
+ always_export_symbols_GCJ=yes
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec_GCJ=' '
+ archive_cmds_need_lc_GCJ=yes
+ # This is similar to how AIX traditionally builds it's shared libraries.
+ archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+ fi
+ fi
+ ;;
+
+ amigaos*)
+ archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec_GCJ='-L$libdir'
+ hardcode_minus_L_GCJ=yes
+ # see comment about different semantics on the GNU ld section
+ ld_shlibs_GCJ=no
+ ;;
+
+ bsdi4*)
+ export_dynamic_flag_spec_GCJ=-rdynamic
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec_GCJ=' '
+ allow_undefined_flag_GCJ=unsupported
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=".dll"
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds_GCJ='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ old_archive_From_new_cmds_GCJ='true'
+ # FIXME: Should let the user specify the lib program.
+ old_archive_cmds_GCJ='lib /OUT:$oldlib$oldobjs$old_deplibs'
+ fix_srcfile_path='`cygpath -w "$srcfile"`'
+ enable_shared_with_static_runtimes_GCJ=yes
+ ;;
+
+ darwin* | rhapsody*)
+ if test "$GXX" = yes ; then
+ archive_cmds_need_lc_GCJ=no
+ case "$host_os" in
+ rhapsody* | darwin1.[012])
+ allow_undefined_flag_GCJ='-undefined suppress'
+ ;;
+ *) # Darwin 1.3 on
+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+ allow_undefined_flag_GCJ='-flat_namespace -undefined suppress'
+ else
+ case ${MACOSX_DEPLOYMENT_TARGET} in
+ 10.[012])
+ allow_undefined_flag_GCJ='-flat_namespace -undefined suppress'
+ ;;
+ 10.*)
+ allow_undefined_flag_GCJ='-undefined dynamic_lookup'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ lt_int_apple_cc_single_mod=no
+ output_verbose_link_cmd='echo'
+ if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then
+ lt_int_apple_cc_single_mod=yes
+ fi
+ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+ archive_cmds_GCJ='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+ else
+ archive_cmds_GCJ='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+ fi
+ module_cmds_GCJ='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's
+ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+ archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ else
+ archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ fi
+ module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ hardcode_direct_GCJ=no
+ hardcode_automatic_GCJ=yes
+ hardcode_shlibpath_var_GCJ=unsupported
+ whole_archive_flag_spec_GCJ='-all_load $convenience'
+ link_all_deplibs_GCJ=yes
+ else
+ ld_shlibs_GCJ=no
+ fi
+ ;;
+
+ dgux*)
+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec_GCJ='-L$libdir'
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ freebsd1*)
+ ld_shlibs_GCJ=no
+ ;;
+
+ # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+ # support. Future versions do this automatically, but an explicit c++rt0.o
+ # does not break anything, and helps significantly (at the cost of a little
+ # extra space).
+ freebsd2.2*)
+ archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+ hardcode_libdir_flag_spec_GCJ='-R$libdir'
+ hardcode_direct_GCJ=yes
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+ freebsd2*)
+ archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_GCJ=yes
+ hardcode_minus_L_GCJ=yes
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+ freebsd* | kfreebsd*-gnu)
+ archive_cmds_GCJ='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec_GCJ='-R$libdir'
+ hardcode_direct_GCJ=yes
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ hpux9*)
+ if test "$GCC" = yes; then
+ archive_cmds_GCJ='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ else
+ archive_cmds_GCJ='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ fi
+ hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator_GCJ=:
+ hardcode_direct_GCJ=yes
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L_GCJ=yes
+ export_dynamic_flag_spec_GCJ='${wl}-E'
+ ;;
+
+ hpux10* | hpux11*)
+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ case "$host_cpu" in
+ hppa*64*|ia64*)
+ archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ else
+ case "$host_cpu" in
+ hppa*64*|ia64*)
+ archive_cmds_GCJ='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags'
+ ;;
+ *)
+ archive_cmds_GCJ='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+ ;;
+ esac
+ fi
+ if test "$with_gnu_ld" = no; then
+ case "$host_cpu" in
+ hppa*64*)
+ hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir'
+ hardcode_libdir_flag_spec_ld_GCJ='+b $libdir'
+ hardcode_libdir_separator_GCJ=:
+ hardcode_direct_GCJ=no
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+ ia64*)
+ hardcode_libdir_flag_spec_GCJ='-L$libdir'
+ hardcode_direct_GCJ=no
+ hardcode_shlibpath_var_GCJ=no
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L_GCJ=yes
+ ;;
+ *)
+ hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator_GCJ=:
+ hardcode_direct_GCJ=yes
+ export_dynamic_flag_spec_GCJ='${wl}-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L_GCJ=yes
+ ;;
+ esac
+ fi
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ if test "$GCC" = yes; then
+ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ archive_cmds_GCJ='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ hardcode_libdir_flag_spec_ld_GCJ='-rpath $libdir'
+ fi
+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_GCJ=:
+ link_all_deplibs_GCJ=yes
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
+ else
+ archive_cmds_GCJ='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
+ fi
+ hardcode_libdir_flag_spec_GCJ='-R$libdir'
+ hardcode_direct_GCJ=yes
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ newsos6)
+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_GCJ=yes
+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_GCJ=:
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ openbsd*)
+ hardcode_direct_GCJ=yes
+ hardcode_shlibpath_var_GCJ=no
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir'
+ export_dynamic_flag_spec_GCJ='${wl}-E'
+ else
+ case $host_os in
+ openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+ archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec_GCJ='-R$libdir'
+ ;;
+ *)
+ archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir'
+ ;;
+ esac
+ fi
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec_GCJ='-L$libdir'
+ hardcode_minus_L_GCJ=yes
+ allow_undefined_flag_GCJ=unsupported
+ archive_cmds_GCJ='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+ old_archive_From_new_cmds_GCJ='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+ ;;
+
+ osf3*)
+ if test "$GCC" = yes; then
+ allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ allow_undefined_flag_GCJ=' -expect_unresolved \*'
+ archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ fi
+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_GCJ=:
+ ;;
+
+ osf4* | osf5*) # as osf3* with the addition of -msym flag
+ if test "$GCC" = yes; then
+ allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
+ else
+ allow_undefined_flag_GCJ=' -expect_unresolved \*'
+ archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ archive_expsym_cmds_GCJ='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
+ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp'
+
+ # Both c and cxx compiler support -rpath directly
+ hardcode_libdir_flag_spec_GCJ='-rpath $libdir'
+ fi
+ hardcode_libdir_separator_GCJ=:
+ ;;
+
+ sco3.2v5*)
+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var_GCJ=no
+ export_dynamic_flag_spec_GCJ='${wl}-Bexport'
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ ;;
+
+ solaris*)
+ no_undefined_flag_GCJ=' -z text'
+ if test "$GCC" = yes; then
+ archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
+ else
+ archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+ fi
+ hardcode_libdir_flag_spec_GCJ='-R$libdir'
+ hardcode_shlibpath_var_GCJ=no
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *) # Supported since Solaris 2.6 (maybe 2.5.1?)
+ whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract' ;;
+ esac
+ link_all_deplibs_GCJ=yes
+ ;;
+
+ sunos4*)
+ if test "x$host_vendor" = xsequent; then
+ # Use $CC to link under sequent, because it throws in some extra .o
+ # files that make .init and .fini sections work.
+ archive_cmds_GCJ='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds_GCJ='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ hardcode_libdir_flag_spec_GCJ='-L$libdir'
+ hardcode_direct_GCJ=yes
+ hardcode_minus_L_GCJ=yes
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ sysv4)
+ case $host_vendor in
+ sni)
+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_GCJ=yes # is this really true???
+ ;;
+ siemens)
+ ## LD is ld it makes a PLAMLIB
+ ## CC just makes a GrossModule.
+ archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ reload_cmds_GCJ='$CC -r -o $output$reload_objs'
+ hardcode_direct_GCJ=no
+ ;;
+ motorola)
+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_GCJ=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ runpath_var='LD_RUN_PATH'
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ sysv4.3*)
+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var_GCJ=no
+ export_dynamic_flag_spec_GCJ='-Bexport'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var_GCJ=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ ld_shlibs_GCJ=yes
+ fi
+ ;;
+
+ sysv4.2uw2*)
+ archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_GCJ=yes
+ hardcode_minus_L_GCJ=no
+ hardcode_shlibpath_var_GCJ=no
+ hardcode_runpath_var=yes
+ runpath_var=LD_RUN_PATH
+ ;;
+
+ sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*)
+ no_undefined_flag_GCJ='${wl}-z ${wl}text'
+ if test "$GCC" = yes; then
+ archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds_GCJ='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ runpath_var='LD_RUN_PATH'
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ sysv5*)
+ no_undefined_flag_GCJ=' -z text'
+ # $CC -shared without GNU ld will not create a library from C++
+ # object files and a static libstdc++, better avoid it by now
+ archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+ hardcode_libdir_flag_spec_GCJ=
+ hardcode_shlibpath_var_GCJ=no
+ runpath_var='LD_RUN_PATH'
+ ;;
+
+ uts4*)
+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec_GCJ='-L$libdir'
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ *)
+ ld_shlibs_GCJ=no
+ ;;
+ esac
+ fi
+
+echo "$as_me:$LINENO: result: $ld_shlibs_GCJ" >&5
+echo "${ECHO_T}$ld_shlibs_GCJ" >&6
+test "$ld_shlibs_GCJ" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_GCJ" in
+x|xyes)
+ # Assume -lc should be added
+ archive_cmds_need_lc_GCJ=yes
+
+ if test "$enable_shared" = yes && test "$GCC" = yes; then
+ case $archive_cmds_GCJ in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
+ $rm conftest*
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$lt_prog_compiler_wl_GCJ
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$allow_undefined_flag_GCJ
+ allow_undefined_flag_GCJ=
+ if { (eval echo "$as_me:$LINENO: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
+ (eval $archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ then
+ archive_cmds_need_lc_GCJ=no
+ else
+ archive_cmds_need_lc_GCJ=yes
+ fi
+ allow_undefined_flag_GCJ=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $rm conftest*
+ echo "$as_me:$LINENO: result: $archive_cmds_need_lc_GCJ" >&5
+echo "${ECHO_T}$archive_cmds_need_lc_GCJ" >&6
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
+ # if the path contains ";" then we assume it to be the separator
+ # otherwise default to the standard path separator (i.e. ":") - it is
+ # assumed that no part of a normal pathname contains ";" but that should
+ # okay in the real world where ";" in dirpaths is itself problematic.
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+else
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX 3 has no versioning support, so we append a major version to the name.
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+
+aix4* | aix5*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ hardcode_into_libs=yes
+ if test "$host_cpu" = ia64; then
+ # AIX 5 supports IA64
+ library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line `#! .'. This would cause the generated library to
+ # depend on `.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[01] | aix4.[01].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ if test "$aix_use_runtimelinking" = yes; then
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ else
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='${libname}${release}.a $libname.a'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ fi
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ ;;
+
+beos*)
+ library_names_spec='${libname}${shared_ext}'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi4*)
+ version_type=linux
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32*)
+ version_type=windows
+ shrext_cmds=".dll"
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$host_os in
+ yes,cygwin* | yes,mingw* | yes,pw32*)
+ library_names_spec='$libname.dll.a'
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \${file}`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $rm \$dlpath'
+ shlibpath_overrides_runpath=yes
+
+ case $host_os in
+ cygwin*)
+ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+ soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+ ;;
+ mingw*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH printed by
+ # mingw gcc, but we are running on Cygwin. Gcc prints its search
+ # path with ; separators, and with drive letters. We can handle the
+ # drive letters (cygwin fileutils understands them), so leave them,
+ # especially as we might pass files found there to a mingw objdump,
+ # which wouldn't understand a cygwinified path. Ahh.
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ ;;
+ pw32*)
+ # pw32 DLLs use 'pw' prefix rather than 'lib'
+ library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}'
+ ;;
+ esac
+ ;;
+
+ *)
+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+ soname_spec='${libname}${release}${major}$shared_ext'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)'
+ # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
+ if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
+ else
+ sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
+ fi
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+freebsd1*)
+ dynamic_linker=no
+ ;;
+
+kfreebsd*-gnu)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='GNU ld.so'
+ ;;
+
+freebsd*)
+ objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout`
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ freebsd3.01* | freebsdelf3.01*)
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ *) # from 3.2 on
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+gnu*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ case "$host_cpu" in
+ ia64*)
+ shrext_cmds='.so'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.so"
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ if test "X$HPUX_IA64_MODE" = X32; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ fi
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ hppa*64*)
+ shrext_cmds='.sl'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ *)
+ shrext_cmds='.sl'
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+ esac
+ # HP-UX runs *really* slowly unless shared libraries are mode 555.
+ postinstall_cmds='chmod 555 $lib'
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $host_os in
+ nonstopux*) version_type=nonstopux ;;
+ *)
+ if test "$lt_cv_prog_gnu_ld" = yes; then
+ version_type=linux
+ else
+ version_type=irix
+ fi ;;
+ esac
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+ case $host_os in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+ libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+ libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+ libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+ sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+ hardcode_into_libs=yes
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+ dynamic_linker=no
+ ;;
+
+# This must be Linux ELF.
+linux*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ # find out which ABI we are using
+ libsuff=
+ case "$host_cpu" in
+ x86_64*|s390x*|powerpc64*)
+ echo '#line 17737 "configure"' > conftest.$ac_ext
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *64-bit*)
+ libsuff=64
+ sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}"
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+ esac
+
+ # Append ld.so.conf contents to the search path
+ if test -f /etc/ld.so.conf; then
+ lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '`
+ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra"
+ fi
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+knetbsd*-gnu)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='GNU ld.so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+nto-qnx*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+openbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=yes
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ case $host_os in
+ openbsd2.[89] | openbsd2.[89].*)
+ shlibpath_overrides_runpath=no
+ ;;
+ *)
+ shlibpath_overrides_runpath=yes
+ ;;
+ esac
+ else
+ shlibpath_overrides_runpath=yes
+ fi
+ ;;
+
+os2*)
+ libname_spec='$name'
+ shrext_cmds=".dll"
+ need_lib_prefix=no
+ library_names_spec='$libname${shared_ext} $libname.a'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=LIBPATH
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+ ;;
+
+sco3.2v5*)
+ version_type=osf
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+solaris*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test "$with_gnu_ld" = yes; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ need_lib_prefix=no
+ export_dynamic_flag_spec='${wl}-Blargedynsym'
+ runpath_var=LD_RUN_PATH
+ ;;
+ siemens)
+ need_lib_prefix=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec ;then
+ version_type=linux
+ library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+ soname_spec='$libname${shared_ext}.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+uts4*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+echo "${ECHO_T}$dynamic_linker" >&6
+test "$dynamic_linker" = no && can_build_shared=no
+
+echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
+hardcode_action_GCJ=
+if test -n "$hardcode_libdir_flag_spec_GCJ" || \
+ test -n "$runpath_var GCJ" || \
+ test "X$hardcode_automatic_GCJ"="Xyes" ; then
+
+ # We can hardcode non-existant directories.
+ if test "$hardcode_direct_GCJ" != no &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no &&
+ test "$hardcode_minus_L_GCJ" != no; then
+ # Linking always hardcodes the temporary library directory.
+ hardcode_action_GCJ=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ hardcode_action_GCJ=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ hardcode_action_GCJ=unsupported
+fi
+echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5
+echo "${ECHO_T}$hardcode_action_GCJ" >&6
+
+if test "$hardcode_action_GCJ" = relink; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+ test "$enable_shared" = no; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+
+striplib=
+old_striplib=
+echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5
+echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6
+if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then
+ test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+ test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+ case $host_os in
+ darwin*)
+ if test -n "$STRIP" ; then
+ striplib="$STRIP -x"
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+ ;;
+ *)
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ ;;
+ esac
+fi
+
+if test "x$enable_dlopen" != xyes; then
+ enable_dlopen=unknown
+ enable_dlopen_self=unknown
+ enable_dlopen_self_static=unknown
+else
+ lt_cv_dlopen=no
+ lt_cv_dlopen_libs=
+
+ case $host_os in
+ beos*)
+ lt_cv_dlopen="load_add_on"
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ;;
+
+ mingw* | pw32*)
+ lt_cv_dlopen="LoadLibrary"
+ lt_cv_dlopen_libs=
+ ;;
+
+ cygwin*)
+ lt_cv_dlopen="dlopen"
+ lt_cv_dlopen_libs=
+ ;;
+
+ darwin*)
+ # if libdl is installed we need to link against it
+ echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
+echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main ()
+{
+dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_dl_dlopen=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dl_dlopen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6
+if test $ac_cv_lib_dl_dlopen = yes; then
+ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+
+ lt_cv_dlopen="dyld"
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+
+fi
+
+ ;;
+
+ *)
+ echo "$as_me:$LINENO: checking for shl_load" >&5
+echo $ECHO_N "checking for shl_load... $ECHO_C" >&6
+if test "${ac_cv_func_shl_load+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define shl_load to an innocuous variant, in case <limits.h> declares shl_load.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define shl_load innocuous_shl_load
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char shl_load (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef shl_load
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char shl_load ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_shl_load) || defined (__stub___shl_load)
+choke me
+#else
+char (*f) () = shl_load;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != shl_load;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_shl_load=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_shl_load=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5
+echo "${ECHO_T}$ac_cv_func_shl_load" >&6
+if test $ac_cv_func_shl_load = yes; then
+ lt_cv_dlopen="shl_load"
+else
+ echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5
+echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6
+if test "${ac_cv_lib_dld_shl_load+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char shl_load ();
+int
+main ()
+{
+shl_load ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_dld_shl_load=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dld_shl_load=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5
+echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6
+if test $ac_cv_lib_dld_shl_load = yes; then
+ lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"
+else
+ echo "$as_me:$LINENO: checking for dlopen" >&5
+echo $ECHO_N "checking for dlopen... $ECHO_C" >&6
+if test "${ac_cv_func_dlopen+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define dlopen to an innocuous variant, in case <limits.h> declares dlopen.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define dlopen innocuous_dlopen
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char dlopen (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef dlopen
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_dlopen) || defined (__stub___dlopen)
+choke me
+#else
+char (*f) () = dlopen;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != dlopen;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_dlopen=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_dlopen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5
+echo "${ECHO_T}$ac_cv_func_dlopen" >&6
+if test $ac_cv_func_dlopen = yes; then
+ lt_cv_dlopen="dlopen"
+else
+ echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
+echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main ()
+{
+dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_dl_dlopen=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dl_dlopen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6
+if test $ac_cv_lib_dl_dlopen = yes; then
+ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+ echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5
+echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6
+if test "${ac_cv_lib_svld_dlopen+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main ()
+{
+dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_svld_dlopen=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_svld_dlopen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6
+if test $ac_cv_lib_svld_dlopen = yes; then
+ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
+else
+ echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5
+echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6
+if test "${ac_cv_lib_dld_dld_link+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dld_link ();
+int
+main ()
+{
+dld_link ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_dld_dld_link=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dld_dld_link=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5
+echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6
+if test $ac_cv_lib_dld_dld_link = yes; then
+ lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+ ;;
+ esac
+
+ if test "x$lt_cv_dlopen" != xno; then
+ enable_dlopen=yes
+ else
+ enable_dlopen=no
+ fi
+
+ case $lt_cv_dlopen in
+ dlopen)
+ save_CPPFLAGS="$CPPFLAGS"
+ test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+ save_LDFLAGS="$LDFLAGS"
+ eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+ save_LIBS="$LIBS"
+ LIBS="$lt_cv_dlopen_libs $LIBS"
+
+ echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5
+echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6
+if test "${lt_cv_dlopen_self+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then :
+ lt_cv_dlopen_self=cross
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<EOF
+#line 18608 "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ /* dlclose (self); */
+ }
+
+ exit (status);
+}
+EOF
+ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then
+ (./conftest; exit; ) 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+ x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+ x$lt_unknown|x*) lt_cv_dlopen_self=no ;;
+ esac
+ else :
+ # compilation failed
+ lt_cv_dlopen_self=no
+ fi
+fi
+rm -fr conftest*
+
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5
+echo "${ECHO_T}$lt_cv_dlopen_self" >&6
+
+ if test "x$lt_cv_dlopen_self" = xyes; then
+ LDFLAGS="$LDFLAGS $link_static_flag"
+ echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5
+echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6
+if test "${lt_cv_dlopen_self_static+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then :
+ lt_cv_dlopen_self_static=cross
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<EOF
+#line 18706 "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ /* dlclose (self); */
+ }
+
+ exit (status);
+}
+EOF
+ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then
+ (./conftest; exit; ) 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+ x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+ x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;;
+ esac
+ else :
+ # compilation failed
+ lt_cv_dlopen_self_static=no
+ fi
+fi
+rm -fr conftest*
+
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5
+echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6
+ fi
+
+ CPPFLAGS="$save_CPPFLAGS"
+ LDFLAGS="$save_LDFLAGS"
+ LIBS="$save_LIBS"
+ ;;
+ esac
+
+ case $lt_cv_dlopen_self in
+ yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+ *) enable_dlopen_self=unknown ;;
+ esac
+
+ case $lt_cv_dlopen_self_static in
+ yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+ *) enable_dlopen_self_static=unknown ;;
+ esac
+fi
+
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+ # See if we are running on zsh, and set the options which allow our commands through
+ # without removal of \ escapes.
+ if test -n "${ZSH_VERSION+set}" ; then
+ setopt NO_GLOB_SUBST
+ fi
+ # Now quote all the things that may contain metacharacters while being
+ # careful not to overquote the AC_SUBSTed values. We take copies of the
+ # variables and quote the copies for generation of the libtool script.
+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \
+ SED SHELL STRIP \
+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+ deplibs_check_method reload_flag reload_cmds need_locks \
+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+ lt_cv_sys_global_symbol_to_c_name_address \
+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+ old_postinstall_cmds old_postuninstall_cmds \
+ compiler_GCJ \
+ CC_GCJ \
+ LD_GCJ \
+ lt_prog_compiler_wl_GCJ \
+ lt_prog_compiler_pic_GCJ \
+ lt_prog_compiler_static_GCJ \
+ lt_prog_compiler_no_builtin_flag_GCJ \
+ export_dynamic_flag_spec_GCJ \
+ thread_safe_flag_spec_GCJ \
+ whole_archive_flag_spec_GCJ \
+ enable_shared_with_static_runtimes_GCJ \
+ old_archive_cmds_GCJ \
+ old_archive_from_new_cmds_GCJ \
+ predep_objects_GCJ \
+ postdep_objects_GCJ \
+ predeps_GCJ \
+ postdeps_GCJ \
+ compiler_lib_search_path_GCJ \
+ archive_cmds_GCJ \
+ archive_expsym_cmds_GCJ \
+ postinstall_cmds_GCJ \
+ postuninstall_cmds_GCJ \
+ old_archive_from_expsyms_cmds_GCJ \
+ allow_undefined_flag_GCJ \
+ no_undefined_flag_GCJ \
+ export_symbols_cmds_GCJ \
+ hardcode_libdir_flag_spec_GCJ \
+ hardcode_libdir_flag_spec_ld_GCJ \
+ hardcode_libdir_separator_GCJ \
+ hardcode_automatic_GCJ \
+ module_cmds_GCJ \
+ module_expsym_cmds_GCJ \
+ lt_cv_prog_compiler_c_o_GCJ \
+ exclude_expsyms_GCJ \
+ include_expsyms_GCJ; do
+
+ case $var in
+ old_archive_cmds_GCJ | \
+ old_archive_from_new_cmds_GCJ | \
+ archive_cmds_GCJ | \
+ archive_expsym_cmds_GCJ | \
+ module_cmds_GCJ | \
+ module_expsym_cmds_GCJ | \
+ old_archive_from_expsyms_cmds_GCJ | \
+ export_symbols_cmds_GCJ | \
+ extract_expsyms_cmds | reload_cmds | finish_cmds | \
+ postinstall_cmds | postuninstall_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | \
+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+ # Double-quote double-evaled strings.
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+ ;;
+ *)
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+ ;;
+ esac
+ done
+
+ case $lt_echo in
+ *'\$0 --fallback-echo"')
+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+ ;;
+ esac
+
+cfgfile="$ofile"
+
+ cat <<__EOF__ >> "$cfgfile"
+# ### BEGIN LIBTOOL TAG CONFIG: $tagname
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_GCJ
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_GCJ
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# A language-specific compiler.
+CC=$lt_compiler_GCJ
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC_GCJ
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD_GCJ
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_GCJ
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_GCJ
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_GCJ
+
+# Must we lock files when doing compilation ?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_GCJ
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_GCJ
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_GCJ
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_GCJ
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec_GCJ
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds_GCJ
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_GCJ
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_GCJ
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds_GCJ
+archive_expsym_cmds=$lt_archive_expsym_cmds_GCJ
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds_GCJ
+module_expsym_cmds=$lt_module_expsym_cmds_GCJ
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_predep_objects_GCJ
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_postdep_objects_GCJ
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps_GCJ
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps_GCJ
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_GCJ
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_GCJ
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_GCJ
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_GCJ
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_GCJ
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_GCJ
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_GCJ
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct_GCJ
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L_GCJ
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_GCJ
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$hardcode_automatic_GCJ
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_GCJ
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path_GCJ"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols_GCJ
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_GCJ
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_GCJ
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_GCJ
+
+# ### END LIBTOOL TAG CONFIG: $tagname
+
+__EOF__
+
+
+else
+ # If there is no Makefile yet, we rely on a make rule to execute
+ # `config.status --recheck' to rerun these tests and create the
+ # libtool script then.
+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+ if test -f "$ltmain_in"; then
+ test -f Makefile && make "$ltmain"
+ fi
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC="$lt_save_CC"
+
+ else
+ tagname=""
+ fi
+ ;;
+
+ RC)
+
+
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+objext_RC=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="$lt_simple_compile_test_code"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${RC-"windres"}
+compiler=$CC
+compiler_RC=$CC
+lt_cv_prog_compiler_c_o_RC=yes
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+ # See if we are running on zsh, and set the options which allow our commands through
+ # without removal of \ escapes.
+ if test -n "${ZSH_VERSION+set}" ; then
+ setopt NO_GLOB_SUBST
+ fi
+ # Now quote all the things that may contain metacharacters while being
+ # careful not to overquote the AC_SUBSTed values. We take copies of the
+ # variables and quote the copies for generation of the libtool script.
+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \
+ SED SHELL STRIP \
+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+ deplibs_check_method reload_flag reload_cmds need_locks \
+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+ lt_cv_sys_global_symbol_to_c_name_address \
+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+ old_postinstall_cmds old_postuninstall_cmds \
+ compiler_RC \
+ CC_RC \
+ LD_RC \
+ lt_prog_compiler_wl_RC \
+ lt_prog_compiler_pic_RC \
+ lt_prog_compiler_static_RC \
+ lt_prog_compiler_no_builtin_flag_RC \
+ export_dynamic_flag_spec_RC \
+ thread_safe_flag_spec_RC \
+ whole_archive_flag_spec_RC \
+ enable_shared_with_static_runtimes_RC \
+ old_archive_cmds_RC \
+ old_archive_from_new_cmds_RC \
+ predep_objects_RC \
+ postdep_objects_RC \
+ predeps_RC \
+ postdeps_RC \
+ compiler_lib_search_path_RC \
+ archive_cmds_RC \
+ archive_expsym_cmds_RC \
+ postinstall_cmds_RC \
+ postuninstall_cmds_RC \
+ old_archive_from_expsyms_cmds_RC \
+ allow_undefined_flag_RC \
+ no_undefined_flag_RC \
+ export_symbols_cmds_RC \
+ hardcode_libdir_flag_spec_RC \
+ hardcode_libdir_flag_spec_ld_RC \
+ hardcode_libdir_separator_RC \
+ hardcode_automatic_RC \
+ module_cmds_RC \
+ module_expsym_cmds_RC \
+ lt_cv_prog_compiler_c_o_RC \
+ exclude_expsyms_RC \
+ include_expsyms_RC; do
+
+ case $var in
+ old_archive_cmds_RC | \
+ old_archive_from_new_cmds_RC | \
+ archive_cmds_RC | \
+ archive_expsym_cmds_RC | \
+ module_cmds_RC | \
+ module_expsym_cmds_RC | \
+ old_archive_from_expsyms_cmds_RC | \
+ export_symbols_cmds_RC | \
+ extract_expsyms_cmds | reload_cmds | finish_cmds | \
+ postinstall_cmds | postuninstall_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | \
+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+ # Double-quote double-evaled strings.
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+ ;;
+ *)
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+ ;;
+ esac
+ done
+
+ case $lt_echo in
+ *'\$0 --fallback-echo"')
+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+ ;;
+ esac
+
+cfgfile="$ofile"
+
+ cat <<__EOF__ >> "$cfgfile"
+# ### BEGIN LIBTOOL TAG CONFIG: $tagname
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_RC
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# A language-specific compiler.
+CC=$lt_compiler_RC
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC_RC
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD_RC
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_RC
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_RC
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC
+
+# Must we lock files when doing compilation ?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_RC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec_RC
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds_RC
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds_RC
+archive_expsym_cmds=$lt_archive_expsym_cmds_RC
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds_RC
+module_expsym_cmds=$lt_module_expsym_cmds_RC
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_predep_objects_RC
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_postdep_objects_RC
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps_RC
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps_RC
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_RC
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_RC
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_RC
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_RC
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_RC
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_RC
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct_RC
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L_RC
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_RC
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$hardcode_automatic_RC
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_RC
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path_RC"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols_RC
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_RC
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_RC
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_RC
+
+# ### END LIBTOOL TAG CONFIG: $tagname
+
+__EOF__
+
+
+else
+ # If there is no Makefile yet, we rely on a make rule to execute
+ # `config.status --recheck' to rerun these tests and create the
+ # libtool script then.
+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+ if test -f "$ltmain_in"; then
+ test -f Makefile && make "$ltmain"
+ fi
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC="$lt_save_CC"
+
+ ;;
+
+ *)
+ { { echo "$as_me:$LINENO: error: Unsupported tag name: $tagname" >&5
+echo "$as_me: error: Unsupported tag name: $tagname" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+ esac
+
+ # Append the new tag name to the list of available tags.
+ if test -n "$tagname" ; then
+ available_tags="$available_tags $tagname"
+ fi
+ fi
+ done
+ IFS="$lt_save_ifs"
+
+ # Now substitute the updated list of available tags.
+ if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then
+ mv "${ofile}T" "$ofile"
+ chmod +x "$ofile"
+ else
+ rm -f "${ofile}T"
+ { { echo "$as_me:$LINENO: error: unable to update list of available tagged configurations." >&5
+echo "$as_me: error: unable to update list of available tagged configurations." >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+fi
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+# Prevent multiple expansion
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if ${TEST} -n "${SAVE_LIBTOOL}" ; then
+ LIBTOOL="$SAVE_LIBTOOL"
+fi
+echo "$as_me:$LINENO: result: LIBTOOL=\"$LIBTOOL\"" >&5
+echo "${ECHO_T}LIBTOOL=\"$LIBTOOL\"" >&6
+
+
+
+
+echo "$as_me:$LINENO: checking for char" >&5
+echo $ECHO_N "checking for char... $ECHO_C" >&6
+if test "${ac_cv_type_char+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((char *) 0)
+ return 0;
+if (sizeof (char))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_char=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_char=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_char" >&5
+echo "${ECHO_T}$ac_cv_type_char" >&6
+
+echo "$as_me:$LINENO: checking size of char" >&5
+echo $ECHO_N "checking size of char... $ECHO_C" >&6
+if test "${ac_cv_sizeof_char+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$ac_cv_type_char" = yes; then
+ # The cast to unsigned long works around a bug in the HP C Compiler
+ # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+ # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+ # This bug is HP SR number 8606223364.
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (char))) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (char))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (char))) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (char))) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (char))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_char=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (char), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (char), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; } ;;
+esac
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+long longval () { return (long) (sizeof (char)); }
+unsigned long ulongval () { return (long) (sizeof (char)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ exit (1);
+ if (((long) (sizeof (char))) < 0)
+ {
+ long i = longval ();
+ if (i != ((long) (sizeof (char))))
+ exit (1);
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long i = ulongval ();
+ if (i != ((long) (sizeof (char))))
+ exit (1);
+ fprintf (f, "%lu\n", i);
+ }
+ exit (ferror (f) || fclose (f) != 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sizeof_char=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (char), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (char), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+ ac_cv_sizeof_char=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_char" >&5
+echo "${ECHO_T}$ac_cv_sizeof_char" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_CHAR $ac_cv_sizeof_char
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking for int" >&5
+echo $ECHO_N "checking for int... $ECHO_C" >&6
+if test "${ac_cv_type_int+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((int *) 0)
+ return 0;
+if (sizeof (int))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_int=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_int=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_int" >&5
+echo "${ECHO_T}$ac_cv_type_int" >&6
+
+echo "$as_me:$LINENO: checking size of int" >&5
+echo $ECHO_N "checking size of int... $ECHO_C" >&6
+if test "${ac_cv_sizeof_int+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$ac_cv_type_int" = yes; then
+ # The cast to unsigned long works around a bug in the HP C Compiler
+ # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+ # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+ # This bug is HP SR number 8606223364.
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (int))) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (int))) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (int))) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_int=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (int), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; } ;;
+esac
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+long longval () { return (long) (sizeof (int)); }
+unsigned long ulongval () { return (long) (sizeof (int)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ exit (1);
+ if (((long) (sizeof (int))) < 0)
+ {
+ long i = longval ();
+ if (i != ((long) (sizeof (int))))
+ exit (1);
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long i = ulongval ();
+ if (i != ((long) (sizeof (int))))
+ exit (1);
+ fprintf (f, "%lu\n", i);
+ }
+ exit (ferror (f) || fclose (f) != 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sizeof_int=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (int), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+ ac_cv_sizeof_int=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_int" >&5
+echo "${ECHO_T}$ac_cv_sizeof_int" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_INT $ac_cv_sizeof_int
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking for long" >&5
+echo $ECHO_N "checking for long... $ECHO_C" >&6
+if test "${ac_cv_type_long+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((long *) 0)
+ return 0;
+if (sizeof (long))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_long=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_long=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_long" >&5
+echo "${ECHO_T}$ac_cv_type_long" >&6
+
+echo "$as_me:$LINENO: checking size of long" >&5
+echo $ECHO_N "checking size of long... $ECHO_C" >&6
+if test "${ac_cv_sizeof_long+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$ac_cv_type_long" = yes; then
+ # The cast to unsigned long works around a bug in the HP C Compiler
+ # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+ # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+ # This bug is HP SR number 8606223364.
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long))) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long))) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long))) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_long=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (long), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; } ;;
+esac
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+long longval () { return (long) (sizeof (long)); }
+unsigned long ulongval () { return (long) (sizeof (long)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ exit (1);
+ if (((long) (sizeof (long))) < 0)
+ {
+ long i = longval ();
+ if (i != ((long) (sizeof (long))))
+ exit (1);
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long i = ulongval ();
+ if (i != ((long) (sizeof (long))))
+ exit (1);
+ fprintf (f, "%lu\n", i);
+ }
+ exit (ferror (f) || fclose (f) != 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sizeof_long=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (long), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+ ac_cv_sizeof_long=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_long" >&5
+echo "${ECHO_T}$ac_cv_sizeof_long" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_LONG $ac_cv_sizeof_long
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking for short" >&5
+echo $ECHO_N "checking for short... $ECHO_C" >&6
+if test "${ac_cv_type_short+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((short *) 0)
+ return 0;
+if (sizeof (short))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_short=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_short=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_short" >&5
+echo "${ECHO_T}$ac_cv_type_short" >&6
+
+echo "$as_me:$LINENO: checking size of short" >&5
+echo $ECHO_N "checking size of short... $ECHO_C" >&6
+if test "${ac_cv_sizeof_short+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$ac_cv_type_short" = yes; then
+ # The cast to unsigned long works around a bug in the HP C Compiler
+ # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+ # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+ # This bug is HP SR number 8606223364.
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (short))) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (short))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (short))) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (short))) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (short))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_short=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (short), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (short), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; } ;;
+esac
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+long longval () { return (long) (sizeof (short)); }
+unsigned long ulongval () { return (long) (sizeof (short)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ exit (1);
+ if (((long) (sizeof (short))) < 0)
+ {
+ long i = longval ();
+ if (i != ((long) (sizeof (short))))
+ exit (1);
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long i = ulongval ();
+ if (i != ((long) (sizeof (short))))
+ exit (1);
+ fprintf (f, "%lu\n", i);
+ }
+ exit (ferror (f) || fclose (f) != 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sizeof_short=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (short), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (short), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+ ac_cv_sizeof_short=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_short" >&5
+echo "${ECHO_T}$ac_cv_sizeof_short" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_SHORT $ac_cv_sizeof_short
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking for long double" >&5
+echo $ECHO_N "checking for long double... $ECHO_C" >&6
+if test "${ac_cv_type_long_double+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((long double *) 0)
+ return 0;
+if (sizeof (long double))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_long_double=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_long_double=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_long_double" >&5
+echo "${ECHO_T}$ac_cv_type_long_double" >&6
+
+echo "$as_me:$LINENO: checking size of long double" >&5
+echo $ECHO_N "checking size of long double... $ECHO_C" >&6
+if test "${ac_cv_sizeof_long_double+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$ac_cv_type_long_double" = yes; then
+ # The cast to unsigned long works around a bug in the HP C Compiler
+ # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+ # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+ # This bug is HP SR number 8606223364.
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long double))) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long double))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long double))) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long double))) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long double))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_long_double=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long double), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (long double), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; } ;;
+esac
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+long longval () { return (long) (sizeof (long double)); }
+unsigned long ulongval () { return (long) (sizeof (long double)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ exit (1);
+ if (((long) (sizeof (long double))) < 0)
+ {
+ long i = longval ();
+ if (i != ((long) (sizeof (long double))))
+ exit (1);
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long i = ulongval ();
+ if (i != ((long) (sizeof (long double))))
+ exit (1);
+ fprintf (f, "%lu\n", i);
+ }
+ exit (ferror (f) || fclose (f) != 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sizeof_long_double=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (long double), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (long double), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+ ac_cv_sizeof_long_double=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_long_double" >&5
+echo "${ECHO_T}$ac_cv_sizeof_long_double" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_LONG_DOUBLE $ac_cv_sizeof_long_double
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking for long long" >&5
+echo $ECHO_N "checking for long long... $ECHO_C" >&6
+if test "${ac_cv_type_long_long+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((long long *) 0)
+ return 0;
+if (sizeof (long long))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_long_long=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_long_long=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_long_long" >&5
+echo "${ECHO_T}$ac_cv_type_long_long" >&6
+
+echo "$as_me:$LINENO: checking size of long long" >&5
+echo $ECHO_N "checking size of long long... $ECHO_C" >&6
+if test "${ac_cv_sizeof_long_long+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$ac_cv_type_long_long" = yes; then
+ # The cast to unsigned long works around a bug in the HP C Compiler
+ # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+ # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+ # This bug is HP SR number 8606223364.
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long long))) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long long))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long long))) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long long))) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long long))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_long_long=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long long), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (long long), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; } ;;
+esac
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+long longval () { return (long) (sizeof (long long)); }
+unsigned long ulongval () { return (long) (sizeof (long long)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ exit (1);
+ if (((long) (sizeof (long long))) < 0)
+ {
+ long i = longval ();
+ if (i != ((long) (sizeof (long long))))
+ exit (1);
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long i = ulongval ();
+ if (i != ((long) (sizeof (long long))))
+ exit (1);
+ fprintf (f, "%lu\n", i);
+ }
+ exit (ferror (f) || fclose (f) != 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sizeof_long_long=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (long long), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (long long), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+ ac_cv_sizeof_long_long=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_long_long" >&5
+echo "${ECHO_T}$ac_cv_sizeof_long_long" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking for longlong" >&5
+echo $ECHO_N "checking for longlong... $ECHO_C" >&6
+if test "${ac_cv_type_longlong+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((longlong *) 0)
+ return 0;
+if (sizeof (longlong))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_longlong=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_longlong=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_longlong" >&5
+echo "${ECHO_T}$ac_cv_type_longlong" >&6
+
+echo "$as_me:$LINENO: checking size of longlong" >&5
+echo $ECHO_N "checking size of longlong... $ECHO_C" >&6
+if test "${ac_cv_sizeof_longlong+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$ac_cv_type_longlong" = yes; then
+ # The cast to unsigned long works around a bug in the HP C Compiler
+ # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+ # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+ # This bug is HP SR number 8606223364.
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (longlong))) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (longlong))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (longlong))) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (longlong))) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (longlong))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_longlong=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (longlong), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (longlong), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; } ;;
+esac
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+long longval () { return (long) (sizeof (longlong)); }
+unsigned long ulongval () { return (long) (sizeof (longlong)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ exit (1);
+ if (((long) (sizeof (longlong))) < 0)
+ {
+ long i = longval ();
+ if (i != ((long) (sizeof (longlong))))
+ exit (1);
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long i = ulongval ();
+ if (i != ((long) (sizeof (longlong))))
+ exit (1);
+ fprintf (f, "%lu\n", i);
+ }
+ exit (ferror (f) || fclose (f) != 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sizeof_longlong=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (longlong), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (longlong), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+ ac_cv_sizeof_longlong=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_longlong" >&5
+echo "${ECHO_T}$ac_cv_sizeof_longlong" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_LONGLONG $ac_cv_sizeof_longlong
+_ACEOF
+
+
+
+# Now we need to find what jk_uint32_t (sizeof == 4) will be.
+# The first match is our preference.
+if test "$ac_cv_sizeof_int" = "4"; then
+ int32_t_fmt='#define JK_INT32_T_FMT "d"'
+ uint32_t_fmt='#define JK_UINT32_T_FMT "u"'
+ uint32_t_hex_fmt='#define JK_UINT32_T_HEX_FMT "x"'
+ int32_value="int"
+elif test "$ac_cv_sizeof_long" = "4"; then
+ int32_t_fmt='#define JK_INT32_T_FMT "ld"'
+ uint32_t_fmt='#define JK_UINT32_T_FMT "lu"'
+ uint32_t_hex_fmt='#define JK_UINT32_T_HEX_FMT "lx"'
+ int32_value="long"
+else
+ int32_t_fmt='#error could not detect a 32-bit integer type'
+ uint32_t_fmt='#error could not detect a 32-bit integer type'
+ uint32_t_hex_fmt='#error could not detect a 32-bit integer type'
+ { { echo "$as_me:$LINENO: error: could not detect a 32-bit integer type" >&5
+echo "$as_me: error: could not detect a 32-bit integer type" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+# Now we need to find what jk_uint64_t (sizeof == 8) will be.
+# The first match is our preference.
+if test "$ac_cv_sizeof_int" = "8"; then
+ int64_t_fmt='#define JK_INT64_T_FMT "d"'
+ uint64_t_fmt='#define JK_UINT64_T_FMT "u"'
+ uint64_t_hex_fmt='#define JK_UINT64_T_HEX_FMT "x"'
+ int64_value="int"
+elif test "$ac_cv_sizeof_long" = "8"; then
+ int64_t_fmt='#define JK_INT64_T_FMT "ld"'
+ uint64_t_fmt='#define JK_UINT64_T_FMT "lu"'
+ uint64_t_hex_fmt='#define JK_UINT64_T_HEX_FMT "lx"'
+ int64_value="long"
+elif test "$ac_cv_sizeof_long_long" = "8"; then
+ # Linux, Solaris, FreeBSD all support ll with printf.
+ # BSD 4.4 originated 'q'. Solaris is more popular and
+ # doesn't support 'q'. Solaris wins. Exceptions can
+ # go to the OS-dependent section.
+ int64_t_fmt='#define JK_INT64_T_FMT "lld"'
+ uint64_t_fmt='#define JK_UINT64_T_FMT "llu"'
+ uint64_t_hex_fmt='#define JK_UINT64_T_HEX_FMT "llx"'
+ int64_value="long long"
+elif test "$ac_cv_sizeof_long_double" = "8"; then
+ int64_t_fmt='#define JK_INT64_T_FMT "Ld"'
+ uint64_t_fmt='#define JK_UINT64_T_FMT "Lu"'
+ uint64_t_hex_fmt='#define JK_UINT64_T_HEX_FMT "Lx"'
+ int64_value="long double"
+elif test "$ac_cv_sizeof_longlong" = "8"; then
+ int64_t_fmt='#define JK_INT64_T_FMT "qd"'
+ uint64_t_fmt='#define JK_UINT64_T_FMT "qu"'
+ uint64_t_hex_fmt='#define JK_UINT64_T_HEX_FMT "qx"'
+ int64_value="__int64"
+else
+ int64_t_fmt='#error could not detect a 64-bit integer type'
+ uint64_t_fmt='#error could not detect a 64-bit integer type'
+ uint64_t_hex_fmt='#error could not detect a 64-bit integer type'
+ { { echo "$as_me:$LINENO: error: could not detect a 64-bit integer type" >&5
+echo "$as_me: error: could not detect a 64-bit integer type" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+echo "$as_me:$LINENO: checking size of pid_t" >&5
+echo $ECHO_N "checking size of pid_t... $ECHO_C" >&6
+if test "${ac_cv_sizeof_pid_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_sizeof_pid_t=8
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdio.h>
+#include <sys/types.h>
+main()
+{
+ FILE *f=fopen("conftestval","w");
+ if (!f) exit(1);
+ fprintf(f, "%d\n", sizeof(pid_t));
+ exit(0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sizeof_pid_t=`cat conftestval`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_sizeof_pid_t=0
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_pid_t" >&5
+echo "${ECHO_T}$ac_cv_sizeof_pid_t" >&6
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_PID_T $ac_cv_sizeof_pid_t
+_ACEOF
+
+
+
+if test "$ac_cv_sizeof_pid_t" = "$ac_cv_sizeof_short"; then
+ pid_t_fmt='#define JK_PID_T_FMT "hd"'
+elif test "$ac_cv_sizeof_pid_t" = "$ac_cv_sizeof_int"; then
+ pid_t_fmt='#define JK_PID_T_FMT "d"'
+elif test "$ac_cv_sizeof_pid_t" = "$ac_cv_sizeof_long"; then
+ pid_t_fmt='#define JK_PID_T_FMT "ld"'
+elif test "$ac_cv_sizeof_pid_t" = "$ac_cv_sizeof_long_long"; then
+ pid_t_fmt='#define JK_PID_T_FMT JK_INT64_T_FMT'
+else
+ pid_t_fmt='#error Can not determine the proper size for pid_t'
+fi
+
+echo "$as_me:$LINENO: checking size of pthread_t" >&5
+echo $ECHO_N "checking size of pthread_t... $ECHO_C" >&6
+if test "${ac_cv_sizeof_pthread_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_sizeof_pthread_t=8
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdio.h>
+#include <pthread.h>
+main()
+{
+ FILE *f=fopen("conftestval","w");
+ if (!f) exit(1);
+ fprintf(f, "%d\n", sizeof(pthread_t));
+ exit(0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sizeof_pthread_t=`cat conftestval`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_sizeof_pthread_t=0
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_pthread_t" >&5
+echo "${ECHO_T}$ac_cv_sizeof_pthread_t" >&6
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_PTHREAD_T $ac_cv_sizeof_pthread_t
+_ACEOF
+
+
+
+if test "$ac_cv_sizeof_pthread_t" = "$ac_cv_sizeof_short"; then
+ pthread_t_fmt='#define JK_PTHREAD_T_FMT "hu"'
+ pthread_t_value="short"
+elif test "$ac_cv_sizeof_pthread_t" = "$ac_cv_sizeof_int"; then
+ pthread_t_fmt='#define JK_PTHREAD_T_FMT "u"'
+ pthread_t_value="int"
+elif test "$ac_cv_sizeof_pthread_t" = "$ac_cv_sizeof_long"; then
+ pthread_t_fmt='#define JK_PTHREAD_T_FMT "lu"'
+ pthread_t_value="long"
+elif test "$ac_cv_sizeof_pthread_t" = "$ac_cv_sizeof_long_long"; then
+ pthread_t_fmt='#define JK_PTHREAD_T_FMT "llu"'
+ pthread_t_value="long long"
+else
+ pthread_t_fmt='#error Can not determine the proper size for pthread_t'
+fi
+
+# Basically, we have tried to figure out the correct format strings
+# for pid_t which varies between platforms, but we don't always get
+# it right. If you find that we don't get it right for your platform,
+# you can override our decision below.
+case $host in
+ *-solaris*)
+ if test "$ac_cv_sizeof_pid_t" = "$ac_cv_sizeof_long"; then
+ pid_t_fmt='#define JK_PID_T_FMT "ld"'
+ fi
+ ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+echo "$as_me:$LINENO: checking for snprintf" >&5
+echo $ECHO_N "checking for snprintf... $ECHO_C" >&6
+if test "${ac_cv_func_snprintf+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define snprintf to an innocuous variant, in case <limits.h> declares snprintf.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define snprintf innocuous_snprintf
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char snprintf (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef snprintf
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char snprintf ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_snprintf) || defined (__stub___snprintf)
+choke me
+#else
+char (*f) () = snprintf;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != snprintf;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_snprintf=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_snprintf=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_snprintf" >&5
+echo "${ECHO_T}$ac_cv_func_snprintf" >&6
+if test $ac_cv_func_snprintf = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_SNPRINTF 1
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking for vsnprintf" >&5
+echo $ECHO_N "checking for vsnprintf... $ECHO_C" >&6
+if test "${ac_cv_func_vsnprintf+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define vsnprintf to an innocuous variant, in case <limits.h> declares vsnprintf.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define vsnprintf innocuous_vsnprintf
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char vsnprintf (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef vsnprintf
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char vsnprintf ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_vsnprintf) || defined (__stub___vsnprintf)
+choke me
+#else
+char (*f) () = vsnprintf;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != vsnprintf;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_vsnprintf=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_vsnprintf=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_vsnprintf" >&5
+echo "${ECHO_T}$ac_cv_func_vsnprintf" >&6
+if test $ac_cv_func_vsnprintf = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_VSNPRINTF 1
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking for flock" >&5
+echo $ECHO_N "checking for flock... $ECHO_C" >&6
+if test "${ac_cv_func_flock+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define flock to an innocuous variant, in case <limits.h> declares flock.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define flock innocuous_flock
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char flock (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef flock
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char flock ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_flock) || defined (__stub___flock)
+choke me
+#else
+char (*f) () = flock;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != flock;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_flock=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_flock=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_flock" >&5
+echo "${ECHO_T}$ac_cv_func_flock" >&6
+if test $ac_cv_func_flock = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_FLOCK 1
+_ACEOF
+
+fi
+
+
+echo "$as_me:$LINENO: checking for setsockopt in -lsocket" >&5
+echo $ECHO_N "checking for setsockopt in -lsocket... $ECHO_C" >&6
+if test "${ac_cv_lib_socket_setsockopt+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsocket $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char setsockopt ();
+int
+main ()
+{
+setsockopt ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_socket_setsockopt=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_socket_setsockopt=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_socket_setsockopt" >&5
+echo "${ECHO_T}$ac_cv_lib_socket_setsockopt" >&6
+if test $ac_cv_lib_socket_setsockopt = yes; then
+ LIBS="$LIBS -lsocket"
+fi
+
+
+
+for ac_header in sys/filio.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## ------------------------------------------ ##
+## Report this to the AC_PACKAGE_NAME lists. ##
+## ------------------------------------------ ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+echo "$as_me:$LINENO: checking whether to use SO_RCVTIMEO with setsockopt()" >&5
+echo $ECHO_N "checking whether to use SO_RCVTIMEO with setsockopt()... $ECHO_C" >&6
+if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+
+int main(void)
+{
+ int s;
+ struct timeval tv;
+ tv.tv_sec = 3;
+ tv.tv_usec = 0;
+
+#ifndef SO_RCVTIMEO
+ exit(3);
+#else
+ if ((s = socket(AF_INET, SOCK_STREAM, 0)) == -1)
+ exit(2);
+
+ /* fails on Solaris 2.6,8,9,10 and some Linuxes because
+ SO_RCVTIMEO|SO_SNDTIMEO are defined but not implemented */
+ if (setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (const void *)&tv, sizeof(tv)) == -1)
+ exit(1);
+
+ exit(0);
+#endif
+}
+
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+cat >>confdefs.h <<\_ACEOF
+#define USE_SO_RCVTIMEO 1
+_ACEOF
+
+
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+echo "$as_me:$LINENO: checking whether to use SO_SNDTIMEO with setsockopt()" >&5
+echo $ECHO_N "checking whether to use SO_SNDTIMEO with setsockopt()... $ECHO_C" >&6
+if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+
+int main(void)
+{
+ int s;
+ struct timeval tv;
+ tv.tv_sec = 3;
+ tv.tv_usec = 0;
+
+#ifndef SO_SNDTIMEO
+ exit(3);
+#else
+ if ((s = socket(AF_INET, SOCK_STREAM, 0)) == -1)
+ exit(2);
+
+ /* fails on Solaris 2.6,8,9,10 and some Linuxes because
+ SO_RCVTIMEO|SO_SNDTIMEO are defined but not implemented */
+ if (setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, (const void *)&tv, sizeof(tv)) == -1)
+ exit(1);
+
+ exit(0);
+#endif
+}
+
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+cat >>confdefs.h <<\_ACEOF
+#define USE_SO_SNDTIMEO 1
+_ACEOF
+
+
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+
+
+echo "$as_me:$LINENO: checking whether to use SOCK_CLOEXEC with socket()" >&5
+echo $ECHO_N "checking whether to use SOCK_CLOEXEC with socket()... $ECHO_C" >&6
+if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+
+int main(void)
+{
+ int s;
+
+#ifndef SOCK_CLOEXEC
+ exit(3);
+#else
+ if ((s = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, 0)) == -1)
+ exit(2);
+
+ exit(0);
+#endif
+}
+
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+cat >>confdefs.h <<\_ACEOF
+#define USE_SOCK_CLOEXEC 1
+_ACEOF
+
+
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+
+for ac_header in poll.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## ------------------------------------------ ##
+## Report this to the AC_PACKAGE_NAME lists. ##
+## ------------------------------------------ ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+echo "$as_me:$LINENO: checking for poll" >&5
+echo $ECHO_N "checking for poll... $ECHO_C" >&6
+if test "${ac_cv_func_poll+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define poll to an innocuous variant, in case <limits.h> declares poll.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define poll innocuous_poll
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char poll (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef poll
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char poll ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_poll) || defined (__stub___poll)
+choke me
+#else
+char (*f) () = poll;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != poll;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_poll=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_poll=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_poll" >&5
+echo "${ECHO_T}$ac_cv_func_poll" >&6
+if test $ac_cv_func_poll = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_POLL 1
+_ACEOF
+
+fi
+
+
+
+
+echo "$as_me:$LINENO: checking for target platform" >&5
+echo $ECHO_N "checking for target platform... $ECHO_C" >&6
+
+#PLATFORM=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`
+PLATFORM=$host
+
+case "$PLATFORM" in
+*beos*)
+ OS_APACHE="beos"
+ OS_APACHE_DIR=$OS_APACHE
+ ;;
+*pc-os2_emx*)
+ OS_APACHE="os2"
+ OS_APACHE_DIR=$OS_APACHE
+ ;;
+bs2000*)
+ OS_APACHE="unix"
+ OS_APACHE_DIR=bs2000 # only the OS_APACHE_DIR is platform specific.
+ ;;
+*)
+ OS_APACHE="unix"
+ OS_APACHE_DIR=$OS_APACHE;;
+esac
+
+echo "$as_me:$LINENO: result: $OS_APACHE" >&5
+echo "${ECHO_T}$OS_APACHE" >&6
+
+
+
+apache_dir_is_src="false"
+
+# Check whether --with-apache or --without-apache was given.
+if test "${with_apache+set}" = set; then
+ withval="$with_apache"
+
+ if ${TEST} ! -z "$WEBSERVER" ; then
+ { { echo "$as_me:$LINENO: error: Sorry cannot use --with-apxs=${APXS} and --with-apache=${withval} together, please choose one of both" >&5
+echo "$as_me: error: Sorry cannot use --with-apxs=${APXS} and --with-apache=${withval} together, please choose one of both" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+ echo "$as_me:$LINENO: checking for Apache source directory (assume static build)" >&5
+echo $ECHO_N "checking for Apache source directory (assume static build)... $ECHO_C" >&6
+
+ if ${TEST} -n "${withval}" && ${TEST} -d "${withval}" ; then
+ if ${TEST} -d "${withval}/src" ; then
+ # handle the case where people use relative paths to
+ # the apache source directory by pre-pending the current
+ # build directory to the path. there are probably
+ # errors with this if configure is run while in a
+ # different directory than what you are in at the time
+ if ${TEST} -n "`${ECHO} ${withval}|${GREP} \"^\.\.\"`" ; then
+ withval=`pwd`/${withval}
+ fi
+
+ apache_dir=${withval}
+ apache_dir_is_src="true"
+ echo "$as_me:$LINENO: result: ${apache_dir}" >&5
+echo "${ECHO_T}${apache_dir}" >&6
+
+ echo "$as_me:$LINENO: checking for Apache include directory" >&5
+echo $ECHO_N "checking for Apache include directory... $ECHO_C" >&6
+
+ if ${TEST} -d "${withval}/src/include" ; then
+ # read osdir from the existing apache.
+ osdir=`${GREP} '^OSDIR=' ${withval}/src/Makefile.config | ${SED} -e 's:^OSDIR=.*/os:os:'`
+ if ${TEST} -z "${osdir}" ; then
+ osdir=os/unix
+ fi
+ apache_include="-I${withval}/src/include \
+ -I${withval}/src/${osdir}"
+ WEBSERVER="apache-1.3"
+ LIB_JK_TYPE=mod_jk.a
+ CFLAGS="${CFLAGS} -DJK_PREFORK"
+ echo "$as_me:$LINENO: result: ${apache_include}, version 1.3" >&5
+echo "${ECHO_T}${apache_include}, version 1.3" >&6
+ else
+ { { echo "$as_me:$LINENO: error: Sorry Apache 1.2.x is no longer supported." >&5
+echo "$as_me: error: Sorry Apache 1.2.x is no longer supported." >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ else
+ if ${TEST} -d "${withval}/include" ; then
+ # osdir for Apache20.
+ WEBSERVER="apache-2.0"
+ apache_dir=${withval}
+ apache_dir_is_src="true"
+ LIB_JK_TYPE=lib_jk.la
+ apache_include="-I${withval}/include -I${withval}/srclib/apr/include -I${withval}/os/${OS_APACHE_DIR} -I${withval}/srclib/apr-util/include"
+ echo "$as_me:$LINENO: result: ${apache_dir}" >&5
+echo "${ECHO_T}${apache_dir}" >&6
+ fi
+ fi
+ fi
+
+ if ${TEST} -z "$WEBSERVER" ; then
+ { { echo "$as_me:$LINENO: error: Directory $apache_dir is not a valid Apache source distribution" >&5
+echo "$as_me: error: Directory $apache_dir is not a valid Apache source distribution" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+# VT: Now, which one I'm supposed to use? Let's figure it out later
+
+ configure_apache=true
+ configure_src=true
+
+ echo "$as_me:$LINENO: result: building connector for \"$WEBSERVER\"" >&5
+echo "${ECHO_T}building connector for \"$WEBSERVER\"" >&6
+
+else
+
+ echo "$as_me:$LINENO: result: no apache given" >&5
+echo "${ECHO_T}no apache given" >&6
+
+fi;
+
+
+APACHE_DIR=${apache_dir}
+
+
+# Check whether --enable-netscape or --disable-netscape was given.
+if test "${enable_netscape+set}" = set; then
+ enableval="$enable_netscape"
+
+ if ${TEST} ! -z "$WEBSERVER" ; then
+ { { echo "$as_me:$LINENO: error: Sorry cannot use --with-apxs=${APXS} or --with-apache=${withval} with --with-netscape, please choose one or the other." >&5
+echo "$as_me: error: Sorry cannot use --with-apxs=${APXS} or --with-apache=${withval} with --with-netscape, please choose one or the other." >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+ WEBSERVER="netscape"
+
+ echo "$as_me:$LINENO: result: building connector for \"$WEBSERVER\"" >&5
+echo "${ECHO_T}building connector for \"$WEBSERVER\"" >&6
+
+else
+
+ echo "$as_me:$LINENO: result: no netscape given" >&5
+echo "${ECHO_T}no netscape given" >&6
+
+fi;
+
+JK_JNI_WORKER=""
+# Check whether --enable-jni or --disable-jni was given.
+if test "${enable_jni+set}" = set; then
+ enableval="$enable_jni"
+
+ echo "$as_me:$LINENO: result: jni enable (need JDK)" >&5
+echo "${ECHO_T}jni enable (need JDK)" >&6
+ CFLAGS="${CFLAGS} -DHAVE_JNI"
+ JK_JNI_WORKER="\${JK}jk_jni_worker\${OEXT}"
+ WARN_JNI=1
+
+fi;
+
+CFLAGS="${CFLAGS}"
+# Check whether --enable-EAPI or --disable-EAPI was given.
+if test "${enable_EAPI+set}" = set; then
+ enableval="$enable_EAPI"
+
+case "${enableval}" in
+ y | Y | YES | yes | TRUE | true )
+ CFLAGS="${CFLAGS} -DEAPI"
+ echo "$as_me:$LINENO: result: ...Enabling EAPI Support..." >&5
+echo "${ECHO_T}...Enabling EAPI Support..." >&6
+ ;;
+esac
+
+fi;
+
+
+CFLAGS="${CFLAGS}"
+# Check whether --enable-maintainer-mode or --disable-maintainer-mode was given.
+if test "${enable_maintainer_mode+set}" = set; then
+ enableval="$enable_maintainer_mode"
+
+case "${enableval}" in
+ y | Y | YES | yes | TRUE | true )
+ CFLAGS="${CFLAGS} -DDEBUG -Wall"
+ echo "$as_me:$LINENO: result: ...Enabling Maintainer mode..." >&5
+echo "${ECHO_T}...Enabling Maintainer mode..." >&6
+ ;;
+esac
+
+fi;
+
+
+CFLAGS="${CFLAGS}"
+# Check whether --enable-prefork or --disable-prefork was given.
+if test "${enable_prefork+set}" = set; then
+ enableval="$enable_prefork"
+
+case "${enableval}" in
+ y | Y | YES | yes | TRUE | true )
+ CFLAGS="${CFLAGS} -DJK_PREFORK"
+ echo "$as_me:$LINENO: result: ...Enabling Prefork mode..." >&5
+echo "${ECHO_T}...Enabling Prefork mode..." >&6
+ ;;
+esac
+
+fi;
+
+
+CFLAGS="${CFLAGS}"
+# Check whether --enable-trace or --disable-trace was given.
+if test "${enable_trace+set}" = set; then
+ enableval="$enable_trace"
+
+case "${enableval}" in
+ no )
+ CFLAGS="${CFLAGS} -DJK_PRODUCTION"
+ echo "$as_me:$LINENO: result: ...Exclude trace log code..." >&5
+echo "${ECHO_T}...Exclude trace log code..." >&6
+ ;;
+esac
+
+fi;
+
+
+CFLAGS="${CFLAGS}"
+# Check whether --enable-api-compatibility or --disable-api-compatibility was given.
+if test "${enable_api_compatibility+set}" = set; then
+ enableval="$enable_api_compatibility"
+
+case "${enableval}" in
+ y | Y | YES | yes | TRUE | true )
+ CFLAGS="${CFLAGS} -DAPI_COMPATIBILITY"
+ echo "$as_me:$LINENO: result: ...Only using compatible httpd API..." >&5
+echo "${ECHO_T}...Only using compatible httpd API..." >&6
+ ;;
+esac
+
+fi;
+
+
+CFLAGS="${CFLAGS}"
+# Check whether --enable-flock or --disable-flock was given.
+if test "${enable_flock+set}" = set; then
+ enableval="$enable_flock"
+
+case "${enableval}" in
+ y | Y | YES | yes | TRUE | true )
+ CFLAGS="${CFLAGS} -DJK_USE_FLOCK"
+ echo "$as_me:$LINENO: result: ...Enabling flock() shared memory locking..." >&5
+echo "${ECHO_T}...Enabling flock() shared memory locking..." >&6
+ ;;
+esac
+
+fi;
+
+
+if ${TEST} -n "${CFLAGS}" ; then
+ APXSCFLAGS="${APXSCFLAGS} ${CFLAGS}"
+fi
+
+
+
+if ${TEST} -n "${LDFLAGS}" ; then
+ APXSLDFLAGS="${APXSLDFLAGS} ${LDFLAGS}"
+fi
+
+
+ jk_new_val=""
+ jk_val_changed=0
+ for i in $APXSLDFLAGS; do
+ case $i in
+ -Wl,*)
+ jk_new_val="$jk_new_val $i"
+ ;;
+ *)
+ jk_new_val="$jk_new_val -Wl,$i"
+ jk_val_changed=1
+ ;;
+ esac
+ done
+ if test $jk_val_changed = "1"; then
+ { echo "$as_me:$LINENO: tokens in APXSLDFLAGS have been prefixed with '-Wl,'" >&5
+echo "$as_me: tokens in APXSLDFLAGS have been prefixed with '-Wl,'" >&6;}
+ APXSLDFLAGS=$jk_new_val
+ fi
+
+
+
+
+if ${TEST} -n "${JK_JNI_WORKER}" ; then
+
+WEBSERVER="jni ${WEBSERVER}"
+
+
+echo "$as_me:$LINENO: checking for JDK location (please wait)" >&5
+echo $ECHO_N "checking for JDK location (please wait)... $ECHO_C" >&6
+
+
+
+if ${TEST} -n "${JAVA_HOME}" ; then
+ JAVA_HOME_ENV="${JAVA_HOME}"
+else
+ JAVA_HOME_ENV=""
+fi
+JAVA_HOME=""
+JAVA_PLATFORM="1"
+
+
+# Check whether --with-java-home or --without-java-home was given.
+if test "${with_java_home+set}" = set; then
+ withval="$with_java_home"
+
+
+ # This stuff works if the command line parameter --with-java-home was
+ # specified, so it takes priority rightfully.
+
+ JAVA_HOME=${withval}
+
+ if ${TEST} ! -d "${JAVA_HOME}" ; then
+ { { echo "$as_me:$LINENO: error: Not a directory: ${JAVA_HOME}" >&5
+echo "$as_me: error: Not a directory: ${JAVA_HOME}" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+ echo "$as_me:$LINENO: result: ${JAVA_HOME}" >&5
+echo "${ECHO_T}${JAVA_HOME}" >&6
+
+
+else
+
+ # This works if the parameter was NOT specified, so it's a good time
+ # to see what the enviroment says.
+
+ # Since Sun uses JAVA_HOME a lot, we check it first and ignore the
+ # JAVA_HOME, otherwise just use whatever JAVA_HOME was specified.
+
+ if ${TEST} -n "${JAVA_HOME_ENV}" ; then
+
+ JAVA_HOME=${JAVA_HOME_ENV}
+ echo "$as_me:$LINENO: result: ${JAVA_HOME_ENV} from environment" >&5
+echo "${ECHO_T}${JAVA_HOME_ENV} from environment" >&6
+ fi
+
+fi;
+
+if ${TEST} -z "${JAVA_HOME}" ; then
+
+ # Oh well, nobody set neither JAVA_HOME nor JAVA_HOME, have to guess
+
+ # The following code is based on the code submitted by Henner Zeller
+ # for ${srcdir}/src/scripts/package/rpm/ApacheJServ.spec
+
+ # Two variables will be set as a result:
+ #
+ # JAVA_HOME
+ # JAVA_PLATFORM
+ echo "$as_me:$LINENO: checking Try to guess JDK location" >&5
+echo $ECHO_N "checking Try to guess JDK location... $ECHO_C" >&6
+
+
+ for JAVA_PREFIX in \
+ /usr/local \
+ /usr/local/lib \
+ /usr \
+ /usr/lib \
+ /opt \
+ /
+ do
+ for JAVA_PLATFORM in 3 2 1 ;
+ do
+
+ for subversion in .9 .8 .7 .6 .5 .4 .3 .2 .1 "" ;
+ do
+ for VARIANT in IBMJava2- java java- jdk jdk-;
+ do
+ GUESS="${JAVA_PREFIX}/${VARIANT}1.${JAVA_PLATFORM}${subversion}"
+ if ${TEST} -d "${GUESS}/bin" \
+ && ${TEST} -d "${GUESS}/include" ; then
+
+ JAVA_HOME="${GUESS}"
+ echo "$as_me:$LINENO: result: ${GUESS}" >&5
+echo "${ECHO_T}${GUESS}" >&6
+ break
+ fi
+
+ done
+
+ if ${TEST} -n "${JAVA_HOME}" ; then
+ break;
+ fi
+
+ done
+
+ if ${TEST} -n "${JAVA_HOME}" ; then
+ break;
+ fi
+
+ done
+
+ if ${TEST} -n "${JAVA_HOME}" ; then
+ break;
+ fi
+
+ done
+
+ if ${TEST} -n "${JAVA_HOME}" ; then
+
+
+ echo "$as_me:$LINENO: checking Java platform" >&5
+echo $ECHO_N "checking Java platform... $ECHO_C" >&6
+ echo "$as_me:$LINENO: result: guess ${JAVA_PLATFORM}" >&5
+echo "${ECHO_T}guess ${JAVA_PLATFORM}" >&6
+ fi
+
+
+else
+
+ echo "$as_me:$LINENO: checking Java platform" >&5
+echo $ECHO_N "checking Java platform... $ECHO_C" >&6
+
+
+# Check whether --with-java-platform or --without-java-platform was given.
+if test "${with_java_platform+set}" = set; then
+ withval="$with_java_platform"
+
+
+ JAVA_PLATFORM="2"
+
+fi;
+
+ echo "$as_me:$LINENO: result: forced Java ${JAVA_PLATFORM}" >&5
+echo "${ECHO_T}forced Java ${JAVA_PLATFORM}" >&6
+
+fi
+
+if ${TEST} -z "${JAVA_HOME}" ; then
+ { { echo "$as_me:$LINENO: error: JDK home not found, please specify one with --with-java-home option (run ./configure --help for more options)" >&5
+echo "$as_me: error: JDK home not found, please specify one with --with-java-home option (run ./configure --help for more options)" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+OS=""
+
+# Check whether --with-os-type or --without-os-type was given.
+if test "${with_os_type+set}" = set; then
+ withval="$with_os_type"
+
+ OS=${withval}
+
+ if ${TEST} ! -d "${JAVA_HOME}/${OS}" ; then
+ { { echo "$as_me:$LINENO: error: Not a directory: ${JAVA_HOME}/${OS}" >&5
+echo "$as_me: error: Not a directory: ${JAVA_HOME}/${OS}" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+else
+
+ echo "$as_me:$LINENO: checking os_type directory" >&5
+echo $ECHO_N "checking os_type directory... $ECHO_C" >&6
+ if ${TEST} -f ${JAVA_HOME}/include/jni_md.h; then
+ OS=""
+ else
+ for f in ${JAVA_HOME}/include/*/jni_md.h; do
+ if ${TEST} -f $f; then
+ OS=`dirname ${f}`
+ OS=`basename ${OS}`
+ echo " ${OS}"
+ fi
+ done
+ if ${TEST} -z "${OS}"; then
+ echo "$as_me:$LINENO: result: Cannot find jni_md.h in ${JAVA_HOME}/${OS}" >&5
+echo "${ECHO_T}Cannot find jni_md.h in ${JAVA_HOME}/${OS}" >&6
+ { { echo "$as_me:$LINENO: error: You should retry --with-os-type=SUBDIR" >&5
+echo "$as_me: error: You should retry --with-os-type=SUBDIR" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ fi
+
+fi;
+fi
+
+
+
+
+if ${TEST} -z "$WEBSERVER" ; then
+ { { echo "$as_me:$LINENO: error: Cannot find the WebServer" >&5
+echo "$as_me: error: Cannot find the WebServer" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+WEBSERVER="common ${WEBSERVER}"
+
+
+
+
+
+if ${TEST} "${apache_dir_is_src}" = "false"; then
+ MAKE_DYNAMIC_APACHE_TRUE=
+ MAKE_DYNAMIC_APACHE_FALSE='#'
+else
+ MAKE_DYNAMIC_APACHE_TRUE='#'
+ MAKE_DYNAMIC_APACHE_FALSE=
+fi
+
+
+if ${TEST} "${apache_dir_is_src}" = "false" ; then
+ APACHE20_OEXT=.c
+ LIB_JK_TYPE=mod_jk.so
+ INSTALL_TYPE=install_dynamic
+else
+ APACHE20_OEXT=.lo
+ INSTALL_TYPE=install_static
+fi
+
+
+
+
+ ac_config_files="$ac_config_files Makefile apache-1.3/Makefile apache-1.3/Makefile.apxs apache-2.0/Makefile apache-2.0/Makefile.apxs common/Makefile common/list.mk common/jk_types.h jni/Makefile"
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+{
+ (set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+} |
+ sed '
+ t clear
+ : clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ : end' >>confcache
+if diff $cache_file confcache >/dev/null 2>&1; then :; else
+ if test -w $cache_file; then
+ test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+ cat confcache >$cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[ ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[ ]*$//;
+}'
+fi
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_i=`echo "$ac_i" |
+ sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
+ # 2. Add them.
+ ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
+ ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${MAKE_DYNAMIC_APACHE_TRUE}" && test -z "${MAKE_DYNAMIC_APACHE_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"MAKE_DYNAMIC_APACHE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"MAKE_DYNAMIC_APACHE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)$' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+ /^X\/\(\/\/\)$/{ s//\1/; q; }
+ /^X\/\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" || {
+ # Find who we are. Look in the path if we contain no path at all
+ # relative or not.
+ case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+ ;;
+ esac
+ # We did not find ourselves, most probably we were run as `sh COMMAND'
+ # in which case we are not to be found in the path.
+ if test "x$as_myself" = x; then
+ as_myself=$0
+ fi
+ if test ! -f "$as_myself"; then
+ { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ case $CONFIG_SHELL in
+ '')
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for as_base in sh bash ksh sh5; do
+ case $as_dir in
+ /*)
+ if ("$as_dir/$as_base" -c '
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
+ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+ CONFIG_SHELL=$as_dir/$as_base
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+ fi;;
+ esac
+ done
+done
+;;
+ esac
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line before each line; the second 'sed' does the real
+ # work. The second script uses 'N' to pair each line-number line
+ # with the numbered line, and appends trailing '-' during
+ # substitution so that $LINENO is not a special case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
+ sed '=' <$as_myself |
+ sed '
+ N
+ s,$,-,
+ : loop
+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+ t loop
+ s,-$,,
+ s,^['$as_cr_digits']*\n,,
+ ' >$as_me.lineno &&
+ chmod +x $as_me.lineno ||
+ { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensible to this).
+ . ./$as_me.lineno
+ # Exit status is that of the last command.
+ exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling. Logging --version etc. is OK.
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by $as_me, which was
+generated by GNU Autoconf 2.59. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+ echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_headers"; then
+ echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_links"; then
+ echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_commands"; then
+ echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number, then exit
+ -q, --quiet do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <bug-autoconf@gnu.org>."
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.59,
+ with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=$srcdir
+INSTALL="$INSTALL"
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value. By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=*)
+ ac_option=`expr "x$1" : 'x\([^=]*\)='`
+ ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ -*)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ *) # This is not an option, so the user has probably given explicit
+ # arguments.
+ ac_option=$1
+ ac_need_defaults=false;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --vers* | -V )
+ echo "$ac_cs_version"; exit 0 ;;
+ --he | --h)
+ # Conflict between --help and --header
+ { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; };;
+ --help | --hel | -h )
+ echo "$ac_cs_usage"; exit 0 ;;
+ --debug | --d* | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+ ac_need_defaults=false;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; } ;;
+
+ *) ac_config_targets="$ac_config_targets $1" ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+ echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+ exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+#
+# INIT-COMMANDS section.
+#
+
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+_ACEOF
+
+
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_config_target in $ac_config_targets
+do
+ case "$ac_config_target" in
+ # Handling of arguments.
+ "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "apache-1.3/Makefile" ) CONFIG_FILES="$CONFIG_FILES apache-1.3/Makefile" ;;
+ "apache-1.3/Makefile.apxs" ) CONFIG_FILES="$CONFIG_FILES apache-1.3/Makefile.apxs" ;;
+ "apache-2.0/Makefile" ) CONFIG_FILES="$CONFIG_FILES apache-2.0/Makefile" ;;
+ "apache-2.0/Makefile.apxs" ) CONFIG_FILES="$CONFIG_FILES apache-2.0/Makefile.apxs" ;;
+ "common/Makefile" ) CONFIG_FILES="$CONFIG_FILES common/Makefile" ;;
+ "common/list.mk" ) CONFIG_FILES="$CONFIG_FILES common/list.mk" ;;
+ "common/jk_types.h" ) CONFIG_FILES="$CONFIG_FILES common/jk_types.h" ;;
+ "jni/Makefile" ) CONFIG_FILES="$CONFIG_FILES jni/Makefile" ;;
+ "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+ "common/config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS common/config.h" ;;
+ *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+ test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason to put it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+ trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+ trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+} ||
+{
+ tmp=./confstat$$-$RANDOM
+ (umask 077 && mkdir $tmp)
+} ||
+{
+ echo "$me: cannot create a temporary directory in ." >&2
+ { (exit 1); exit 1; }
+}
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+ # Protect against being on the right side of a sed subst in config.status.
+ sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+ s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
+s,@SHELL@,$SHELL,;t t
+s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s,@exec_prefix@,$exec_prefix,;t t
+s,@prefix@,$prefix,;t t
+s,@program_transform_name@,$program_transform_name,;t t
+s,@bindir@,$bindir,;t t
+s,@sbindir@,$sbindir,;t t
+s,@libexecdir@,$libexecdir,;t t
+s,@datadir@,$datadir,;t t
+s,@sysconfdir@,$sysconfdir,;t t
+s,@sharedstatedir@,$sharedstatedir,;t t
+s,@localstatedir@,$localstatedir,;t t
+s,@libdir@,$libdir,;t t
+s,@includedir@,$includedir,;t t
+s,@oldincludedir@,$oldincludedir,;t t
+s,@infodir@,$infodir,;t t
+s,@mandir@,$mandir,;t t
+s,@build_alias@,$build_alias,;t t
+s,@host_alias@,$host_alias,;t t
+s,@target_alias@,$target_alias,;t t
+s,@DEFS@,$DEFS,;t t
+s,@ECHO_C@,$ECHO_C,;t t
+s,@ECHO_N@,$ECHO_N,;t t
+s,@ECHO_T@,$ECHO_T,;t t
+s,@LIBS@,$LIBS,;t t
+s,@build@,$build,;t t
+s,@build_cpu@,$build_cpu,;t t
+s,@build_vendor@,$build_vendor,;t t
+s,@build_os@,$build_os,;t t
+s,@host@,$host,;t t
+s,@host_cpu@,$host_cpu,;t t
+s,@host_vendor@,$host_vendor,;t t
+s,@host_os@,$host_os,;t t
+s,@target@,$target,;t t
+s,@target_cpu@,$target_cpu,;t t
+s,@target_vendor@,$target_vendor,;t t
+s,@target_os@,$target_os,;t t
+s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
+s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
+s,@INSTALL_DATA@,$INSTALL_DATA,;t t
+s,@CYGPATH_W@,$CYGPATH_W,;t t
+s,@PACKAGE@,$PACKAGE,;t t
+s,@VERSION@,$VERSION,;t t
+s,@ACLOCAL@,$ACLOCAL,;t t
+s,@AUTOCONF@,$AUTOCONF,;t t
+s,@AUTOMAKE@,$AUTOMAKE,;t t
+s,@AUTOHEADER@,$AUTOHEADER,;t t
+s,@MAKEINFO@,$MAKEINFO,;t t
+s,@install_sh@,$install_sh,;t t
+s,@STRIP@,$STRIP,;t t
+s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t
+s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t
+s,@mkdir_p@,$mkdir_p,;t t
+s,@AWK@,$AWK,;t t
+s,@SET_MAKE@,$SET_MAKE,;t t
+s,@am__leading_dot@,$am__leading_dot,;t t
+s,@AMTAR@,$AMTAR,;t t
+s,@am__tar@,$am__tar,;t t
+s,@am__untar@,$am__untar,;t t
+s,@TEST@,$TEST,;t t
+s,@RM@,$RM,;t t
+s,@GREP@,$GREP,;t t
+s,@ECHO@,$ECHO,;t t
+s,@SED@,$SED,;t t
+s,@CP@,$CP,;t t
+s,@MKDIR@,$MKDIR,;t t
+s,@CFLAGS@,$CFLAGS,;t t
+s,@PERL@,$PERL,;t t
+s,@APXS@,$APXS,;t t
+s,@APACHE_CONFIG_VARS@,$APACHE_CONFIG_VARS,;t t
+s,@CC@,$CC,;t t
+s,@LDFLAGS@,$LDFLAGS,;t t
+s,@CPPFLAGS@,$CPPFLAGS,;t t
+s,@ac_ct_CC@,$ac_ct_CC,;t t
+s,@EXEEXT@,$EXEEXT,;t t
+s,@OBJEXT@,$OBJEXT,;t t
+s,@DEPDIR@,$DEPDIR,;t t
+s,@am__include@,$am__include,;t t
+s,@am__quote@,$am__quote,;t t
+s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t
+s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t
+s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t
+s,@CCDEPMODE@,$CCDEPMODE,;t t
+s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t
+s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t
+s,@EGREP@,$EGREP,;t t
+s,@LN_S@,$LN_S,;t t
+s,@AR@,$AR,;t t
+s,@ac_ct_AR@,$ac_ct_AR,;t t
+s,@RANLIB@,$RANLIB,;t t
+s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t
+s,@CPP@,$CPP,;t t
+s,@CXX@,$CXX,;t t
+s,@CXXFLAGS@,$CXXFLAGS,;t t
+s,@ac_ct_CXX@,$ac_ct_CXX,;t t
+s,@CXXDEPMODE@,$CXXDEPMODE,;t t
+s,@am__fastdepCXX_TRUE@,$am__fastdepCXX_TRUE,;t t
+s,@am__fastdepCXX_FALSE@,$am__fastdepCXX_FALSE,;t t
+s,@CXXCPP@,$CXXCPP,;t t
+s,@F77@,$F77,;t t
+s,@FFLAGS@,$FFLAGS,;t t
+s,@ac_ct_F77@,$ac_ct_F77,;t t
+s,@LIBTOOL@,$LIBTOOL,;t t
+s,@int32_value@,$int32_value,;t t
+s,@int32_t_fmt@,$int32_t_fmt,;t t
+s,@uint32_t_fmt@,$uint32_t_fmt,;t t
+s,@uint32_t_hex_fmt@,$uint32_t_hex_fmt,;t t
+s,@int64_value@,$int64_value,;t t
+s,@int64_t_fmt@,$int64_t_fmt,;t t
+s,@uint64_t_fmt@,$uint64_t_fmt,;t t
+s,@uint64_t_hex_fmt@,$uint64_t_hex_fmt,;t t
+s,@pid_t_fmt@,$pid_t_fmt,;t t
+s,@pthread_t_fmt@,$pthread_t_fmt,;t t
+s,@pthread_t_value@,$pthread_t_value,;t t
+s,@apache_include@,$apache_include,;t t
+s,@APACHE_DIR@,$APACHE_DIR,;t t
+s,@JK_JNI_WORKER@,$JK_JNI_WORKER,;t t
+s,@APXSCFLAGS@,$APXSCFLAGS,;t t
+s,@APXSCPPFLAGS@,$APXSCPPFLAGS,;t t
+s,@APXSLDFLAGS@,$APXSLDFLAGS,;t t
+s,@JAVA_HOME@,$JAVA_HOME,;t t
+s,@OS@,$OS,;t t
+s,@WEBSERVER@,$WEBSERVER,;t t
+s,@MAKE_DYNAMIC_APACHE_TRUE@,$MAKE_DYNAMIC_APACHE_TRUE,;t t
+s,@MAKE_DYNAMIC_APACHE_FALSE@,$MAKE_DYNAMIC_APACHE_FALSE,;t t
+s,@APACHE20_OEXT@,$APACHE20_OEXT,;t t
+s,@LIB_JK_TYPE@,$LIB_JK_TYPE,;t t
+s,@INSTALL_TYPE@,$INSTALL_TYPE,;t t
+s,@LIBOBJS@,$LIBOBJS,;t t
+s,@LTLIBOBJS@,$LTLIBOBJS,;t t
+CEOF
+
+_ACEOF
+
+ cat >>$CONFIG_STATUS <<\_ACEOF
+ # Split the substitutions into bite-sized pieces for seds with
+ # small command number limits, like on Digital OSF/1 and HP-UX.
+ ac_max_sed_lines=48
+ ac_sed_frag=1 # Number of current file.
+ ac_beg=1 # First line for current file.
+ ac_end=$ac_max_sed_lines # Line after last line for current file.
+ ac_more_lines=:
+ ac_sed_cmds=
+ while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ else
+ sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ fi
+ if test ! -s $tmp/subs.frag; then
+ ac_more_lines=false
+ else
+ # The purpose of the label and of the branching condition is to
+ # speed up the sed processing (if there are no `@' at all, there
+ # is no need to browse any of the substitutions).
+ # These are the two extra sed commands mentioned above.
+ (echo ':t
+ /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+ fi
+ ac_sed_frag=`expr $ac_sed_frag + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_lines`
+ fi
+ done
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+ fi
+fi # test -n "$CONFIG_FILES"
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case $ac_file in
+ - | *:- | *:-:* ) # input from stdin
+ cat >$tmp/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
+ esac
+
+ # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+ ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
+ esac
+
+ if test x"$ac_file" != x-; then
+ { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+ rm -f "$ac_file"
+ fi
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ if test x"$ac_file" = x-; then
+ configure_input=
+ else
+ configure_input="$ac_file. "
+ fi
+ configure_input=$configure_input"Generated from `echo $ac_file_in |
+ sed 's,.*/,,'` by configure."
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo $tmp/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ echo "$f";;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo "$f"
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo "$srcdir/$f"
+ else
+ # /dev/null tree
+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s,@configure_input@,$configure_input,;t t
+s,@srcdir@,$ac_srcdir,;t t
+s,@abs_srcdir@,$ac_abs_srcdir,;t t
+s,@top_srcdir@,$ac_top_srcdir,;t t
+s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s,@builddir@,$ac_builddir,;t t
+s,@abs_builddir@,$ac_abs_builddir,;t t
+s,@top_builddir@,$ac_top_builddir,;t t
+s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
+s,@INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+ rm -f $tmp/stdin
+ if test x"$ac_file" != x-; then
+ mv $tmp/out $ac_file
+ else
+ cat $tmp/out
+ rm -f $tmp/out
+ fi
+
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_HEADER section.
+#
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)'
+ac_dB='[ ].*$,\1#\2'
+ac_dC=' '
+ac_dD=',;t'
+# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_uB='$,\1#\2define\3'
+ac_uC=' '
+ac_uD=',;t'
+
+for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case $ac_file in
+ - | *:- | *:-:* ) # input from stdin
+ cat >$tmp/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
+ esac
+
+ test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo $tmp/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ # Do quote $f, to prevent DOS paths from being IFS'd.
+ echo "$f";;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo "$f"
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo "$srcdir/$f"
+ else
+ # /dev/null tree
+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+ # Remove the trailing spaces.
+ sed 's/[ ]*$//' $ac_file_inputs >$tmp/in
+
+_ACEOF
+
+# Transform confdefs.h into two sed scripts, `conftest.defines' and
+# `conftest.undefs', that substitutes the proper values into
+# config.h.in to produce config.h. The first handles `#define'
+# templates, and the second `#undef' templates.
+# And first: Protect against being on the right side of a sed subst in
+# config.status. Protect against being in an unquoted here document
+# in config.status.
+rm -f conftest.defines conftest.undefs
+# Using a here document instead of a string reduces the quoting nightmare.
+# Putting comments in sed scripts is not portable.
+#
+# `end' is used to avoid that the second main sed command (meant for
+# 0-ary CPP macros) applies to n-ary macro definitions.
+# See the Autoconf documentation for `clear'.
+cat >confdef2sed.sed <<\_ACEOF
+s/[\\&,]/\\&/g
+s,[\\$`],\\&,g
+t clear
+: clear
+s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
+t end
+s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
+: end
+_ACEOF
+# If some macros were called several times there might be several times
+# the same #defines, which is useless. Nevertheless, we may not want to
+# sort them, since we want the *last* AC-DEFINE to be honored.
+uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
+sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
+rm -f confdef2sed.sed
+
+# This sed command replaces #undef with comments. This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >>conftest.undefs <<\_ACEOF
+s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
+_ACEOF
+
+# Break up conftest.defines because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
+echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
+echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
+echo ' :' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.defines >/dev/null
+do
+ # Write a limited-size here document to $tmp/defines.sed.
+ echo ' cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
+ # Speed up: don't consider the non `#define' lines.
+ echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS
+ # Work around the forget-to-reset-the-flag bug.
+ echo 't clr' >>$CONFIG_STATUS
+ echo ': clr' >>$CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
+ echo 'CEOF
+ sed -f $tmp/defines.sed $tmp/in >$tmp/out
+ rm -f $tmp/in
+ mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
+ rm -f conftest.defines
+ mv conftest.tail conftest.defines
+done
+rm -f conftest.defines
+echo ' fi # grep' >>$CONFIG_STATUS
+echo >>$CONFIG_STATUS
+
+# Break up conftest.undefs because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo ' # Handle all the #undef templates' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.undefs >/dev/null
+do
+ # Write a limited-size here document to $tmp/undefs.sed.
+ echo ' cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
+ # Speed up: don't consider the non `#undef'
+ echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS
+ # Work around the forget-to-reset-the-flag bug.
+ echo 't clr' >>$CONFIG_STATUS
+ echo ': clr' >>$CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
+ echo 'CEOF
+ sed -f $tmp/undefs.sed $tmp/in >$tmp/out
+ rm -f $tmp/in
+ mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
+ rm -f conftest.undefs
+ mv conftest.tail conftest.undefs
+done
+rm -f conftest.undefs
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ if test x"$ac_file" = x-; then
+ echo "/* Generated by configure. */" >$tmp/config.h
+ else
+ echo "/* $ac_file. Generated by configure. */" >$tmp/config.h
+ fi
+ cat $tmp/in >>$tmp/config.h
+ rm -f $tmp/in
+ if test x"$ac_file" != x-; then
+ if diff $ac_file $tmp/config.h >/dev/null 2>&1; then
+ { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+ else
+ ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ rm -f $ac_file
+ mv $tmp/config.h $ac_file
+ fi
+ else
+ cat $tmp/config.h
+ rm -f $tmp/config.h
+ fi
+# Compute $ac_file's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $ac_file | $ac_file:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null ||
+$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X$ac_file : 'X\(//\)[^/]' \| \
+ X$ac_file : 'X\(//\)$' \| \
+ X$ac_file : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X$ac_file |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`/stamp-h$_am_stamp_count
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_COMMANDS section.
+#
+for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
+ ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
+ ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_dir=`(dirname "$ac_dest") 2>/dev/null ||
+$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_dest" : 'X\(//\)[^/]' \| \
+ X"$ac_dest" : 'X\(//\)$' \| \
+ X"$ac_dest" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_dest" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+
+ { echo "$as_me:$LINENO: executing $ac_dest commands" >&5
+echo "$as_me: executing $ac_dest commands" >&6;}
+ case $ac_dest in
+ depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
+ # Strip MF so we end up with the name of the file.
+ mf=`echo "$mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile or not.
+ # We used to match only the files named `Makefile.in', but
+ # some people rename them; so instead we look at the file content.
+ # Grep'ing the first line is not enough: some people post-process
+ # each Makefile.in and add a new line on top of each file to say so.
+ # So let's grep whole file.
+ if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+ dirpart=`(dirname "$mf") 2>/dev/null ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$mf" : 'X\(//\)[^/]' \| \
+ X"$mf" : 'X\(//\)$' \| \
+ X"$mf" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$mf" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ else
+ continue
+ fi
+ # Extract the definition of DEPDIR, am__include, and am__quote
+ # from the Makefile without running `make'.
+ DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+ test -z "$DEPDIR" && continue
+ am__include=`sed -n 's/^am__include = //p' < "$mf"`
+ test -z "am__include" && continue
+ am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+ # When using ansi2knr, U may be empty or an underscore; expand it
+ U=`sed -n 's/^U = //p' < "$mf"`
+ # Find all dependency output files, they are included files with
+ # $(DEPDIR) in their names. We invoke sed twice because it is the
+ # simplest approach to changing $(DEPDIR) to its actual value in the
+ # expansion.
+ for file in `sed -n "
+ s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+ # Make sure the directory exists.
+ test -f "$dirpart/$file" && continue
+ fdir=`(dirname "$file") 2>/dev/null ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$file" : 'X\(//\)[^/]' \| \
+ X"$file" : 'X\(//\)$' \| \
+ X"$file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p $dirpart/$fdir
+ else
+ as_dir=$dirpart/$fdir
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5
+echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ # echo "creating $dirpart/$file"
+ echo '# dummy' > "$dirpart/$file"
+ done
+done
+ ;;
+ esac
+done
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || { (exit 1); exit 1; }
+fi
+
+
+if ${TEST} -n "${WARN_JNI}" ; then
+ { echo "$as_me:$LINENO: WARNING: ===========================================" >&5
+echo "$as_me: WARNING: ===========================================" >&2;}
+ { echo "$as_me:$LINENO: WARNING: You have used one of the following options:" >&5
+echo "$as_me: WARNING: You have used one of the following options:" >&2;}
+ { echo "$as_me:$LINENO: WARNING: --enable-jni" >&5
+echo "$as_me: WARNING: --enable-jni" >&2;}
+ { echo "$as_me:$LINENO: WARNING: --with-java-home" >&5
+echo "$as_me: WARNING: --with-java-home" >&2;}
+ { echo "$as_me:$LINENO: WARNING: --with-java-platform" >&5
+echo "$as_me: WARNING: --with-java-platform" >&2;}
+ { echo "$as_me:$LINENO: WARNING: --with-os-type" >&5
+echo "$as_me: WARNING: --with-os-type" >&2;}
+ { echo "$as_me:$LINENO: WARNING: These options are only necessary if" >&5
+echo "$as_me: WARNING: These options are only necessary if" >&2;}
+ { echo "$as_me:$LINENO: WARNING: you want to use a worker of type jni." >&5
+echo "$as_me: WARNING: you want to use a worker of type jni." >&2;}
+ { echo "$as_me:$LINENO: WARNING: These workers have been deprecated." >&5
+echo "$as_me: WARNING: These workers have been deprecated." >&2;}
+ { echo "$as_me:$LINENO: WARNING: They do not work and will be removed from" >&5
+echo "$as_me: WARNING: They do not work and will be removed from" >&2;}
+ { echo "$as_me:$LINENO: WARNING: a future release" >&5
+echo "$as_me: WARNING: a future release" >&2;}
+ { echo "$as_me:$LINENO: WARNING: ===========================================" >&5
+echo "$as_me: WARNING: ===========================================" >&2;}
+fi
+
+if ${TEST} -n "${WARN_CC}" ; then
+ { echo "$as_me:$LINENO: WARNING: ===========================================" >&5
+echo "$as_me: WARNING: ===========================================" >&2;}
+ { echo "$as_me:$LINENO: WARNING: Using CC from environment:" >&5
+echo "$as_me: WARNING: Using CC from environment:" >&2;}
+ { echo "$as_me:$LINENO: WARNING: CC=\"$CC\"" >&5
+echo "$as_me: WARNING: CC=\"$CC\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: instead of CC from apxs:" >&5
+echo "$as_me: WARNING: instead of CC from apxs:" >&2;}
+ { echo "$as_me:$LINENO: WARNING: CC=\"$APXSCC\"" >&5
+echo "$as_me: WARNING: CC=\"$APXSCC\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: If \"make\" throws an error of the form" >&5
+echo "$as_me: WARNING: If \"make\" throws an error of the form" >&2;}
+ { echo "$as_me:$LINENO: WARNING: \"libtool: compile: unable to infer tagged configuration\"" >&5
+echo "$as_me: WARNING: \"libtool: compile: unable to infer tagged configuration\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: \"libtool: compile: specify a tag with \`--tag'\"" >&5
+echo "$as_me: WARNING: \"libtool: compile: specify a tag with \`--tag'\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: try running configure without setting CC," >&5
+echo "$as_me: WARNING: try running configure without setting CC," >&2;}
+ { echo "$as_me:$LINENO: WARNING: or at least CC should start with \"$APXSCC\"" >&5
+echo "$as_me: WARNING: or at least CC should start with \"$APXSCC\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: ===========================================" >&5
+echo "$as_me: WARNING: ===========================================" >&2;}
+fi
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/configure.in b/rubbos/app/tomcat-connectors-1.2.32-src/native/configure.in
new file mode 100644
index 00000000..7cbe5e3f
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/configure.in
@@ -0,0 +1,852 @@
+dnl Licensed to the Apache Software Foundation (ASF) under one or more
+dnl contributor license agreements. See the NOTICE file distributed with
+dnl this work for additional information regarding copyright ownership.
+dnl The ASF licenses this file to You under the Apache License, Version 2.0
+dnl (the "License"); you may not use this file except in compliance with
+dnl the License. You may obtain a copy of the License at
+dnl
+dnl http://www.apache.org/licenses/LICENSE-2.0
+dnl
+dnl Unless required by applicable law or agreed to in writing, software
+dnl distributed under the License is distributed on an "AS IS" BASIS,
+dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+dnl See the License for the specific language governing permissions and
+dnl limitations under the License.
+
+dnl
+dnl Process this file with autoconf to produce a configure script
+dnl
+AC_REVISION($Id: configure.in 1054607 2011-01-03 13:13:49Z rjung $)dnl
+
+AC_PREREQ(2.13)
+AC_INIT(common/jk_worker.h)
+AC_CONFIG_HEADER(common/config.h)
+AC_CONFIG_AUX_DIR(scripts/build/unix)
+AC_CANONICAL_SYSTEM
+
+dnl package and version. (synchronization with common/jk_version.h ?)
+PACKAGE=mod_jk
+VERSION=1.2.32
+
+AM_INIT_AUTOMAKE(${PACKAGE}, ${VERSION})
+
+dnl
+dnl Include our own M4 macros
+dnl
+sinclude(scripts/build/jk_common.m4)
+
+dnl Generate ./config.nice for reproducing runs of configure
+dnl
+JK_CONFIG_NICE(config.nice)
+
+AC_PATH_PROG(TEST,test,$PATH)dnl
+AC_SUBST(TEST)
+
+AC_PATH_PROG(RM,rm,$PATH)dnl
+AC_SUBST(RM)
+
+AC_PATH_PROG(GREP,grep,$PATH)dnl
+AC_SUBST(GREP)
+
+AC_PATH_PROG(ECHO,echo,echo,$PATH)dnl
+AC_SUBST(ECHO)
+
+AC_PATH_PROG(SED,sed,$PATH)dnl
+AC_SUBST(SED)
+
+AC_PATH_PROG(CP,cp,$PATH)dnl
+AC_SUBST(CP)
+
+AC_PATH_PROG(MKDIR,mkdir,$PATH)dnl
+AC_SUBST(MKDIR)
+
+dnl Mark that we have generated config.h
+CFLAGS="${CFLAGS} -DHAVE_CONFIG_H"
+AC_SUBST(CFLAGS)
+
+APACHE_CONFIG_VARS=`pwd`/scripts/build/config_vars.mk
+WEBSERVER=""
+apache_dir=""
+apache_include=""
+APXS="apxs"
+AC_ARG_WITH(apxs,
+[[ --with-apxs[=FILE] Build shared Apache module.
+ FILE is the optional pathname to the apxs tool;
+ defaults to finding apxs in your PATH.]],
+[
+ case "${withval}" in
+ y | yes | true) find_apxs=true ;;
+ n | no | false) find_apxs= ;;
+ *) find_apxs=${withval} ;;
+ esac
+
+ if ${TEST} ${find_apxs} ; then
+ AC_MSG_RESULT([need to check for Perl first, apxs depends on it...])
+ AC_PATH_PROG(PERL,perl,$PATH)dnl
+
+ if ${TEST} ${find_apxs} = true ; then
+ AC_PATH_PROG(APXS,apxs,$PATH)dnl
+ else
+ APXS=${find_apxs}
+ fi
+
+ if ${TEST} -n "${APXS}" ; then
+ dnl Seems that we have it, but have to check if it is OK first
+ if ${TEST} ! -x "${APXS}" ; then
+ AC_MSG_ERROR(Invalid location for apxs: '${APXS}')
+ fi
+
+ ${APXS} -q PREFIX >/dev/null 2>/dev/null || apxs_support=false
+
+ if ${TEST} "${apxs_support}" = "false" ; then
+ AC_MSG_RESULT(could not find ${APXS})
+ AC_MSG_ERROR(You must specify a valid --with-apxs path)
+ fi
+
+ dnl apache_dir and apache_include are also needed.
+ apache_dir=`$APXS -q PREFIX`
+ apache_include="-I`$APXS -q INCLUDEDIR`"
+
+ dnl test apache version
+ APA=`${GREP} STANDARD20 ${APXS}`
+ if ${TEST} -z "$APA" ; then
+ WEBSERVER="apache-1.3"
+ APXSCC="`$APXS -q CC`"
+ APXSCFLAGS="`$APXS -q CFLAGS` -DJK_PREFORK"
+ APXSCPPFLAGS=""
+ APXSLDFLAGS="`$APXS -q LDFLAGS_SHLIB`"
+ else
+ WEBSERVER="apache-2.0"
+ APRINCLUDEDIR=""
+ INCTEMP="`$APXS -q APR_INCLUDEDIR` `$APXS -q APU_INCLUDEDIR`"
+ for INC in ${INCTEMP}; do
+ APRINCLUDEDIR="${APRINCLUDEDIR} -I${INC}"
+ done
+ AC_MSG_RESULT([APRINCLUDEDIR is $APRINCLUDEDIR])
+ APXSCC="`$APXS -q CC`"
+ APXSCFLAGS="`${APXS} -q CFLAGS` `${APXS} -q EXTRA_CFLAGS` -DHAVE_APR ${APRINCLUDEDIR}"
+ APXSCPPFLAGS="`${APXS} -q EXTRA_CPPFLAGS`"
+ APXSLDFLAGS="`$APXS -q LDFLAGS`"
+ APACHE_CONFIG_VARS="`${APXS} -q exp_installbuilddir`/config_vars.mk"
+ LIBTOOL=`$APXS -q LIBTOOL`
+ fi
+ AC_MSG_RESULT([building connector for \"$WEBSERVER\"])
+ if ${TEST} -z "${CC}" ; then
+ CC="${APXSCC}"
+ else
+ if ${TEST} "${CC}" != "$APXSCC" ; then
+ WARN_CC=1
+ fi
+ fi
+
+ AC_SUBST(APXS)
+ fi
+ fi
+],
+[
+ AC_MSG_RESULT(no apxs given)
+])
+
+AC_SUBST(APACHE_CONFIG_VARS)
+
+AC_PROG_CC
+AC_PROG_LD
+
+SAVE_LIBTOOL="$LIBTOOL"
+
+dnl Not sure what it does, but the libtool manual seems to require this
+dnl It should use the native platform dlopen ( if available )
+AC_LIBTOOL_DLOPEN
+
+dnl AM_PROG_LIBTOOL often causes problems.
+dnl I have solved them once using aclocal --acdir=/usr/local/share/aclocal/
+AM_PROG_LIBTOOL
+
+if ${TEST} -n "${SAVE_LIBTOOL}" ; then
+ LIBTOOL="$SAVE_LIBTOOL"
+fi
+AC_MSG_RESULT([LIBTOOL="$LIBTOOL"])
+
+AC_SUBST(LIBTOOL)
+
+dnl ----------------------------- Checks for standard typedefs
+
+dnl Checks for integer size
+AC_CHECK_SIZEOF(char, 1)
+AC_CHECK_SIZEOF(int, 4)
+AC_CHECK_SIZEOF(long, 4)
+AC_CHECK_SIZEOF(short, 2)
+AC_CHECK_SIZEOF(long double, 12)
+AC_CHECK_SIZEOF(long long, 8)
+AC_CHECK_SIZEOF(longlong, 8)
+
+# Now we need to find what jk_uint32_t (sizeof == 4) will be.
+# The first match is our preference.
+if test "$ac_cv_sizeof_int" = "4"; then
+ int32_t_fmt='#define JK_INT32_T_FMT "d"'
+ uint32_t_fmt='#define JK_UINT32_T_FMT "u"'
+ uint32_t_hex_fmt='#define JK_UINT32_T_HEX_FMT "x"'
+ int32_value="int"
+elif test "$ac_cv_sizeof_long" = "4"; then
+ int32_t_fmt='#define JK_INT32_T_FMT "ld"'
+ uint32_t_fmt='#define JK_UINT32_T_FMT "lu"'
+ uint32_t_hex_fmt='#define JK_UINT32_T_HEX_FMT "lx"'
+ int32_value="long"
+else
+ int32_t_fmt='#error could not detect a 32-bit integer type'
+ uint32_t_fmt='#error could not detect a 32-bit integer type'
+ uint32_t_hex_fmt='#error could not detect a 32-bit integer type'
+ AC_ERROR([could not detect a 32-bit integer type])
+fi
+
+# Now we need to find what jk_uint64_t (sizeof == 8) will be.
+# The first match is our preference.
+if test "$ac_cv_sizeof_int" = "8"; then
+ int64_t_fmt='#define JK_INT64_T_FMT "d"'
+ uint64_t_fmt='#define JK_UINT64_T_FMT "u"'
+ uint64_t_hex_fmt='#define JK_UINT64_T_HEX_FMT "x"'
+ int64_value="int"
+elif test "$ac_cv_sizeof_long" = "8"; then
+ int64_t_fmt='#define JK_INT64_T_FMT "ld"'
+ uint64_t_fmt='#define JK_UINT64_T_FMT "lu"'
+ uint64_t_hex_fmt='#define JK_UINT64_T_HEX_FMT "lx"'
+ int64_value="long"
+elif test "$ac_cv_sizeof_long_long" = "8"; then
+ # Linux, Solaris, FreeBSD all support ll with printf.
+ # BSD 4.4 originated 'q'. Solaris is more popular and
+ # doesn't support 'q'. Solaris wins. Exceptions can
+ # go to the OS-dependent section.
+ int64_t_fmt='#define JK_INT64_T_FMT "lld"'
+ uint64_t_fmt='#define JK_UINT64_T_FMT "llu"'
+ uint64_t_hex_fmt='#define JK_UINT64_T_HEX_FMT "llx"'
+ int64_value="long long"
+elif test "$ac_cv_sizeof_long_double" = "8"; then
+ int64_t_fmt='#define JK_INT64_T_FMT "Ld"'
+ uint64_t_fmt='#define JK_UINT64_T_FMT "Lu"'
+ uint64_t_hex_fmt='#define JK_UINT64_T_HEX_FMT "Lx"'
+ int64_value="long double"
+elif test "$ac_cv_sizeof_longlong" = "8"; then
+ int64_t_fmt='#define JK_INT64_T_FMT "qd"'
+ uint64_t_fmt='#define JK_UINT64_T_FMT "qu"'
+ uint64_t_hex_fmt='#define JK_UINT64_T_HEX_FMT "qx"'
+ int64_value="__int64"
+else
+ int64_t_fmt='#error could not detect a 64-bit integer type'
+ uint64_t_fmt='#error could not detect a 64-bit integer type'
+ uint64_t_hex_fmt='#error could not detect a 64-bit integer type'
+ AC_ERROR([could not detect a 64-bit integer type])
+fi
+
+JK_CHECK_SIZEOF_EXTENDED([#include <sys/types.h>], pid_t, 8)
+
+if test "$ac_cv_sizeof_pid_t" = "$ac_cv_sizeof_short"; then
+ pid_t_fmt='#define JK_PID_T_FMT "hd"'
+elif test "$ac_cv_sizeof_pid_t" = "$ac_cv_sizeof_int"; then
+ pid_t_fmt='#define JK_PID_T_FMT "d"'
+elif test "$ac_cv_sizeof_pid_t" = "$ac_cv_sizeof_long"; then
+ pid_t_fmt='#define JK_PID_T_FMT "ld"'
+elif test "$ac_cv_sizeof_pid_t" = "$ac_cv_sizeof_long_long"; then
+ pid_t_fmt='#define JK_PID_T_FMT JK_INT64_T_FMT'
+else
+ pid_t_fmt='#error Can not determine the proper size for pid_t'
+fi
+
+JK_CHECK_SIZEOF_EXTENDED([#include <pthread.h>], pthread_t, 8)
+
+if test "$ac_cv_sizeof_pthread_t" = "$ac_cv_sizeof_short"; then
+ pthread_t_fmt='#define JK_PTHREAD_T_FMT "hu"'
+ pthread_t_value="short"
+elif test "$ac_cv_sizeof_pthread_t" = "$ac_cv_sizeof_int"; then
+ pthread_t_fmt='#define JK_PTHREAD_T_FMT "u"'
+ pthread_t_value="int"
+elif test "$ac_cv_sizeof_pthread_t" = "$ac_cv_sizeof_long"; then
+ pthread_t_fmt='#define JK_PTHREAD_T_FMT "lu"'
+ pthread_t_value="long"
+elif test "$ac_cv_sizeof_pthread_t" = "$ac_cv_sizeof_long_long"; then
+ pthread_t_fmt='#define JK_PTHREAD_T_FMT "llu"'
+ pthread_t_value="long long"
+else
+ pthread_t_fmt='#error Can not determine the proper size for pthread_t'
+fi
+
+# Basically, we have tried to figure out the correct format strings
+# for pid_t which varies between platforms, but we don't always get
+# it right. If you find that we don't get it right for your platform,
+# you can override our decision below.
+case $host in
+ *-solaris*)
+ if test "$ac_cv_sizeof_pid_t" = "$ac_cv_sizeof_long"; then
+ pid_t_fmt='#define JK_PID_T_FMT "ld"'
+ fi
+ ;;
+esac
+
+AC_SUBST(int32_value)
+AC_SUBST(int32_t_fmt)
+AC_SUBST(uint32_t_fmt)
+AC_SUBST(uint32_t_hex_fmt)
+AC_SUBST(int64_value)
+AC_SUBST(int64_t_fmt)
+AC_SUBST(uint64_t_fmt)
+AC_SUBST(uint64_t_hex_fmt)
+AC_SUBST(pid_t_fmt)
+AC_SUBST(pthread_t_fmt)
+AC_SUBST(pthread_t_value)
+
+dnl check for snprintf and vsnprintf.
+AC_CHECK_FUNC(snprintf, AC_DEFINE(HAVE_SNPRINTF,1,[Have snprintf()]))
+AC_CHECK_FUNC(vsnprintf, AC_DEFINE(HAVE_VSNPRINTF,1,[Have vsnprintf()]))
+dnl check for flock function.
+AC_CHECK_FUNC(flock, AC_DEFINE(HAVE_FLOCK,1,[Have flock()]))
+
+dnl check for -lsocket library
+AC_CHECK_LIB(socket, setsockopt, [LIBS="$LIBS -lsocket"])
+
+dnl check for filio.h used on Solaris to define FIONREAD ioctl.
+AC_CHECK_HEADERS(sys/filio.h)
+
+AC_DEFUN([JK_CHECK_SETSOCKOPT], [
+AC_MSG_CHECKING(whether to use $1 with setsockopt())
+AC_TRY_RUN([
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+
+int main(void)
+{
+ int s;
+ struct timeval tv;
+ tv.tv_sec = 3;
+ tv.tv_usec = 0;
+
+#ifndef $1
+ exit(3);
+#else
+ if ((s = socket(AF_INET, SOCK_STREAM, 0)) == -1)
+ exit(2);
+
+ /* fails on Solaris 2.6,8,9,10 and some Linuxes because
+ SO_RCVTIMEO|SO_SNDTIMEO are defined but not implemented */
+ if (setsockopt(s, SOL_SOCKET, $1, (const void *)&tv, sizeof(tv)) == -1)
+ exit(1);
+
+ exit(0);
+#endif
+}
+]
+, [ AC_MSG_RESULT([yes]) AC_DEFINE(USE_$1, 1, [Define to use $1 with setsockopt()]) ]
+, [ AC_MSG_RESULT([no]) ]
+)
+])dnl
+
+dnl check for SO_RCVTIMEO and SO_SNDTIMEO
+JK_CHECK_SETSOCKOPT(SO_RCVTIMEO)
+JK_CHECK_SETSOCKOPT(SO_SNDTIMEO)
+
+AC_DEFUN([JK_CHECK_SOCKOPT], [
+AC_MSG_CHECKING(whether to use $1 with socket())
+AC_TRY_RUN([
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+
+int main(void)
+{
+ int s;
+
+#ifndef $1
+ exit(3);
+#else
+ if ((s = socket(AF_INET, SOCK_STREAM | $1, 0)) == -1)
+ exit(2);
+
+ exit(0);
+#endif
+}
+]
+, [ AC_MSG_RESULT([yes]) AC_DEFINE(USE_$1, 1, [Define to use $1 with socket()]) ]
+, [ AC_MSG_RESULT([no]) ]
+)
+])dnl
+
+dnl check for SOCK_CLOEXEC
+JK_CHECK_SOCKOPT(SOCK_CLOEXEC)
+
+dnl check for poll.h header
+AC_CHECK_HEADERS(poll.h)
+dnl check for poll function
+AC_CHECK_FUNC(poll, AC_DEFINE(HAVE_POLL,1,[Have poll()]))
+
+dnl Apache-2.0 needs the os subdirectory to include os.h
+dnl this include is copy from os/config.m4
+sinclude(../support/os_apache.m4)
+
+dnl it is copied from the configure of JServ ;=)
+dnl and adapted.
+
+apache_dir_is_src="false"
+AC_ARG_WITH(apache,
+[AS_HELP_STRING([--with-apache=DIR],
+[Build static Apache module. DIR is the pathname
+to the Apache source directory.])],
+[
+ if ${TEST} ! -z "$WEBSERVER" ; then
+ AC_MSG_ERROR([Sorry cannot use --with-apxs=${APXS} and --with-apache=${withval} together, please choose one of both])
+ fi
+
+ AC_MSG_CHECKING([for Apache source directory (assume static build)])
+
+ if ${TEST} -n "${withval}" && ${TEST} -d "${withval}" ; then
+ if ${TEST} -d "${withval}/src" ; then
+ # handle the case where people use relative paths to
+ # the apache source directory by pre-pending the current
+ # build directory to the path. there are probably
+ # errors with this if configure is run while in a
+ # different directory than what you are in at the time
+ if ${TEST} -n "`${ECHO} ${withval}|${GREP} \"^\.\.\"`" ; then
+ withval=`pwd`/${withval}
+ fi
+
+ apache_dir=${withval}
+ apache_dir_is_src="true"
+ AC_MSG_RESULT(${apache_dir})
+
+ AC_MSG_CHECKING(for Apache include directory)
+
+ if ${TEST} -d "${withval}/src/include" ; then
+ # read osdir from the existing apache.
+ osdir=`${GREP} '^OSDIR=' ${withval}/src/Makefile.config | ${SED} -e 's:^OSDIR=.*/os:os:'`
+ if ${TEST} -z "${osdir}" ; then
+ osdir=os/unix
+ fi
+ apache_include="-I${withval}/src/include \
+ -I${withval}/src/${osdir}"
+ WEBSERVER="apache-1.3"
+ LIB_JK_TYPE=mod_jk.a
+ CFLAGS="${CFLAGS} -DJK_PREFORK"
+ AC_MSG_RESULT([${apache_include}, version 1.3])
+ else
+ AC_MSG_ERROR([Sorry Apache 1.2.x is no longer supported.])
+ fi
+ else
+ if ${TEST} -d "${withval}/include" ; then
+ # osdir for Apache20.
+ WEBSERVER="apache-2.0"
+ apache_dir=${withval}
+ apache_dir_is_src="true"
+ LIB_JK_TYPE=lib_jk.la
+ apache_include="-I${withval}/include -I${withval}/srclib/apr/include -I${withval}/os/${OS_APACHE_DIR} -I${withval}/srclib/apr-util/include"
+ AC_MSG_RESULT(${apache_dir})
+ fi
+ fi
+ fi
+
+ dnl Make sure we have a result.
+ if ${TEST} -z "$WEBSERVER" ; then
+ AC_MSG_ERROR([Directory $apache_dir is not a valid Apache source distribution])
+ fi
+
+# VT: Now, which one I'm supposed to use? Let's figure it out later
+
+ configure_apache=true
+ configure_src=true
+
+ AC_MSG_RESULT([building connector for \"$WEBSERVER\"])
+],
+[
+ AC_MSG_RESULT(no apache given)
+])
+
+AC_SUBST(apache_include)
+APACHE_DIR=${apache_dir}
+AC_SUBST(APACHE_DIR)
+
+AC_ARG_ENABLE(netscape,
+[AS_HELP_STRING([--enable-netscape=DIR],[Build Netscape/iPlanet/SunONE nsapi redirector plugin])],
+[
+ if ${TEST} ! -z "$WEBSERVER" ; then
+ AC_MSG_ERROR([Sorry cannot use --with-apxs=${APXS} or --with-apache=${withval} with --with-netscape, please choose one or the other.])
+ fi
+
+ WEBSERVER="netscape"
+
+ AC_MSG_RESULT([building connector for \"$WEBSERVER\"])
+],
+[
+ AC_MSG_RESULT(no netscape given)
+])
+
+dnl Check for enable-jni
+JK_JNI_WORKER=""
+AC_ARG_ENABLE(jni,
+[AS_HELP_STRING([--enable-jni],[DEPRECATED: Build jni_connect.so and enable jni_worker])],
+[
+ AC_MSG_RESULT(jni enable (need JDK))
+ CFLAGS="${CFLAGS} -DHAVE_JNI"
+ JK_JNI_WORKER="\${JK}jk_jni_worker\${OEXT}"
+ WARN_JNI=1
+])dnl
+AC_SUBST(JK_JNI_WORKER)
+
+dnl CFLAGS for EAPI mod_ssl (Apache 1.3)
+dnl it also allows the CFLAGS environment variable.
+CFLAGS="${CFLAGS}"
+AC_ARG_ENABLE(EAPI,
+[AS_HELP_STRING([--enable-EAPI],[Enable EAPI support (mod_ssl, Apache 1.3)])],
+[
+case "${enableval}" in
+ y | Y | YES | yes | TRUE | true )
+ CFLAGS="${CFLAGS} -DEAPI"
+ AC_MSG_RESULT([...Enabling EAPI Support...])
+ ;;
+esac
+])
+AC_SUBST(CFLAGS)
+
+dnl CFLAGS for maintainer mode
+dnl it also allows the CFLAGS environment variable.
+CFLAGS="${CFLAGS}"
+AC_ARG_ENABLE(maintainer-mode,
+[AS_HELP_STRING([--enable-maintainer-mode],[Turn on debugging and compile time warnings])],
+[
+case "${enableval}" in
+ y | Y | YES | yes | TRUE | true )
+ CFLAGS="${CFLAGS} -DDEBUG -Wall"
+ AC_MSG_RESULT([...Enabling Maintainer mode...])
+ ;;
+esac
+])
+AC_SUBST(CFLAGS)
+
+dnl CFLAGS for prefork mode
+dnl it also allows the CFLAGS environment variable.
+CFLAGS="${CFLAGS}"
+AC_ARG_ENABLE(prefork,
+[AS_HELP_STRING([--enable-prefork],[Turn on prefork web server mode (single-threaded)])],
+[
+case "${enableval}" in
+ y | Y | YES | yes | TRUE | true )
+ CFLAGS="${CFLAGS} -DJK_PREFORK"
+ AC_MSG_RESULT([...Enabling Prefork mode...])
+ ;;
+esac
+])
+AC_SUBST(CFLAGS)
+
+dnl CFLAGS for stripping TRACE logs
+dnl it also allows the CFLAGS environment variable.
+CFLAGS="${CFLAGS}"
+AC_ARG_ENABLE(trace,
+[AS_HELP_STRING([--disable-trace],[Exclude trace log code from compilation])],
+[
+case "${enableval}" in
+ no )
+ CFLAGS="${CFLAGS} -DJK_PRODUCTION"
+ AC_MSG_RESULT([...Exclude trace log code...])
+ ;;
+esac
+])
+AC_SUBST(CFLAGS)
+
+dnl CFLAGS for building against recent httpd but without
+dnl using httpd API functions, which didn't exist in the first
+dnl production releases. This ensures, that the resulting
+dnl module binary is compatible with older httpd releases.
+dnl Until now only relevant for httpd 2.2.x with x >= 4.
+CFLAGS="${CFLAGS}"
+AC_ARG_ENABLE(api-compatibility,
+[AS_HELP_STRING([--enable-api-compatibility],
+[Only use httpd API functions available in all production releases.
+This improves binary compatibility of module builds with httpd releases
+older than the release against we build (only between minor versions).])],
+[
+case "${enableval}" in
+ y | Y | YES | yes | TRUE | true )
+ CFLAGS="${CFLAGS} -DAPI_COMPATIBILITY"
+ AC_MSG_RESULT([...Only using compatible httpd API...])
+ ;;
+esac
+])
+AC_SUBST(CFLAGS)
+
+dnl CFLAGS for shared memory lock mode
+dnl it also allows the CFLAGS environment variable.
+CFLAGS="${CFLAGS}"
+AC_ARG_ENABLE(flock,
+[AS_HELP_STRING([--enable-flock],[Turn on flock for shared locking if present])],
+[
+case "${enableval}" in
+ y | Y | YES | yes | TRUE | true )
+ CFLAGS="${CFLAGS} -DJK_USE_FLOCK"
+ AC_MSG_RESULT([...Enabling flock() shared memory locking...])
+ ;;
+esac
+])
+AC_SUBST(CFLAGS)
+
+dnl the APXSCFLAGS is given by apxs to the C compiler
+if ${TEST} -n "${CFLAGS}" ; then
+ APXSCFLAGS="${APXSCFLAGS} ${CFLAGS}"
+fi
+AC_SUBST(APXSCFLAGS)
+AC_SUBST(APXSCPPFLAGS)
+
+dnl the APXSLDFLAGS is given to the linker (for APRVARS).
+if ${TEST} -n "${LDFLAGS}" ; then
+ APXSLDFLAGS="${APXSLDFLAGS} ${LDFLAGS}"
+fi
+
+dnl Prefix all LDFLAGS with "-Wl,",
+dnl because we pass them to libtool
+JK_PREFIX_IF_MISSING(APXSLDFLAGS, [-Wl,])
+
+AC_SUBST(APXSLDFLAGS)
+
+if ${TEST} -n "${JK_JNI_WORKER}" ; then
+
+WEBSERVER="jni ${WEBSERVER}"
+
+dnl Find the JDK
+dnl Results go in JAVA_HOME
+dnl Also sets JAVA_PLATFORM to 1 for 1.1 and to 2 for 1.2
+
+AC_MSG_CHECKING([for JDK location (please wait)])
+
+dnl The order is: --with-java-home first, environment second, guessed value third.
+
+dnl This is a safe default. Could screw up on the security features, but
+dnl oh well, this is what --with-java2 is for.
+
+if ${TEST} -n "${JAVA_HOME}" ; then
+ JAVA_HOME_ENV="${JAVA_HOME}"
+else
+ JAVA_HOME_ENV=""
+fi
+JAVA_HOME=""
+JAVA_PLATFORM="1"
+
+AC_ARG_WITH(java-home,
+[AS_HELP_STRING([--with-java-home=DIR],[DEPRECATED: Where is your JDK root directory])],
+[
+
+ # This stuff works if the command line parameter --with-java-home was
+ # specified, so it takes priority rightfully.
+
+ JAVA_HOME=${withval}
+
+ if ${TEST} ! -d "${JAVA_HOME}" ; then
+ AC_MSG_ERROR(Not a directory: ${JAVA_HOME})
+ fi
+
+ AC_MSG_RESULT(${JAVA_HOME})
+
+],
+[
+ # This works if the parameter was NOT specified, so it's a good time
+ # to see what the enviroment says.
+
+ # Since Sun uses JAVA_HOME a lot, we check it first and ignore the
+ # JAVA_HOME, otherwise just use whatever JAVA_HOME was specified.
+
+ if ${TEST} -n "${JAVA_HOME_ENV}" ; then
+
+ JAVA_HOME=${JAVA_HOME_ENV}
+ AC_MSG_RESULT(${JAVA_HOME_ENV} from environment)
+ fi
+])
+
+if ${TEST} -z "${JAVA_HOME}" ; then
+
+ # Oh well, nobody set neither JAVA_HOME nor JAVA_HOME, have to guess
+
+ # The following code is based on the code submitted by Henner Zeller
+ # for ${srcdir}/src/scripts/package/rpm/ApacheJServ.spec
+
+ # Two variables will be set as a result:
+ #
+ # JAVA_HOME
+ # JAVA_PLATFORM
+ AC_MSG_CHECKING([Try to guess JDK location])
+
+
+ for JAVA_PREFIX in \
+ /usr/local \
+ /usr/local/lib \
+ /usr \
+ /usr/lib \
+ /opt \
+ /
+ do
+ for JAVA_PLATFORM in 3 2 1 ;
+ do
+
+ for subversion in .9 .8 .7 .6 .5 .4 .3 .2 .1 "" ;
+ do
+ for VARIANT in IBMJava2- java java- jdk jdk-;
+ do
+ GUESS="${JAVA_PREFIX}/${VARIANT}1.${JAVA_PLATFORM}${subversion}"
+dnl AC_MSG_CHECKING([${GUESS}])
+ if ${TEST} -d "${GUESS}/bin" \
+ && ${TEST} -d "${GUESS}/include" ; then
+
+ JAVA_HOME="${GUESS}"
+ AC_MSG_RESULT([${GUESS}])
+ break
+ fi
+
+ done
+
+ if ${TEST} -n "${JAVA_HOME}" ; then
+ break;
+ fi
+
+ done
+
+ if ${TEST} -n "${JAVA_HOME}" ; then
+ break;
+ fi
+
+ done
+
+ if ${TEST} -n "${JAVA_HOME}" ; then
+ break;
+ fi
+
+ done
+
+ if ${TEST} -n "${JAVA_HOME}" ; then
+
+ dnl Just to have the messages looking uniformly
+
+ AC_MSG_CHECKING(Java platform)
+ AC_MSG_RESULT([guess ${JAVA_PLATFORM}])
+ fi
+
+
+else
+
+ AC_MSG_CHECKING(Java platform)
+
+ AC_ARG_WITH(java-platform,
+ [AS_HELP_STRING([--with-java-platform=VAL],
+ [DEPRECATED: Force the Java platform
+ (value is 1 for 1.1.x or 2 for 1.2.x or greater)])],
+ [
+ dnl This requires a bit of tweaking to be handled properly, but
+ dnl the default is good enough
+
+ JAVA_PLATFORM="2"
+ ])
+
+ AC_MSG_RESULT(forced Java ${JAVA_PLATFORM})
+
+fi
+dnl end of JServ ;=)
+
+dnl test if --enable-jni give but not valid JAVA_HOME
+if ${TEST} -z "${JAVA_HOME}" ; then
+ AC_MSG_ERROR([JDK home not found, please specify one with --with-java-home option (run ./configure --help for more options)])
+fi
+
+dnl guess OS = OS_TYPE for jni_md.h
+OS=""
+AC_ARG_WITH(os-type,
+[AS_HELP_STRING([--with-os-type=SUBDIR],[DEPRECATED: Where is your JDK os-type subdirectory])],
+[
+ OS=${withval}
+
+ if ${TEST} ! -d "${JAVA_HOME}/${OS}" ; then
+ AC_MSG_ERROR(Not a directory: ${JAVA_HOME}/${OS})
+ fi
+],
+[
+ AC_MSG_CHECKING(os_type directory)
+ if ${TEST} -f ${JAVA_HOME}/include/jni_md.h; then
+ OS=""
+ else
+ for f in ${JAVA_HOME}/include/*/jni_md.h; do
+ if ${TEST} -f $f; then
+ OS=`dirname ${f}`
+ OS=`basename ${OS}`
+ echo " ${OS}"
+ fi
+ done
+ if ${TEST} -z "${OS}"; then
+ AC_MSG_RESULT(Cannot find jni_md.h in ${JAVA_HOME}/${OS})
+ AC_MSG_ERROR(You should retry --with-os-type=SUBDIR)
+ fi
+ fi
+])
+fi
+AC_SUBST(JAVA_HOME)
+AC_SUBST(OS)
+
+
+dnl Check that a WEBSERVER has been given
+if ${TEST} -z "$WEBSERVER" ; then
+ AC_MSG_ERROR(Cannot find the WebServer)
+fi
+
+dnl Add common to subdir list
+WEBSERVER="common ${WEBSERVER}"
+
+AC_SUBST(WEBSERVER)
+
+AM_CONDITIONAL(MAKE_DYNAMIC_APACHE, ${TEST} "${apache_dir_is_src}" = "false")
+
+if ${TEST} "${apache_dir_is_src}" = "false" ; then
+ dnl normal apxs handling
+ APACHE20_OEXT=.c
+ LIB_JK_TYPE=mod_jk.so
+ INSTALL_TYPE=install_dynamic
+else
+ dnl install static library in apache sources.
+ APACHE20_OEXT=.lo
+ INSTALL_TYPE=install_static
+fi
+AC_SUBST(APACHE20_OEXT)
+AC_SUBST(LIB_JK_TYPE)
+AC_SUBST(INSTALL_TYPE)
+
+dnl automake needs the path it does not work with $WEBSERVER
+dnl that why useless Makefiles are build.
+AC_OUTPUT([
+ Makefile
+ apache-1.3/Makefile
+ apache-1.3/Makefile.apxs
+ apache-2.0/Makefile
+ apache-2.0/Makefile.apxs
+ common/Makefile
+ common/list.mk
+ common/jk_types.h
+ jni/Makefile
+])
+
+if ${TEST} -n "${WARN_JNI}" ; then
+ AC_MSG_WARN([===========================================])
+ AC_MSG_WARN([You have used one of the following options:])
+ AC_MSG_WARN([ --enable-jni])
+ AC_MSG_WARN([ --with-java-home])
+ AC_MSG_WARN([ --with-java-platform])
+ AC_MSG_WARN([ --with-os-type])
+ AC_MSG_WARN([These options are only necessary if])
+ AC_MSG_WARN([you want to use a worker of type jni.])
+ AC_MSG_WARN([These workers have been deprecated.])
+ AC_MSG_WARN([They do not work and will be removed from])
+ AC_MSG_WARN([a future release])
+ AC_MSG_WARN([===========================================])
+fi
+
+if ${TEST} -n "${WARN_CC}" ; then
+ AC_MSG_WARN([===========================================])
+ AC_MSG_WARN([Using CC from environment:])
+ AC_MSG_WARN([ CC="$CC"])
+ AC_MSG_WARN([instead of CC from apxs:])
+ AC_MSG_WARN([ CC="$APXSCC"])
+ AC_MSG_WARN([If "make" throws an error of the form])
+ AC_MSG_WARN([ "libtool: compile: unable to infer tagged configuration"])
+ AC_MSG_WARN([ "libtool: compile: specify a tag with `--tag'"])
+ AC_MSG_WARN([try running configure without setting CC,])
+ AC_MSG_WARN([or at least CC should start with "$APXSCC"])
+ AC_MSG_WARN([===========================================])
+fi
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/docs/api/README.txt b/rubbos/app/tomcat-connectors-1.2.32-src/native/docs/api/README.txt
new file mode 100644
index 00000000..af3ada4b
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/docs/api/README.txt
@@ -0,0 +1,18 @@
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+To generate the API documentation for the mod_jk library, simply invoke
+ make apidocs
+from the mod_jk Library root source path. (tomcat-connectors/jk/native)
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/Makefile.amd64 b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/Makefile.amd64
new file mode 100644
index 00000000..964e6437
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/Makefile.amd64
@@ -0,0 +1,310 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Microsoft Developer Studio Generated NMAKE File, Based on isapi.dsp
+# Use Platform SDK:
+# SetEnv.cmd /X64 /RETAIL
+# nmake -f Makefile.amd64
+#
+
+TARGET=isapi_redirect$(SO_VERSION)
+
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+OUTDIR=.\Release_amd64
+INTDIR=.\Release_amd64
+# Begin Custom Macros
+OutDir=.\Release_amd64
+# End Custom Macros
+
+!IF "$(RECURSE)" == "0"
+
+ALL : "$(OUTDIR)\$(TARGET).dll"
+
+!ELSE
+
+ALL : "pcre_amd64" "$(OUTDIR)\$(TARGET).dll"
+
+!ENDIF
+
+!IF "$(RECURSE)" == "1"
+CLEAN :"pcre_amd64CLEAN"
+!ELSE
+CLEAN :
+!ENDIF
+ -@erase "$(INTDIR)\jk.res"
+ -@erase "$(INTDIR)\isapi_redirector_src.idb"
+ -@erase "$(INTDIR)\isapi_redirector_src.pdb"
+ -@erase "$(INTDIR)\jk_ajp12_worker.obj"
+ -@erase "$(INTDIR)\jk_ajp13.obj"
+ -@erase "$(INTDIR)\jk_ajp13_worker.obj"
+ -@erase "$(INTDIR)\jk_ajp14.obj"
+ -@erase "$(INTDIR)\jk_ajp14_worker.obj"
+ -@erase "$(INTDIR)\jk_ajp_common.obj"
+ -@erase "$(INTDIR)\jk_connect.obj"
+ -@erase "$(INTDIR)\jk_context.obj"
+ -@erase "$(INTDIR)\jk_isapi_plugin.obj"
+ -@erase "$(INTDIR)\jk_jni_worker.obj"
+ -@erase "$(INTDIR)\jk_lb_worker.obj"
+ -@erase "$(INTDIR)\jk_map.obj"
+ -@erase "$(INTDIR)\jk_md5.obj"
+ -@erase "$(INTDIR)\jk_msg_buff.obj"
+ -@erase "$(INTDIR)\jk_nwmain.obj"
+ -@erase "$(INTDIR)\jk_pool.obj"
+ -@erase "$(INTDIR)\jk_shm.obj"
+ -@erase "$(INTDIR)\jk_sockbuf.obj"
+ -@erase "$(INTDIR)\jk_status.obj"
+ -@erase "$(INTDIR)\jk_uri_worker_map.obj"
+ -@erase "$(INTDIR)\jk_url.obj"
+ -@erase "$(INTDIR)\jk_util.obj"
+ -@erase "$(INTDIR)\jk_worker.obj"
+ -@erase "$(OUTDIR)\$(TARGET).dll"
+ -@erase "$(OUTDIR)\isapi_redirect.exp"
+ -@erase "$(OUTDIR)\isapi_redirect.lib"
+ -@erase "$(OUTDIR)\$(TARGET).pdb"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\isapi.bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+LINK32_FLAGS=kernel32.lib user32.lib advapi32.lib ws2_32.lib mswsock.lib strsafe.lib bufferoverflowu.lib $(EXTRA_LIBS) /nologo /dll /incremental:no /pdb:"$(OUTDIR)\$(TARGET).pdb" /debug /machine:AMD64 /def:".\isapi.def" /out:"$(OUTDIR)\$(TARGET).dll" /implib:"$(OUTDIR)\isapi_redirect.lib"
+DEF_FILE= \
+ ".\isapi.def"
+LINK32_OBJS= \
+ "$(INTDIR)\jk_ajp12_worker.obj" \
+ "$(INTDIR)\jk_ajp13.obj" \
+ "$(INTDIR)\jk_ajp13_worker.obj" \
+ "$(INTDIR)\jk_ajp14.obj" \
+ "$(INTDIR)\jk_ajp14_worker.obj" \
+ "$(INTDIR)\jk_ajp_common.obj" \
+ "$(INTDIR)\jk_connect.obj" \
+ "$(INTDIR)\jk_context.obj" \
+ "$(INTDIR)\jk_isapi_plugin.obj" \
+ "$(INTDIR)\jk_jni_worker.obj" \
+ "$(INTDIR)\jk_lb_worker.obj" \
+ "$(INTDIR)\jk_map.obj" \
+ "$(INTDIR)\jk_md5.obj" \
+ "$(INTDIR)\jk_msg_buff.obj" \
+ "$(INTDIR)\jk_nwmain.obj" \
+ "$(INTDIR)\jk_pool.obj" \
+ "$(INTDIR)\jk_shm.obj" \
+ "$(INTDIR)\jk_sockbuf.obj" \
+ "$(INTDIR)\jk_status.obj" \
+ "$(INTDIR)\jk_uri_worker_map.obj" \
+ "$(INTDIR)\jk_url.obj" \
+ "$(INTDIR)\jk_util.obj" \
+ "$(INTDIR)\jk_worker.obj" \
+ "$(INTDIR)\jk.res" \
+ ".\pcre\Release_amd64\pcre.lib"
+
+"$(OUTDIR)\$(TARGET).dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+ IF EXIST $(OUTDIR)\$(TARGET).manifest \
+ mt -nologo -manifest $(OUTDIR)\$(TARGET).manifest -outputresource:$(OUTDIR)\$(TARGET).dll;2
+
+CPP_PROJ=-nologo -MD -W3 -O2 -Ob2 -Oy- -Zi -EHsc /I "..\common" /I "pcre" /I "$(JAVA_HOME)\include" /I "$(JAVA_HOME)\include\win32" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_AMD64_=1" -DWIN64 /D "_WIN64" /D "JK_ISAPI" /D "ISAPI_EXPORTS" /D "HAS_PCRE" /D "PCRE_STATIC" $(CFLAGS) /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\isapi_redirector_src" /FD /c
+
+.c{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /win32
+RSC_PROJ=/l 0x409 /fo"$(INTDIR)\jk.res" /i "..\common" /d "JK_ISAPI" /d "NDEBUG"
+
+SOURCE=..\common\jk.rc
+
+"$(INTDIR)\jk.res" : $(SOURCE) "$(INTDIR)"
+ $(RSC) $(RSC_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_ajp12_worker.c
+
+"$(INTDIR)\jk_ajp12_worker.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_ajp13.c
+
+"$(INTDIR)\jk_ajp13.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_ajp13_worker.c
+
+"$(INTDIR)\jk_ajp13_worker.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_ajp14.c
+
+"$(INTDIR)\jk_ajp14.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_ajp14_worker.c
+
+"$(INTDIR)\jk_ajp14_worker.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_ajp_common.c
+
+"$(INTDIR)\jk_ajp_common.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_connect.c
+
+"$(INTDIR)\jk_connect.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_context.c
+
+"$(INTDIR)\jk_context.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=.\jk_isapi_plugin.c
+
+"$(INTDIR)\jk_isapi_plugin.obj" : $(SOURCE) "$(INTDIR)"
+
+
+SOURCE=..\common\jk_jni_worker.c
+
+"$(INTDIR)\jk_jni_worker.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_lb_worker.c
+
+"$(INTDIR)\jk_lb_worker.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_map.c
+
+"$(INTDIR)\jk_map.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_md5.c
+
+"$(INTDIR)\jk_md5.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_msg_buff.c
+
+"$(INTDIR)\jk_msg_buff.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_nwmain.c
+
+"$(INTDIR)\jk_nwmain.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_pool.c
+
+"$(INTDIR)\jk_pool.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_shm.c
+
+"$(INTDIR)\jk_shm.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_sockbuf.c
+
+"$(INTDIR)\jk_sockbuf.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_status.c
+
+"$(INTDIR)\jk_status.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_uri_worker_map.c
+
+"$(INTDIR)\jk_uri_worker_map.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_url.c
+
+"$(INTDIR)\jk_url.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_util.c
+
+"$(INTDIR)\jk_util.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_worker.c
+
+"$(INTDIR)\jk_worker.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+"pcre_amd64" :
+ cd ".\pcre"
+ $(MAKE) /$(MAKEFLAGS) /F ".\pcre.amd64"
+ cd ".."
+
+"pcre_amd64CLEAN" :
+ cd ".\pcre"
+ $(MAKE) /$(MAKEFLAGS) /F ".\pcre.amd64" RECURSE=1 CLEAN
+ cd ".."
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/Makefile.ia64 b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/Makefile.ia64
new file mode 100644
index 00000000..f2c6f80c
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/Makefile.ia64
@@ -0,0 +1,310 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Microsoft Developer Studio Generated NMAKE File, Based on isapi.dsp
+# Use Platform SDK:
+# SetEnv.cmd /SRV64 /RETAIL
+# nmake -f Makefile.ia64
+#
+
+TARGET=isapi_redirect$(SO_VERSION)
+
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+OUTDIR=.\Release_ia64
+INTDIR=.\Release_ia64
+# Begin Custom Macros
+OutDir=.\Release_ia64
+# End Custom Macros
+
+!IF "$(RECURSE)" == "0"
+
+ALL : "$(OUTDIR)\$(TARGET).dll"
+
+!ELSE
+
+ALL : "pcre_ia64" "$(OUTDIR)\$(TARGET).dll"
+
+!ENDIF
+
+!IF "$(RECURSE)" == "1"
+CLEAN :"pcre_ia64CLEAN"
+!ELSE
+CLEAN :
+!ENDIF
+ -@erase "$(INTDIR)\jk.res"
+ -@erase "$(INTDIR)\isapi_redirector_src.idb"
+ -@erase "$(INTDIR)\isapi_redirector_src.pdb"
+ -@erase "$(INTDIR)\jk_ajp12_worker.obj"
+ -@erase "$(INTDIR)\jk_ajp13.obj"
+ -@erase "$(INTDIR)\jk_ajp13_worker.obj"
+ -@erase "$(INTDIR)\jk_ajp14.obj"
+ -@erase "$(INTDIR)\jk_ajp14_worker.obj"
+ -@erase "$(INTDIR)\jk_ajp_common.obj"
+ -@erase "$(INTDIR)\jk_connect.obj"
+ -@erase "$(INTDIR)\jk_context.obj"
+ -@erase "$(INTDIR)\jk_isapi_plugin.obj"
+ -@erase "$(INTDIR)\jk_jni_worker.obj"
+ -@erase "$(INTDIR)\jk_lb_worker.obj"
+ -@erase "$(INTDIR)\jk_map.obj"
+ -@erase "$(INTDIR)\jk_md5.obj"
+ -@erase "$(INTDIR)\jk_msg_buff.obj"
+ -@erase "$(INTDIR)\jk_nwmain.obj"
+ -@erase "$(INTDIR)\jk_pool.obj"
+ -@erase "$(INTDIR)\jk_shm.obj"
+ -@erase "$(INTDIR)\jk_sockbuf.obj"
+ -@erase "$(INTDIR)\jk_status.obj"
+ -@erase "$(INTDIR)\jk_uri_worker_map.obj"
+ -@erase "$(INTDIR)\jk_url.obj"
+ -@erase "$(INTDIR)\jk_util.obj"
+ -@erase "$(INTDIR)\jk_worker.obj"
+ -@erase "$(OUTDIR)\$(TARGET).dll"
+ -@erase "$(OUTDIR)\isapi_redirect.exp"
+ -@erase "$(OUTDIR)\isapi_redirect.lib"
+ -@erase "$(OUTDIR)\$(TARGET).pdb"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\isapi.bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+LINK32_FLAGS=kernel32.lib user32.lib advapi32.lib ws2_32.lib mswsock.lib strsafe.lib bufferoverflowu.lib $(EXTRA_LIBS) /nologo /dll /incremental:no /pdb:"$(OUTDIR)\$(TARGET).pdb" /debug /machine:IA64 /def:".\isapi.def" /out:"$(OUTDIR)\$(TARGET).dll" /implib:"$(OUTDIR)\isapi_redirect.lib"
+DEF_FILE= \
+ ".\isapi.def"
+LINK32_OBJS= \
+ "$(INTDIR)\jk_ajp12_worker.obj" \
+ "$(INTDIR)\jk_ajp13.obj" \
+ "$(INTDIR)\jk_ajp13_worker.obj" \
+ "$(INTDIR)\jk_ajp14.obj" \
+ "$(INTDIR)\jk_ajp14_worker.obj" \
+ "$(INTDIR)\jk_ajp_common.obj" \
+ "$(INTDIR)\jk_connect.obj" \
+ "$(INTDIR)\jk_context.obj" \
+ "$(INTDIR)\jk_isapi_plugin.obj" \
+ "$(INTDIR)\jk_jni_worker.obj" \
+ "$(INTDIR)\jk_lb_worker.obj" \
+ "$(INTDIR)\jk_map.obj" \
+ "$(INTDIR)\jk_md5.obj" \
+ "$(INTDIR)\jk_msg_buff.obj" \
+ "$(INTDIR)\jk_nwmain.obj" \
+ "$(INTDIR)\jk_pool.obj" \
+ "$(INTDIR)\jk_shm.obj" \
+ "$(INTDIR)\jk_sockbuf.obj" \
+ "$(INTDIR)\jk_status.obj" \
+ "$(INTDIR)\jk_uri_worker_map.obj" \
+ "$(INTDIR)\jk_url.obj" \
+ "$(INTDIR)\jk_util.obj" \
+ "$(INTDIR)\jk_worker.obj" \
+ "$(INTDIR)\jk.res" \
+ ".\pcre\Release_ia64\pcre.lib"
+
+"$(OUTDIR)\$(TARGET).dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+ IF EXIST $(OUTDIR)\$(TARGET).manifest \
+ mt -nologo -manifest $(OUTDIR)\$(TARGET).manifest -outputresource:$(OUTDIR)\$(TARGET).dll;2
+
+CPP_PROJ=-nologo -MD -W3 -O2 -Ob2 -Zi -EHsc /I "..\common" /I "pcre" /I "$(JAVA_HOME)\include" /I "$(JAVA_HOME)\include\win32" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_IA64_=1" -DWIN64 /D "_WIN64" /D "JK_ISAPI" /D "ISAPI_EXPORTS" /D "HAS_PCRE" /D "PCRE_STATIC" $(CFLAGS) /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\isapi_redirector_src" /FD /c
+
+.c{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /win32
+RSC_PROJ=/l 0x409 /fo"$(INTDIR)\jk.res" /i "..\common" /d "JK_ISAPI" /d "NDEBUG"
+
+SOURCE=..\common\jk.rc
+
+"$(INTDIR)\jk.res" : $(SOURCE) "$(INTDIR)"
+ $(RSC) $(RSC_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_ajp12_worker.c
+
+"$(INTDIR)\jk_ajp12_worker.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_ajp13.c
+
+"$(INTDIR)\jk_ajp13.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_ajp13_worker.c
+
+"$(INTDIR)\jk_ajp13_worker.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_ajp14.c
+
+"$(INTDIR)\jk_ajp14.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_ajp14_worker.c
+
+"$(INTDIR)\jk_ajp14_worker.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_ajp_common.c
+
+"$(INTDIR)\jk_ajp_common.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_connect.c
+
+"$(INTDIR)\jk_connect.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_context.c
+
+"$(INTDIR)\jk_context.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=.\jk_isapi_plugin.c
+
+"$(INTDIR)\jk_isapi_plugin.obj" : $(SOURCE) "$(INTDIR)"
+
+
+SOURCE=..\common\jk_jni_worker.c
+
+"$(INTDIR)\jk_jni_worker.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_lb_worker.c
+
+"$(INTDIR)\jk_lb_worker.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_map.c
+
+"$(INTDIR)\jk_map.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_md5.c
+
+"$(INTDIR)\jk_md5.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_msg_buff.c
+
+"$(INTDIR)\jk_msg_buff.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_nwmain.c
+
+"$(INTDIR)\jk_nwmain.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_pool.c
+
+"$(INTDIR)\jk_pool.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_shm.c
+
+"$(INTDIR)\jk_shm.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_sockbuf.c
+
+"$(INTDIR)\jk_sockbuf.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_status.c
+
+"$(INTDIR)\jk_status.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_uri_worker_map.c
+
+"$(INTDIR)\jk_uri_worker_map.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_url.c
+
+"$(INTDIR)\jk_url.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_util.c
+
+"$(INTDIR)\jk_util.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_worker.c
+
+"$(INTDIR)\jk_worker.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+"pcre_ia64" :
+ cd ".\pcre"
+ $(MAKE) /$(MAKEFLAGS) /F ".\pcre.ia64"
+ cd ".."
+
+"pcre_ia64CLEAN" :
+ cd ".\pcre"
+ $(MAKE) /$(MAKEFLAGS) /F ".\pcre.ia64" RECURSE=1 CLEAN
+ cd ".."
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/Makefile.x86 b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/Makefile.x86
new file mode 100644
index 00000000..d9a376f7
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/Makefile.x86
@@ -0,0 +1,304 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+TARGET=isapi_redirect$(SO_VERSION)
+
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+OUTDIR=.\Release_x86
+INTDIR=.\Release_x86
+# Begin Custom Macros
+OutDir=.\Release_x86
+# End Custom Macros
+
+!IF "$(RECURSE)" == "0"
+
+ALL : "$(OUTDIR)\$(TARGET).dll"
+
+!ELSE
+
+ALL : "pcre_x86" "$(OUTDIR)\$(TARGET).dll"
+
+!ENDIF
+
+!IF "$(RECURSE)" == "1"
+CLEAN :"pcre_x86CLEAN"
+!ELSE
+CLEAN :
+!ENDIF
+ -@erase "$(INTDIR)\jk.res"
+ -@erase "$(INTDIR)\isapi_redirector_src.idb"
+ -@erase "$(INTDIR)\isapi_redirector_src.pdb"
+ -@erase "$(INTDIR)\jk_ajp12_worker.obj"
+ -@erase "$(INTDIR)\jk_ajp13.obj"
+ -@erase "$(INTDIR)\jk_ajp13_worker.obj"
+ -@erase "$(INTDIR)\jk_ajp14.obj"
+ -@erase "$(INTDIR)\jk_ajp14_worker.obj"
+ -@erase "$(INTDIR)\jk_ajp_common.obj"
+ -@erase "$(INTDIR)\jk_connect.obj"
+ -@erase "$(INTDIR)\jk_context.obj"
+ -@erase "$(INTDIR)\jk_isapi_plugin.obj"
+ -@erase "$(INTDIR)\jk_jni_worker.obj"
+ -@erase "$(INTDIR)\jk_lb_worker.obj"
+ -@erase "$(INTDIR)\jk_map.obj"
+ -@erase "$(INTDIR)\jk_md5.obj"
+ -@erase "$(INTDIR)\jk_msg_buff.obj"
+ -@erase "$(INTDIR)\jk_nwmain.obj"
+ -@erase "$(INTDIR)\jk_pool.obj"
+ -@erase "$(INTDIR)\jk_shm.obj"
+ -@erase "$(INTDIR)\jk_sockbuf.obj"
+ -@erase "$(INTDIR)\jk_status.obj"
+ -@erase "$(INTDIR)\jk_uri_worker_map.obj"
+ -@erase "$(INTDIR)\jk_url.obj"
+ -@erase "$(INTDIR)\jk_util.obj"
+ -@erase "$(INTDIR)\jk_worker.obj"
+ -@erase "$(OUTDIR)\$(TARGET).dll"
+ -@erase "$(OUTDIR)\isapi_redirect.exp"
+ -@erase "$(OUTDIR)\isapi_redirect.lib"
+ -@erase "$(OUTDIR)\$(TARGET).pdb"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\isapi.bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+LINK32_FLAGS=kernel32.lib user32.lib advapi32.lib ws2_32.lib mswsock.lib strsafe.lib $(EXTRA_LIBS) /nologo /base:"0x6A6B0000" /dll /incremental:no /pdb:"$(OUTDIR)\$(TARGET).pdb" /debug /machine:I386 /def:".\isapi.def" /out:"$(OUTDIR)\$(TARGET).dll" /implib:"$(OUTDIR)\isapi_redirect.lib"
+DEF_FILE= \
+ ".\isapi.def"
+LINK32_OBJS= \
+ "$(INTDIR)\jk_ajp12_worker.obj" \
+ "$(INTDIR)\jk_ajp13.obj" \
+ "$(INTDIR)\jk_ajp13_worker.obj" \
+ "$(INTDIR)\jk_ajp14.obj" \
+ "$(INTDIR)\jk_ajp14_worker.obj" \
+ "$(INTDIR)\jk_ajp_common.obj" \
+ "$(INTDIR)\jk_connect.obj" \
+ "$(INTDIR)\jk_context.obj" \
+ "$(INTDIR)\jk_isapi_plugin.obj" \
+ "$(INTDIR)\jk_jni_worker.obj" \
+ "$(INTDIR)\jk_lb_worker.obj" \
+ "$(INTDIR)\jk_map.obj" \
+ "$(INTDIR)\jk_md5.obj" \
+ "$(INTDIR)\jk_msg_buff.obj" \
+ "$(INTDIR)\jk_nwmain.obj" \
+ "$(INTDIR)\jk_pool.obj" \
+ "$(INTDIR)\jk_shm.obj" \
+ "$(INTDIR)\jk_sockbuf.obj" \
+ "$(INTDIR)\jk_status.obj" \
+ "$(INTDIR)\jk_uri_worker_map.obj" \
+ "$(INTDIR)\jk_url.obj" \
+ "$(INTDIR)\jk_util.obj" \
+ "$(INTDIR)\jk_worker.obj" \
+ "$(INTDIR)\jk.res" \
+ ".\pcre\Release_x86\pcre.lib"
+
+"$(OUTDIR)\$(TARGET).dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+ IF EXIST $(OUTDIR)\$(TARGET).manifest \
+ mt -nologo -manifest $(OUTDIR)\$(TARGET).manifest -outputresource:$(OUTDIR)\$(TARGET).dll;2
+
+CPP_PROJ=-nologo -MD -W3 -O2 -Ob2 -Oy- -Zi -EHsc /I "..\common" /I "pcre" /I "$(JAVA_HOME)\include" /I "$(JAVA_HOME)\include\win32" $(CFLAGS) /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "JK_ISAPI" /D "ISAPI_EXPORTS" /D "HAS_PCRE" /D "PCRE_STATIC" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\isapi_redirector_src" /FD /c
+
+.c{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /win32
+RSC_PROJ=/l 0x409 /fo"$(INTDIR)\jk.res" /i "..\common" /d "JK_ISAPI" /d "NDEBUG"
+
+SOURCE=..\common\jk.rc
+
+"$(INTDIR)\jk.res" : $(SOURCE) "$(INTDIR)"
+ $(RSC) $(RSC_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_ajp12_worker.c
+
+"$(INTDIR)\jk_ajp12_worker.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_ajp13.c
+
+"$(INTDIR)\jk_ajp13.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_ajp13_worker.c
+
+"$(INTDIR)\jk_ajp13_worker.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_ajp14.c
+
+"$(INTDIR)\jk_ajp14.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_ajp14_worker.c
+
+"$(INTDIR)\jk_ajp14_worker.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_ajp_common.c
+
+"$(INTDIR)\jk_ajp_common.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_connect.c
+
+"$(INTDIR)\jk_connect.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_context.c
+
+"$(INTDIR)\jk_context.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=.\jk_isapi_plugin.c
+
+"$(INTDIR)\jk_isapi_plugin.obj" : $(SOURCE) "$(INTDIR)"
+
+
+SOURCE=..\common\jk_jni_worker.c
+
+"$(INTDIR)\jk_jni_worker.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_lb_worker.c
+
+"$(INTDIR)\jk_lb_worker.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_map.c
+
+"$(INTDIR)\jk_map.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_md5.c
+
+"$(INTDIR)\jk_md5.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_msg_buff.c
+
+"$(INTDIR)\jk_msg_buff.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_nwmain.c
+
+"$(INTDIR)\jk_nwmain.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_pool.c
+
+"$(INTDIR)\jk_pool.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_shm.c
+
+"$(INTDIR)\jk_shm.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_sockbuf.c
+
+"$(INTDIR)\jk_sockbuf.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_status.c
+
+"$(INTDIR)\jk_status.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_uri_worker_map.c
+
+"$(INTDIR)\jk_uri_worker_map.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_url.c
+
+"$(INTDIR)\jk_url.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_util.c
+
+"$(INTDIR)\jk_util.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_worker.c
+
+"$(INTDIR)\jk_worker.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+"pcre_x86" :
+ cd ".\pcre"
+ $(MAKE) /$(MAKEFLAGS) /F ".\pcre.x86" CFG="pcre_x86"
+ cd ".."
+
+"pcre_x86CLEAN" :
+ cd ".\pcre"
+ $(MAKE) /$(MAKEFLAGS) /F ".\pcre.x86" CFG="pcre_x86" RECURSE=1 CLEAN
+ cd ".."
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/README b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/README
new file mode 100644
index 00000000..a77dbd82
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/README
@@ -0,0 +1,43 @@
+ABOUT
+-----
+
+The Tomcat redirector was developed using Visual C++ Ver.6.0,
+so having this environment is a prerequisite if you want to perform
+a custom build.
+
+REQUIREMENT
+-----------
+
+* MS VC 6.0 (+ update, latest service pack is sp5)
+ isapi_redirector.dll can be built using the command line tools, or
+ from within the Visual Studio IDE Workbench. The command line build
+ requires the environment to reflect the PATH, INCLUDE, LIB and other
+ variables that can be configured with the vcvars32 batch file:
+
+ "c:\Program Files\DevStudio\VC\Bin\vcvars32.bat"
+
+* MS PLATFORM SDK
+ Visual C++ 6.0 builds require an updated Microsoft Windows Platform SDK
+ (http://www.microsoft.com/msdownload/platformsdk/sdkupdate/) to enable
+ some isapi_redirector.dll features. For command line builds,
+ the Platform SDK environment is prepared by the setenv batch file:
+
+ "c:\Program Files\Microsoft Platform SDK\setenv.bat"
+
+ Note that the Windows Platform SDK is only needed if you want authenticate
+ using IIS to compile a isapi_redirector.dll..
+
+
+
+BUILDING
+--------
+
+The steps that you need to take are:
+
+ 1. Change directory to the isapi redirector plugins source directory.
+
+ 2. Execute the following command:
+ nmake -f Makefile.x86 [SO_VERSION=-1.2.32]
+
+An alternative will be to open the isapi workspace file (isapi.dsw) in msdev and
+build it using the build menu.
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/LICENSE.TXT b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/LICENSE.TXT
new file mode 100644
index 00000000..261eeb9e
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/LICENSE.TXT
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/License.rtf b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/License.rtf
new file mode 100644
index 00000000..e174f06d
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/License.rtf
@@ -0,0 +1,72 @@
+{\rtf1\ansi\ansicpg1252\deff0{\fonttbl{\f0\fswiss\fprq2\fcharset0 Arial;}}
+\viewkind4\uc1\pard\qc\lang1033\b\f0\fs18 Apache License\par
+Version 2.0, January 2004\par
+http://www.apache.org/licenses/\par
+\b0\par
+\pard TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\par
+\par
+\pard\fi-180\li180 1. Definitions.\par
+\par
+\pard\li180 "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\par
+\par
+"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\par
+\par
+"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\par
+\par
+"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.\par
+\par
+"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\par
+\par
+"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\par
+\par
+"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\par
+\par
+"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\par
+\par
+"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."\par
+\par
+"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\par
+\pard\par
+\pard\fi-180\li180 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\par
+\par
+3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\par
+\par
+4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\par
+\pard\par
+\pard\fi-270\li450 (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\par
+\par
+(b) You must cause any modified files to carry prominent notices stating that You changed the files; and\par
+\par
+(c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\par
+\par
+(d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\par
+\pard\par
+\pard\li180 You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\par
+\pard\par
+\pard\fi-180\li180 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\par
+\par
+6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\par
+\par
+7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\par
+\par
+8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\par
+\par
+9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.\par
+\pard\par
+END OF TERMS AND CONDITIONS\par
+\par
+APPENDIX: How to apply the Apache License to your work.\par
+\par
+To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives.\par
+\par
+\pard\li180 Copyright [yyyy] [name of copyright owner]\par
+\par
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\par
+\par
+\pard\li360 http://www.apache.org/licenses/LICENSE-2.0\par
+\pard\li180\par
+Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.\par
+\pard\par
+\b\par
+}
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/bin/README b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/bin/README
new file mode 100644
index 00000000..0539cf21
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/bin/README
@@ -0,0 +1 @@
+Jakarta Isapi Redirector \ No newline at end of file
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/conf/rewrite.properties b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/conf/rewrite.properties
new file mode 100644
index 00000000..ac036d62
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/conf/rewrite.properties
@@ -0,0 +1,28 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# rewrite.properties - IIS
+#
+# Form of the file
+# requested=replacement
+#
+# Note: Requested must be present in the
+# uriworkermap.properies file and mapped to
+# the desired worker.
+#
+# Next will send /examples/servlets/ to the container
+# for the /servlets-examples request.
+#
+# /servlets-examples/=/examples/servlets/
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/conf/uriworkermap.properties b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/conf/uriworkermap.properties
new file mode 100644
index 00000000..facc0e2d
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/conf/uriworkermap.properties
@@ -0,0 +1,39 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# uriworkermap.properties - IIS
+#
+# This file provides sample mappings for example wlb
+# worker defined in workermap.properties.minimal
+# The general syntax for this file is:
+# [URL]=[Worker name]
+
+/admin/*=wlb
+/manager/*=wlb
+/jsp-examples/*=wlb
+/servlets-examples/*=wlb
+/examples/*=wlb
+
+# Optionally filter out all .jpeg files inside that context
+# For no mapping the url has to start with exclamation (!)
+
+!/servlets-examples/*.jpeg=wlb
+
+#
+# Mount jkstatus to /jkmanager
+# For production servers you will need to
+# secure the access to the /jkmanager url
+#
+/jkmanager=jkstatus
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/conf/workers.properties.minimal b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/conf/workers.properties.minimal
new file mode 100644
index 00000000..7d7dcdac
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/conf/workers.properties.minimal
@@ -0,0 +1,45 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# workers.properties.minimal -
+#
+# This file provides minimal jk configuration properties needed to
+# connect to Tomcat.
+#
+# The workers that jk should create and work with
+#
+
+worker.list=wlb,jkstatus
+
+#
+# Defining a worker named ajp13w and of type ajp13
+# Note that the name and the type do not have to match.
+#
+worker.ajp13w.type=ajp13
+worker.ajp13w.host=localhost
+worker.ajp13w.port=8009
+
+#
+# Defining a load balancer
+#
+
+worker.wlb.type=lb
+worker.wlb.balance_workers=ajp13w
+
+#
+# Define status worker
+#
+
+worker.jkstatus.type=status
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/iisfilter.vbs b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/iisfilter.vbs
new file mode 100644
index 00000000..104cd1bf
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/iisfilter.vbs
@@ -0,0 +1,120 @@
+'
+' Licensed to the Apache Software Foundation (ASF) under one or more
+' contributor license agreements. See the NOTICE file distributed with
+' this work for additional information regarding copyright ownership.
+' The ASF licenses this file to You under the Apache License, Version 2.0
+' (the "License"); you may not use this file except in compliance with
+' the License. You may obtain a copy of the License at
+'
+' http://www.apache.org/licenses/LICENSE-2.0
+'
+' Unless required by applicable law or agreed to in writing, software
+' distributed under the License is distributed on an "AS IS" BASIS,
+' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+' See the License for the specific language governing permissions and
+' limitations under the License.
+'
+
+' =========================================================================
+' Description: Install script for Tomcat ISAPI redirector
+' Author: Mladen Turk <mturk@apache.org>
+' Version: $Revision: 572120 $
+' =========================================================================
+
+'
+' Get a handle to the filters for the server - we process all errors
+'
+On Error Resume Next
+
+filterName = "jakarta"
+filterLib = "bin\isapi_redirect.dll"
+
+Function IISInstallFilter(filterDir, filterObject)
+
+ Dim filters
+ Set filters = GetObject(filterObject)
+ If err Then err.clear
+ info "Got Filters " + filters.FilterLoadOrder
+
+ '
+ ' Create the filter - if it fails then delete it and try again
+ '
+ name = filterName
+ info "Creating Filter - " + filterName
+ Dim filter
+ Set filter = filters.Create( "IISFilter", filterName )
+ If err Then
+ err.clear
+ info "Filter exists - deleting"
+ filters.delete "IISFilter", filterName
+ If err Then
+ info "Error Deleting Filter"
+ IISInstallFilter = 0
+ Exit Function
+ End If
+ Set filter = filters.Create( "IISFilter", filterName )
+ If Err Then
+ info "Error Creating Filter"
+ IISInstallFilter = 0
+ Exit Function
+ End If
+ End If
+
+ '
+ ' Set the filter info and save it
+ '
+ filter.FilterPath = filterDir + filterLib
+' filter.FilterEnabled = true
+ filter.FilterDescription = "Jakarta Isapi Redirector"
+ filter.NotifyOrderHigh = true
+ filter.SetInfo
+ info "Created Filter " + filterDir + filterLib
+
+ '
+ ' Set the load order - only if it's not in the list already
+ '
+ On Error goto 0
+ loadOrders = filters.FilterLoadOrder
+ list = Split( loadOrders, "," )
+ found = false
+ For each item in list
+ If Trim( item ) = filterName Then found = true
+ Next
+
+ If found = false Then
+ info "Filter is not in load order - adding now."
+ If Len(loadOrders) <> 0 Then loadOrders = loadOrders + ","
+ filters.FilterLoadOrder = loadOrders + filterName
+ filters.SetInfo
+ info "Added Filter " + filterName
+ Else
+ info "Filter already exists in load order - no update required."
+ End If
+ IISInstallFilter = 1
+End Function
+
+'
+' Helper function for snafus
+'
+Function fail(message)
+' MsgBox " " + message
+ WScript.Quit(1)
+End function
+
+'
+' Helper function for info
+'
+Function info(message)
+' MsgBox " " + message
+End Function
+
+info "Installing IIS Filter " + Session.Property("INSTALLDIR")
+Dim rv
+rv = 0
+rv = IISInstallFilter(Session.Property("INSTALLDIR"), "IIS://LocalHost/W3SVC/1/Filters")
+If rv = 0 Then
+ rv = IISInstallFilter(Session.Property("INSTALLDIR"), "/LM/W3SVC/Filters")
+End If
+If rv = 0 Then
+ rv = IISInstallFilter(Session.Property("INSTALLDIR"), "/LM/W3SVC/1/Filters")
+End If
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/isapi-redirector-win32-msi.ism b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/isapi-redirector-win32-msi.ism
new file mode 100644
index 00000000..665191e4
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/isapi-redirector-win32-msi.ism
@@ -0,0 +1,4773 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<?xml-stylesheet type="text/xsl" href="is.xsl" ?>
+<!DOCTYPE msi [
+ <!ELEMENT msi (summary,table*)>
+ <!ATTLIST msi version CDATA #REQUIRED>
+ <!ATTLIST msi xmlns:dt CDATA #IMPLIED
+ codepage CDATA #IMPLIED
+ compression (MSZIP|LZX|none) "LZX">
+
+ <!ELEMENT summary (codepage?,title?,subject?,author?,keywords?,comments?,
+ template,lastauthor?,revnumber,lastprinted?,
+ createdtm?,lastsavedtm?,pagecount,wordcount,
+ charcount?,appname?,security?)>
+
+ <!ELEMENT codepage (#PCDATA)>
+ <!ELEMENT title (#PCDATA)>
+ <!ELEMENT subject (#PCDATA)>
+ <!ELEMENT author (#PCDATA)>
+ <!ELEMENT keywords (#PCDATA)>
+ <!ELEMENT comments (#PCDATA)>
+ <!ELEMENT template (#PCDATA)>
+ <!ELEMENT lastauthor (#PCDATA)>
+ <!ELEMENT revnumber (#PCDATA)>
+ <!ELEMENT lastprinted (#PCDATA)>
+ <!ELEMENT createdtm (#PCDATA)>
+ <!ELEMENT lastsavedtm (#PCDATA)>
+ <!ELEMENT pagecount (#PCDATA)>
+ <!ELEMENT wordcount (#PCDATA)>
+ <!ELEMENT charcount (#PCDATA)>
+ <!ELEMENT appname (#PCDATA)>
+ <!ELEMENT security (#PCDATA)>
+
+ <!ELEMENT table (col+,row*)>
+ <!ATTLIST table
+ name CDATA #REQUIRED>
+
+ <!ELEMENT col (#PCDATA)>
+ <!ATTLIST col
+ key (yes|no) #IMPLIED
+ def CDATA #IMPLIED>
+
+ <!ELEMENT row (td+)>
+
+ <!ELEMENT td (#PCDATA)>
+ <!ATTLIST td
+ href CDATA #IMPLIED
+ dt:dt (string|bin.base64) #IMPLIED
+ md5 CDATA #IMPLIED>
+]>
+<msi version="2.0" xmlns:dt="urn:schemas-microsoft-com:datatypes">
+
+ <summary>
+ <codepage>1252</codepage>
+ <title>Installation Database</title>
+ <subject>##ID_STRING5##</subject>
+ <author>##COMPANY_NAME##</author>
+ <keywords>Installer,MSI,Database</keywords>
+ <comments>##ID_STRING6##</comments>
+ <template>Intel;1033</template>
+ <lastauthor>Administrator</lastauthor>
+ <revnumber>{C3AC9A0C-8E2C-4998-8FD3-894123CF9D37}</revnumber>
+ <lastprinted/>
+ <createdtm>06/21/1999 09:00</createdtm>
+ <lastsavedtm>07/14/2000 12:50</lastsavedtm>
+ <pagecount>200</pagecount>
+ <wordcount>0</wordcount>
+ <charcount/>
+ <appname>FLEXnet InstallShield</appname>
+ <security>1</security>
+ </summary>
+
+ <table name="ActionText">
+ <col key="yes" def="s72">Action</col>
+ <col def="L64">Description</col>
+ <col def="L128">Template</col>
+ <row><td>Advertise</td><td>##IDS_ACTIONTEXT_Advertising##</td><td/></row>
+ <row><td>AllocateRegistrySpace</td><td>##IDS_ACTIONTEXT_AllocatingRegistry##</td><td>##IDS_ACTIONTEXT_FreeSpace##</td></row>
+ <row><td>AppSearch</td><td>##IDS_ACTIONTEXT_SearchInstalled##</td><td>##IDS_ACTIONTEXT_PropertySignature##</td></row>
+ <row><td>BindImage</td><td>##IDS_ACTIONTEXT_BindingExes##</td><td>##IDS_ACTIONTEXT_File##</td></row>
+ <row><td>CCPSearch</td><td>##IDS_ACTIONTEXT_UnregisterModules##</td><td/></row>
+ <row><td>CostFinalize</td><td>##IDS_ACTIONTEXT_ComputingSpace3##</td><td/></row>
+ <row><td>CostInitialize</td><td>##IDS_ACTIONTEXT_ComputingSpace##</td><td/></row>
+ <row><td>CreateFolders</td><td>##IDS_ACTIONTEXT_CreatingFolders##</td><td>##IDS_ACTIONTEXT_Folder##</td></row>
+ <row><td>CreateShortcuts</td><td>##IDS_ACTIONTEXT_CreatingShortcuts##</td><td>##IDS_ACTIONTEXT_Shortcut##</td></row>
+ <row><td>DeleteServices</td><td>##IDS_ACTIONTEXT_DeletingServices##</td><td>##IDS_ACTIONTEXT_Service##</td></row>
+ <row><td>DuplicateFiles</td><td>##IDS_ACTIONTEXT_CreatingDuplicate##</td><td>##IDS_ACTIONTEXT_FileDirectorySize##</td></row>
+ <row><td>FileCost</td><td>##IDS_ACTIONTEXT_ComputingSpace2##</td><td/></row>
+ <row><td>FindRelatedProducts</td><td>##IDS_ACTIONTEXT_SearchForRelated##</td><td>##IDS_ACTIONTEXT_FoundApp##</td></row>
+ <row><td>GenerateScript</td><td>##IDS_ACTIONTEXT_GeneratingScript##</td><td>##IDS_ACTIONTEXT_1##</td></row>
+ <row><td>InstallAdminPackage</td><td>##IDS_ACTIONTEXT_CopyingNetworkFiles##</td><td>##IDS_ACTIONTEXT_FileDirSize##</td></row>
+ <row><td>InstallFiles</td><td>##IDS_ACTIONTEXT_CopyingNewFiles##</td><td>##IDS_ACTIONTEXT_FileDirSize2##</td></row>
+ <row><td>InstallODBC</td><td>##IDS_ACTIONTEXT_InstallODBC##</td><td/></row>
+ <row><td>InstallSFPCatalogFile</td><td>##IDS_ACTIONTEXT_InstallingSystemCatalog##</td><td>##IDS_ACTIONTEXT_FileDependencies##</td></row>
+ <row><td>InstallServices</td><td>##IDS_ACTIONTEXT_InstallServices##</td><td>##IDS_ACTIONTEXT_Service2##</td></row>
+ <row><td>InstallValidate</td><td>##IDS_ACTIONTEXT_Validating##</td><td/></row>
+ <row><td>LaunchConditions</td><td>##IDS_ACTIONTEXT_EvaluateLaunchConditions##</td><td/></row>
+ <row><td>MigrateFeatureStates</td><td>##IDS_ACTIONTEXT_MigratingFeatureStates##</td><td>##IDS_ACTIONTEXT_Application##</td></row>
+ <row><td>MoveFiles</td><td>##IDS_ACTIONTEXT_MovingFiles##</td><td>##IDS_ACTIONTEXT_FileDirSize3##</td></row>
+ <row><td>PatchFiles</td><td>##IDS_ACTIONTEXT_PatchingFiles##</td><td>##IDS_ACTIONTEXT_FileDirSize4##</td></row>
+ <row><td>ProcessComponents</td><td>##IDS_ACTIONTEXT_UpdateComponentRegistration##</td><td/></row>
+ <row><td>PublishComponents</td><td>##IDS_ACTIONTEXT_PublishingQualifiedComponents##</td><td>##IDS_ACTIONTEXT_ComponentIDQualifier##</td></row>
+ <row><td>PublishFeatures</td><td>##IDS_ACTIONTEXT_PublishProductFeatures##</td><td>##IDS_ACTIONTEXT_FeatureColon##</td></row>
+ <row><td>PublishProduct</td><td>##IDS_ACTIONTEXT_PublishProductInfo##</td><td/></row>
+ <row><td>RMCCPSearch</td><td>##IDS_ACTIONTEXT_SearchingQualifyingProducts##</td><td/></row>
+ <row><td>RegisterClassInfo</td><td>##IDS_ACTIONTEXT_RegisterClassServer##</td><td>##IDS_ACTIONTEXT_ClassId##</td></row>
+ <row><td>RegisterComPlus</td><td>##IDS_ACTIONTEXT_RegisteringComPlus##</td><td>##IDS_ACTIONTEXT_AppIdAppTypeRSN##</td></row>
+ <row><td>RegisterExtensionInfo</td><td>##IDS_ACTIONTEXT_RegisterExtensionServers##</td><td>##IDS_ACTIONTEXT_Extension2##</td></row>
+ <row><td>RegisterFonts</td><td>##IDS_ACTIONTEXT_RegisterFonts##</td><td>##IDS_ACTIONTEXT_Font##</td></row>
+ <row><td>RegisterMIMEInfo</td><td>##IDS_ACTIONTEXT_RegisterMimeInfo##</td><td>##IDS_ACTIONTEXT_ContentTypeExtension##</td></row>
+ <row><td>RegisterProduct</td><td>##IDS_ACTIONTEXT_RegisteringProduct##</td><td>##IDS_ACTIONTEXT_1b##</td></row>
+ <row><td>RegisterProgIdInfo</td><td>##IDS_ACTIONTEXT_RegisteringProgIdentifiers##</td><td>##IDS_ACTIONTEXT_ProgID2##</td></row>
+ <row><td>RegisterTypeLibraries</td><td>##IDS_ACTIONTEXT_RegisterTypeLibs##</td><td>##IDS_ACTIONTEXT_LibId##</td></row>
+ <row><td>RegisterUser</td><td>##IDS_ACTIONTEXT_RegUser##</td><td>##IDS_ACTIONTEXT_1c##</td></row>
+ <row><td>RemoveDuplicateFiles</td><td>##IDS_ACTIONTEXT_RemovingDuplicates##</td><td>##IDS_ACTIONTEXT_FileDir##</td></row>
+ <row><td>RemoveEnvironmentStrings</td><td>##IDS_ACTIONTEXT_UpdateEnvironmentStrings##</td><td>##IDS_ACTIONTEXT_NameValueAction2##</td></row>
+ <row><td>RemoveExistingProducts</td><td>##IDS_ACTIONTEXT_RemoveApps##</td><td>##IDS_ACTIONTEXT_AppCommandLine##</td></row>
+ <row><td>RemoveFiles</td><td>##IDS_ACTIONTEXT_RemovingFiles##</td><td>##IDS_ACTIONTEXT_FileDir2##</td></row>
+ <row><td>RemoveFolders</td><td>##IDS_ACTIONTEXT_RemovingFolders##</td><td>##IDS_ACTIONTEXT_Folder1##</td></row>
+ <row><td>RemoveIniValues</td><td>##IDS_ACTIONTEXT_RemovingIni##</td><td>##IDS_ACTIONTEXT_FileSectionKeyValue##</td></row>
+ <row><td>RemoveODBC</td><td>##IDS_ACTIONTEXT_RemovingODBC##</td><td/></row>
+ <row><td>RemoveRegistryValues</td><td>##IDS_ACTIONTEXT_RemovingRegistry##</td><td>##IDS_ACTIONTEXT_KeyName##</td></row>
+ <row><td>RemoveShortcuts</td><td>##IDS_ACTIONTEXT_RemovingShortcuts##</td><td>##IDS_ACTIONTEXT_Shortcut1##</td></row>
+ <row><td>Rollback</td><td>##IDS_ACTIONTEXT_RollingBack##</td><td>##IDS_ACTIONTEXT_1d##</td></row>
+ <row><td>RollbackCleanup</td><td>##IDS_ACTIONTEXT_RemovingBackup##</td><td>##IDS_ACTIONTEXT_File2##</td></row>
+ <row><td>SelfRegModules</td><td>##IDS_ACTIONTEXT_RegisteringModules##</td><td>##IDS_ACTIONTEXT_FileFolder##</td></row>
+ <row><td>SelfUnregModules</td><td>##IDS_ACTIONTEXT_UnregisterModules##</td><td>##IDS_ACTIONTEXT_FileFolder2##</td></row>
+ <row><td>SetODBCFolders</td><td>##IDS_ACTIONTEXT_InitializeODBCDirs##</td><td/></row>
+ <row><td>StartServices</td><td>##IDS_ACTIONTEXT_StartingServices##</td><td>##IDS_ACTIONTEXT_Service3##</td></row>
+ <row><td>StopServices</td><td>##IDS_ACTIONTEXT_StoppingServices##</td><td>##IDS_ACTIONTEXT_Service4##</td></row>
+ <row><td>UnmoveFiles</td><td>##IDS_ACTIONTEXT_RemovingMoved##</td><td>##IDS_ACTIONTEXT_FileDir3##</td></row>
+ <row><td>UnpublishComponents</td><td>##IDS_ACTIONTEXT_UnpublishQualified##</td><td>##IDS_ACTIONTEXT_ComponentIdQualifier2##</td></row>
+ <row><td>UnpublishFeatures</td><td>##IDS_ACTIONTEXT_UnpublishProductFeatures##</td><td>##IDS_ACTIONTEXT_Feature##</td></row>
+ <row><td>UnpublishProduct</td><td>##IDS_ACTIONTEXT_UnpublishingProductInfo##</td><td/></row>
+ <row><td>UnregisterClassInfo</td><td>##IDS_ACTIONTEXT_UnregisterClassServers##</td><td>##IDS_ACTIONTEXT_ClsID##</td></row>
+ <row><td>UnregisterComPlus</td><td>##IDS_ACTIONTEXT_UnregisteringComPlus##</td><td>##IDS_ACTIONTEXT_AppId##</td></row>
+ <row><td>UnregisterExtensionInfo</td><td>##IDS_ACTIONTEXT_UnregisterExtensionServers##</td><td>##IDS_ACTIONTEXT_Extension##</td></row>
+ <row><td>UnregisterFonts</td><td>##IDS_ACTIONTEXT_UnregisteringFonts##</td><td>##IDS_ACTIONTEXT_Font2##</td></row>
+ <row><td>UnregisterMIMEInfo</td><td>##IDS_ACTIONTEXT_UnregisteringMimeInfo##</td><td>##IDS_ACTIONTEXT_ContentTypeExtension2##</td></row>
+ <row><td>UnregisterProgIdInfo</td><td>##IDS_ACTIONTEXT_UnregisteringProgramIds##</td><td>##IDS_ACTIONTEXT_ProgID##</td></row>
+ <row><td>UnregisterTypeLibraries</td><td>##IDS_ACTIONTEXT_UnregTypeLibs##</td><td>##IDS_ACTIONTEXT_Libid2##</td></row>
+ <row><td>WriteEnvironmentStrings</td><td>##IDS_ACTIONTEXT_EnvironmentStrings##</td><td>##IDS_ACTIONTEXT_NameValueAction##</td></row>
+ <row><td>WriteIniValues</td><td>##IDS_ACTIONTEXT_WritingINI##</td><td>##IDS_ACTIONTEXT_FileSectionKeyValue2##</td></row>
+ <row><td>WriteRegistryValues</td><td>##IDS_ACTIONTEXT_WritingRegistry##</td><td>##IDS_ACTIONTEXT_KeyNameValue##</td></row>
+ <row><td>caCreateVRoots</td><td>##IDS_ACTIONTEXT_CreatingIISRoots##</td><td/></row>
+ <row><td>caRemoveVRoots</td><td>##IDS_ACTIONTEXT_RemovingIISRoots##</td><td/></row>
+ </table>
+
+ <table name="AdminExecuteSequence">
+ <col key="yes" def="s72">Action</col>
+ <col def="S255">Condition</col>
+ <col def="I2">Sequence</col>
+ <col def="S255">ISComments</col>
+ <col def="I4">ISAttributes</col>
+ <row><td>CostFinalize</td><td/><td>1000</td><td>CostFinalize</td><td/></row>
+ <row><td>CostInitialize</td><td/><td>800</td><td>CostInitialize</td><td/></row>
+ <row><td>FileCost</td><td/><td>900</td><td>FileCost</td><td/></row>
+ <row><td>InstallAdminPackage</td><td/><td>3900</td><td>InstallAdminPackage</td><td/></row>
+ <row><td>InstallFiles</td><td/><td>4000</td><td>InstallFiles</td><td/></row>
+ <row><td>InstallFinalize</td><td/><td>6600</td><td>InstallFinalize</td><td/></row>
+ <row><td>InstallInitialize</td><td/><td>1500</td><td>InstallInitialize</td><td/></row>
+ <row><td>InstallValidate</td><td/><td>1400</td><td>InstallValidate</td><td/></row>
+ <row><td>ScheduleReboot</td><td>ISSCHEDULEREBOOT</td><td>4010</td><td>ScheduleReboot</td><td/></row>
+ </table>
+
+ <table name="AdminUISequence">
+ <col key="yes" def="s72">Action</col>
+ <col def="S255">Condition</col>
+ <col def="I2">Sequence</col>
+ <col def="S255">ISComments</col>
+ <col def="I4">ISAttributes</col>
+ <row><td>AdminWelcome</td><td/><td>1010</td><td>AdminWelcome</td><td/></row>
+ <row><td>CostFinalize</td><td/><td>1000</td><td>CostFinalize</td><td/></row>
+ <row><td>CostInitialize</td><td/><td>800</td><td>CostInitialize</td><td/></row>
+ <row><td>ExecuteAction</td><td/><td>1300</td><td>ExecuteAction</td><td/></row>
+ <row><td>FileCost</td><td/><td>900</td><td>FileCost</td><td/></row>
+ <row><td>SetupCompleteError</td><td/><td>-3</td><td>SetupCompleteError</td><td/></row>
+ <row><td>SetupCompleteSuccess</td><td/><td>-1</td><td>SetupCompleteSuccess</td><td/></row>
+ <row><td>SetupInitialization</td><td/><td>50</td><td>SetupInitialization</td><td/></row>
+ <row><td>SetupInterrupted</td><td/><td>-2</td><td>SetupInterrupted</td><td/></row>
+ <row><td>SetupProgress</td><td/><td>1020</td><td>SetupProgress</td><td/></row>
+ </table>
+
+ <table name="AdvtExecuteSequence">
+ <col key="yes" def="s72">Action</col>
+ <col def="S255">Condition</col>
+ <col def="I2">Sequence</col>
+ <col def="S255">ISComments</col>
+ <col def="I4">ISAttributes</col>
+ <row><td>CostFinalize</td><td/><td>1000</td><td>CostFinalize</td><td/></row>
+ <row><td>CostInitialize</td><td/><td>800</td><td>CostInitialize</td><td/></row>
+ <row><td>CreateShortcuts</td><td/><td>4500</td><td>CreateShortcuts</td><td/></row>
+ <row><td>InstallFinalize</td><td/><td>6600</td><td>InstallFinalize</td><td/></row>
+ <row><td>InstallInitialize</td><td/><td>1500</td><td>InstallInitialize</td><td/></row>
+ <row><td>InstallValidate</td><td/><td>1400</td><td>InstallValidate</td><td/></row>
+ <row><td>MsiPublishAssemblies</td><td/><td>6250</td><td>MsiPublishAssemblies</td><td/></row>
+ <row><td>PublishComponents</td><td/><td>6200</td><td>PublishComponents</td><td/></row>
+ <row><td>PublishFeatures</td><td/><td>6300</td><td>PublishFeatures</td><td/></row>
+ <row><td>PublishProduct</td><td/><td>6400</td><td>PublishProduct</td><td/></row>
+ <row><td>RegisterClassInfo</td><td/><td>4600</td><td>RegisterClassInfo</td><td/></row>
+ <row><td>RegisterExtensionInfo</td><td/><td>4700</td><td>RegisterExtensionInfo</td><td/></row>
+ <row><td>RegisterMIMEInfo</td><td/><td>4900</td><td>RegisterMIMEInfo</td><td/></row>
+ <row><td>RegisterProgIdInfo</td><td/><td>4800</td><td>RegisterProgIdInfo</td><td/></row>
+ <row><td>RegisterTypeLibraries</td><td/><td>4910</td><td>RegisterTypeLibraries</td><td/></row>
+ <row><td>ScheduleReboot</td><td>ISSCHEDULEREBOOT</td><td>6410</td><td>ScheduleReboot</td><td/></row>
+ </table>
+
+ <table name="AdvtUISequence">
+ <col key="yes" def="s72">Action</col>
+ <col def="S255">Condition</col>
+ <col def="I2">Sequence</col>
+ <col def="S255">ISComments</col>
+ <col def="I4">ISAttributes</col>
+ </table>
+
+ <table name="AppId">
+ <col key="yes" def="s38">AppId</col>
+ <col def="S255">RemoteServerName</col>
+ <col def="S255">LocalService</col>
+ <col def="S255">ServiceParameters</col>
+ <col def="S255">DllSurrogate</col>
+ <col def="I2">ActivateAtStorage</col>
+ <col def="I2">RunAsInteractiveUser</col>
+ </table>
+
+ <table name="AppSearch">
+ <col key="yes" def="s72">Property</col>
+ <col key="yes" def="s72">Signature_</col>
+ <row><td>IISROOTFOLDER</td><td>_IISROOTFOLDER</td></row>
+ <row><td>IIS_VERSION</td><td>_IIS_VERSION</td></row>
+ </table>
+
+ <table name="BBControl">
+ <col key="yes" def="s50">Billboard_</col>
+ <col key="yes" def="s50">BBControl</col>
+ <col def="s50">Type</col>
+ <col def="i2">X</col>
+ <col def="i2">Y</col>
+ <col def="i2">Width</col>
+ <col def="i2">Height</col>
+ <col def="I4">Attributes</col>
+ <col def="L50">Text</col>
+ </table>
+
+ <table name="Billboard">
+ <col key="yes" def="s50">Billboard</col>
+ <col def="s38">Feature_</col>
+ <col def="S50">Action</col>
+ <col def="I2">Ordering</col>
+ </table>
+
+ <table name="Binary">
+ <col key="yes" def="s72">Name</col>
+ <col def="V0">Data</col>
+ <col def="S255">ISBuildSourcePath</col>
+ <row><td>ISSELFREG.DLL</td><td/><td>&lt;ISProductFolder&gt;\redist\language independent\i386\isregsvr.dll</td></row>
+ <row><td>NewBinary1</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\IsDialogBanner.ibd</td></row>
+ <row><td>NewBinary10</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\CompleteSetupIco.ibd</td></row>
+ <row><td>NewBinary11</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\CustomSetupIco.ibd</td></row>
+ <row><td>NewBinary12</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\DestIcon.ibd</td></row>
+ <row><td>NewBinary13</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\NetworkInstall.ico</td></row>
+ <row><td>NewBinary14</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\DontInstall.ico</td></row>
+ <row><td>NewBinary15</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\Install.ico</td></row>
+ <row><td>NewBinary16</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\InstallFirstUse.ico</td></row>
+ <row><td>NewBinary17</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\InstallPartial.ico</td></row>
+ <row><td>NewBinary18</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\InstallStateMenu.ico</td></row>
+ <row><td>NewBinary19</td><td/><td>&lt;ISProjectFolder&gt;\iisfilter.vbs</td></row>
+ <row><td>NewBinary2</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\New.ibd</td></row>
+ <row><td>NewBinary3</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\Up.ibd</td></row>
+ <row><td>NewBinary4</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\WarningIcon.ibd</td></row>
+ <row><td>NewBinary5</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\IsDialogBitmap.ibd</td></row>
+ <row><td>NewBinary6</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\CustomSetupIco.ibd</td></row>
+ <row><td>NewBinary7</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\ReinstIco.ibd</td></row>
+ <row><td>NewBinary8</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\RemoveIco.ibd</td></row>
+ <row><td>NewBinary9</td><td/><td>&lt;ISProductFolder&gt;\Redist\Language Independent\OS Independent\SetupIcon.ibd</td></row>
+ <row><td>SetAllUsers.dll</td><td/><td>&lt;ISProductFolder&gt;\redist\language independent\i386\SetAllUsers.dll</td></row>
+ <row><td>binIISHelper</td><td/><td>&lt;ISProductFolder&gt;\Support\IISHelper.dll</td></row>
+ </table>
+
+ <table name="BindImage">
+ <col key="yes" def="s72">File_</col>
+ <col def="S255">Path</col>
+ </table>
+
+ <table name="CCPSearch">
+ <col key="yes" def="s72">Signature_</col>
+ </table>
+
+ <table name="CheckBox">
+ <col key="yes" def="s72">Property</col>
+ <col def="S64">Value</col>
+ <row><td>ISCHECKFORPRODUCTUPDATES</td><td>1</td></row>
+ <row><td>LAUNCHPROGRAM</td><td>1</td></row>
+ </table>
+
+ <table name="Class">
+ <col key="yes" def="s38">CLSID</col>
+ <col key="yes" def="s32">Context</col>
+ <col key="yes" def="s72">Component_</col>
+ <col def="S255">ProgId_Default</col>
+ <col def="L255">Description</col>
+ <col def="S38">AppId_</col>
+ <col def="S255">FileTypeMask</col>
+ <col def="S72">Icon_</col>
+ <col def="I2">IconIndex</col>
+ <col def="S32">DefInprocHandler</col>
+ <col def="S255">Argument</col>
+ <col def="s38">Feature_</col>
+ <col def="I2">Attributes</col>
+ </table>
+
+ <table name="ComboBox">
+ <col key="yes" def="s72">Property</col>
+ <col key="yes" def="i2">Order</col>
+ <col def="s64">Value</col>
+ <col def="L64">Text</col>
+ <row><td>IS_SQLSERVER_SERVER</td><td>1</td><td>TestValue</td><td/></row>
+ </table>
+
+ <table name="CompLocator">
+ <col key="yes" def="s72">Signature_</col>
+ <col def="s38">ComponentId</col>
+ <col def="I2">Type</col>
+ </table>
+
+ <table name="Complus">
+ <col key="yes" def="s72">Component_</col>
+ <col key="yes" def="I2">ExpType</col>
+ </table>
+
+ <table name="Component">
+ <col key="yes" def="s72">Component</col>
+ <col def="S38">ComponentId</col>
+ <col def="s72">Directory_</col>
+ <col def="i2">Attributes</col>
+ <col def="S255">Condition</col>
+ <col def="S72">KeyPath</col>
+ <col def="I4">ISAttributes</col>
+ <col def="S255">ISComments</col>
+ <col def="S255">ISScanAtBuildFile</col>
+ <col def="S255">ISRegFileToMergeAtBuild</col>
+ <col def="S0">ISDotNetInstallerArgsInstall</col>
+ <col def="S0">ISDotNetInstallerArgsCommit</col>
+ <col def="S0">ISDotNetInstallerArgsUninstall</col>
+ <col def="S0">ISDotNetInstallerArgsRollback</col>
+ <row><td>AllOtherFiles</td><td>{01621138-5B6F-47D3-B183-8F6107690955}</td><td>BIN</td><td>8</td><td/><td/><td>17</td><td/><td/><td/><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td></row>
+ <row><td>AllOtherFiles1</td><td>{918FECBF-6B1D-4648-A0C9-BAE694AB1DF3}</td><td>CONF</td><td>8</td><td/><td/><td>17</td><td/><td/><td/><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td></row>
+ <row><td>AllOtherFiles10</td><td>{E461BDCC-5045-469B-96DF-CDB381D7413E}</td><td>BIN</td><td>8</td><td/><td/><td>17</td><td/><td/><td/><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td></row>
+ <row><td>AllOtherFiles11</td><td>{BE301E37-3373-4655-B6E0-B39ACCEC85DB}</td><td>BIN</td><td>8</td><td/><td/><td>17</td><td/><td/><td/><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td></row>
+ <row><td>AllOtherFiles12</td><td>{CEBD938A-39BA-4ACD-94F4-E87FF5D65383}</td><td>LOG</td><td>8</td><td/><td/><td>17</td><td/><td/><td/><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td></row>
+ <row><td>AllOtherFiles2</td><td>{BC4C5E05-7E81-40D6-A477-29D1658190F8}</td><td>LOG</td><td>8</td><td/><td/><td>17</td><td/><td/><td/><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td></row>
+ <row><td>AllOtherFiles3</td><td>{66FFA73A-17D7-46D7-911F-3E515C813FFC}</td><td>INSTALLDIR</td><td>8</td><td/><td/><td>17</td><td/><td/><td/><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td></row>
+ <row><td>AllOtherFiles4</td><td>{F7546761-05DF-4ED7-9F6D-854F42CE2333}</td><td>INSTALLDIR</td><td>8</td><td/><td/><td>145</td><td/><td/><td/><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td></row>
+ <row><td>AllOtherFiles5</td><td>{56403C1F-20CA-423C-A296-D95AB3E1E7FF}</td><td>CONF</td><td>8</td><td/><td/><td>17</td><td/><td/><td/><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td></row>
+ <row><td>AllOtherFiles6</td><td>{2D786CD4-E0CB-47FF-9981-F3F1FC266B1A}</td><td>INSTALLDIR</td><td>8</td><td/><td/><td>17</td><td/><td/><td/><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td></row>
+ <row><td>AllOtherFiles7</td><td>{990D5874-56BB-457E-A316-C048C7AF214A}</td><td>INSTALLDIR</td><td>8</td><td/><td/><td>17</td><td/><td/><td/><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td></row>
+ <row><td>AllOtherFiles8</td><td>{C8EC2CC3-13A1-4EED-B195-D44739A00048}</td><td>BIN</td><td>8</td><td/><td/><td>145</td><td/><td/><td/><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td></row>
+ <row><td>AllOtherFiles9</td><td>{80382F22-06B4-4290-B60B-908D38ECBA4D}</td><td>CONF</td><td>8</td><td/><td/><td>17</td><td/><td/><td/><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td></row>
+ <row><td>ISRegistryComponent</td><td>{60AC5270-5430-4CC4-AF22-BE198804A039}</td><td>INSTALLDIR</td><td>8</td><td/><td/><td>17</td><td/><td/><td/><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td></row>
+ <row><td>ISRegistryComponent1</td><td>{695FA56F-E422-429B-AA91-884E5F5DEDCF}</td><td>INSTALLDIR</td><td>8</td><td/><td/><td>17</td><td/><td/><td/><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td></row>
+ <row><td>VirtualDirComponent</td><td>{F2BD5AC6-AB0C-4ED5-889E-148870C25009}</td><td>INSTALLDIR</td><td>8</td><td/><td/><td>17</td><td/><td/><td/><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td><td>/LogFile=</td></row>
+ </table>
+
+ <table name="Condition">
+ <col key="yes" def="s38">Feature_</col>
+ <col key="yes" def="i2">Level</col>
+ <col def="S255">Condition</col>
+ </table>
+
+ <table name="Control">
+ <col key="yes" def="s72">Dialog_</col>
+ <col key="yes" def="s50">Control</col>
+ <col def="s20">Type</col>
+ <col def="i2">X</col>
+ <col def="i2">Y</col>
+ <col def="i2">Width</col>
+ <col def="i2">Height</col>
+ <col def="I4">Attributes</col>
+ <col def="S72">Property</col>
+ <col def="L0">Text</col>
+ <col def="S50">Control_Next</col>
+ <col def="L50">Help</col>
+ <col def="I4">ISWindowStyle</col>
+ <col def="I4">ISControlId</col>
+ <col def="S255">ISBuildSourcePath</col>
+ <col def="S72">Binary_</col>
+ <row><td>AdminChangeFolder</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+ <row><td>AdminChangeFolder</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>AdminChangeFolder</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>AdminChangeFolder</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>AdminChangeFolder</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>ComboText</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>AdminChangeFolder</td><td>Combo</td><td>DirectoryCombo</td><td>21</td><td>64</td><td>277</td><td>80</td><td>458755</td><td>TARGETDIR</td><td>##IDS__IsAdminInstallBrowse_4##</td><td>Up</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>AdminChangeFolder</td><td>ComboText</td><td>Text</td><td>21</td><td>50</td><td>99</td><td>14</td><td>3</td><td/><td>##IDS__IsAdminInstallBrowse_LookIn##</td><td>Combo</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>AdminChangeFolder</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsAdminInstallBrowse_BrowseDestination##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>AdminChangeFolder</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>AdminChangeFolder</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsAdminInstallBrowse_ChangeDestination##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>AdminChangeFolder</td><td>List</td><td>DirectoryList</td><td>21</td><td>90</td><td>332</td><td>97</td><td>7</td><td>TARGETDIR</td><td>##IDS__IsAdminInstallBrowse_8##</td><td>TailText</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>AdminChangeFolder</td><td>NewFolder</td><td>PushButton</td><td>335</td><td>66</td><td>19</td><td>19</td><td>3670019</td><td/><td/><td>List</td><td>##IDS__IsAdminInstallBrowse_CreateFolder##</td><td>0</td><td/><td/><td>NewBinary2</td></row>
+ <row><td>AdminChangeFolder</td><td>OK</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_OK##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>AdminChangeFolder</td><td>Tail</td><td>PathEdit</td><td>21</td><td>207</td><td>332</td><td>17</td><td>3</td><td>TARGETDIR</td><td>##IDS__IsAdminInstallBrowse_11##</td><td>OK</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>AdminChangeFolder</td><td>TailText</td><td>Text</td><td>21</td><td>193</td><td>99</td><td>13</td><td>3</td><td/><td>##IDS__IsAdminInstallBrowse_FolderName##</td><td>Tail</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>AdminChangeFolder</td><td>Up</td><td>PushButton</td><td>310</td><td>66</td><td>19</td><td>19</td><td>3670019</td><td/><td/><td>NewFolder</td><td>##IDS__IsAdminInstallBrowse_UpOneLevel##</td><td>0</td><td/><td/><td>NewBinary3</td></row>
+ <row><td>AdminNetworkLocation</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_BACK##</td><td>InstallNow</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>AdminNetworkLocation</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+ <row><td>AdminNetworkLocation</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>AdminNetworkLocation</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>AdminNetworkLocation</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>AdminNetworkLocation</td><td>Browse</td><td>PushButton</td><td>286</td><td>124</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsAdminInstallPoint_Change##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>AdminNetworkLocation</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>SetupPathEdit</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>AdminNetworkLocation</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsAdminInstallPoint_SpecifyNetworkLocation##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>AdminNetworkLocation</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>AdminNetworkLocation</td><td>DlgText</td><td>Text</td><td>21</td><td>51</td><td>326</td><td>40</td><td>3</td><td/><td>##IDS__IsAdminInstallPoint_EnterNetworkLocation##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>AdminNetworkLocation</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsAdminInstallPoint_NetworkLocationFormatted##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>AdminNetworkLocation</td><td>InstallNow</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsAdminInstallPoint_Install##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>AdminNetworkLocation</td><td>LBBrowse</td><td>Text</td><td>21</td><td>90</td><td>100</td><td>10</td><td>3</td><td/><td>##IDS__IsAdminInstallPoint_NetworkLocation##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>AdminNetworkLocation</td><td>SetupPathEdit</td><td>PathEdit</td><td>21</td><td>102</td><td>330</td><td>17</td><td>3</td><td>TARGETDIR</td><td/><td>Browse</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>AdminWelcome</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>1</td><td/><td>##IDS_BACK##</td><td>Next</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>AdminWelcome</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>AdminWelcome</td><td>DlgLine</td><td>Line</td><td>0</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>AdminWelcome</td><td>Image</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>234</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary5</td></row>
+ <row><td>AdminWelcome</td><td>Next</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_NEXT##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>AdminWelcome</td><td>TextLine1</td><td>Text</td><td>135</td><td>8</td><td>225</td><td>45</td><td>65539</td><td/><td>##IDS__IsAdminInstallPointWelcome_Wizard##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>AdminWelcome</td><td>TextLine2</td><td>Text</td><td>135</td><td>55</td><td>228</td><td>45</td><td>65539</td><td/><td>##IDS__IsAdminInstallPointWelcome_ServerImage##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CancelSetup</td><td>Icon</td><td>Icon</td><td>15</td><td>15</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary4</td></row>
+ <row><td>CancelSetup</td><td>No</td><td>PushButton</td><td>135</td><td>57</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsCancelDlg_No##</td><td>Yes</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CancelSetup</td><td>Text</td><td>Text</td><td>48</td><td>15</td><td>194</td><td>30</td><td>3</td><td/><td>##IDS__IsCancelDlg_ConfirmCancel##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CancelSetup</td><td>Yes</td><td>PushButton</td><td>62</td><td>57</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsCancelDlg_Yes##</td><td>No</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomSetup</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_BACK##</td><td>Next</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomSetup</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+ <row><td>CustomSetup</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomSetup</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomSetup</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomSetup</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>Tree</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomSetup</td><td>ChangeFolder</td><td>PushButton</td><td>301</td><td>203</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsCustomSelectionDlg_Change##</td><td>Help</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomSetup</td><td>Details</td><td>PushButton</td><td>93</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsCustomSelectionDlg_Space##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomSetup</td><td>DlgDesc</td><td>Text</td><td>17</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsCustomSelectionDlg_SelectFeatures##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomSetup</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomSetup</td><td>DlgText</td><td>Text</td><td>9</td><td>51</td><td>360</td><td>10</td><td>3</td><td/><td>##IDS__IsCustomSelectionDlg_ClickFeatureIcon##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomSetup</td><td>DlgTitle</td><td>Text</td><td>9</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsCustomSelectionDlg_CustomSetup##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomSetup</td><td>FeatureGroup</td><td>GroupBox</td><td>235</td><td>67</td><td>131</td><td>120</td><td>1</td><td/><td>##IDS__IsCustomSelectionDlg_FeatureDescription##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomSetup</td><td>Help</td><td>PushButton</td><td>22</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsCustomSelectionDlg_Help##</td><td>Details</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomSetup</td><td>InstallLabel</td><td>Text</td><td>8</td><td>190</td><td>360</td><td>10</td><td>3</td><td/><td>##IDS__IsCustomSelectionDlg_InstallTo##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomSetup</td><td>ItemDescription</td><td>Text</td><td>241</td><td>80</td><td>120</td><td>50</td><td>3</td><td/><td>##IDS__IsCustomSelectionDlg_MultilineDescription##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomSetup</td><td>Location</td><td>Text</td><td>8</td><td>203</td><td>291</td><td>20</td><td>3</td><td/><td>##IDS__IsCustomSelectionDlg_FeaturePath##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomSetup</td><td>Next</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_NEXT##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomSetup</td><td>Size</td><td>Text</td><td>241</td><td>133</td><td>120</td><td>50</td><td>3</td><td/><td>##IDS__IsCustomSelectionDlg_FeatureSize##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomSetup</td><td>Tree</td><td>SelectionTree</td><td>8</td><td>70</td><td>220</td><td>118</td><td>7</td><td>_BrowseProperty</td><td/><td>ChangeFolder</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomSetupTips</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+ <row><td>CustomSetupTips</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomSetupTips</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomSetupTips</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomSetupTips</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS_SetupTips_CustomSetupDescription##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomSetupTips</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomSetupTips</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS_SetupTips_CustomSetup##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomSetupTips</td><td>DontInstall</td><td>Icon</td><td>21</td><td>155</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary14</td></row>
+ <row><td>CustomSetupTips</td><td>DontInstallText</td><td>Text</td><td>60</td><td>155</td><td>300</td><td>20</td><td>3</td><td/><td>##IDS_SetupTips_WillNotBeInstalled##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomSetupTips</td><td>FirstInstallText</td><td>Text</td><td>60</td><td>180</td><td>300</td><td>20</td><td>3</td><td/><td>##IDS_SetupTips_Advertise##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomSetupTips</td><td>Install</td><td>Icon</td><td>21</td><td>105</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary15</td></row>
+ <row><td>CustomSetupTips</td><td>InstallFirstUse</td><td>Icon</td><td>21</td><td>180</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary16</td></row>
+ <row><td>CustomSetupTips</td><td>InstallPartial</td><td>Icon</td><td>21</td><td>130</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary17</td></row>
+ <row><td>CustomSetupTips</td><td>InstallStateMenu</td><td>Icon</td><td>21</td><td>52</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary18</td></row>
+ <row><td>CustomSetupTips</td><td>InstallStateText</td><td>Text</td><td>21</td><td>91</td><td>300</td><td>10</td><td>3</td><td/><td>##IDS_SetupTips_InstallState##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomSetupTips</td><td>InstallText</td><td>Text</td><td>60</td><td>105</td><td>300</td><td>20</td><td>3</td><td/><td>##IDS_SetupTips_AllInstalledLocal##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomSetupTips</td><td>MenuText</td><td>Text</td><td>50</td><td>52</td><td>300</td><td>36</td><td>3</td><td/><td>##IDS_SetupTips_IconInstallState##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomSetupTips</td><td>NetworkInstall</td><td>Icon</td><td>21</td><td>205</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary13</td></row>
+ <row><td>CustomSetupTips</td><td>NetworkInstallText</td><td>Text</td><td>60</td><td>205</td><td>300</td><td>20</td><td>3</td><td/><td>##IDS_SetupTips_Network##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomSetupTips</td><td>OK</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_SetupTips_OK##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomSetupTips</td><td>PartialText</td><td>Text</td><td>60</td><td>130</td><td>300</td><td>20</td><td>3</td><td/><td>##IDS_SetupTips_SubFeaturesInstalledLocal##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomerInformation</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_BACK##</td><td>Next</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomerInformation</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+ <row><td>CustomerInformation</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomerInformation</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomerInformation</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomerInformation</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>NameLabel</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomerInformation</td><td>CompanyEdit</td><td>Edit</td><td>21</td><td>100</td><td>237</td><td>17</td><td>3</td><td>COMPANYNAME</td><td>##IDS__IsRegisterUserDlg_Tahoma80##</td><td>SerialLabel</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomerInformation</td><td>CompanyLabel</td><td>Text</td><td>21</td><td>89</td><td>75</td><td>10</td><td>3</td><td/><td>##IDS__IsRegisterUserDlg_Organization##</td><td>CompanyEdit</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomerInformation</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsRegisterUserDlg_PleaseEnterInfo##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomerInformation</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomerInformation</td><td>DlgRadioGroupText</td><td>Text</td><td>21</td><td>161</td><td>300</td><td>14</td><td>3</td><td/><td>##IDS__IsRegisterUserDlg_InstallFor##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomerInformation</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsRegisterUserDlg_CustomerInformation##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomerInformation</td><td>NameEdit</td><td>Edit</td><td>21</td><td>63</td><td>237</td><td>17</td><td>3</td><td>USERNAME</td><td>##IDS__IsRegisterUserDlg_Tahoma50##</td><td>CompanyLabel</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomerInformation</td><td>NameLabel</td><td>Text</td><td>21</td><td>52</td><td>75</td><td>10</td><td>3</td><td/><td>##IDS__IsRegisterUserDlg_UserName##</td><td>NameEdit</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomerInformation</td><td>Next</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_NEXT##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomerInformation</td><td>RadioGroup</td><td>RadioButtonGroup</td><td>63</td><td>170</td><td>300</td><td>50</td><td>3</td><td>ApplicationUsers</td><td>##IDS__IsRegisterUserDlg_16##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomerInformation</td><td>SerialLabel</td><td>Text</td><td>21</td><td>127</td><td>109</td><td>10</td><td>2</td><td/><td>##IDS__IsRegisterUserDlg_SerialNumber##</td><td>SerialNumber</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>CustomerInformation</td><td>SerialNumber</td><td>MaskedEdit</td><td>21</td><td>138</td><td>237</td><td>17</td><td>2</td><td>ISX_SERIALNUM</td><td/><td>RadioGroup</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>DatabaseFolder</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_BACK##</td><td>Next</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>DatabaseFolder</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+ <row><td>DatabaseFolder</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>DatabaseFolder</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>DatabaseFolder</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>DatabaseFolder</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>ChangeFolder</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>DatabaseFolder</td><td>ChangeFolder</td><td>PushButton</td><td>301</td><td>65</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CHANGE##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>DatabaseFolder</td><td>DatabaseFolder</td><td>Icon</td><td>21</td><td>52</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary12</td></row>
+ <row><td>DatabaseFolder</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__DatabaseFolder_ChangeFolder##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>DatabaseFolder</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>DatabaseFolder</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__DatabaseFolder_DatabaseFolder##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>DatabaseFolder</td><td>LocLabel</td><td>Text</td><td>57</td><td>52</td><td>290</td><td>10</td><td>3</td><td/><td>##IDS_DatabaseFolder_InstallDatabaseTo##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>DatabaseFolder</td><td>Location</td><td>Text</td><td>57</td><td>65</td><td>240</td><td>40</td><td>3</td><td>_BrowseProperty</td><td>##IDS__DatabaseFolder_DatabaseDir##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>DatabaseFolder</td><td>Next</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_NEXT##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>DestinationFolder</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_BACK##</td><td>Next</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>DestinationFolder</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+ <row><td>DestinationFolder</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>DestinationFolder</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>DestinationFolder</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>DestinationFolder</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>ChangeFolder</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>DestinationFolder</td><td>ChangeFolder</td><td>PushButton</td><td>301</td><td>65</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__DestinationFolder_Change##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>DestinationFolder</td><td>DestFolder</td><td>Icon</td><td>21</td><td>52</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary12</td></row>
+ <row><td>DestinationFolder</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__DestinationFolder_ChangeFolder##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>DestinationFolder</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>DestinationFolder</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__DestinationFolder_DestinationFolder##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>DestinationFolder</td><td>LocLabel</td><td>Text</td><td>57</td><td>52</td><td>290</td><td>10</td><td>3</td><td/><td>##IDS__DestinationFolder_InstallTo##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>DestinationFolder</td><td>Location</td><td>Text</td><td>57</td><td>65</td><td>240</td><td>40</td><td>3</td><td>_BrowseProperty</td><td>##IDS_INSTALLDIR##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>DestinationFolder</td><td>Next</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_NEXT##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>DiskSpaceRequirements</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+ <row><td>DiskSpaceRequirements</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>DiskSpaceRequirements</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>DiskSpaceRequirements</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>DiskSpaceRequirements</td><td>DlgDesc</td><td>Text</td><td>17</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsFeatureDetailsDlg_SpaceRequired##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>DiskSpaceRequirements</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>DiskSpaceRequirements</td><td>DlgText</td><td>Text</td><td>10</td><td>185</td><td>358</td><td>41</td><td>3</td><td/><td>##IDS__IsFeatureDetailsDlg_VolumesTooSmall##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>DiskSpaceRequirements</td><td>DlgTitle</td><td>Text</td><td>9</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsFeatureDetailsDlg_DiskSpaceRequirements##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>DiskSpaceRequirements</td><td>List</td><td>VolumeCostList</td><td>8</td><td>55</td><td>358</td><td>125</td><td>393223</td><td/><td>##IDS__IsFeatureDetailsDlg_Numbers##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>DiskSpaceRequirements</td><td>OK</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsFeatureDetailsDlg_OK##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>FilesInUse</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+ <row><td>FilesInUse</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>FilesInUse</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>FilesInUse</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>FilesInUse</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsFilesInUse_FilesInUseMessage##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>FilesInUse</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>FilesInUse</td><td>DlgText</td><td>Text</td><td>21</td><td>51</td><td>348</td><td>29</td><td>3</td><td/><td>##IDS__IsFilesInUse_ApplicationsUsingFiles##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>FilesInUse</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsFilesInUse_FilesInUse##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>FilesInUse</td><td>Exit</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsFilesInUse_Exit##</td><td>List</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>FilesInUse</td><td>Ignore</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsFilesInUse_Ignore##</td><td>Exit</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>FilesInUse</td><td>List</td><td>ListBox</td><td>21</td><td>87</td><td>331</td><td>135</td><td>7</td><td>FileInUseProcess</td><td/><td>Retry</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>FilesInUse</td><td>Retry</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsFilesInUse_Retry##</td><td>Ignore</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>InstallChangeFolder</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+ <row><td>InstallChangeFolder</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>InstallChangeFolder</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>InstallChangeFolder</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>InstallChangeFolder</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>ComboText</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>InstallChangeFolder</td><td>Combo</td><td>DirectoryCombo</td><td>21</td><td>64</td><td>277</td><td>80</td><td>4128779</td><td>_BrowseProperty</td><td>##IDS__IsBrowseFolderDlg_4##</td><td>Up</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>InstallChangeFolder</td><td>ComboText</td><td>Text</td><td>21</td><td>50</td><td>99</td><td>14</td><td>3</td><td/><td>##IDS__IsBrowseFolderDlg_LookIn##</td><td>Combo</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>InstallChangeFolder</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsBrowseFolderDlg_BrowseDestFolder##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>InstallChangeFolder</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>InstallChangeFolder</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsBrowseFolderDlg_ChangeCurrentFolder##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>InstallChangeFolder</td><td>List</td><td>DirectoryList</td><td>21</td><td>90</td><td>332</td><td>97</td><td>15</td><td>_BrowseProperty</td><td>##IDS__IsBrowseFolderDlg_8##</td><td>TailText</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>InstallChangeFolder</td><td>NewFolder</td><td>PushButton</td><td>335</td><td>66</td><td>19</td><td>19</td><td>3670019</td><td/><td/><td>List</td><td>##IDS__IsBrowseFolderDlg_CreateFolder##</td><td>0</td><td/><td/><td>NewBinary2</td></row>
+ <row><td>InstallChangeFolder</td><td>OK</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsBrowseFolderDlg_OK##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>InstallChangeFolder</td><td>Tail</td><td>PathEdit</td><td>21</td><td>207</td><td>332</td><td>17</td><td>15</td><td>_BrowseProperty</td><td>##IDS__IsBrowseFolderDlg_11##</td><td>OK</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>InstallChangeFolder</td><td>TailText</td><td>Text</td><td>21</td><td>193</td><td>99</td><td>13</td><td>3</td><td/><td>##IDS__IsBrowseFolderDlg_FolderName##</td><td>Tail</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>InstallChangeFolder</td><td>Up</td><td>PushButton</td><td>310</td><td>66</td><td>19</td><td>19</td><td>3670019</td><td/><td/><td>NewFolder</td><td>##IDS__IsBrowseFolderDlg_UpOneLevel##</td><td>0</td><td/><td/><td>NewBinary3</td></row>
+ <row><td>InstallWelcome</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>1</td><td/><td>##IDS_BACK##</td><td>Copyright</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>InstallWelcome</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>InstallWelcome</td><td>Copyright</td><td>Text</td><td>135</td><td>144</td><td>228</td><td>73</td><td>65539</td><td/><td>##IDS__IsWelcomeDlg_WarningCopyright##</td><td>Next</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>InstallWelcome</td><td>DlgLine</td><td>Line</td><td>0</td><td>234</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>InstallWelcome</td><td>Image</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>234</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary5</td></row>
+ <row><td>InstallWelcome</td><td>Next</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_NEXT##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>InstallWelcome</td><td>TextLine1</td><td>Text</td><td>135</td><td>8</td><td>225</td><td>45</td><td>65539</td><td/><td>##IDS__IsWelcomeDlg_WelcomeProductName##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>InstallWelcome</td><td>TextLine2</td><td>Text</td><td>135</td><td>55</td><td>228</td><td>45</td><td>65539</td><td/><td>##IDS__IsWelcomeDlg_InstallProductName##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>LicenseAgreement</td><td>Agree</td><td>RadioButtonGroup</td><td>8</td><td>190</td><td>291</td><td>40</td><td>3</td><td>AgreeToLicense</td><td/><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>LicenseAgreement</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_BACK##</td><td>Next</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>LicenseAgreement</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+ <row><td>LicenseAgreement</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>LicenseAgreement</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>LicenseAgreement</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>LicenseAgreement</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>ISPrintButton</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>LicenseAgreement</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsLicenseDlg_ReadLicenseAgreement##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>LicenseAgreement</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>LicenseAgreement</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsLicenseDlg_LicenseAgreement##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>LicenseAgreement</td><td>ISPrintButton</td><td>PushButton</td><td>301</td><td>188</td><td>65</td><td>17</td><td>3</td><td/><td>##IDS_PRINT_BUTTON##</td><td>Agree</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>LicenseAgreement</td><td>Memo</td><td>ScrollableText</td><td>8</td><td>55</td><td>358</td><td>130</td><td>7</td><td/><td/><td/><td/><td>0</td><td/><td>&lt;ISProjectFolder&gt;\License.rtf</td><td/></row>
+ <row><td>LicenseAgreement</td><td>Next</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_NEXT##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>MaintenanceType</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_BACK##</td><td>Next</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>MaintenanceType</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+ <row><td>MaintenanceType</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>MaintenanceType</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>MaintenanceType</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>MaintenanceType</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>RadioGroup</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>MaintenanceType</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsMaintenanceDlg_MaitenanceOptions##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>MaintenanceType</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>MaintenanceType</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsMaintenanceDlg_ProgramMaintenance##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>MaintenanceType</td><td>Ico1</td><td>Icon</td><td>35</td><td>75</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary6</td></row>
+ <row><td>MaintenanceType</td><td>Ico2</td><td>Icon</td><td>35</td><td>135</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary7</td></row>
+ <row><td>MaintenanceType</td><td>Ico3</td><td>Icon</td><td>35</td><td>195</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary8</td></row>
+ <row><td>MaintenanceType</td><td>Next</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_NEXT##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>MaintenanceType</td><td>RadioGroup</td><td>RadioButtonGroup</td><td>21</td><td>55</td><td>290</td><td>170</td><td>3</td><td>_IsMaintenance</td><td>##IDS__IsMaintenanceDlg_11##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>MaintenanceType</td><td>Text1</td><td>Text</td><td>80</td><td>72</td><td>260</td><td>35</td><td>3</td><td/><td>##IDS__IsMaintenanceDlg_ChangeFeatures##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>MaintenanceType</td><td>Text2</td><td>Text</td><td>80</td><td>135</td><td>260</td><td>35</td><td>3</td><td/><td>##IDS__IsMaintenanceDlg_RepairMessage##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>MaintenanceType</td><td>Text3</td><td>Text</td><td>80</td><td>192</td><td>260</td><td>35</td><td>3</td><td/><td>##IDS__IsMaintenanceDlg_RemoveProductName##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>MaintenanceWelcome</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>1</td><td/><td>##IDS_BACK##</td><td>Next</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>MaintenanceWelcome</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>MaintenanceWelcome</td><td>DlgLine</td><td>Line</td><td>0</td><td>234</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>MaintenanceWelcome</td><td>Image</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>234</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary5</td></row>
+ <row><td>MaintenanceWelcome</td><td>Next</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_NEXT##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>MaintenanceWelcome</td><td>TextLine1</td><td>Text</td><td>135</td><td>8</td><td>225</td><td>45</td><td>65539</td><td/><td>##IDS__IsMaintenanceWelcome_WizardWelcome##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>MaintenanceWelcome</td><td>TextLine2</td><td>Text</td><td>135</td><td>55</td><td>228</td><td>50</td><td>65539</td><td/><td>##IDS__IsMaintenanceWelcome_MaintenanceOptionsDescription##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>OutOfSpace</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+ <row><td>OutOfSpace</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>OutOfSpace</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>OutOfSpace</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>OutOfSpace</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsDiskSpaceDlg_DiskSpace##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>OutOfSpace</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>OutOfSpace</td><td>DlgText</td><td>Text</td><td>21</td><td>51</td><td>326</td><td>43</td><td>3</td><td/><td>##IDS__IsDiskSpaceDlg_HighlightedVolumes##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>OutOfSpace</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsDiskSpaceDlg_OutOfDiskSpace##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>OutOfSpace</td><td>List</td><td>VolumeCostList</td><td>21</td><td>95</td><td>332</td><td>120</td><td>393223</td><td/><td>##IDS__IsDiskSpaceDlg_Numbers##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>OutOfSpace</td><td>Resume</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsDiskSpaceDlg_OK##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>PatchWelcome</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>1</td><td/><td>##IDS_BACK##</td><td>Next</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>PatchWelcome</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>PatchWelcome</td><td>DlgLine</td><td>Line</td><td>0</td><td>234</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>PatchWelcome</td><td>Image</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>234</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary5</td></row>
+ <row><td>PatchWelcome</td><td>Next</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsPatchDlg_Update##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>PatchWelcome</td><td>TextLine1</td><td>Text</td><td>135</td><td>8</td><td>225</td><td>45</td><td>65539</td><td/><td>##IDS__IsPatchDlg_WelcomePatchWizard##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>PatchWelcome</td><td>TextLine2</td><td>Text</td><td>135</td><td>54</td><td>228</td><td>45</td><td>65539</td><td/><td>##IDS__IsPatchDlg_PatchClickUpdate##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>ReadyToInstall</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_BACK##</td><td>InstallNow</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>ReadyToInstall</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+ <row><td>ReadyToInstall</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>ReadyToInstall</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>ReadyToInstall</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>ReadyToInstall</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>ReadyToInstall</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsVerifyReadyDlg_WizardReady##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>ReadyToInstall</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>ReadyToInstall</td><td>DlgText</td><td>Text</td><td>21</td><td>51</td><td>326</td><td>20</td><td>3</td><td/><td>##IDS__IsVerifyReadyDlg_ClickInstall##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>ReadyToInstall</td><td>DlgText1</td><td>Text</td><td>21</td><td>70</td><td>330</td><td>24</td><td>3</td><td/><td>##IDS__IsVerifyReadyDlg_BackOrCancel##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>ReadyToInstall</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65538</td><td/><td>##IDS__IsVerifyReadyDlg_ModifyReady##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>ReadyToInstall</td><td>DlgTitle2</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65538</td><td/><td>##IDS__IsVerifyReadyDlg_ReadyRepair##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>ReadyToInstall</td><td>DlgTitle3</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65538</td><td/><td>##IDS__IsVerifyReadyDlg_ReadyInstall##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>ReadyToInstall</td><td>InstallNow</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsVerifyReadyDlg_Install##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>ReadyToRemove</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_BACK##</td><td>RemoveNow</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>ReadyToRemove</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+ <row><td>ReadyToRemove</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>ReadyToRemove</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>ReadyToRemove</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>ReadyToRemove</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>ReadyToRemove</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsVerifyRemoveAllDlg_ChoseRemoveProgram##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>ReadyToRemove</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>ReadyToRemove</td><td>DlgText</td><td>Text</td><td>21</td><td>51</td><td>326</td><td>24</td><td>3</td><td/><td>##IDS__IsVerifyRemoveAllDlg_ClickRemove##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>ReadyToRemove</td><td>DlgText1</td><td>Text</td><td>21</td><td>79</td><td>330</td><td>23</td><td>3</td><td/><td>##IDS__IsVerifyRemoveAllDlg_ClickBack##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>ReadyToRemove</td><td>DlgText2</td><td>Text</td><td>21</td><td>102</td><td>330</td><td>24</td><td>3</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>ReadyToRemove</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsVerifyRemoveAllDlg_RemoveProgram##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>ReadyToRemove</td><td>RemoveNow</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsVerifyRemoveAllDlg_Remove##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SQLBrowse</td><td>Branding1</td><td>Text</td><td>4</td><td>227</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td>0</td><td/><td/></row>
+ <row><td>SQLBrowse</td><td>Branding2</td><td>Text</td><td>3</td><td>226</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td>0</td><td/><td/></row>
+ <row><td>SQLBrowse</td><td>Cancel</td><td>PushButton</td><td>194</td><td>241</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>TxtSQLBrowse</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SQLBrowse</td><td>DlgLine</td><td>Line</td><td>48</td><td>232</td><td>224</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td>0</td><td/><td/></row>
+ <row><td>SQLBrowse</td><td>OK</td><td>PushButton</td><td>125</td><td>241</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_OK##</td><td>lstSQLServer</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SQLBrowse</td><td>TxtSQLBrowse</td><td>Text</td><td>13</td><td>8</td><td>245</td><td>31</td><td>65539</td><td/><td>##IDS_SQLBROWSE_INTRO##</td><td>OK</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SQLBrowse</td><td>lstSQLServer</td><td>ListBox</td><td>14</td><td>45</td><td>245</td><td>165</td><td>7</td><td>IS_SQLSERVER_LIST</td><td/><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SQLLogin</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_BACK##</td><td>Next</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SQLLogin</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+ <row><td>SQLLogin</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SQLLogin</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SQLLogin</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SQLLogin</td><td>BtnSQLBrowse</td><td>PushButton</td><td>301</td><td>106</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_SQLLOGIN_BROWSE##</td><td>lblAuthentication</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SQLLogin</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>lblServer</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SQLLogin</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS_SQLLOGIN_DESC##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SQLLogin</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SQLLogin</td><td>DlgTitle</td><td>Text</td><td>13</td><td>7</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS_SQLLOGIN_TITLE##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SQLLogin</td><td>EdtLogin</td><td>Edit</td><td>92</td><td>184</td><td>218</td><td>16</td><td>3</td><td>IS_SQLSERVER_USERNAME</td><td/><td>lblPswd</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SQLLogin</td><td>EdtPswd</td><td>Edit</td><td>92</td><td>208</td><td>218</td><td>16</td><td>2097155</td><td>IS_SQLSERVER_PASSWORD</td><td/><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SQLLogin</td><td>Next</td><td>PushButton</td><td>229</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_NEXT##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SQLLogin</td><td>RadioButtonGroup1</td><td>RadioButtonGroup</td><td>25</td><td>145</td><td>343</td><td>34</td><td>3</td><td>IS_SQLSERVER_AUTHENTICATION</td><td/><td>lblLoginID</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SQLLogin</td><td>cboServers</td><td>ComboBox</td><td>18</td><td>106</td><td>278</td><td>80</td><td>65539</td><td>IS_SQLSERVER_SERVER</td><td/><td>BtnSQLBrowse</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SQLLogin</td><td>lblAuthentication</td><td>Text</td><td>18</td><td>129</td><td>334</td><td>14</td><td>131075</td><td/><td>##IDS_SQLLOGIN_CONNECT##</td><td>RadioButtonGroup1</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SQLLogin</td><td>lblLoginID</td><td>Text</td><td>43</td><td>186</td><td>48</td><td>13</td><td>3</td><td/><td>##IDS_SQLLOGIN_ID##</td><td>EdtLogin</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SQLLogin</td><td>lblPswd</td><td>Text</td><td>43</td><td>208</td><td>47</td><td>13</td><td>3</td><td/><td>##IDS_SQLLOGIN_PSWD##</td><td>EdtPswd</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SQLLogin</td><td>lblSQLLoginIntro</td><td>Text</td><td>17</td><td>50</td><td>345</td><td>40</td><td>65539</td><td/><td>##IDS_SQLLOGIN_INTRO##</td><td>cboServers</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SQLLogin</td><td>lblServer</td><td>Text</td><td>18</td><td>92</td><td>88</td><td>14</td><td>3</td><td/><td>##IDS_SQLLOGIN_SERVER##</td><td>lblSQLLoginIntro</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupCompleteError</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>1</td><td/><td>##IDS_BACK##</td><td>Finish</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupCompleteError</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>1</td><td/><td>##IDS_CANCEL##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupCompleteError</td><td>DlgLine</td><td>Line</td><td>0</td><td>234</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupCompleteError</td><td>Finish</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsFatalError_Finish##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupCompleteError</td><td>FinishText1</td><td>Text</td><td>135</td><td>80</td><td>228</td><td>50</td><td>65539</td><td/><td>##IDS__IsFatalError_NotModified##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupCompleteError</td><td>FinishText2</td><td>Text</td><td>135</td><td>135</td><td>228</td><td>25</td><td>65539</td><td/><td>##IDS__IsFatalError_ClickFinish##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupCompleteError</td><td>Image</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>234</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary5</td></row>
+ <row><td>SetupCompleteError</td><td>RestContText1</td><td>Text</td><td>135</td><td>80</td><td>228</td><td>50</td><td>65539</td><td/><td>##IDS__IsFatalError_KeepOrRestore##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupCompleteError</td><td>RestContText2</td><td>Text</td><td>135</td><td>135</td><td>228</td><td>25</td><td>65539</td><td/><td>##IDS__IsFatalError_RestoreOrContinueLater##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupCompleteError</td><td>TextLine1</td><td>Text</td><td>135</td><td>8</td><td>225</td><td>45</td><td>65539</td><td/><td>##IDS__IsFatalError_WizardCompleted##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupCompleteError</td><td>TextLine2</td><td>Text</td><td>135</td><td>55</td><td>228</td><td>25</td><td>65539</td><td/><td>##IDS__IsFatalError_WizardInterrupted##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupCompleteSuccess</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>1</td><td/><td>##IDS_BACK##</td><td>OK</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupCompleteSuccess</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>1</td><td/><td>##IDS_CANCEL##</td><td>Image</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupCompleteSuccess</td><td>CheckBoxUpdates</td><td>CheckBox</td><td>135</td><td>164</td><td>10</td><td>9</td><td>2</td><td>ISCHECKFORPRODUCTUPDATES</td><td>CheckBox1</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupCompleteSuccess</td><td>CheckForUpdatesText</td><td>Text</td><td>152</td><td>162</td><td>190</td><td>30</td><td>65538</td><td/><td>##IDS__IsExitDialog_Update_YesCheckForUpdates##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupCompleteSuccess</td><td>CheckLaunchProgram</td><td>CheckBox</td><td>151</td><td>114</td><td>10</td><td>9</td><td>2</td><td>LAUNCHPROGRAM</td><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupCompleteSuccess</td><td>CheckLaunchReadme</td><td>CheckBox</td><td>151</td><td>148</td><td>10</td><td>9</td><td>2</td><td>LAUNCHREADME</td><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupCompleteSuccess</td><td>DlgLine</td><td>Line</td><td>0</td><td>234</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupCompleteSuccess</td><td>Image</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>234</td><td>1</td><td/><td/><td>CheckBoxUpdates</td><td/><td>0</td><td/><td/><td>NewBinary5</td></row>
+ <row><td>SetupCompleteSuccess</td><td>LaunchProgramText</td><td>Text</td><td>164</td><td>112</td><td>198</td><td>15</td><td>65538</td><td/><td>Launch [ProductName]</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupCompleteSuccess</td><td>LaunchReadmeText</td><td>Text</td><td>164</td><td>148</td><td>198</td><td>13</td><td>65538</td><td/><td>##IDS__IsExitDialog_ShowReadMe##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupCompleteSuccess</td><td>OK</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsExitDialog_Finish##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupCompleteSuccess</td><td>TextLine1</td><td>Text</td><td>135</td><td>8</td><td>225</td><td>45</td><td>65539</td><td/><td>##IDS__IsExitDialog_WizardCompleted##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupCompleteSuccess</td><td>TextLine2</td><td>Text</td><td>135</td><td>55</td><td>228</td><td>45</td><td>65538</td><td/><td>##IDS__IsExitDialog_InstallSuccess##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupCompleteSuccess</td><td>TextLine3</td><td>Text</td><td>135</td><td>55</td><td>228</td><td>45</td><td>65538</td><td/><td>##IDS__IsExitDialog_UninstallSuccess##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupCompleteSuccess</td><td>UpdateTextLine1</td><td>Text</td><td>135</td><td>30</td><td>228</td><td>45</td><td>65538</td><td/><td>##IDS__IsExitDialog_Update_SetupFinished##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupCompleteSuccess</td><td>UpdateTextLine2</td><td>Text</td><td>135</td><td>80</td><td>228</td><td>45</td><td>65538</td><td/><td>##IDS__IsExitDialog_Update_PossibleUpdates##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupCompleteSuccess</td><td>UpdateTextLine3</td><td>Text</td><td>135</td><td>120</td><td>228</td><td>45</td><td>65538</td><td/><td>##IDS__IsExitDialog_Update_InternetConnection##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupError</td><td>A</td><td>PushButton</td><td>192</td><td>80</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsErrorDlg_Abort##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupError</td><td>C</td><td>PushButton</td><td>192</td><td>80</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL2##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupError</td><td>ErrorIcon</td><td>Icon</td><td>15</td><td>15</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary4</td></row>
+ <row><td>SetupError</td><td>ErrorText</td><td>Text</td><td>50</td><td>15</td><td>200</td><td>50</td><td>3</td><td/><td>##IDS__IsErrorDlg_ErrorText##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupError</td><td>I</td><td>PushButton</td><td>192</td><td>80</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsErrorDlg_Ignore##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupError</td><td>N</td><td>PushButton</td><td>192</td><td>80</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsErrorDlg_NO##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupError</td><td>O</td><td>PushButton</td><td>192</td><td>80</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsErrorDlg_OK##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupError</td><td>R</td><td>PushButton</td><td>192</td><td>80</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsErrorDlg_Retry##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupError</td><td>Y</td><td>PushButton</td><td>192</td><td>80</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsErrorDlg_Yes##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupInitialization</td><td>ActionData</td><td>Text</td><td>135</td><td>125</td><td>228</td><td>12</td><td>65539</td><td/><td>##IDS__IsInitDlg_1##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupInitialization</td><td>ActionText</td><td>Text</td><td>135</td><td>109</td><td>220</td><td>36</td><td>65539</td><td/><td>##IDS__IsInitDlg_2##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupInitialization</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>1</td><td/><td>##IDS_BACK##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupInitialization</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupInitialization</td><td>DlgLine</td><td>Line</td><td>0</td><td>234</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupInitialization</td><td>Image</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>234</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary5</td></row>
+ <row><td>SetupInitialization</td><td>Next</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>1</td><td/><td>##IDS_NEXT##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupInitialization</td><td>TextLine1</td><td>Text</td><td>135</td><td>8</td><td>225</td><td>45</td><td>65539</td><td/><td>##IDS__IsInitDlg_WelcomeWizard##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupInitialization</td><td>TextLine2</td><td>Text</td><td>135</td><td>55</td><td>228</td><td>30</td><td>65539</td><td/><td>##IDS__IsInitDlg_PreparingWizard##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupInterrupted</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>1</td><td/><td>##IDS_BACK##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupInterrupted</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>1</td><td/><td>##IDS_CANCEL##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupInterrupted</td><td>DlgLine</td><td>Line</td><td>0</td><td>234</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupInterrupted</td><td>Finish</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS__IsUserExit_Finish##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupInterrupted</td><td>FinishText1</td><td>Text</td><td>135</td><td>80</td><td>228</td><td>50</td><td>65539</td><td/><td>##IDS__IsUserExit_NotModified##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupInterrupted</td><td>FinishText2</td><td>Text</td><td>135</td><td>135</td><td>228</td><td>25</td><td>65539</td><td/><td>##IDS__IsUserExit_ClickFinish##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupInterrupted</td><td>Image</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>234</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary5</td></row>
+ <row><td>SetupInterrupted</td><td>RestContText1</td><td>Text</td><td>135</td><td>80</td><td>228</td><td>50</td><td>65539</td><td/><td>##IDS__IsUserExit_KeepOrRestore##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupInterrupted</td><td>RestContText2</td><td>Text</td><td>135</td><td>135</td><td>228</td><td>25</td><td>65539</td><td/><td>##IDS__IsUserExit_RestoreOrContinue##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupInterrupted</td><td>TextLine1</td><td>Text</td><td>135</td><td>8</td><td>225</td><td>45</td><td>65539</td><td/><td>##IDS__IsUserExit_WizardCompleted##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupInterrupted</td><td>TextLine2</td><td>Text</td><td>135</td><td>55</td><td>228</td><td>25</td><td>65539</td><td/><td>##IDS__IsUserExit_WizardInterrupted##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupProgress</td><td>ActionProgress95</td><td>ProgressBar</td><td>59</td><td>113</td><td>275</td><td>12</td><td>65537</td><td/><td>##IDS__IsProgressDlg_ProgressDone##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupProgress</td><td>ActionText</td><td>Text</td><td>59</td><td>100</td><td>275</td><td>12</td><td>3</td><td/><td>##IDS__IsProgressDlg_2##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupProgress</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>1</td><td/><td>##IDS_BACK##</td><td>Next</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupProgress</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+ <row><td>SetupProgress</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupProgress</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupProgress</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupProgress</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupProgress</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65538</td><td/><td>##IDS__IsProgressDlg_UninstallingFeatures2##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupProgress</td><td>DlgDesc2</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65538</td><td/><td>##IDS__IsProgressDlg_UninstallingFeatures##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupProgress</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupProgress</td><td>DlgText</td><td>Text</td><td>59</td><td>51</td><td>275</td><td>30</td><td>65538</td><td/><td>##IDS__IsProgressDlg_WaitUninstall2##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupProgress</td><td>DlgText2</td><td>Text</td><td>59</td><td>51</td><td>275</td><td>30</td><td>65538</td><td/><td>##IDS__IsProgressDlg_WaitUninstall##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupProgress</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65538</td><td/><td>##IDS__IsProgressDlg_InstallingProductName##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupProgress</td><td>DlgTitle2</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65538</td><td/><td>##IDS__IsProgressDlg_Uninstalling##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupProgress</td><td>LbSec</td><td>Text</td><td>172</td><td>139</td><td>32</td><td>12</td><td>2</td><td/><td>##IDS__IsProgressDlg_SecHidden##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupProgress</td><td>LbStatus</td><td>Text</td><td>59</td><td>85</td><td>70</td><td>12</td><td>3</td><td/><td>##IDS__IsProgressDlg_Status##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupProgress</td><td>Next</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>1</td><td/><td>##IDS_NEXT##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupProgress</td><td>SetupIcon</td><td>Icon</td><td>21</td><td>51</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary9</td></row>
+ <row><td>SetupProgress</td><td>ShowTime</td><td>Text</td><td>155</td><td>139</td><td>17</td><td>12</td><td>2</td><td/><td>##IDS__IsProgressDlg_Hidden##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupProgress</td><td>TextTime</td><td>Text</td><td>59</td><td>139</td><td>96</td><td>12</td><td>2</td><td/><td>##IDS__IsProgressDlg_HiddenTimeRemaining##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupResume</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>1</td><td/><td>##IDS_BACK##</td><td>Next</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupResume</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupResume</td><td>DlgLine</td><td>Line</td><td>0</td><td>234</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupResume</td><td>Image</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>234</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary5</td></row>
+ <row><td>SetupResume</td><td>Next</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_NEXT##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupResume</td><td>PreselectedText</td><td>Text</td><td>135</td><td>55</td><td>228</td><td>45</td><td>65539</td><td/><td>##IDS__IsResumeDlg_WizardResume##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupResume</td><td>ResumeText</td><td>Text</td><td>135</td><td>46</td><td>228</td><td>45</td><td>65539</td><td/><td>##IDS__IsResumeDlg_ResumeSuspended##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupResume</td><td>TextLine1</td><td>Text</td><td>135</td><td>8</td><td>225</td><td>45</td><td>65539</td><td/><td>##IDS__IsResumeDlg_Resuming##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupType</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_BACK##</td><td>Next</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupType</td><td>Banner</td><td>Bitmap</td><td>0</td><td>0</td><td>374</td><td>44</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary1</td></row>
+ <row><td>SetupType</td><td>BannerLine</td><td>Line</td><td>0</td><td>44</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupType</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupType</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupType</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>RadioGroup</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupType</td><td>CompText</td><td>Text</td><td>80</td><td>94</td><td>246</td><td>35</td><td>3</td><td/><td>##IDS__IsSetupTypeMinDlg_AllFeatures##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupType</td><td>CompleteIco</td><td>Icon</td><td>34</td><td>94</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary10</td></row>
+ <row><td>SetupType</td><td>CustText</td><td>Text</td><td>80</td><td>154</td><td>246</td><td>35</td><td>3</td><td/><td>##IDS__IsSetupTypeMinDlg_ChooseFeatures##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupType</td><td>CustomIco</td><td>Icon</td><td>34</td><td>154</td><td>24</td><td>24</td><td>5242881</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary6</td></row>
+ <row><td>SetupType</td><td>DlgDesc</td><td>Text</td><td>21</td><td>23</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsSetupTypeMinDlg_ChooseSetupType##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupType</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>326</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupType</td><td>DlgText</td><td>Text</td><td>21</td><td>51</td><td>326</td><td>10</td><td>3</td><td/><td>##IDS__IsSetupTypeMinDlg_SelectSetupType##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupType</td><td>DlgTitle</td><td>Text</td><td>13</td><td>6</td><td>292</td><td>25</td><td>65539</td><td/><td>##IDS__IsSetupTypeMinDlg_SetupType##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupType</td><td>Next</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_NEXT##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SetupType</td><td>RadioGroup</td><td>RadioButtonGroup</td><td>21</td><td>79</td><td>264</td><td>120</td><td>3</td><td>_IsSetupTypeMin</td><td>##IDS__IsSetupTypeMinDlg_13##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SplashBitmap</td><td>Back</td><td>PushButton</td><td>164</td><td>243</td><td>66</td><td>17</td><td>1</td><td/><td>##IDS_BACK##</td><td>Next</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SplashBitmap</td><td>Branding1</td><td>Text</td><td>4</td><td>229</td><td>50</td><td>13</td><td>3</td><td/><td>##IDS_INSTALLSHIELD_FORMATTED##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SplashBitmap</td><td>Branding2</td><td>Text</td><td>3</td><td>228</td><td>50</td><td>13</td><td>65537</td><td/><td>##IDS_INSTALLSHIELD##</td><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SplashBitmap</td><td>Cancel</td><td>PushButton</td><td>301</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_CANCEL##</td><td>Back</td><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SplashBitmap</td><td>DlgLine</td><td>Line</td><td>48</td><td>234</td><td>374</td><td>0</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td/></row>
+ <row><td>SplashBitmap</td><td>Image</td><td>Bitmap</td><td>13</td><td>12</td><td>349</td><td>211</td><td>1</td><td/><td/><td/><td/><td>0</td><td/><td/><td>NewBinary5</td></row>
+ <row><td>SplashBitmap</td><td>Next</td><td>PushButton</td><td>230</td><td>243</td><td>66</td><td>17</td><td>3</td><td/><td>##IDS_NEXT##</td><td>Cancel</td><td/><td>0</td><td/><td/><td/></row>
+ </table>
+
+ <table name="ControlCondition">
+ <col key="yes" def="s72">Dialog_</col>
+ <col key="yes" def="s50">Control_</col>
+ <col key="yes" def="s50">Action</col>
+ <col key="yes" def="s255">Condition</col>
+ <row><td>CustomSetup</td><td>ChangeFolder</td><td>Hide</td><td>Installed</td></row>
+ <row><td>CustomSetup</td><td>Details</td><td>Hide</td><td>Installed</td></row>
+ <row><td>CustomSetup</td><td>InstallLabel</td><td>Hide</td><td>Installed</td></row>
+ <row><td>CustomerInformation</td><td>DlgRadioGroupText</td><td>Hide</td><td>NOT Privileged</td></row>
+ <row><td>CustomerInformation</td><td>DlgRadioGroupText</td><td>Hide</td><td>ProductState &gt; 0</td></row>
+ <row><td>CustomerInformation</td><td>DlgRadioGroupText</td><td>Hide</td><td>Version9X</td></row>
+ <row><td>CustomerInformation</td><td>RadioGroup</td><td>Hide</td><td>NOT Privileged</td></row>
+ <row><td>CustomerInformation</td><td>RadioGroup</td><td>Hide</td><td>ProductState &gt; 0</td></row>
+ <row><td>CustomerInformation</td><td>RadioGroup</td><td>Hide</td><td>Version9X</td></row>
+ <row><td>CustomerInformation</td><td>SerialLabel</td><td>Show</td><td>SERIALNUMSHOW</td></row>
+ <row><td>CustomerInformation</td><td>SerialNumber</td><td>Show</td><td>SERIALNUMSHOW</td></row>
+ <row><td>InstallWelcome</td><td>Copyright</td><td>Hide</td><td>SHOWCOPYRIGHT="No"</td></row>
+ <row><td>InstallWelcome</td><td>Copyright</td><td>Show</td><td>SHOWCOPYRIGHT="Yes"</td></row>
+ <row><td>LicenseAgreement</td><td>Next</td><td>Disable</td><td>AgreeToLicense &lt;&gt; "Yes"</td></row>
+ <row><td>LicenseAgreement</td><td>Next</td><td>Enable</td><td>AgreeToLicense = "Yes"</td></row>
+ <row><td>ReadyToInstall</td><td>DlgTitle</td><td>Show</td><td>ProgressType0="Modify"</td></row>
+ <row><td>ReadyToInstall</td><td>DlgTitle2</td><td>Show</td><td>ProgressType0="Repair"</td></row>
+ <row><td>ReadyToInstall</td><td>DlgTitle3</td><td>Show</td><td>ProgressType0="install"</td></row>
+ <row><td>SQLLogin</td><td>EdtLogin</td><td>Disable</td><td>IS_SQLSERVER_AUTHENTICATION=0</td></row>
+ <row><td>SQLLogin</td><td>EdtLogin</td><td>Enable</td><td>IS_SQLSERVER_AUTHENTICATION=1</td></row>
+ <row><td>SQLLogin</td><td>EdtPswd</td><td>Disable</td><td>IS_SQLSERVER_AUTHENTICATION=0</td></row>
+ <row><td>SQLLogin</td><td>EdtPswd</td><td>Enable</td><td>IS_SQLSERVER_AUTHENTICATION=1</td></row>
+ <row><td>SQLLogin</td><td>lblLoginID</td><td>Disable</td><td>IS_SQLSERVER_AUTHENTICATION=0</td></row>
+ <row><td>SQLLogin</td><td>lblLoginID</td><td>Enable</td><td>IS_SQLSERVER_AUTHENTICATION=1</td></row>
+ <row><td>SQLLogin</td><td>lblPswd</td><td>Disable</td><td>IS_SQLSERVER_AUTHENTICATION=0</td></row>
+ <row><td>SQLLogin</td><td>lblPswd</td><td>Enable</td><td>IS_SQLSERVER_AUTHENTICATION=1</td></row>
+ <row><td>SetupCompleteError</td><td>Back</td><td>Default</td><td>UpdateStarted</td></row>
+ <row><td>SetupCompleteError</td><td>Back</td><td>Disable</td><td>NOT UpdateStarted</td></row>
+ <row><td>SetupCompleteError</td><td>Back</td><td>Enable</td><td>UpdateStarted</td></row>
+ <row><td>SetupCompleteError</td><td>Cancel</td><td>Disable</td><td>NOT UpdateStarted</td></row>
+ <row><td>SetupCompleteError</td><td>Cancel</td><td>Enable</td><td>UpdateStarted</td></row>
+ <row><td>SetupCompleteError</td><td>Finish</td><td>Default</td><td>NOT UpdateStarted</td></row>
+ <row><td>SetupCompleteError</td><td>FinishText1</td><td>Hide</td><td>UpdateStarted</td></row>
+ <row><td>SetupCompleteError</td><td>FinishText1</td><td>Show</td><td>NOT UpdateStarted</td></row>
+ <row><td>SetupCompleteError</td><td>FinishText2</td><td>Hide</td><td>UpdateStarted</td></row>
+ <row><td>SetupCompleteError</td><td>FinishText2</td><td>Show</td><td>NOT UpdateStarted</td></row>
+ <row><td>SetupCompleteError</td><td>RestContText1</td><td>Hide</td><td>NOT UpdateStarted</td></row>
+ <row><td>SetupCompleteError</td><td>RestContText1</td><td>Show</td><td>UpdateStarted</td></row>
+ <row><td>SetupCompleteError</td><td>RestContText2</td><td>Hide</td><td>NOT UpdateStarted</td></row>
+ <row><td>SetupCompleteError</td><td>RestContText2</td><td>Show</td><td>UpdateStarted</td></row>
+ <row><td>SetupCompleteSuccess</td><td>CheckBoxUpdates</td><td>Show</td><td>ISENABLEDWUSFINISHDIALOG And NOT Installed And ACTION="INSTALL"</td></row>
+ <row><td>SetupCompleteSuccess</td><td>CheckForUpdatesText</td><td>Show</td><td>ISENABLEDWUSFINISHDIALOG And NOT Installed And ACTION="INSTALL"</td></row>
+ <row><td>SetupCompleteSuccess</td><td>CheckLaunchProgram</td><td>Show</td><td>SHOWLAUNCHPROGRAM="-1" And PROGRAMFILETOLAUNCHATEND &lt;&gt; "" And NOT Installed And NOT ISENABLEDWUSFINISHDIALOG</td></row>
+ <row><td>SetupCompleteSuccess</td><td>CheckLaunchReadme</td><td>Show</td><td>SHOWLAUNCHREADME="-1" And READMEFILETOLAUNCHATEND &lt;&gt; "" And NOT Installed And NOT ISENABLEDWUSFINISHDIALOG</td></row>
+ <row><td>SetupCompleteSuccess</td><td>LaunchProgramText</td><td>Show</td><td>SHOWLAUNCHPROGRAM="-1" And PROGRAMFILETOLAUNCHATEND &lt;&gt; "" And NOT Installed And NOT ISENABLEDWUSFINISHDIALOG</td></row>
+ <row><td>SetupCompleteSuccess</td><td>LaunchReadmeText</td><td>Show</td><td>SHOWLAUNCHREADME="-1" And READMEFILETOLAUNCHATEND &lt;&gt; "" And NOT Installed And NOT ISENABLEDWUSFINISHDIALOG</td></row>
+ <row><td>SetupCompleteSuccess</td><td>TextLine2</td><td>Show</td><td>ProgressType2="installed" And ((ACTION&lt;&gt;"INSTALL") OR (NOT ISENABLEDWUSFINISHDIALOG) OR (ISENABLEDWUSFINISHDIALOG And Installed))</td></row>
+ <row><td>SetupCompleteSuccess</td><td>TextLine3</td><td>Show</td><td>ProgressType2="uninstalled" And ((ACTION&lt;&gt;"INSTALL") OR (NOT ISENABLEDWUSFINISHDIALOG) OR (ISENABLEDWUSFINISHDIALOG And Installed))</td></row>
+ <row><td>SetupCompleteSuccess</td><td>UpdateTextLine1</td><td>Show</td><td>ISENABLEDWUSFINISHDIALOG And NOT Installed And ACTION="INSTALL"</td></row>
+ <row><td>SetupCompleteSuccess</td><td>UpdateTextLine2</td><td>Show</td><td>ISENABLEDWUSFINISHDIALOG And NOT Installed And ACTION="INSTALL"</td></row>
+ <row><td>SetupCompleteSuccess</td><td>UpdateTextLine3</td><td>Show</td><td>ISENABLEDWUSFINISHDIALOG And NOT Installed And ACTION="INSTALL"</td></row>
+ <row><td>SetupInterrupted</td><td>Back</td><td>Default</td><td>UpdateStarted</td></row>
+ <row><td>SetupInterrupted</td><td>Back</td><td>Disable</td><td>NOT UpdateStarted</td></row>
+ <row><td>SetupInterrupted</td><td>Back</td><td>Enable</td><td>UpdateStarted</td></row>
+ <row><td>SetupInterrupted</td><td>Cancel</td><td>Disable</td><td>NOT UpdateStarted</td></row>
+ <row><td>SetupInterrupted</td><td>Cancel</td><td>Enable</td><td>UpdateStarted</td></row>
+ <row><td>SetupInterrupted</td><td>Finish</td><td>Default</td><td>NOT UpdateStarted</td></row>
+ <row><td>SetupInterrupted</td><td>FinishText1</td><td>Hide</td><td>UpdateStarted</td></row>
+ <row><td>SetupInterrupted</td><td>FinishText1</td><td>Show</td><td>NOT UpdateStarted</td></row>
+ <row><td>SetupInterrupted</td><td>FinishText2</td><td>Hide</td><td>UpdateStarted</td></row>
+ <row><td>SetupInterrupted</td><td>FinishText2</td><td>Show</td><td>NOT UpdateStarted</td></row>
+ <row><td>SetupInterrupted</td><td>RestContText1</td><td>Hide</td><td>NOT UpdateStarted</td></row>
+ <row><td>SetupInterrupted</td><td>RestContText1</td><td>Show</td><td>UpdateStarted</td></row>
+ <row><td>SetupInterrupted</td><td>RestContText2</td><td>Hide</td><td>NOT UpdateStarted</td></row>
+ <row><td>SetupInterrupted</td><td>RestContText2</td><td>Show</td><td>UpdateStarted</td></row>
+ <row><td>SetupProgress</td><td>DlgDesc</td><td>Show</td><td>ProgressType2="installed"</td></row>
+ <row><td>SetupProgress</td><td>DlgDesc2</td><td>Show</td><td>ProgressType2="uninstalled"</td></row>
+ <row><td>SetupProgress</td><td>DlgText</td><td>Show</td><td>ProgressType3="installs"</td></row>
+ <row><td>SetupProgress</td><td>DlgText2</td><td>Show</td><td>ProgressType3="uninstalls"</td></row>
+ <row><td>SetupProgress</td><td>DlgTitle</td><td>Show</td><td>ProgressType1="Installing"</td></row>
+ <row><td>SetupProgress</td><td>DlgTitle2</td><td>Show</td><td>ProgressType1="Uninstalling"</td></row>
+ <row><td>SetupResume</td><td>PreselectedText</td><td>Hide</td><td>RESUME</td></row>
+ <row><td>SetupResume</td><td>PreselectedText</td><td>Show</td><td>NOT RESUME</td></row>
+ <row><td>SetupResume</td><td>ResumeText</td><td>Hide</td><td>NOT RESUME</td></row>
+ <row><td>SetupResume</td><td>ResumeText</td><td>Show</td><td>RESUME</td></row>
+ </table>
+
+ <table name="ControlEvent">
+ <col key="yes" def="s72">Dialog_</col>
+ <col key="yes" def="s50">Control_</col>
+ <col key="yes" def="s50">Event</col>
+ <col key="yes" def="s255">Argument</col>
+ <col key="yes" def="S255">Condition</col>
+ <col def="I2">Ordering</col>
+ <row><td>AdminChangeFolder</td><td>Cancel</td><td>EndDialog</td><td>Return</td><td>1</td><td>2</td></row>
+ <row><td>AdminChangeFolder</td><td>Cancel</td><td>Reset</td><td>0</td><td>1</td><td>1</td></row>
+ <row><td>AdminChangeFolder</td><td>NewFolder</td><td>DirectoryListNew</td><td>0</td><td>1</td><td>0</td></row>
+ <row><td>AdminChangeFolder</td><td>OK</td><td>EndDialog</td><td>Return</td><td>1</td><td>0</td></row>
+ <row><td>AdminChangeFolder</td><td>OK</td><td>SetTargetPath</td><td>TARGETDIR</td><td>1</td><td>1</td></row>
+ <row><td>AdminChangeFolder</td><td>Up</td><td>DirectoryListUp</td><td>0</td><td>1</td><td>0</td></row>
+ <row><td>AdminNetworkLocation</td><td>Back</td><td>NewDialog</td><td>AdminWelcome</td><td>1</td><td>0</td></row>
+ <row><td>AdminNetworkLocation</td><td>Browse</td><td>SpawnDialog</td><td>AdminChangeFolder</td><td>1</td><td>0</td></row>
+ <row><td>AdminNetworkLocation</td><td>Cancel</td><td>SpawnDialog</td><td>CancelSetup</td><td>1</td><td>0</td></row>
+ <row><td>AdminNetworkLocation</td><td>InstallNow</td><td>EndDialog</td><td>Return</td><td>OutOfNoRbDiskSpace &lt;&gt; 1</td><td>3</td></row>
+ <row><td>AdminNetworkLocation</td><td>InstallNow</td><td>NewDialog</td><td>OutOfSpace</td><td>OutOfNoRbDiskSpace = 1</td><td>2</td></row>
+ <row><td>AdminNetworkLocation</td><td>InstallNow</td><td>SetTargetPath</td><td>TARGETDIR</td><td>1</td><td>1</td></row>
+ <row><td>AdminWelcome</td><td>Cancel</td><td>SpawnDialog</td><td>CancelSetup</td><td>1</td><td>0</td></row>
+ <row><td>AdminWelcome</td><td>Next</td><td>NewDialog</td><td>AdminNetworkLocation</td><td>1</td><td>0</td></row>
+ <row><td>CancelSetup</td><td>No</td><td>EndDialog</td><td>Return</td><td>1</td><td>0</td></row>
+ <row><td>CancelSetup</td><td>Yes</td><td>EndDialog</td><td>Exit</td><td>1</td><td>2</td></row>
+ <row><td>CustomSetup</td><td>Back</td><td>NewDialog</td><td>DestinationFolder</td><td>Installed</td><td>0</td></row>
+ <row><td>CustomSetup</td><td>Back</td><td>NewDialog</td><td>SetupType</td><td>NOT Installed</td><td>0</td></row>
+ <row><td>CustomSetup</td><td>Cancel</td><td>SpawnDialog</td><td>CancelSetup</td><td>1</td><td>0</td></row>
+ <row><td>CustomSetup</td><td>ChangeFolder</td><td>SelectionBrowse</td><td>InstallChangeFolder</td><td>1</td><td>0</td></row>
+ <row><td>CustomSetup</td><td>Details</td><td>SelectionBrowse</td><td>DiskSpaceRequirements</td><td>1</td><td>1</td></row>
+ <row><td>CustomSetup</td><td>Help</td><td>SpawnDialog</td><td>CustomSetupTips</td><td>1</td><td>1</td></row>
+ <row><td>CustomSetup</td><td>Next</td><td>NewDialog</td><td>OutOfSpace</td><td>OutOfNoRbDiskSpace = 1</td><td>0</td></row>
+ <row><td>CustomSetup</td><td>Next</td><td>NewDialog</td><td>ReadyToInstall</td><td>OutOfNoRbDiskSpace &lt;&gt; 1</td><td>0</td></row>
+ <row><td>CustomSetup</td><td>Next</td><td>[_IsSetupTypeMin]</td><td>Custom</td><td>1</td><td>0</td></row>
+ <row><td>CustomSetupTips</td><td>OK</td><td>EndDialog</td><td>Return</td><td>1</td><td>1</td></row>
+ <row><td>CustomerInformation</td><td>Back</td><td>NewDialog</td><td>LicenseAgreement</td><td>1</td><td>1</td></row>
+ <row><td>CustomerInformation</td><td>Cancel</td><td>SpawnDialog</td><td>CancelSetup</td><td>1</td><td>0</td></row>
+ <row><td>CustomerInformation</td><td>Next</td><td>EndDialog</td><td>Exit</td><td>(SERIALNUMVALRETRYLIMIT) And (SERIALNUMVALRETRYLIMIT&lt;0) And (SERIALNUMVALRETURN&lt;&gt;SERIALNUMVALSUCCESSRETVAL)</td><td>3</td></row>
+ <row><td>CustomerInformation</td><td>Next</td><td>NewDialog</td><td>SetupType</td><td>(Not SERIALNUMVALRETURN) OR (SERIALNUMVALRETURN=SERIALNUMVALSUCCESSRETVAL)</td><td>4</td></row>
+ <row><td>CustomerInformation</td><td>Next</td><td>[ALLUSERS]</td><td>1</td><td>ApplicationUsers = "AllUsers" And Privileged</td><td>1</td></row>
+ <row><td>CustomerInformation</td><td>Next</td><td>[ALLUSERS]</td><td>{}</td><td>ApplicationUsers = "OnlyCurrentUser" And Privileged</td><td>2</td></row>
+ <row><td>DatabaseFolder</td><td>Back</td><td>NewDialog</td><td>CustomerInformation</td><td>1</td><td>1</td></row>
+ <row><td>DatabaseFolder</td><td>Cancel</td><td>SpawnDialog</td><td>CancelSetup</td><td>1</td><td>1</td></row>
+ <row><td>DatabaseFolder</td><td>ChangeFolder</td><td>SpawnDialog</td><td>InstallChangeFolder</td><td>1</td><td>1</td></row>
+ <row><td>DatabaseFolder</td><td>ChangeFolder</td><td>[_BrowseProperty]</td><td>DATABASEDIR</td><td>1</td><td>2</td></row>
+ <row><td>DatabaseFolder</td><td>Next</td><td>NewDialog</td><td>SetupType</td><td>1</td><td>1</td></row>
+ <row><td>DestinationFolder</td><td>Back</td><td>NewDialog</td><td>LicenseAgreement</td><td>1</td><td>0</td></row>
+ <row><td>DestinationFolder</td><td>Cancel</td><td>SpawnDialog</td><td>CancelSetup</td><td>1</td><td>1</td></row>
+ <row><td>DestinationFolder</td><td>ChangeFolder</td><td>SpawnDialog</td><td>InstallChangeFolder</td><td>1</td><td>1</td></row>
+ <row><td>DestinationFolder</td><td>ChangeFolder</td><td>[_BrowseProperty]</td><td>INSTALLDIR</td><td>1</td><td>2</td></row>
+ <row><td>DestinationFolder</td><td>Next</td><td>NewDialog</td><td>ReadyToInstall</td><td>1</td><td>0</td></row>
+ <row><td>DiskSpaceRequirements</td><td>OK</td><td>EndDialog</td><td>Return</td><td>1</td><td>0</td></row>
+ <row><td>FilesInUse</td><td>Exit</td><td>EndDialog</td><td>Exit</td><td>1</td><td>0</td></row>
+ <row><td>FilesInUse</td><td>Ignore</td><td>EndDialog</td><td>Ignore</td><td>1</td><td>0</td></row>
+ <row><td>FilesInUse</td><td>Retry</td><td>EndDialog</td><td>Retry</td><td>1</td><td>0</td></row>
+ <row><td>InstallChangeFolder</td><td>Cancel</td><td>EndDialog</td><td>Return</td><td>1</td><td>2</td></row>
+ <row><td>InstallChangeFolder</td><td>Cancel</td><td>Reset</td><td>0</td><td>1</td><td>1</td></row>
+ <row><td>InstallChangeFolder</td><td>NewFolder</td><td>DirectoryListNew</td><td>0</td><td>1</td><td>0</td></row>
+ <row><td>InstallChangeFolder</td><td>OK</td><td>EndDialog</td><td>Return</td><td>1</td><td>3</td></row>
+ <row><td>InstallChangeFolder</td><td>OK</td><td>SetTargetPath</td><td>[_BrowseProperty]</td><td>1</td><td>2</td></row>
+ <row><td>InstallChangeFolder</td><td>Up</td><td>DirectoryListUp</td><td>0</td><td>1</td><td>0</td></row>
+ <row><td>InstallWelcome</td><td>Back</td><td>NewDialog</td><td>SplashBitmap</td><td>Display_IsBitmapDlg</td><td>0</td></row>
+ <row><td>InstallWelcome</td><td>Cancel</td><td>SpawnDialog</td><td>CancelSetup</td><td>1</td><td>0</td></row>
+ <row><td>InstallWelcome</td><td>Next</td><td>NewDialog</td><td>LicenseAgreement</td><td>1</td><td>0</td></row>
+ <row><td>LicenseAgreement</td><td>Back</td><td>NewDialog</td><td>InstallWelcome</td><td>1</td><td>0</td></row>
+ <row><td>LicenseAgreement</td><td>Cancel</td><td>SpawnDialog</td><td>CancelSetup</td><td>1</td><td>0</td></row>
+ <row><td>LicenseAgreement</td><td>ISPrintButton</td><td>DoAction</td><td>ISPrint</td><td>1</td><td>0</td></row>
+ <row><td>LicenseAgreement</td><td>Next</td><td>NewDialog</td><td>DestinationFolder</td><td>AgreeToLicense = "Yes"</td><td>0</td></row>
+ <row><td>MaintenanceType</td><td>Back</td><td>NewDialog</td><td>MaintenanceWelcome</td><td>1</td><td>0</td></row>
+ <row><td>MaintenanceType</td><td>Cancel</td><td>SpawnDialog</td><td>CancelSetup</td><td>1</td><td>0</td></row>
+ <row><td>MaintenanceType</td><td>Next</td><td>NewDialog</td><td>CustomSetup</td><td>_IsMaintenance = "Change"</td><td>12</td></row>
+ <row><td>MaintenanceType</td><td>Next</td><td>NewDialog</td><td>ReadyToInstall</td><td>_IsMaintenance = "Reinstall"</td><td>13</td></row>
+ <row><td>MaintenanceType</td><td>Next</td><td>NewDialog</td><td>ReadyToRemove</td><td>_IsMaintenance = "Remove"</td><td>11</td></row>
+ <row><td>MaintenanceType</td><td>Next</td><td>Reinstall</td><td>ALL</td><td>_IsMaintenance = "Reinstall"</td><td>10</td></row>
+ <row><td>MaintenanceType</td><td>Next</td><td>ReinstallMode</td><td>[ReinstallModeText]</td><td>_IsMaintenance = "Reinstall"</td><td>9</td></row>
+ <row><td>MaintenanceType</td><td>Next</td><td>[ProgressType0]</td><td>Modify</td><td>_IsMaintenance = "Change"</td><td>2</td></row>
+ <row><td>MaintenanceType</td><td>Next</td><td>[ProgressType0]</td><td>Repair</td><td>_IsMaintenance = "Reinstall"</td><td>1</td></row>
+ <row><td>MaintenanceType</td><td>Next</td><td>[ProgressType1]</td><td>Modifying</td><td>_IsMaintenance = "Change"</td><td>3</td></row>
+ <row><td>MaintenanceType</td><td>Next</td><td>[ProgressType1]</td><td>Repairing</td><td>_IsMaintenance = "Reinstall"</td><td>4</td></row>
+ <row><td>MaintenanceType</td><td>Next</td><td>[ProgressType2]</td><td>modified</td><td>_IsMaintenance = "Change"</td><td>6</td></row>
+ <row><td>MaintenanceType</td><td>Next</td><td>[ProgressType2]</td><td>repairs</td><td>_IsMaintenance = "Reinstall"</td><td>5</td></row>
+ <row><td>MaintenanceType</td><td>Next</td><td>[ProgressType3]</td><td>modifies</td><td>_IsMaintenance = "Change"</td><td>7</td></row>
+ <row><td>MaintenanceType</td><td>Next</td><td>[ProgressType3]</td><td>repairs</td><td>_IsMaintenance = "Reinstall"</td><td>8</td></row>
+ <row><td>MaintenanceWelcome</td><td>Cancel</td><td>SpawnDialog</td><td>CancelSetup</td><td>1</td><td>0</td></row>
+ <row><td>MaintenanceWelcome</td><td>Next</td><td>NewDialog</td><td>MaintenanceType</td><td>1</td><td>0</td></row>
+ <row><td>OutOfSpace</td><td>Resume</td><td>NewDialog</td><td>AdminNetworkLocation</td><td>ACTION = "ADMIN"</td><td>0</td></row>
+ <row><td>OutOfSpace</td><td>Resume</td><td>NewDialog</td><td>CustomSetup</td><td>ACTION &lt;&gt; "ADMIN"</td><td>0</td></row>
+ <row><td>PatchWelcome</td><td>Back</td><td>NewDialog</td><td>SplashBitmap</td><td>Display_IsBitmapDlg</td><td>0</td></row>
+ <row><td>PatchWelcome</td><td>Cancel</td><td>SpawnDialog</td><td>CancelSetup</td><td>1</td><td>1</td></row>
+ <row><td>PatchWelcome</td><td>Next</td><td>EndDialog</td><td>Return</td><td>1</td><td>3</td></row>
+ <row><td>PatchWelcome</td><td>Next</td><td>Reinstall</td><td>ALL</td><td>PATCH And REINSTALL=""</td><td>1</td></row>
+ <row><td>PatchWelcome</td><td>Next</td><td>ReinstallMode</td><td>omus</td><td>PATCH And REINSTALLMODE=""</td><td>2</td></row>
+ <row><td>ReadyToInstall</td><td>Back</td><td>NewDialog</td><td>CustomSetup</td><td>Installed OR _IsSetupTypeMin = "Custom"</td><td>2</td></row>
+ <row><td>ReadyToInstall</td><td>Back</td><td>NewDialog</td><td>DestinationFolder</td><td>NOT Installed AND _IsSetupTypeMin &lt;&gt; "Custom"</td><td>1</td></row>
+ <row><td>ReadyToInstall</td><td>Back</td><td>NewDialog</td><td>MaintenanceType</td><td>Installed AND _IsMaintenance = "Reinstall"</td><td>3</td></row>
+ <row><td>ReadyToInstall</td><td>Cancel</td><td>SpawnDialog</td><td>CancelSetup</td><td>1</td><td>0</td></row>
+ <row><td>ReadyToInstall</td><td>InstallNow</td><td>EndDialog</td><td>Return</td><td>OutOfNoRbDiskSpace &lt;&gt; 1</td><td>0</td></row>
+ <row><td>ReadyToInstall</td><td>InstallNow</td><td>NewDialog</td><td>OutOfSpace</td><td>OutOfNoRbDiskSpace = 1</td><td>0</td></row>
+ <row><td>ReadyToInstall</td><td>InstallNow</td><td>[ProgressType1]</td><td>Installing</td><td>1</td><td>0</td></row>
+ <row><td>ReadyToInstall</td><td>InstallNow</td><td>[ProgressType2]</td><td>installed</td><td>1</td><td>0</td></row>
+ <row><td>ReadyToInstall</td><td>InstallNow</td><td>[ProgressType3]</td><td>installs</td><td>1</td><td>0</td></row>
+ <row><td>ReadyToRemove</td><td>Back</td><td>NewDialog</td><td>MaintenanceType</td><td>1</td><td>0</td></row>
+ <row><td>ReadyToRemove</td><td>Cancel</td><td>SpawnDialog</td><td>CancelSetup</td><td>1</td><td>0</td></row>
+ <row><td>ReadyToRemove</td><td>RemoveNow</td><td>EndDialog</td><td>Return</td><td>OutOfNoRbDiskSpace &lt;&gt; 1</td><td>2</td></row>
+ <row><td>ReadyToRemove</td><td>RemoveNow</td><td>NewDialog</td><td>OutOfSpace</td><td>OutOfNoRbDiskSpace = 1</td><td>2</td></row>
+ <row><td>ReadyToRemove</td><td>RemoveNow</td><td>Remove</td><td>ALL</td><td>1</td><td>1</td></row>
+ <row><td>ReadyToRemove</td><td>RemoveNow</td><td>[ProgressType1]</td><td>Uninstalling</td><td>1</td><td>0</td></row>
+ <row><td>ReadyToRemove</td><td>RemoveNow</td><td>[ProgressType2]</td><td>uninstalled</td><td>1</td><td>0</td></row>
+ <row><td>ReadyToRemove</td><td>RemoveNow</td><td>[ProgressType3]</td><td>uninstalls</td><td>1</td><td>0</td></row>
+ <row><td>SQLBrowse</td><td>Cancel</td><td>EndDialog</td><td>Return</td><td>1</td><td>1</td></row>
+ <row><td>SQLBrowse</td><td>OK</td><td>EndDialog</td><td>Return</td><td>1</td><td>2</td></row>
+ <row><td>SQLBrowse</td><td>OK</td><td>[IS_SQLSERVER_SERVER]</td><td>[IS_SQLSERVER_LIST]</td><td>1</td><td>1</td></row>
+ <row><td>SQLLogin</td><td>Back</td><td>NewDialog</td><td>CustomerInformation</td><td>1</td><td>1</td></row>
+ <row><td>SQLLogin</td><td>BtnSQLBrowse</td><td>DoAction</td><td>ISSQLServerList</td><td>1</td><td>2</td></row>
+ <row><td>SQLLogin</td><td>BtnSQLBrowse</td><td>SpawnDialog</td><td>SQLBrowse</td><td>1</td><td>3</td></row>
+ <row><td>SQLLogin</td><td>BtnSQLBrowse</td><td>[IS_SQLSERVER_LIST]</td><td>[IS_SQLSERVER_SERVER]</td><td>1</td><td>1</td></row>
+ <row><td>SQLLogin</td><td>Cancel</td><td>SpawnDialog</td><td>CancelSetup</td><td>1</td><td>1</td></row>
+ <row><td>SQLLogin</td><td>Next</td><td>DoAction</td><td>ISSQLServerValidate</td><td>1</td><td>3</td></row>
+ <row><td>SQLLogin</td><td>Next</td><td>NewDialog</td><td>SetupType</td><td>IS_SQLSERVER_STATUS=0</td><td>4</td></row>
+ <row><td>SetupCompleteError</td><td>Back</td><td>EndDialog</td><td>Return</td><td>1</td><td>2</td></row>
+ <row><td>SetupCompleteError</td><td>Back</td><td>[Suspend]</td><td>{}</td><td>1</td><td>1</td></row>
+ <row><td>SetupCompleteError</td><td>Cancel</td><td>EndDialog</td><td>Return</td><td>1</td><td>2</td></row>
+ <row><td>SetupCompleteError</td><td>Cancel</td><td>[Suspend]</td><td>1</td><td>1</td><td>1</td></row>
+ <row><td>SetupCompleteError</td><td>Finish</td><td>EndDialog</td><td>Exit</td><td>1</td><td>2</td></row>
+ <row><td>SetupCompleteSuccess</td><td>OK</td><td>DoAction</td><td>CheckForProductUpdates</td><td>ISCHECKFORPRODUCTUPDATES="1" And ISENABLEDWUSFINISHDIALOG And NOT ISREBOOTREQUIRED And NOT Installed And ACTION="INSTALL"</td><td>4</td></row>
+ <row><td>SetupCompleteSuccess</td><td>OK</td><td>DoAction</td><td>CheckForProductUpdatesOnReboot</td><td>ISCHECKFORPRODUCTUPDATES="1" And ISENABLEDWUSFINISHDIALOG And ISREBOOTREQUIRED And NOT Installed And ACTION="INSTALL"</td><td>5</td></row>
+ <row><td>SetupCompleteSuccess</td><td>OK</td><td>DoAction</td><td>IS_LAUNCH_MY_PROGRAM_PLEASE</td><td>LAUNCHPROGRAM</td><td/></row>
+ <row><td>SetupCompleteSuccess</td><td>OK</td><td>EndDialog</td><td>Exit</td><td>1</td><td>2</td></row>
+ <row><td>SetupError</td><td>A</td><td>EndDialog</td><td>ErrorAbort</td><td>1</td><td>0</td></row>
+ <row><td>SetupError</td><td>C</td><td>EndDialog</td><td>ErrorCancel</td><td>1</td><td>0</td></row>
+ <row><td>SetupError</td><td>I</td><td>EndDialog</td><td>ErrorIgnore</td><td>1</td><td>0</td></row>
+ <row><td>SetupError</td><td>N</td><td>EndDialog</td><td>ErrorNo</td><td>1</td><td>0</td></row>
+ <row><td>SetupError</td><td>O</td><td>EndDialog</td><td>ErrorOk</td><td>1</td><td>0</td></row>
+ <row><td>SetupError</td><td>R</td><td>EndDialog</td><td>ErrorRetry</td><td>1</td><td>0</td></row>
+ <row><td>SetupError</td><td>Y</td><td>EndDialog</td><td>ErrorYes</td><td>1</td><td>0</td></row>
+ <row><td>SetupInitialization</td><td>Cancel</td><td>SpawnDialog</td><td>CancelSetup</td><td>1</td><td>0</td></row>
+ <row><td>SetupInterrupted</td><td>Back</td><td>EndDialog</td><td>Exit</td><td>1</td><td>2</td></row>
+ <row><td>SetupInterrupted</td><td>Back</td><td>[Suspend]</td><td>{}</td><td>1</td><td>1</td></row>
+ <row><td>SetupInterrupted</td><td>Cancel</td><td>EndDialog</td><td>Exit</td><td>1</td><td>2</td></row>
+ <row><td>SetupInterrupted</td><td>Cancel</td><td>[Suspend]</td><td>1</td><td>1</td><td>1</td></row>
+ <row><td>SetupInterrupted</td><td>Finish</td><td>EndDialog</td><td>Exit</td><td>1</td><td>2</td></row>
+ <row><td>SetupProgress</td><td>Cancel</td><td>SpawnDialog</td><td>CancelSetup</td><td>1</td><td>0</td></row>
+ <row><td>SetupResume</td><td>Cancel</td><td>SpawnDialog</td><td>CancelSetup</td><td>1</td><td>0</td></row>
+ <row><td>SetupResume</td><td>Next</td><td>EndDialog</td><td>Return</td><td>OutOfNoRbDiskSpace &lt;&gt; 1</td><td>0</td></row>
+ <row><td>SetupResume</td><td>Next</td><td>NewDialog</td><td>OutOfSpace</td><td>OutOfNoRbDiskSpace = 1</td><td>0</td></row>
+ <row><td>SetupType</td><td>Back</td><td>NewDialog</td><td>DestinationFolder</td><td>1</td><td>0</td></row>
+ <row><td>SetupType</td><td>Cancel</td><td>SpawnDialog</td><td>CancelSetup</td><td>1</td><td>0</td></row>
+ <row><td>SetupType</td><td>Next</td><td>AddLocal</td><td>ALL</td><td>_IsSetupTypeMin = "Typical"</td><td>0</td></row>
+ <row><td>SetupType</td><td>Next</td><td>NewDialog</td><td>CustomSetup</td><td>_IsSetupTypeMin = "Custom"</td><td>0</td></row>
+ <row><td>SetupType</td><td>Next</td><td>NewDialog</td><td>ReadyToInstall</td><td>_IsSetupTypeMin &lt;&gt; "Custom"</td><td>0</td></row>
+ <row><td>SplashBitmap</td><td>Cancel</td><td>SpawnDialog</td><td>CancelSetup</td><td>1</td><td>0</td></row>
+ <row><td>SplashBitmap</td><td>Next</td><td>NewDialog</td><td>InstallWelcome</td><td>1</td><td>0</td></row>
+ </table>
+
+ <table name="CreateFolder">
+ <col key="yes" def="s72">Directory_</col>
+ <col key="yes" def="s72">Component_</col>
+ <row><td>BIN</td><td>AllOtherFiles10</td></row>
+ <row><td>BIN</td><td>AllOtherFiles11</td></row>
+ <row><td>BIN</td><td>AllOtherFiles8</td></row>
+ <row><td>CONF</td><td>AllOtherFiles5</td></row>
+ <row><td>CONF</td><td>AllOtherFiles9</td></row>
+ <row><td>INSTALLDIR</td><td>AllOtherFiles4</td></row>
+ <row><td>INSTALLDIR</td><td>AllOtherFiles5</td></row>
+ <row><td>INSTALLDIR</td><td>AllOtherFiles6</td></row>
+ <row><td>INSTALLDIR</td><td>AllOtherFiles7</td></row>
+ <row><td>INSTALLDIR</td><td>ISRegistryComponent</td></row>
+ <row><td>INSTALLDIR</td><td>ISRegistryComponent1</td></row>
+ <row><td>INSTALLDIR</td><td>VirtualDirComponent</td></row>
+ <row><td>LOG</td><td>AllOtherFiles12</td></row>
+ </table>
+
+ <table name="CustomAction">
+ <col key="yes" def="s72">Action</col>
+ <col def="i2">Type</col>
+ <col def="S64">Source</col>
+ <col def="S0">Target</col>
+ <col def="S255">ISComments</col>
+ <row><td>CheckForProductUpdates</td><td>226</td><td>ISUpdateServiceFolder</td><td>[ISUpdateServiceFolder]agent.exe "/au[ProductCode] /EndOfInstall"</td><td>Checks for product updates</td></row>
+ <row><td>CheckForProductUpdatesOnReboot</td><td>226</td><td>ISUpdateServiceFolder</td><td>[ISUpdateServiceFolder]agent.exe "/au[ProductCode] /EndOfInstall /Reboot"</td><td>Checks for product updates on reboot</td></row>
+ <row><td>ISPrint</td><td>1</td><td>SetAllUsers.dll</td><td>PrintScrollableText</td><td>Prints the contents of a ScrollableText control on a dialog.</td></row>
+ <row><td>ISSelfRegisterCosting</td><td>1</td><td>ISSELFREG.DLL</td><td>ISSelfRegisterCosting</td><td/></row>
+ <row><td>ISSelfRegisterFiles</td><td>1025</td><td>ISSELFREG.DLL</td><td>ISSelfRegisterFiles</td><td/></row>
+ <row><td>ISSelfRegisterFinalize</td><td>1</td><td>ISSELFREG.DLL</td><td>ISSelfRegisterFinalize</td><td/></row>
+ <row><td>ISUnSelfRegisterFiles</td><td>1025</td><td>ISSELFREG.DLL</td><td>ISUnSelfRegisterFiles</td><td/></row>
+ <row><td>InstallFilter</td><td>70</td><td>NewBinary19</td><td/><td/></row>
+ <row><td>SetARPINSTALLLOCATION</td><td>51</td><td>ARPINSTALLLOCATION</td><td>[INSTALLDIR]</td><td/></row>
+ <row><td>SetAllUsersProfileNT</td><td>51</td><td>ALLUSERSPROFILE</td><td>[%SystemRoot]\Profiles\All Users</td><td/></row>
+ <row><td>caCreateVRoots</td><td>1025</td><td>binIISHelper</td><td>CreateIISVRoots</td><td/></row>
+ <row><td>caExtractIISSuppFiles</td><td>1</td><td>binIISHelper</td><td>ExtractIISTables</td><td/></row>
+ <row><td>caIISCleanup</td><td>1</td><td>binIISHelper</td><td>CleanupVRoots</td><td/></row>
+ <row><td>caRemoveVRoots</td><td>1025</td><td>binIISHelper</td><td>RemoveIISVRoots</td><td/></row>
+ <row><td>caRlbackVRoots</td><td>1281</td><td>binIISHelper</td><td>RlBackRemoveIISVRoots</td><td/></row>
+ <row><td>setAllUsersProfile2K</td><td>51</td><td>ALLUSERSPROFILE</td><td>[%ALLUSERSPROFILE]</td><td/></row>
+ <row><td>setUserProfileNT</td><td>51</td><td>USERPROFILE</td><td>[%USERPROFILE]</td><td/></row>
+ </table>
+
+ <table name="Dialog">
+ <col key="yes" def="s72">Dialog</col>
+ <col def="i2">HCentering</col>
+ <col def="i2">VCentering</col>
+ <col def="i2">Width</col>
+ <col def="i2">Height</col>
+ <col def="I4">Attributes</col>
+ <col def="L128">Title</col>
+ <col def="s50">Control_First</col>
+ <col def="S50">Control_Default</col>
+ <col def="S50">Control_Cancel</col>
+ <col def="S255">ISComments</col>
+ <col def="S72">TextStyle_</col>
+ <col def="I4">ISWindowStyle</col>
+ <col def="I4">ISResourceId</col>
+ <row><td>AdminChangeFolder</td><td>50</td><td>50</td><td>374</td><td>266</td><td>3</td><td>##IDS_PRODUCTNAME_INSTALLSHIELD##</td><td>Tail</td><td>OK</td><td>Cancel</td><td>Install Point Browse</td><td/><td>0</td><td/></row>
+ <row><td>AdminNetworkLocation</td><td>50</td><td>50</td><td>374</td><td>266</td><td>3</td><td>##IDS_PRODUCTNAME_INSTALLSHIELD##</td><td>InstallNow</td><td>InstallNow</td><td>Cancel</td><td>Network Location</td><td/><td>0</td><td/></row>
+ <row><td>AdminWelcome</td><td>50</td><td>50</td><td>374</td><td>266</td><td>3</td><td>##IDS_PRODUCTNAME_INSTALLSHIELD##</td><td>Next</td><td>Next</td><td>Cancel</td><td>Administration Welcome</td><td/><td>0</td><td/></row>
+ <row><td>CancelSetup</td><td>50</td><td>50</td><td>260</td><td>85</td><td>3</td><td>##IDS_PRODUCTNAME_INSTALLSHIELD##</td><td>No</td><td>No</td><td>No</td><td>Cancel</td><td/><td>0</td><td/></row>
+ <row><td>CustomSetup</td><td>50</td><td>50</td><td>374</td><td>266</td><td>35</td><td>##IDS_PRODUCTNAME_INSTALLSHIELD##</td><td>Tree</td><td>Next</td><td>Cancel</td><td>Custom Selection</td><td/><td>0</td><td/></row>
+ <row><td>CustomSetupTips</td><td>50</td><td>50</td><td>374</td><td>266</td><td>3</td><td>##IDS_PRODUCTNAME_INSTALLSHIELD##</td><td>OK</td><td>OK</td><td>OK</td><td>Custom Setup Tips</td><td/><td>0</td><td/></row>
+ <row><td>CustomerInformation</td><td>50</td><td>50</td><td>374</td><td>266</td><td>3</td><td>##IDS_PRODUCTNAME_INSTALLSHIELD##</td><td>NameEdit</td><td>Next</td><td>Cancel</td><td>Identification</td><td/><td>0</td><td/></row>
+ <row><td>DatabaseFolder</td><td>50</td><td>50</td><td>374</td><td>266</td><td>3</td><td>##IDS_PRODUCTNAME_INSTALLSHIELD##</td><td>Next</td><td>Next</td><td>Cancel</td><td>Database Folder</td><td/><td>0</td><td/></row>
+ <row><td>DestinationFolder</td><td>50</td><td>50</td><td>374</td><td>266</td><td>3</td><td>##IDS_PRODUCTNAME_INSTALLSHIELD##</td><td>Next</td><td>Next</td><td>Cancel</td><td>Destination Folder</td><td/><td>0</td><td/></row>
+ <row><td>DiskSpaceRequirements</td><td>50</td><td>50</td><td>374</td><td>266</td><td>3</td><td>##IDS_PRODUCTNAME_INSTALLSHIELD##</td><td>OK</td><td>OK</td><td>OK</td><td>Feature Details</td><td/><td>0</td><td/></row>
+ <row><td>FilesInUse</td><td>50</td><td>50</td><td>374</td><td>266</td><td>19</td><td>##IDS_PRODUCTNAME_INSTALLSHIELD##</td><td>Retry</td><td>Retry</td><td>Exit</td><td>Files in Use</td><td/><td>0</td><td/></row>
+ <row><td>InstallChangeFolder</td><td>50</td><td>50</td><td>374</td><td>266</td><td>3</td><td>##IDS_PRODUCTNAME_INSTALLSHIELD##</td><td>Tail</td><td>OK</td><td>Cancel</td><td>Browse</td><td/><td>0</td><td/></row>
+ <row><td>InstallWelcome</td><td>50</td><td>50</td><td>374</td><td>266</td><td>3</td><td>##IDS_PRODUCTNAME_INSTALLSHIELD##</td><td>Next</td><td>Next</td><td>Cancel</td><td>Welcome Panel</td><td/><td>0</td><td/></row>
+ <row><td>LicenseAgreement</td><td>50</td><td>50</td><td>374</td><td>266</td><td>2</td><td>##IDS_PRODUCTNAME_INSTALLSHIELD##</td><td>Agree</td><td>Next</td><td>Cancel</td><td>License Agreement</td><td/><td>0</td><td/></row>
+ <row><td>MaintenanceType</td><td>50</td><td>50</td><td>374</td><td>266</td><td>3</td><td>##IDS_PRODUCTNAME_INSTALLSHIELD##</td><td>RadioGroup</td><td>Next</td><td>Cancel</td><td>Change, Reinstall, Remove</td><td/><td>0</td><td/></row>
+ <row><td>MaintenanceWelcome</td><td>50</td><td>50</td><td>374</td><td>266</td><td>3</td><td>##IDS_PRODUCTNAME_INSTALLSHIELD##</td><td>Next</td><td>Next</td><td>Cancel</td><td>Maintenance Welcome</td><td/><td>0</td><td/></row>
+ <row><td>OutOfSpace</td><td>50</td><td>50</td><td>374</td><td>266</td><td>3</td><td>##IDS_PRODUCTNAME_INSTALLSHIELD##</td><td>Resume</td><td>Resume</td><td>Resume</td><td>Out Of Disk Space</td><td/><td>0</td><td/></row>
+ <row><td>PatchWelcome</td><td>50</td><td>50</td><td>374</td><td>266</td><td>3</td><td>##IDS__IsPatchDlg_PatchWizard##</td><td>Next</td><td>Next</td><td>Cancel</td><td>Patch Panel</td><td/><td>0</td><td/></row>
+ <row><td>ReadyToInstall</td><td>50</td><td>50</td><td>374</td><td>266</td><td>35</td><td>##IDS_PRODUCTNAME_INSTALLSHIELD##</td><td>InstallNow</td><td>InstallNow</td><td>Cancel</td><td>Ready to Install</td><td/><td>0</td><td/></row>
+ <row><td>ReadyToRemove</td><td>50</td><td>50</td><td>374</td><td>266</td><td>3</td><td>##IDS_PRODUCTNAME_INSTALLSHIELD##</td><td>RemoveNow</td><td>RemoveNow</td><td>Cancel</td><td>Verify Remove</td><td/><td>0</td><td/></row>
+ <row><td>SQLBrowse</td><td>50</td><td>50</td><td>272</td><td>265</td><td>3</td><td>##IDS_PRODUCTNAME_INSTALLSHIELD##</td><td>lstSQLServer</td><td>OK</td><td>Cancel</td><td>SQL Server List Browse</td><td/><td>0</td><td/></row>
+ <row><td>SQLLogin</td><td>50</td><td>50</td><td>374</td><td>266</td><td>3</td><td>##IDS_PRODUCTNAME_INSTALLSHIELD##</td><td>cboServers</td><td>Next</td><td>Cancel</td><td>SQL Server Login</td><td/><td>0</td><td/></row>
+ <row><td>SetupCompleteError</td><td>50</td><td>50</td><td>374</td><td>266</td><td>3</td><td>##IDS_PRODUCTNAME_INSTALLSHIELD##</td><td>Finish</td><td>Finish</td><td>Finish</td><td>Fatal Error</td><td/><td>0</td><td/></row>
+ <row><td>SetupCompleteSuccess</td><td>50</td><td>50</td><td>374</td><td>266</td><td>3</td><td>##IDS_PRODUCTNAME_INSTALLSHIELD##</td><td>OK</td><td>OK</td><td>OK</td><td>Exit</td><td/><td>0</td><td/></row>
+ <row><td>SetupError</td><td>50</td><td>50</td><td>270</td><td>110</td><td>65543</td><td>##IDS__IsErrorDlg_InstallerInfo##</td><td>ErrorText</td><td>O</td><td>C</td><td>Error</td><td/><td>0</td><td/></row>
+ <row><td>SetupInitialization</td><td>50</td><td>50</td><td>374</td><td>266</td><td>5</td><td>##IDS_PRODUCTNAME_INSTALLSHIELD##</td><td>Cancel</td><td>Cancel</td><td>Cancel</td><td>Setup Initialization</td><td/><td>0</td><td/></row>
+ <row><td>SetupInterrupted</td><td>50</td><td>50</td><td>374</td><td>266</td><td>3</td><td>##IDS_PRODUCTNAME_INSTALLSHIELD##</td><td>Finish</td><td>Finish</td><td>Finish</td><td>User Exit</td><td/><td>0</td><td/></row>
+ <row><td>SetupProgress</td><td>50</td><td>50</td><td>374</td><td>266</td><td>5</td><td>##IDS_PRODUCTNAME_INSTALLSHIELD##</td><td>Cancel</td><td>Cancel</td><td>Cancel</td><td>Progress</td><td/><td>0</td><td/></row>
+ <row><td>SetupResume</td><td>50</td><td>50</td><td>374</td><td>266</td><td>3</td><td>##IDS_PRODUCTNAME_INSTALLSHIELD##</td><td>Next</td><td>Next</td><td>Cancel</td><td>Resume</td><td/><td>0</td><td/></row>
+ <row><td>SetupType</td><td>50</td><td>50</td><td>374</td><td>266</td><td>3</td><td>##IDS_PRODUCTNAME_INSTALLSHIELD##</td><td>RadioGroup</td><td>Next</td><td>Cancel</td><td>Setup Type</td><td/><td>0</td><td/></row>
+ <row><td>SplashBitmap</td><td>50</td><td>50</td><td>374</td><td>266</td><td>3</td><td>##IDS_PRODUCTNAME_INSTALLSHIELD##</td><td>Next</td><td>Next</td><td>Cancel</td><td>Welcome Bitmap</td><td/><td>0</td><td/></row>
+ </table>
+
+ <table name="Directory">
+ <col key="yes" def="s72">Directory</col>
+ <col def="S72">Directory_Parent</col>
+ <col def="l255">DefaultDir</col>
+ <col def="S255">ISDescription</col>
+ <col def="I4">ISAttributes</col>
+ <col def="S255">ISFolderName</col>
+ <row><td>ALLUSERSPROFILE</td><td>TARGETDIR</td><td>.:ALLUSE~1|All Users</td><td/><td>0</td><td/></row>
+ <row><td>APACHE_SOFTWARE_FOUNDATION</td><td>ProgramFilesFolder</td><td>APACHE~1|Apache Software Foundation</td><td/><td>0</td><td/></row>
+ <row><td>AdminToolsFolder</td><td>TARGETDIR</td><td>.:Admint~1|AdminTools</td><td/><td>0</td><td/></row>
+ <row><td>AppDataFolder</td><td>TARGETDIR</td><td>.:APPLIC~1|Application Data</td><td/><td>0</td><td/></row>
+ <row><td>BIN</td><td>INSTALLDIR</td><td>bin</td><td/><td>0</td><td/></row>
+ <row><td>CONF</td><td>INSTALLDIR</td><td>conf</td><td/><td>0</td><td/></row>
+ <row><td>CommonAppDataFolder</td><td>TARGETDIR</td><td>.:Common~1|CommonAppData</td><td/><td>0</td><td/></row>
+ <row><td>CommonFiles64Folder</td><td>TARGETDIR</td><td>.:Common64</td><td/><td>0</td><td/></row>
+ <row><td>CommonFilesFolder</td><td>TARGETDIR</td><td>.:Common</td><td/><td>0</td><td/></row>
+ <row><td>DATABASEDIR</td><td>ISYourDataBaseDir</td><td>.</td><td/><td>0</td><td/></row>
+ <row><td>DesktopFolder</td><td>TARGETDIR</td><td>.:Desktop</td><td/><td>3</td><td/></row>
+ <row><td>FavoritesFolder</td><td>TARGETDIR</td><td>.:FAVORI~1|Favorites</td><td/><td>0</td><td/></row>
+ <row><td>FontsFolder</td><td>TARGETDIR</td><td>.:Fonts</td><td/><td>0</td><td/></row>
+ <row><td>GlobalAssemblyCache</td><td>TARGETDIR</td><td>.:Global~1|GlobalAssemblyCache</td><td/><td>0</td><td/></row>
+ <row><td>IISROOTFOLDER</td><td>TARGETDIR</td><td>.:IISRoo~1|IISRootFolder</td><td/><td>0</td><td/></row>
+ <row><td>INSTALLDIR</td><td>JAKARTA_ISAPI_REDIRECTOR</td><td>.</td><td/><td>0</td><td/></row>
+ <row><td>ISCommonFilesFolder</td><td>CommonFilesFolder</td><td>Instal~1|InstallShield</td><td/><td>0</td><td/></row>
+ <row><td>ISMyCompanyDir</td><td>ProgramFilesFolder</td><td>MYCOMP~1|My Company Name</td><td/><td>0</td><td/></row>
+ <row><td>ISMyProductDir</td><td>ISMyCompanyDir</td><td>MYPROD~1|My Product Name</td><td/><td>0</td><td/></row>
+ <row><td>ISUpdateServiceFolder</td><td>ISCommonFilesFolder</td><td>UPDATE~1|UpdateService</td><td/><td>0</td><td/></row>
+ <row><td>ISYourDataBaseDir</td><td>INSTALLDIR</td><td>Database</td><td/><td>0</td><td/></row>
+ <row><td>JAKARTA_ISAPI_REDIRECTOR</td><td>APACHE_SOFTWARE_FOUNDATION</td><td>JAKART~1|Tomcat Isapi Redirector</td><td/><td>0</td><td/></row>
+ <row><td>JAKARTA_ISAPU_REDIRECTOR</td><td>APACHE_SOFTWARE_FOUNDATION</td><td>JAKART~1|Jakarta Isapu Redirector</td><td/><td>0</td><td/></row>
+ <row><td>JBOSS_EUROPE_SARL</td><td>ProgramFilesFolder</td><td>JBOSSE~1|JBoss Europe SaRL</td><td/><td>0</td><td/></row>
+ <row><td>LOG</td><td>INSTALLDIR</td><td>log</td><td/><td>0</td><td/></row>
+ <row><td>LocalAppDataFolder</td><td>TARGETDIR</td><td>.:LocalA~1|LocalAppData</td><td/><td>0</td><td/></row>
+ <row><td>MY_PRODUCT_NAME</td><td>JBOSS_EUROPE_SARL</td><td>MYPROD~1|My Product Name</td><td/><td>0</td><td/></row>
+ <row><td>MY_PRODUCT_NAME1</td><td>APACHE_SOFTWARE_FOUNDATION</td><td>MYPROD~1|My Product Name</td><td/><td>0</td><td/></row>
+ <row><td>MyPicturesFolder</td><td>TARGETDIR</td><td>.:MyPict~1|MyPictures</td><td/><td>0</td><td/></row>
+ <row><td>PersonalFolder</td><td>TARGETDIR</td><td>.:Personal</td><td/><td>0</td><td/></row>
+ <row><td>PrimaryVolumePath</td><td>TARGETDIR</td><td>.:Primar~1|PrimaryVolumePath</td><td/><td>0</td><td/></row>
+ <row><td>ProgramFiles64Folder</td><td>TARGETDIR</td><td>.:Prog64~1|Program Files 64</td><td/><td>0</td><td/></row>
+ <row><td>ProgramFilesFolder</td><td>TARGETDIR</td><td>.:PROGRA~1|program files</td><td/><td>0</td><td/></row>
+ <row><td>ProgramMenuFolder</td><td>TARGETDIR</td><td>.:Programs</td><td/><td>3</td><td/></row>
+ <row><td>SendToFolder</td><td>TARGETDIR</td><td>.:SendTo</td><td/><td>3</td><td/></row>
+ <row><td>StartMenuFolder</td><td>TARGETDIR</td><td>.:STARTM~1|Start Menu</td><td/><td>3</td><td/></row>
+ <row><td>StartupFolder</td><td>TARGETDIR</td><td>.:StartUp</td><td/><td>3</td><td/></row>
+ <row><td>System16Folder</td><td>TARGETDIR</td><td>.:System</td><td/><td>0</td><td/></row>
+ <row><td>System64Folder</td><td>TARGETDIR</td><td>.:System64</td><td/><td>0</td><td/></row>
+ <row><td>SystemFolder</td><td>TARGETDIR</td><td>.:System32</td><td/><td>0</td><td/></row>
+ <row><td>TARGETDIR</td><td/><td>SourceDir</td><td/><td>0</td><td/></row>
+ <row><td>TempFolder</td><td>TARGETDIR</td><td>.:Temp</td><td/><td>0</td><td/></row>
+ <row><td>TemplateFolder</td><td>TARGETDIR</td><td>.:ShellNew</td><td/><td>0</td><td/></row>
+ <row><td>USERPROFILE</td><td>TARGETDIR</td><td>.:USERPR~1|UserProfile</td><td/><td>0</td><td/></row>
+ <row><td>WindowsFolder</td><td>TARGETDIR</td><td>.:Windows</td><td/><td>0</td><td/></row>
+ <row><td>WindowsVolume</td><td>TARGETDIR</td><td>.:WinRoot</td><td/><td>0</td><td/></row>
+ </table>
+
+ <table name="DrLocator">
+ <col key="yes" def="s72">Signature_</col>
+ <col key="yes" def="S72">Parent</col>
+ <col key="yes" def="S255">Path</col>
+ <col def="I2">Depth</col>
+ </table>
+
+ <table name="DuplicateFile">
+ <col key="yes" def="s72">FileKey</col>
+ <col def="s72">Component_</col>
+ <col def="s72">File_</col>
+ <col def="L255">DestName</col>
+ <col def="S72">DestFolder</col>
+ </table>
+
+ <table name="Environment">
+ <col key="yes" def="s72">Environment</col>
+ <col def="l255">Name</col>
+ <col def="L255">Value</col>
+ <col def="s72">Component_</col>
+ </table>
+
+ <table name="Error">
+ <col key="yes" def="i2">Error</col>
+ <col def="L255">Message</col>
+ <row><td>0</td><td>##IDS_ERROR_0##</td></row>
+ <row><td>1</td><td>##IDS_ERROR_1##</td></row>
+ <row><td>10</td><td>##IDS_ERROR_8##</td></row>
+ <row><td>11</td><td>##IDS_ERROR_9##</td></row>
+ <row><td>1101</td><td>##IDS_ERROR_22##</td></row>
+ <row><td>12</td><td>##IDS_ERROR_10##</td></row>
+ <row><td>13</td><td>##IDS_ERROR_11##</td></row>
+ <row><td>1301</td><td>##IDS_ERROR_23##</td></row>
+ <row><td>1302</td><td>##IDS_ERROR_24##</td></row>
+ <row><td>1303</td><td>##IDS_ERROR_25##</td></row>
+ <row><td>1304</td><td>##IDS_ERROR_26##</td></row>
+ <row><td>1305</td><td>##IDS_ERROR_27##</td></row>
+ <row><td>1306</td><td>##IDS_ERROR_28##</td></row>
+ <row><td>1307</td><td>##IDS_ERROR_29##</td></row>
+ <row><td>1308</td><td>##IDS_ERROR_30##</td></row>
+ <row><td>1309</td><td>##IDS_ERROR_31##</td></row>
+ <row><td>1310</td><td>##IDS_ERROR_32##</td></row>
+ <row><td>1311</td><td>##IDS_ERROR_33##</td></row>
+ <row><td>1312</td><td>##IDS_ERROR_34##</td></row>
+ <row><td>1313</td><td>##IDS_ERROR_35##</td></row>
+ <row><td>1314</td><td>##IDS_ERROR_36##</td></row>
+ <row><td>1315</td><td>##IDS_ERROR_37##</td></row>
+ <row><td>1316</td><td>##IDS_ERROR_38##</td></row>
+ <row><td>1317</td><td>##IDS_ERROR_39##</td></row>
+ <row><td>1318</td><td>##IDS_ERROR_40##</td></row>
+ <row><td>1319</td><td>##IDS_ERROR_41##</td></row>
+ <row><td>1320</td><td>##IDS_ERROR_42##</td></row>
+ <row><td>1321</td><td>##IDS_ERROR_43##</td></row>
+ <row><td>1322</td><td>##IDS_ERROR_44##</td></row>
+ <row><td>1323</td><td>##IDS_ERROR_45##</td></row>
+ <row><td>1324</td><td>##IDS_ERROR_46##</td></row>
+ <row><td>1325</td><td>##IDS_ERROR_47##</td></row>
+ <row><td>1326</td><td>##IDS_ERROR_48##</td></row>
+ <row><td>1327</td><td>##IDS_ERROR_49##</td></row>
+ <row><td>1328</td><td>##IDS_ERROR_122##</td></row>
+ <row><td>14</td><td>##IDS_ERROR_12##</td></row>
+ <row><td>1401</td><td>##IDS_ERROR_50##</td></row>
+ <row><td>1402</td><td>##IDS_ERROR_51##</td></row>
+ <row><td>1403</td><td>##IDS_ERROR_52##</td></row>
+ <row><td>1404</td><td>##IDS_ERROR_53##</td></row>
+ <row><td>1405</td><td>##IDS_ERROR_54##</td></row>
+ <row><td>1406</td><td>##IDS_ERROR_55##</td></row>
+ <row><td>1407</td><td>##IDS_ERROR_56##</td></row>
+ <row><td>1408</td><td>##IDS_ERROR_57##</td></row>
+ <row><td>1409</td><td>##IDS_ERROR_58##</td></row>
+ <row><td>1410</td><td>##IDS_ERROR_59##</td></row>
+ <row><td>15</td><td>##IDS_ERROR_13##</td></row>
+ <row><td>1500</td><td>##IDS_ERROR_60##</td></row>
+ <row><td>1501</td><td>##IDS_ERROR_61##</td></row>
+ <row><td>1502</td><td>##IDS_ERROR_62##</td></row>
+ <row><td>1503</td><td>##IDS_ERROR_63##</td></row>
+ <row><td>16</td><td>##IDS_ERROR_14##</td></row>
+ <row><td>1601</td><td>##IDS_ERROR_64##</td></row>
+ <row><td>1602</td><td>##IDS_ERROR_65##</td></row>
+ <row><td>1603</td><td>##IDS_ERROR_66##</td></row>
+ <row><td>1604</td><td>##IDS_ERROR_67##</td></row>
+ <row><td>1605</td><td>##IDS_ERROR_68##</td></row>
+ <row><td>1606</td><td>##IDS_ERROR_69##</td></row>
+ <row><td>1607</td><td>##IDS_ERROR_70##</td></row>
+ <row><td>1608</td><td>##IDS_ERROR_71##</td></row>
+ <row><td>17</td><td>##IDS_ERROR_15##</td></row>
+ <row><td>1701</td><td>##IDS_ERROR_72##</td></row>
+ <row><td>1702</td><td>##IDS_ERROR_73##</td></row>
+ <row><td>1703</td><td>##IDS_ERROR_74##</td></row>
+ <row><td>1704</td><td>##IDS_ERROR_75##</td></row>
+ <row><td>1705</td><td>##IDS_ERROR_76##</td></row>
+ <row><td>1706</td><td>##IDS_ERROR_77##</td></row>
+ <row><td>1707</td><td>##IDS_ERROR_78##</td></row>
+ <row><td>1708</td><td>##IDS_ERROR_79##</td></row>
+ <row><td>1709</td><td>##IDS_ERROR_80##</td></row>
+ <row><td>1710</td><td>##IDS_ERROR_81##</td></row>
+ <row><td>1711</td><td>##IDS_ERROR_82##</td></row>
+ <row><td>1712</td><td>##IDS_ERROR_83##</td></row>
+ <row><td>1713</td><td>##IDS_ERROR_123##</td></row>
+ <row><td>1714</td><td>##IDS_ERROR_124##</td></row>
+ <row><td>18</td><td>##IDS_ERROR_16##</td></row>
+ <row><td>1801</td><td>##IDS_ERROR_84##</td></row>
+ <row><td>1802</td><td>##IDS_ERROR_85##</td></row>
+ <row><td>1803</td><td>##IDS_ERROR_86##</td></row>
+ <row><td>1804</td><td>##IDS_ERROR_87##</td></row>
+ <row><td>1805</td><td>##IDS_ERROR_88##</td></row>
+ <row><td>1806</td><td>##IDS_ERROR_89##</td></row>
+ <row><td>1807</td><td>##IDS_ERROR_90##</td></row>
+ <row><td>19</td><td>##IDS_ERROR_17##</td></row>
+ <row><td>1901</td><td>##IDS_ERROR_91##</td></row>
+ <row><td>1902</td><td>##IDS_ERROR_92##</td></row>
+ <row><td>1903</td><td>##IDS_ERROR_93##</td></row>
+ <row><td>1904</td><td>##IDS_ERROR_94##</td></row>
+ <row><td>1905</td><td>##IDS_ERROR_95##</td></row>
+ <row><td>1906</td><td>##IDS_ERROR_96##</td></row>
+ <row><td>1907</td><td>##IDS_ERROR_97##</td></row>
+ <row><td>1908</td><td>##IDS_ERROR_98##</td></row>
+ <row><td>1909</td><td>##IDS_ERROR_99##</td></row>
+ <row><td>1910</td><td>##IDS_ERROR_100##</td></row>
+ <row><td>1911</td><td>##IDS_ERROR_101##</td></row>
+ <row><td>1912</td><td>##IDS_ERROR_102##</td></row>
+ <row><td>1913</td><td>##IDS_ERROR_103##</td></row>
+ <row><td>1914</td><td>##IDS_ERROR_104##</td></row>
+ <row><td>1915</td><td>##IDS_ERROR_105##</td></row>
+ <row><td>1916</td><td>##IDS_ERROR_106##</td></row>
+ <row><td>1917</td><td>##IDS_ERROR_107##</td></row>
+ <row><td>1918</td><td>##IDS_ERROR_108##</td></row>
+ <row><td>1919</td><td>##IDS_ERROR_109##</td></row>
+ <row><td>1920</td><td>##IDS_ERROR_110##</td></row>
+ <row><td>1921</td><td>##IDS_ERROR_111##</td></row>
+ <row><td>1922</td><td>##IDS_ERROR_112##</td></row>
+ <row><td>1923</td><td>##IDS_ERROR_113##</td></row>
+ <row><td>1924</td><td>##IDS_ERROR_114##</td></row>
+ <row><td>1925</td><td>##IDS_ERROR_115##</td></row>
+ <row><td>1926</td><td>##IDS_ERROR_116##</td></row>
+ <row><td>1927</td><td>##IDS_ERROR_117##</td></row>
+ <row><td>1928</td><td>##IDS_ERROR_118##</td></row>
+ <row><td>1929</td><td>##IDS_ERROR_119##</td></row>
+ <row><td>1930</td><td>##IDS_ERROR_125##</td></row>
+ <row><td>1931</td><td>##IDS_ERROR_126##</td></row>
+ <row><td>1932</td><td>##IDS_ERROR_127##</td></row>
+ <row><td>1933</td><td>##IDS_ERROR_128##</td></row>
+ <row><td>1934</td><td>##IDS_ERROR_129##</td></row>
+ <row><td>2</td><td>##IDS_ERROR_2##</td></row>
+ <row><td>20</td><td>##IDS_ERROR_18##</td></row>
+ <row><td>21</td><td>##IDS_ERROR_19##</td></row>
+ <row><td>22</td><td>##IDS_ERROR_120##</td></row>
+ <row><td>23</td><td>##IDS_ERROR_121##</td></row>
+ <row><td>2331</td><td>##IDS_ERROR_2331##</td></row>
+ <row><td>27500</td><td>##IDS_ERROR_130##</td></row>
+ <row><td>27501</td><td>##IDS_ERROR_131##</td></row>
+ <row><td>27502</td><td>##IDS_ERROR_27502##</td></row>
+ <row><td>27503</td><td>##IDS_ERROR_27503##</td></row>
+ <row><td>27504</td><td>##IDS_ERROR_27504##</td></row>
+ <row><td>27505</td><td>##IDS_ERROR_27505##</td></row>
+ <row><td>27506</td><td>##IDS_ERROR_27506##</td></row>
+ <row><td>27507</td><td>##IDS_ERROR_27507##</td></row>
+ <row><td>27508</td><td>##IDS_ERROR_27508##</td></row>
+ <row><td>27509</td><td>##IDS_ERROR_27509##</td></row>
+ <row><td>27510</td><td>##IDS_ERROR_27510##</td></row>
+ <row><td>27511</td><td>##IDS_ERROR_27511##</td></row>
+ <row><td>27512</td><td>##IDS_ERROR_27512##</td></row>
+ <row><td>27513</td><td>##IDS_ERROR_27513##</td></row>
+ <row><td>27514</td><td>##IDS_ERROR_27514##</td></row>
+ <row><td>27515</td><td>##IDS_ERROR_27515##</td></row>
+ <row><td>27516</td><td>##IDS_ERROR_27516##</td></row>
+ <row><td>27517</td><td>##IDS_ERROR_27517##</td></row>
+ <row><td>27518</td><td>##IDS_ERROR_27518##</td></row>
+ <row><td>27519</td><td>##IDS_ERROR_27519##</td></row>
+ <row><td>27520</td><td>##IDS_ERROR_27520##</td></row>
+ <row><td>27521</td><td>##IDS_ERROR_27521##</td></row>
+ <row><td>27522</td><td>##IDS_ERROR_27522##</td></row>
+ <row><td>27523</td><td>##IDS_ERROR_27523##</td></row>
+ <row><td>27524</td><td>##IDS_ERROR_27524##</td></row>
+ <row><td>27525</td><td>##IDS_ERROR_27525##</td></row>
+ <row><td>27526</td><td>##IDS_ERROR_27526##</td></row>
+ <row><td>27527</td><td>##IDS_ERROR_27527##</td></row>
+ <row><td>27528</td><td>##IDS_ERROR_27528##</td></row>
+ <row><td>27529</td><td>##IDS_ERROR_27529##</td></row>
+ <row><td>27530</td><td>##IDS_ERROR_27530##</td></row>
+ <row><td>27531</td><td>##IDS_ERROR_27531##</td></row>
+ <row><td>27532</td><td>##IDS_ERROR_27532##</td></row>
+ <row><td>27533</td><td>##IDS_ERROR_27533##</td></row>
+ <row><td>27534</td><td>##IDS_ERROR_27534##</td></row>
+ <row><td>27535</td><td>##IDS_ERROR_27535##</td></row>
+ <row><td>27536</td><td>##IDS_ERROR_27536##</td></row>
+ <row><td>27537</td><td>##IDS_ERROR_27537##</td></row>
+ <row><td>27538</td><td>##IDS_ERROR_27538##</td></row>
+ <row><td>27539</td><td>##IDS_ERROR_27539##</td></row>
+ <row><td>27540</td><td>##IDS_ERROR_27540##</td></row>
+ <row><td>27541</td><td>##IDS_ERROR_27541##</td></row>
+ <row><td>27542</td><td>##IDS_ERROR_27542##</td></row>
+ <row><td>27543</td><td>##IDS_ERROR_27543##</td></row>
+ <row><td>27544</td><td>##IDS_ERROR_27544##</td></row>
+ <row><td>27545</td><td>##IDS_ERROR_27545##</td></row>
+ <row><td>27546</td><td>##IDS_ERROR_27546##</td></row>
+ <row><td>27547</td><td>##IDS_ERROR_27547##</td></row>
+ <row><td>27548</td><td>##IDS_ERROR_27548##</td></row>
+ <row><td>27549</td><td>##IDS_ERROR_27549##</td></row>
+ <row><td>27550</td><td>##IDS_ERROR_27550##</td></row>
+ <row><td>27551</td><td>##IDS_ERROR_27551##</td></row>
+ <row><td>27552</td><td>##IDS_ERROR_27552##</td></row>
+ <row><td>27553</td><td>##IDS_ERROR_27553##</td></row>
+ <row><td>27554</td><td>##IDS_ERROR_27554##</td></row>
+ <row><td>32</td><td>##IDS_ERROR_20##</td></row>
+ <row><td>33</td><td>##IDS_ERROR_21##</td></row>
+ <row><td>4</td><td>##IDS_ERROR_3##</td></row>
+ <row><td>5</td><td>##IDS_ERROR_4##</td></row>
+ <row><td>7</td><td>##IDS_ERROR_5##</td></row>
+ <row><td>8</td><td>##IDS_ERROR_6##</td></row>
+ <row><td>9</td><td>##IDS_ERROR_7##</td></row>
+ </table>
+
+ <table name="EventMapping">
+ <col key="yes" def="s72">Dialog_</col>
+ <col key="yes" def="s50">Control_</col>
+ <col key="yes" def="s50">Event</col>
+ <col def="s50">Attribute</col>
+ <row><td>CustomSetup</td><td>ItemDescription</td><td>SelectionDescription</td><td>Text</td></row>
+ <row><td>CustomSetup</td><td>Location</td><td>SelectionPath</td><td>Text</td></row>
+ <row><td>CustomSetup</td><td>Size</td><td>SelectionSize</td><td>Text</td></row>
+ <row><td>SetupInitialization</td><td>ActionData</td><td>ActionData</td><td>Text</td></row>
+ <row><td>SetupInitialization</td><td>ActionText</td><td>ActionText</td><td>Text</td></row>
+ <row><td>SetupProgress</td><td>ActionProgress95</td><td>AdminInstallFinalize</td><td>Progress</td></row>
+ <row><td>SetupProgress</td><td>ActionProgress95</td><td>InstallFiles</td><td>Progress</td></row>
+ <row><td>SetupProgress</td><td>ActionProgress95</td><td>MoveFiles</td><td>Progress</td></row>
+ <row><td>SetupProgress</td><td>ActionProgress95</td><td>RemoveFiles</td><td>Progress</td></row>
+ <row><td>SetupProgress</td><td>ActionProgress95</td><td>RemoveRegistryValues</td><td>Progress</td></row>
+ <row><td>SetupProgress</td><td>ActionProgress95</td><td>SetProgress</td><td>Progress</td></row>
+ <row><td>SetupProgress</td><td>ActionProgress95</td><td>UnmoveFiles</td><td>Progress</td></row>
+ <row><td>SetupProgress</td><td>ActionProgress95</td><td>WriteIniValues</td><td>Progress</td></row>
+ <row><td>SetupProgress</td><td>ActionProgress95</td><td>WriteRegistryValues</td><td>Progress</td></row>
+ <row><td>SetupProgress</td><td>ActionText</td><td>ActionText</td><td>Text</td></row>
+ </table>
+
+ <table name="Extension">
+ <col key="yes" def="s255">Extension</col>
+ <col key="yes" def="s72">Component_</col>
+ <col def="S255">ProgId_</col>
+ <col def="S64">MIME_</col>
+ <col def="s38">Feature_</col>
+ </table>
+
+ <table name="Feature">
+ <col key="yes" def="s38">Feature</col>
+ <col def="S38">Feature_Parent</col>
+ <col def="L64">Title</col>
+ <col def="L255">Description</col>
+ <col def="I2">Display</col>
+ <col def="i2">Level</col>
+ <col def="S72">Directory_</col>
+ <col def="i2">Attributes</col>
+ <col def="S255">ISReleaseFlags</col>
+ <col def="S255">ISComments</col>
+ <col def="S255">ISFeatureCabName</col>
+ <col def="S255">ISProFeatureName</col>
+ <row><td>MainFeature</td><td/><td>##ID_STRING4##</td><td/><td>2</td><td>1</td><td>INSTALLDIR</td><td>0</td><td/><td/><td/><td/></row>
+ </table>
+
+ <table name="FeatureComponents">
+ <col key="yes" def="s38">Feature_</col>
+ <col key="yes" def="s72">Component_</col>
+ <row><td>MainFeature</td><td>AllOtherFiles</td></row>
+ <row><td>MainFeature</td><td>AllOtherFiles1</td></row>
+ <row><td>MainFeature</td><td>AllOtherFiles2</td></row>
+ <row><td>MainFeature</td><td>AllOtherFiles3</td></row>
+ <row><td>MainFeature</td><td>ISRegistryComponent</td></row>
+ <row><td>MainFeature</td><td>ISRegistryComponent1</td></row>
+ <row><td>MainFeature</td><td>VirtualDirComponent</td></row>
+ </table>
+
+ <table name="File">
+ <col key="yes" def="s72">File</col>
+ <col def="s72">Component_</col>
+ <col def="s255">FileName</col>
+ <col def="i4">FileSize</col>
+ <col def="S72">Version</col>
+ <col def="S20">Language</col>
+ <col def="I2">Attributes</col>
+ <col def="i2">Sequence</col>
+ <col def="S255">ISBuildSourcePath</col>
+ <col def="I4">ISAttributes</col>
+ <col def="S72">ISComponentSubFolder_</col>
+ <row><td>license.txt</td><td>AllOtherFiles3</td><td>LICENSE.TXT</td><td>0</td><td/><td/><td/><td>1</td><td>&lt;ISProjectFolder&gt;\LICENSE.TXT</td><td>1</td><td/></row>
+ </table>
+
+ <table name="FileSFPCatalog">
+ <col key="yes" def="s72">File_</col>
+ <col key="yes" def="s255">SFPCatalog_</col>
+ </table>
+
+ <table name="Font">
+ <col key="yes" def="s72">File_</col>
+ <col def="S128">FontTitle</col>
+ </table>
+
+ <table name="ISAssistantTag">
+ <col key="yes" def="s72">Tag</col>
+ <col def="S255">Data</col>
+ <row><td>BiildCDROMEnabled</td><td/></row>
+ <row><td>BiildInternetEnabled</td><td/></row>
+ <row><td>BiildSingleExeEnabled</td><td/></row>
+ <row><td>BiildSingleMSIEnabled</td><td/></row>
+ <row><td>PROJECT_ASSISTANT_DEFAULT_FEATURE</td><td>NewFeature1</td></row>
+ <row><td>PROJECT_ASSISTANT_FEATURES</td><td>NonSelectable</td></row>
+ <row><td>RegistryPageEnabled</td><td>Yes</td></row>
+ </table>
+
+ <table name="ISCEApp">
+ <col key="yes" def="s50">AppKey</col>
+ <col def="s50">AppName</col>
+ <col def="s200">CompanyName</col>
+ <col def="s50">DefDir</col>
+ <col def="S255">IconPath</col>
+ <col def="I4">IconIndex</col>
+ <col def="S255">DeviceFile</col>
+ <col def="s50">DesktopTargetDir</col>
+ <col def="S255">Description</col>
+ <col def="i2">DeleteMedia</col>
+ <col def="I4">InstallNetCF</col>
+ <col def="I4">InstallSQLServer</col>
+ <col def="I4">InstallSQLClient</col>
+ <col def="I4">InstallSQLDev</col>
+ <col def="S255">PreXML</col>
+ <col def="S255">PostXML</col>
+ <col def="I2">NoUninstall</col>
+ <col def="S255">SPCFile</col>
+ <col def="S255">PVKFile</col>
+ <col def="I4">Attributes</col>
+ <col def="S255">RawDeviceFile</col>
+ <col def="S72">Component_</col>
+ </table>
+
+ <table name="ISCEDir">
+ <col key="yes" def="s50">AppKey</col>
+ <col key="yes" def="s50">DirKey</col>
+ <col def="s50">DirParent</col>
+ <col def="s255">DirValue</col>
+ </table>
+
+ <table name="ISCEFile">
+ <col key="yes" def="s50">AppKey</col>
+ <col key="yes" def="s50">FileKey</col>
+ <col def="s255">Name</col>
+ <col def="s50">Destination</col>
+ <col def="s255">Source</col>
+ <col def="i4">Processor</col>
+ <col def="i4">Platform</col>
+ <col def="i4">CopyOption</col>
+ <col def="i4">FileOption</col>
+ <col def="I4">AdvancedOptions</col>
+ </table>
+
+ <table name="ISCEFileExt">
+ <col key="yes" def="s50">AppKey</col>
+ <col key="yes" def="s50">ExtKey</col>
+ <col def="s50">FileKey</col>
+ <col def="S255">Description</col>
+ <col def="s50">Extension</col>
+ <col def="i4">IconIndex</col>
+ </table>
+
+ <table name="ISCEInstall">
+ <col key="yes" def="s255">CEInstallKey</col>
+ <col def="s255">CEAppName</col>
+ <col def="s255">CEDesktopDir</col>
+ <col def="s255">CEIniFileKey</col>
+ <col def="s0">CECabs</col>
+ <col def="s0">CEIcoFile</col>
+ <col def="i2">DeleteMedia</col>
+ <col def="S38">Component_</col>
+ </table>
+
+ <table name="ISCEOtherAppCABs">
+ <col key="yes" def="s50">AppKey</col>
+ <col key="yes" def="s50">FileKey</col>
+ <col def="s255">BuildSourcePath</col>
+ </table>
+
+ <table name="ISCERegistry">
+ <col key="yes" def="s50">AppKey</col>
+ <col key="yes" def="s50">RegKey</col>
+ <col def="i4">Root</col>
+ <col def="s255">Key</col>
+ <col def="S255">Name</col>
+ <col def="S255">Value</col>
+ <col def="i4">Processor</col>
+ <col def="i4">Platform</col>
+ <col def="i4">Overwrite</col>
+ </table>
+
+ <table name="ISCESetupFile">
+ <col key="yes" def="s50">AppKey</col>
+ <col key="yes" def="s50">SetupFileKey</col>
+ <col def="s255">Name</col>
+ <col def="s255">Source</col>
+ <col def="i4">Processor</col>
+ <col def="i4">Platform</col>
+ </table>
+
+ <table name="ISCEShtCut">
+ <col key="yes" def="s50">AppKey</col>
+ <col key="yes" def="s50">ShtCutKey</col>
+ <col def="s255">DisplayName</col>
+ <col def="s255">Destination</col>
+ <col def="s50">Target</col>
+ <col def="i4">Platform</col>
+ </table>
+
+ <table name="ISComCatalogAttribute">
+ <col key="yes" def="s72">ISComCatalogObject_</col>
+ <col key="yes" def="s255">ItemName</col>
+ <col def="S0">ItemValue</col>
+ </table>
+
+ <table name="ISComCatalogCollection">
+ <col key="yes" def="s72">ISComCatalogCollection</col>
+ <col def="s72">ISComCatalogObject_</col>
+ <col def="s255">CollectionName</col>
+ </table>
+
+ <table name="ISComCatalogCollectionObjects">
+ <col key="yes" def="s72">ISComCatalogCollection_</col>
+ <col key="yes" def="s72">ISComCatalogObject_</col>
+ </table>
+
+ <table name="ISComCatalogObject">
+ <col key="yes" def="s72">ISComCatalogObject</col>
+ <col def="s255">DisplayName</col>
+ </table>
+
+ <table name="ISComPlusApplication">
+ <col key="yes" def="s72">ISComCatalogObject_</col>
+ <col def="S255">ComputerName</col>
+ <col def="s72">Component_</col>
+ <col def="I2">ISAttributes</col>
+ <col def="S0">DepFiles</col>
+ </table>
+
+ <table name="ISComPlusProxy">
+ <col key="yes" def="s72">ISComPlusProxy</col>
+ <col def="s72">ISComPlusApplication_</col>
+ <col def="S72">Component_</col>
+ <col def="I2">ISAttributes</col>
+ <col def="S0">DepFiles</col>
+ </table>
+
+ <table name="ISComponentExtended">
+ <col key="yes" def="s72">Component_</col>
+ <col def="I4">OS</col>
+ <col def="S0">Language</col>
+ <col def="s72">FilterProperty</col>
+ <col def="I4">Platforms</col>
+ <col def="S0">FTPLocation</col>
+ <col def="S0">HTTPLocation</col>
+ <col def="S0">Miscellaneous</col>
+ <row><td>AllOtherFiles</td><td/><td/><td>_74B17E30_4D29_487A_8CD4_7B95B8D56A83_FILTER</td><td/><td/><td/><td/></row>
+ <row><td>AllOtherFiles1</td><td/><td/><td>_7B0061CE_6436_4507_9459_93572D569FC1_FILTER</td><td/><td/><td/><td/></row>
+ <row><td>AllOtherFiles10</td><td/><td/><td>_E157B509_E34A_4875_AB50_BA85BE3F5DD2_FILTER</td><td/><td/><td/><td/></row>
+ <row><td>AllOtherFiles11</td><td/><td/><td>_3B6FD6F4_F250_47A8_834C_D7EFD14C3BEF_FILTER</td><td/><td/><td/><td/></row>
+ <row><td>AllOtherFiles12</td><td/><td/><td>_D98A783F_15B1_4E2D_B444_2AFE9178F6F0_FILTER</td><td/><td/><td/><td/></row>
+ <row><td>AllOtherFiles2</td><td/><td/><td>_7322BDD9_A833_41E8_B75C_D99037B19E78_FILTER</td><td/><td/><td/><td/></row>
+ <row><td>AllOtherFiles3</td><td/><td/><td>_C7E1E3F1_ABC8_4A0D_929F_A385EDF1E1F7_FILTER</td><td/><td/><td/><td/></row>
+ <row><td>AllOtherFiles4</td><td/><td/><td>_D740564E_80EF_41ED_958F_95C1F4062224_FILTER</td><td/><td/><td/><td/></row>
+ <row><td>AllOtherFiles5</td><td/><td/><td>_D918C9FE_F0EE_4F2B_870A_095BCA8C2C2F_FILTER</td><td/><td/><td/><td/></row>
+ <row><td>AllOtherFiles6</td><td/><td/><td>_228CD380_C643_4C2C_8ECB_4E7429660108_FILTER</td><td/><td/><td/><td/></row>
+ <row><td>AllOtherFiles7</td><td/><td/><td>_0C21B08E_04C8_4326_8560_DDA770F7D93E_FILTER</td><td/><td/><td/><td/></row>
+ <row><td>AllOtherFiles8</td><td/><td/><td>_845468E3_C693_4547_A32F_F231781A4C8A_FILTER</td><td/><td/><td/><td/></row>
+ <row><td>AllOtherFiles9</td><td/><td/><td>_5F1CCD3B_FD30_4D31_ACEE_707E99BE0281_FILTER</td><td/><td/><td/><td/></row>
+ <row><td>ISRegistryComponent</td><td/><td/><td>_1DEB35F2_294C_4ED0_B0A2_78FB6F4E2EFF_FILTER</td><td/><td/><td/><td/></row>
+ <row><td>ISRegistryComponent1</td><td/><td/><td>_2E54C60F_AF93_4D31_8E1B_F381B381FC92_FILTER</td><td/><td/><td/><td/></row>
+ <row><td>VirtualDirComponent</td><td/><td/><td>_5ACAD922_2F71_4963_BCF2_D05C97252574_FILTER</td><td/><td/><td/><td/></row>
+ </table>
+
+ <table name="ISDIMDependency">
+ <col key="yes" def="s72">ISDIMReference_</col>
+ <col def="s255">RequiredUUID</col>
+ <col def="S255">RequiredMajorVersion</col>
+ <col def="S255">RequiredMinorVersion</col>
+ <col def="S255">RequiredBuildVersion</col>
+ <col def="S255">RequiredRevisionVersion</col>
+ </table>
+
+ <table name="ISDIMReference">
+ <col key="yes" def="s72">ISDIMReference</col>
+ <col def="S0">ISBuildSourcePath</col>
+ </table>
+
+ <table name="ISDIMReferenceDependencies">
+ <col key="yes" def="s72">ISDIMReference_Parent</col>
+ <col key="yes" def="s72">ISDIMDependency_</col>
+ </table>
+
+ <table name="ISDIMVariable">
+ <col key="yes" def="s72">ISDIMVariable</col>
+ <col def="s72">ISDIMReference_</col>
+ <col def="s0">Name</col>
+ <col def="S0">NewValue</col>
+ <col def="I4">Type</col>
+ </table>
+
+ <table name="ISDLLWrapper">
+ <col key="yes" def="s72">EntryPoint</col>
+ <col def="I4">Type</col>
+ <col def="s0">Source</col>
+ <col def="s255">Target</col>
+ </table>
+
+ <table name="ISDRMFile">
+ <col key="yes" def="s72">ISDRMFile</col>
+ <col def="S72">File_</col>
+ <col def="S72">ISDRMLicense_</col>
+ <col def="s255">Shell</col>
+ </table>
+
+ <table name="ISDRMFileAttribute">
+ <col key="yes" def="s72">ISDRMFile_</col>
+ <col key="yes" def="s72">Property</col>
+ <col def="S0">Value</col>
+ </table>
+
+ <table name="ISDRMLicense">
+ <col key="yes" def="s72">ISDRMLicense</col>
+ <col def="S255">Description</col>
+ <col def="S50">ProjectVersion</col>
+ <col def="I4">Attributes</col>
+ <col def="S255">LicenseNumber</col>
+ <col def="S255">RequestCode</col>
+ <col def="S255">ResponseCode</col>
+ </table>
+
+ <table name="ISDependency">
+ <col key="yes" def="S50">ISDependency</col>
+ <col def="I2">Exclude</col>
+ </table>
+
+ <table name="ISDisk1File">
+ <col key="yes" def="s72">ISDisk1File</col>
+ <col def="s255">ISBuildSourcePath</col>
+ <col def="I4">Disk</col>
+ </table>
+
+ <table name="ISDynamicFile">
+ <col key="yes" def="s72">Component_</col>
+ <col key="yes" def="s255">SourceFolder</col>
+ <col def="I2">IncludeFlags</col>
+ <col def="S0">IncludeFiles</col>
+ <col def="S0">ExcludeFiles</col>
+ <col def="I4">ISAttributes</col>
+ <row><td>AllOtherFiles</td><td>&lt;ISProjectFolder&gt;\bin</td><td>4</td><td/><td/><td>0</td></row>
+ <row><td>AllOtherFiles1</td><td>&lt;ISProjectFolder&gt;\conf</td><td>4</td><td/><td/><td>0</td></row>
+ <row><td>AllOtherFiles2</td><td>&lt;ISProjectFolder&gt;\log</td><td>4</td><td/><td/><td>0</td></row>
+ </table>
+
+ <table name="ISFeatureDIMReferences">
+ <col key="yes" def="s38">Feature_</col>
+ <col key="yes" def="s72">ISDIMReference_</col>
+ </table>
+
+ <table name="ISFeatureMergeModuleExcludes">
+ <col key="yes" def="s38">Feature_</col>
+ <col key="yes" def="s255">ModuleID</col>
+ <col key="yes" def="i2">Language</col>
+ </table>
+
+ <table name="ISFeatureMergeModules">
+ <col key="yes" def="s38">Feature_</col>
+ <col key="yes" def="s255">ISMergeModule_</col>
+ <col key="yes" def="i2">Language_</col>
+ </table>
+
+ <table name="ISFileManifests">
+ <col key="yes" def="s72">File_</col>
+ <col key="yes" def="s72">Manifest_</col>
+ </table>
+
+ <table name="ISIISAppPool">
+ <col key="yes" def="s72">AppPool</col>
+ <col def="l72">Name</col>
+ <col def="s72">Component_</col>
+ <col def="I4">Attributes</col>
+ <col def="S72">User</col>
+ <col def="S72">UserPassword</col>
+ <col def="I4">RecycleMinutes</col>
+ <col def="I4">RecycleRequests</col>
+ <col def="S72">RecycleTimes</col>
+ <col def="I4">IdleTimeout</col>
+ <col def="I4">QueueLimit</col>
+ <col def="S72">CPUMon</col>
+ <col def="I4">MaxProc</col>
+ </table>
+
+ <table name="ISIISCommon">
+ <col key="yes" def="s50">ISIISCommon</col>
+ <col def="S50">ISIISCommon_Parent</col>
+ <col def="L255">DisplayName</col>
+ <col def="s50">RootDir</col>
+ <col def="i4">Attributes</col>
+ <col def="L255">DefDoc</col>
+ <col def="I4">SessionTimeout</col>
+ <col def="I4">ScriptTimeout</col>
+ <col def="S255">AnonyUserName</col>
+ <col def="S255">AnonyPasswrd</col>
+ <col def="S0">CustomErrors</col>
+ <col def="L255">AppName</col>
+ <col def="S72">SSLCert</col>
+ <col def="L72">AppPool_</col>
+ <row><td>ISIISCommonVRoot</td><td>ISIISCommonWebsite1</td><td>##ID_STRING3##</td><td>BIN</td><td>28069</td><td>Default.asp</td><td>20</td><td>90</td><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISIISCommonWebsite1</td><td/><td>Default Web Site</td><td>IISROOTFOLDER</td><td>28113</td><td/><td>20</td><td>90</td><td/><td/><td/><td/><td/><td/></row>
+ </table>
+
+ <table name="ISIISMetaData">
+ <col key="yes" def="s72">ISIISCommon_</col>
+ <col key="yes" def="I4">MetaDataProp</col>
+ <col def="I4">MetaDataType</col>
+ <col def="i4">MetaDataUserType</col>
+ <col def="i4">MetaDataAttributes</col>
+ <col def="i4">Order</col>
+ <col def="s0">MetaDataValue</col>
+ </table>
+
+ <table name="ISIISWebServiceExtension">
+ <col key="yes" def="s72">WebServiceExtension</col>
+ <col def="s0">Component_</col>
+ <col def="s72">File</col>
+ <col def="l72">Description</col>
+ <col def="s72">Group</col>
+ <col def="i4">Attributes</col>
+ </table>
+
+ <table name="ISInstallScriptAction">
+ <col key="yes" def="s72">EntryPoint</col>
+ <col def="I4">Type</col>
+ <col def="s72">Source</col>
+ <col def="S255">Target</col>
+ </table>
+
+ <table name="ISLanguage">
+ <col key="yes" def="s50">ISLanguage</col>
+ <col def="I2">Included</col>
+ <row><td>1033</td><td>1</td></row>
+ </table>
+
+ <table name="ISLinkerLibrary">
+ <col key="yes" def="s72">ISLinkerLibrary</col>
+ <col def="s255">Library</col>
+ <col def="i4">Order</col>
+ <row><td>Isrt.obl</td><td>&lt;ISProductFolder&gt;\Script\ISRT\Lib\isrt.obl</td><td>2</td></row>
+ <row><td>Iswi.obl</td><td>&lt;ISProductFolder&gt;\Script\ISWi\Lib\iswi.obl</td><td>1</td></row>
+ </table>
+
+ <table name="ISLocalControl">
+ <col key="yes" def="s72">Dialog_</col>
+ <col key="yes" def="s50">Control_</col>
+ <col key="yes" def="s50">ISLanguage_</col>
+ <col def="I4">Attributes</col>
+ <col def="I2">X</col>
+ <col def="I2">Y</col>
+ <col def="I2">Width</col>
+ <col def="I2">Height</col>
+ <col def="S72">Binary_</col>
+ <col def="S255">ISBuildSourcePath</col>
+ </table>
+
+ <table name="ISLocalDialog">
+ <col key="yes" def="S50">Dialog_</col>
+ <col key="yes" def="S50">ISLanguage_</col>
+ <col def="I4">Attributes</col>
+ <col def="S72">TextStyle_</col>
+ <col def="i2">Width</col>
+ <col def="i2">Height</col>
+ </table>
+
+ <table name="ISLocalRadioButton">
+ <col key="yes" def="s72">Property</col>
+ <col key="yes" def="i2">Order</col>
+ <col key="yes" def="s50">ISLanguage_</col>
+ <col def="i2">X</col>
+ <col def="i2">Y</col>
+ <col def="i2">Width</col>
+ <col def="i2">Height</col>
+ </table>
+
+ <table name="ISLogicalDisk">
+ <col key="yes" def="i2">DiskId</col>
+ <col key="yes" def="s255">ISProductConfiguration_</col>
+ <col key="yes" def="s255">ISRelease_</col>
+ <col def="i2">LastSequence</col>
+ <col def="L64">DiskPrompt</col>
+ <col def="S255">Cabinet</col>
+ <col def="S32">VolumeLabel</col>
+ <col def="S32">Source</col>
+ <row><td>1</td><td>Release</td><td>Bin</td><td>0</td><td/><td/><td/><td/></row>
+ <row><td>1</td><td>Release</td><td>Msi</td><td>0</td><td/><td/><td/><td/></row>
+ </table>
+
+ <table name="ISLogicalDiskFeatures">
+ <col key="yes" def="i2">ISLogicalDisk_</col>
+ <col key="yes" def="s255">ISProductConfiguration_</col>
+ <col key="yes" def="s255">ISRelease_</col>
+ <col key="yes" def="S38">Feature_</col>
+ <col def="i2">Sequence</col>
+ <col def="I4">ISAttributes</col>
+ </table>
+
+ <table name="ISMergeModule">
+ <col key="yes" def="s255">ISMergeModule</col>
+ <col key="yes" def="i2">Language</col>
+ <col def="s255">Name</col>
+ <col def="S255">Destination</col>
+ <col def="I4">ISAttributes</col>
+ </table>
+
+ <table name="ISMergeModuleCfgValues">
+ <col key="yes" def="s255">ISMergeModule_</col>
+ <col key="yes" def="i2">Language_</col>
+ <col key="yes" def="s72">ModuleConfiguration_</col>
+ <col def="L0">Value</col>
+ <col def="i2">Format</col>
+ <col def="L255">Type</col>
+ <col def="L255">ContextData</col>
+ <col def="L255">DefaultValue</col>
+ <col def="I2">Attributes</col>
+ <col def="L255">DisplayName</col>
+ <col def="L255">Description</col>
+ <col def="L255">HelpLocation</col>
+ <col def="L255">HelpKeyword</col>
+ </table>
+
+ <table name="ISObject">
+ <col key="yes" def="s50">ObjectName</col>
+ <col def="s15">Language</col>
+ </table>
+
+ <table name="ISObjectProperty">
+ <col key="yes" def="S50">ObjectName</col>
+ <col key="yes" def="S50">Property</col>
+ <col def="S0">Value</col>
+ <col def="I2">IncludeInBuild</col>
+ </table>
+
+ <table name="ISPalmApp">
+ <col key="yes" def="s72">PalmApp</col>
+ <col key="yes" def="s72">Component</col>
+ </table>
+
+ <table name="ISPalmAppFile">
+ <col key="yes" def="s72">PalmApp</col>
+ <col key="yes" def="s72">FileKey</col>
+ <col def="i4">Destination</col>
+ </table>
+
+ <table name="ISPatchConfigImage">
+ <col key="yes" def="S72">PatchConfiguration_</col>
+ <col key="yes" def="s72">UpgradedImage_</col>
+ </table>
+
+ <table name="ISPatchConfiguration">
+ <col key="yes" def="s72">Name</col>
+ <col def="i2">CanPCDiffer</col>
+ <col def="i2">CanPVDiffer</col>
+ <col def="i2">IncludeWholeFiles</col>
+ <col def="i2">LeaveDecompressed</col>
+ <col def="i2">OptimizeForSize</col>
+ <col def="i2">EnablePatchCache</col>
+ <col def="S0">PatchCacheDir</col>
+ <col def="i4">Flags</col>
+ <col def="S0">PatchGuidsToReplace</col>
+ <col def="s0">TargetProductCodes</col>
+ <col def="s50">PatchGuid</col>
+ <col def="s0">OutputPath</col>
+ <col def="i2">MinMsiVersion</col>
+ <col def="I4">Attributes</col>
+ </table>
+
+ <table name="ISPatchConfigurationProperty">
+ <col key="yes" def="S72">ISPatchConfiguration_</col>
+ <col key="yes" def="S50">Property</col>
+ <col def="S50">Value</col>
+ </table>
+
+ <table name="ISPatchExternalFile">
+ <col key="yes" def="s50">Name</col>
+ <col key="yes" def="s13">ISUpgradedImage_</col>
+ <col def="s72">FileKey</col>
+ <col def="s255">FilePath</col>
+ </table>
+
+ <table name="ISPatchWholeFile">
+ <col key="yes" def="s50">UpgradedImage</col>
+ <col key="yes" def="s72">FileKey</col>
+ <col def="S72">Component</col>
+ </table>
+
+ <table name="ISPathVariable">
+ <col key="yes" def="s32">ISPathVariable</col>
+ <col def="S255">Value</col>
+ <col def="S255">TestValue</col>
+ <col def="i4">Type</col>
+ <row><td>CommonFilesFolder</td><td/><td/><td>1</td></row>
+ <row><td>ISPROJECTDIR</td><td/><td/><td>1</td></row>
+ <row><td>ISProductFolder</td><td/><td/><td>1</td></row>
+ <row><td>ISProjectDataFolder</td><td/><td/><td>1</td></row>
+ <row><td>ISProjectFolder</td><td/><td/><td>1</td></row>
+ <row><td>PATH_TO_IIS_FILES</td><td>C:\W\jakarta\jtc\jk\native\iis</td><td/><td>2</td></row>
+ <row><td>ProgramFilesFolder</td><td/><td/><td>1</td></row>
+ <row><td>SystemFolder</td><td/><td/><td>1</td></row>
+ <row><td>WindowsFolder</td><td/><td/><td>1</td></row>
+ </table>
+
+ <table name="ISProductConfiguration">
+ <col key="yes" def="s72">ISProductConfiguration</col>
+ <col def="S255">ProductConfigurationFlags</col>
+ <col def="I4">GeneratePackageCode</col>
+ <row><td>Release</td><td/><td>1</td></row>
+ </table>
+
+ <table name="ISProductConfigurationInstance">
+ <col key="yes" def="s72">ISProductConfiguration_</col>
+ <col key="yes" def="i2">InstanceId</col>
+ <col key="yes" def="s72">Property</col>
+ <col def="s255">Value</col>
+ </table>
+
+ <table name="ISProductConfigurationProperty">
+ <col key="yes" def="s72">ISProductConfiguration_</col>
+ <col key="yes" def="s72">Property</col>
+ <col def="L255">Value</col>
+ <row><td>Release</td><td>SetupFileName</td><td>setup</td></row>
+ </table>
+
+ <table name="ISRelease">
+ <col key="yes" def="s72">ISRelease</col>
+ <col key="yes" def="s72">ISProductConfiguration_</col>
+ <col def="s255">BuildLocation</col>
+ <col def="s255">PackageName</col>
+ <col def="i4">Type</col>
+ <col def="s255">SupportedLanguagesUI</col>
+ <col def="i4">MsiSourceType</col>
+ <col def="i4">ReleaseType</col>
+ <col def="s72">Platforms</col>
+ <col def="S255">SupportedLanguagesData</col>
+ <col def="s6">DefaultLanguage</col>
+ <col def="i4">SupportedOSs</col>
+ <col def="s50">DiskSize</col>
+ <col def="i4">DiskSizeUnit</col>
+ <col def="i4">DiskClusterSize</col>
+ <col def="S255">ReleaseFlags</col>
+ <col def="i4">DiskSpanning</col>
+ <col def="S255">SynchMsi</col>
+ <col def="s255">MediaLocation</col>
+ <col def="S255">URLLocation</col>
+ <col def="S255">DigitalURL</col>
+ <col def="S255">DigitalPVK</col>
+ <col def="S255">DigitalSPC</col>
+ <col def="S255">Password</col>
+ <col def="S255">VersionCopyright</col>
+ <col def="i4">Attributes</col>
+ <col def="S255">CDBrowser</col>
+ <col def="S255">DotNetBuildConfiguration</col>
+ <col def="S255">MsiCommandLine</col>
+ <col def="I4">ISSetupPrerequisiteLocation</col>
+ <row><td>Bin</td><td>Release</td><td>&lt;ISProjectDataFolder&gt;</td><td>PackageName</td><td>4</td><td>1033</td><td>2</td><td>1</td><td>Intel</td><td/><td>1033</td><td>3</td><td>0</td><td>1</td><td>0</td><td/><td>0</td><td/><td>MediaLocation</td><td/><td>http://</td><td/><td/><td/><td/><td>8988685</td><td/><td/><td/><td/></row>
+ <row><td>Msi</td><td>Release</td><td>&lt;ISProjectDataFolder&gt;</td><td>PackageName</td><td>0</td><td>1033</td><td>2</td><td>1</td><td>Intel</td><td/><td>1033</td><td>3</td><td>650</td><td>0</td><td>2048</td><td/><td>0</td><td/><td>MediaLocation</td><td/><td>http://</td><td/><td/><td/><td/><td>8464397</td><td/><td/><td/><td/></row>
+ </table>
+
+ <table name="ISReleaseASPublishInfo">
+ <col key="yes" def="s72">ISRelease_</col>
+ <col key="yes" def="s72">ISProductConfiguration_</col>
+ <col key="yes" def="S0">Property</col>
+ <col def="S0">Value</col>
+ </table>
+
+ <table name="ISReleaseExtended">
+ <col key="yes" def="s72">ISRelease_</col>
+ <col key="yes" def="s72">ISProductConfiguration_</col>
+ <col def="I4">WebType</col>
+ <col def="S255">WebURL</col>
+ <col def="I4">WebCabSize</col>
+ <col def="S255">OneClickCabName</col>
+ <col def="S255">OneClickHtmlName</col>
+ <col def="S255">WebLocalCachePath</col>
+ <col def="I4">EngineLocation</col>
+ <col def="S255">Win9xMsiUrl</col>
+ <col def="S255">WinNTMsiUrl</col>
+ <col def="I4">ISEngineLocation</col>
+ <col def="S255">ISEngineURL</col>
+ <col def="I4">OneClickTargetBrowser</col>
+ <col def="S255">DigitalCertificateIdNS</col>
+ <col def="S255">DigitalCertificateDBaseNS</col>
+ <col def="S255">DigitalCertificatePasswordNS</col>
+ <col def="I4">DotNetRedistLocation</col>
+ <col def="S255">DotNetRedistURL</col>
+ <col def="I4">DotNetVersion</col>
+ <col def="S255">DotNetBaseLanguage</col>
+ <col def="S0">DotNetLangaugePacks</col>
+ <col def="S255">DotNetFxCmdLine</col>
+ <col def="S255">DotNetLangPackCmdLine</col>
+ <col def="S50">JSharpCmdLine</col>
+ <col def="I4">Attributes</col>
+ <col def="I4">JSharpRedistLocation</col>
+ <col def="I4">MsiEngineVersion</col>
+ <col def="S255">WinMsi30Url</col>
+ <col def="S255">CertPassword</col>
+ <row><td>Bin</td><td>Release</td><td>0</td><td>http://</td><td>0</td><td>install</td><td>install</td><td>[WindowsFolder]Downloaded Installations</td><td>1</td><td>http://www.installengine.com/Msiengine20</td><td>http://www.installengine.com/Msiengine20</td><td>2</td><td>http://www.installengine.com/cert05/isengine</td><td>2</td><td/><td/><td/><td>3</td><td>http://www.installengine.com/cert05/dotnetfx</td><td>0</td><td>1033</td><td/><td/><td/><td/><td>16</td><td>3</td><td>4</td><td>http://www.installengine.com/Msiengine30</td><td/></row>
+ <row><td>Msi</td><td>Release</td><td>0</td><td>http://</td><td>0</td><td>install</td><td>install</td><td>[WindowsFolder]Downloaded Installations</td><td>2</td><td>http://www.installengine.com/Msiengine20</td><td>http://www.installengine.com/Msiengine20</td><td>2</td><td>http://www.installengine.com/cert05/isengine</td><td/><td/><td/><td/><td>3</td><td>http://www.installengine.com/cert05/dotnetfx</td><td>0</td><td>1033</td><td/><td/><td/><td/><td>16</td><td>3</td><td>4</td><td>http://www.installengine.com/Msiengine30</td><td/></row>
+ <row><td>Release 1</td><td>Release</td><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/><td/></row>
+ </table>
+
+ <table name="ISReleasePublishInfo">
+ <col key="yes" def="s72">ISRelease_</col>
+ <col key="yes" def="s72">ISProductConfiguration_</col>
+ <col def="S255">Repository</col>
+ <col def="S255">DisplayName</col>
+ <col def="S255">Publisher</col>
+ <col def="S255">Description</col>
+ <col def="I4">ISAttributes</col>
+ </table>
+
+ <table name="ISSQLConnection">
+ <col key="yes" def="s72">ISSQLConnection</col>
+ <col def="s255">Server</col>
+ <col def="s255">Database</col>
+ <col def="s255">UserName</col>
+ <col def="s255">Password</col>
+ <col def="s255">Authentication</col>
+ <col def="i2">Attributes</col>
+ <col def="i2">Order</col>
+ <col def="S0">Comments</col>
+ <col def="I4">CmdTimeout</col>
+ <col def="S0">BatchSeparator</col>
+ </table>
+
+ <table name="ISSQLConnectionDBServer">
+ <col key="yes" def="s72">ISSQLConnectionDBServer</col>
+ <col key="yes" def="s72">ISSQLConnection_</col>
+ <col key="yes" def="s72">ISSQLDBMetaData_</col>
+ <col def="i2">Order</col>
+ </table>
+
+ <table name="ISSQLConnectionScript">
+ <col key="yes" def="s72">ISSQLConnection_</col>
+ <col key="yes" def="s72">ISSQLScriptFile_</col>
+ <col def="i2">Order</col>
+ </table>
+
+ <table name="ISSQLDBMetaData">
+ <col key="yes" def="s72">ISSQLDBMetaData</col>
+ <col def="S0">DisplayName</col>
+ <col def="S0">AdoDriverName</col>
+ <col def="S0">AdoCxnDriver</col>
+ <col def="S0">AdoCxnServer</col>
+ <col def="S0">AdoCxnDatabase</col>
+ <col def="S0">AdoCxnUserID</col>
+ <col def="S0">AdoCxnPassword</col>
+ <col def="S0">AdoCxnWindowsSecurity</col>
+ <col def="S0">AdoCxnNetLibrary</col>
+ <col def="S0">TestDatabaseCmd</col>
+ <col def="S0">TestTableCmd</col>
+ <col def="S0">VersionInfoCmd</col>
+ <col def="S0">VersionBeginToken</col>
+ <col def="S0">VersionEndToken</col>
+ <col def="S0">LocalInstanceNames</col>
+ <col def="S0">CreateDbCmd</col>
+ <col def="S0">SwitchDbCmd</col>
+ <col def="I4">ISAttributes</col>
+ <col def="S0">TestTableCmd2</col>
+ <col def="S0">WinAuthentUserId</col>
+ <col def="S0">DsnODBCName</col>
+ </table>
+
+ <table name="ISSQLRequirement">
+ <col key="yes" def="s72">ISSQLRequirement</col>
+ <col key="yes" def="s72">ISSQLConnection_</col>
+ <col def="S15">MajorVersion</col>
+ <col def="S25">ServicePackLevel</col>
+ <col def="i4">Attributes</col>
+ <col def="S72">ISSQLConnectionDBServer_</col>
+ </table>
+
+ <table name="ISSQLScriptError">
+ <col key="yes" def="i4">ErrNumber</col>
+ <col key="yes" def="S72">ISSQLScriptFile_</col>
+ <col def="i2">ErrHandling</col>
+ <col def="L255">Message</col>
+ <col def="i2">Attributes</col>
+ </table>
+
+ <table name="ISSQLScriptFile">
+ <col key="yes" def="s72">ISSQLScriptFile</col>
+ <col def="s72">Component_</col>
+ <col def="i2">Scheduling</col>
+ <col def="L255">InstallText</col>
+ <col def="L255">UninstallText</col>
+ <col def="S0">ISBuildSourcePath</col>
+ <col def="S0">Comments</col>
+ <col def="i2">ErrorHandling</col>
+ <col def="i2">Attributes</col>
+ <col def="S15">Version</col>
+ </table>
+
+ <table name="ISSQLScriptImport">
+ <col key="yes" def="s72">ISSQLScriptFile_</col>
+ <col def="S255">Server</col>
+ <col def="S255">Database</col>
+ <col def="S255">UserName</col>
+ <col def="S255">Password</col>
+ <col def="i4">Authentication</col>
+ <col def="S0">IncludeTables</col>
+ <col def="S0">ExcludeTables</col>
+ <col def="i4">Attributes</col>
+ </table>
+
+ <table name="ISSQLScriptReplace">
+ <col key="yes" def="s72">ISSQLScriptReplace</col>
+ <col key="yes" def="s72">ISSQLScriptFile_</col>
+ <col def="S0">Search</col>
+ <col def="S0">Replace</col>
+ <col def="i4">Attributes</col>
+ </table>
+
+ <table name="ISScriptFile">
+ <col key="yes" def="s255">ISScriptFile</col>
+ </table>
+
+ <table name="ISSelfReg">
+ <col key="yes" def="s72">FileKey</col>
+ <col def="I2">Cost</col>
+ <col def="I2">Order</col>
+ <col def="S50">CmdLine</col>
+ </table>
+
+ <table name="ISSetupFile">
+ <col key="yes" def="s72">ISSetupFile</col>
+ <col def="S255">FileName</col>
+ <col def="V0">Stream</col>
+ <col def="S50">Language</col>
+ <col def="I2">Splash</col>
+ <col def="S0">Path</col>
+ </table>
+
+ <table name="ISSetupPrerequisites">
+ <col key="yes" def="s72">ISSetupPrerequisites</col>
+ <col def="S255">ISBuildSourcePath</col>
+ <col def="I2">Order</col>
+ </table>
+
+ <table name="ISSetupType">
+ <col key="yes" def="s38">ISSetupType</col>
+ <col def="L255">Description</col>
+ <col def="L255">Display_Name</col>
+ <col def="i2">Display</col>
+ <col def="S255">Comments</col>
+ </table>
+
+ <table name="ISSetupTypeFeatures">
+ <col key="yes" def="s38">ISSetupType_</col>
+ <col key="yes" def="s38">Feature_</col>
+ </table>
+
+ <table name="ISStorages">
+ <col key="yes" def="s72">Name</col>
+ <col def="S0">ISBuildSourcePath</col>
+ </table>
+
+ <table name="ISString">
+ <col key="yes" def="s255">ISString</col>
+ <col key="yes" def="s50">ISLanguage_</col>
+ <col def="S0">Value</col>
+ <col def="I2">Encoded</col>
+ <col def="S0">Comment</col>
+ <col def="I4">TimeStamp</col>
+ <row><td>COMPANY_NAME</td><td>1033</td><td>Apache Software Foundation</td><td>0</td><td/><td>2115503849</td></row>
+ <row><td>DN_AlwaysInstall</td><td>1033</td><td>Always Install</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDPROP_EXPRESS_LAUNCH_CONDITION_COLOR</td><td>1033</td><td>The color settings of your system are not adequate for running [ProductName].</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDPROP_EXPRESS_LAUNCH_CONDITION_OS</td><td>1033</td><td>[ProductName] requires that your computer is running Windows NT 4.0 or Windows 2000 or Windows XP or Windows 2003 Server</td><td>0</td><td/><td>2115550953</td></row>
+ <row><td>IDPROP_EXPRESS_LAUNCH_CONDITION_PROCESSOR</td><td>1033</td><td>The processor is not adequate for running [ProductName].</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDPROP_EXPRESS_LAUNCH_CONDITION_RAM</td><td>1033</td><td>The amount of RAM is not adequate for running [ProductName].</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDPROP_EXPRESS_LAUNCH_CONDITION_SCREEN</td><td>1033</td><td>The screen resolution is not adequate for running [ProductName].</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDPROP_SETUPTYPE_COMPACT</td><td>1033</td><td>Compact</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDPROP_SETUPTYPE_COMPACT_DESC</td><td>1033</td><td>Compact Description</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDPROP_SETUPTYPE_COMPLETE</td><td>1033</td><td>Complete</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDPROP_SETUPTYPE_COMPLETE_DESC</td><td>1033</td><td>Complete</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDPROP_SETUPTYPE_CUSTOM</td><td>1033</td><td>Custom</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDPROP_SETUPTYPE_CUSTOM_DESC</td><td>1033</td><td>Custom Description</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDPROP_SETUPTYPE_CUSTOM_DESC_PRO</td><td>1033</td><td>Custom</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDPROP_SETUPTYPE_TYPICAL</td><td>1033</td><td>Typical</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDPROP_SETUPTYPE_TYPICAL_DESC</td><td>1033</td><td>Typical Description</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_1</td><td>1033</td><td>[1]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_1b</td><td>1033</td><td>[1]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_1c</td><td>1033</td><td>[1]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_1d</td><td>1033</td><td>[1]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_Advertising</td><td>1033</td><td>Advertising application</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_AllocatingRegistry</td><td>1033</td><td>Allocating registry space</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_AppCommandLine</td><td>1033</td><td>Application: [1], Command line: [2]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_AppId</td><td>1033</td><td>AppId: [1]{{, AppType: [2]}}</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_AppIdAppTypeRSN</td><td>1033</td><td>AppId: [1]{{, AppType: [2], Users: [3], RSN: [4]}}</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_Application</td><td>1033</td><td>Application: [1]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_BindingExes</td><td>1033</td><td>Binding executables</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_ClassId</td><td>1033</td><td>Class ID: [1]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_ClsID</td><td>1033</td><td>Class ID: [1]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_ComponentIDQualifier</td><td>1033</td><td>Component ID: [1], Qualifier: [2]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_ComponentIdQualifier2</td><td>1033</td><td>Component ID: [1], Qualifier: [2]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_ComputingSpace</td><td>1033</td><td>Computing space requirements</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_ComputingSpace2</td><td>1033</td><td>Computing space requirements</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_ComputingSpace3</td><td>1033</td><td>Computing space requirements</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_ContentTypeExtension</td><td>1033</td><td>MIME Content Type: [1], Extension: [2]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_ContentTypeExtension2</td><td>1033</td><td>MIME Content Type: [1], Extension: [2]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_CopyingNetworkFiles</td><td>1033</td><td>Copying files to the network</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_CopyingNewFiles</td><td>1033</td><td>Copying new files</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_CreatingDuplicate</td><td>1033</td><td>Creating duplicate files</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_CreatingFolders</td><td>1033</td><td>Creating folders</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_CreatingIISRoots</td><td>1033</td><td>Creating IIS Virtual Roots...</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_CreatingShortcuts</td><td>1033</td><td>Creating shortcuts</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_DeletingServices</td><td>1033</td><td>Deleting services</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_EnvironmentStrings</td><td>1033</td><td>Updating environment strings</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_EvaluateLaunchConditions</td><td>1033</td><td>Evaluating launch conditions</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_Extension</td><td>1033</td><td>Extension: [1]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_Extension2</td><td>1033</td><td>Extension: [1]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_Feature</td><td>1033</td><td>Feature: [1]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_FeatureColon</td><td>1033</td><td>Feature: [1]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_File</td><td>1033</td><td>File: [1]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_File2</td><td>1033</td><td>File: [1]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_FileDependencies</td><td>1033</td><td>File: [1], Dependencies: [2]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_FileDir</td><td>1033</td><td>File: [1], Directory: [9]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_FileDir2</td><td>1033</td><td>File: [1], Directory: [9]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_FileDir3</td><td>1033</td><td>File: [1], Directory: [9]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_FileDirSize</td><td>1033</td><td>File: [1], Directory: [9], Size: [6]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_FileDirSize2</td><td>1033</td><td>File: [1], Directory: [9], Size: [6]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_FileDirSize3</td><td>1033</td><td>File: [1], Directory: [9], Size: [6]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_FileDirSize4</td><td>1033</td><td>File: [1], Directory: [2], Size: [3]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_FileDirectorySize</td><td>1033</td><td>File: [1], Directory: [9], Size: [6]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_FileFolder</td><td>1033</td><td>File: [1], Folder: [2]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_FileFolder2</td><td>1033</td><td>File: [1], Folder: [2]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_FileSectionKeyValue</td><td>1033</td><td>File: [1], Section: [2], Key: [3], Value: [4]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_FileSectionKeyValue2</td><td>1033</td><td>File: [1], Section: [2], Key: [3], Value: [4]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_Folder</td><td>1033</td><td>Folder: [1]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_Folder1</td><td>1033</td><td>Folder: [1]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_Font</td><td>1033</td><td>Font: [1]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_Font2</td><td>1033</td><td>Font: [1]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_FoundApp</td><td>1033</td><td>Found application: [1]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_FreeSpace</td><td>1033</td><td>Free space: [1]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_GeneratingScript</td><td>1033</td><td>Generating script operations for action:</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_InitializeODBCDirs</td><td>1033</td><td>Initializing ODBC directories</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_InstallODBC</td><td>1033</td><td>Installing ODBC components</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_InstallServices</td><td>1033</td><td>Installing new services</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_InstallingSystemCatalog</td><td>1033</td><td>Installing system catalog</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_KeyName</td><td>1033</td><td>Key: [1], Name: [2]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_KeyNameValue</td><td>1033</td><td>Key: [1], Name: [2], Value: [3]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_LibId</td><td>1033</td><td>LibID: [1]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_Libid2</td><td>1033</td><td>LibID: [1]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_MigratingFeatureStates</td><td>1033</td><td>Migrating feature states from related applications</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_MovingFiles</td><td>1033</td><td>Moving files</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_NameValueAction</td><td>1033</td><td>Name: [1], Value: [2], Action [3]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_NameValueAction2</td><td>1033</td><td>Name: [1], Value: [2], Action [3]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_PatchingFiles</td><td>1033</td><td>Patching files</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_ProgID</td><td>1033</td><td>ProgID: [1]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_ProgID2</td><td>1033</td><td>ProgID: [1]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_PropertySignature</td><td>1033</td><td>Property: [1], Signature: [2]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_PublishProductFeatures</td><td>1033</td><td>Publishing product features</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_PublishProductInfo</td><td>1033</td><td>Publishing product information</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_PublishingQualifiedComponents</td><td>1033</td><td>Publishing qualified components</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_RegUser</td><td>1033</td><td>Registering user</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_RegisterClassServer</td><td>1033</td><td>Registering class servers</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_RegisterExtensionServers</td><td>1033</td><td>Registering extension servers</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_RegisterFonts</td><td>1033</td><td>Registering fonts</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_RegisterMimeInfo</td><td>1033</td><td>Registering MIME info</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_RegisterTypeLibs</td><td>1033</td><td>Registering type libraries</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_RegisteringComPlus</td><td>1033</td><td>Registering COM+ Applications and Components</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_RegisteringModules</td><td>1033</td><td>Registering modules</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_RegisteringProduct</td><td>1033</td><td>Registering product</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_RegisteringProgIdentifiers</td><td>1033</td><td>Registering program identifiers</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_RemoveApps</td><td>1033</td><td>Removing applications</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_RemovingBackup</td><td>1033</td><td>Removing backup files</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_RemovingDuplicates</td><td>1033</td><td>Removing duplicated files</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_RemovingFiles</td><td>1033</td><td>Removing files</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_RemovingFolders</td><td>1033</td><td>Removing folders</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_RemovingIISRoots</td><td>1033</td><td>Removing IIS Virtual Roots...</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_RemovingIni</td><td>1033</td><td>Removing INI file entries</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_RemovingMoved</td><td>1033</td><td>Removing moved files</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_RemovingODBC</td><td>1033</td><td>Removing ODBC components</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_RemovingRegistry</td><td>1033</td><td>Removing system registry values</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_RemovingShortcuts</td><td>1033</td><td>Removing shortcuts</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_RollingBack</td><td>1033</td><td>Rolling back action:</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_SearchForRelated</td><td>1033</td><td>Searching for related applications</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_SearchInstalled</td><td>1033</td><td>Searching for installed applications</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_SearchingQualifyingProducts</td><td>1033</td><td>Searching for qualifying products</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_SearchingQualifyingProducts2</td><td>1033</td><td>Searching for qualifying products</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_Service</td><td>1033</td><td>Service: [1]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_Service2</td><td>1033</td><td>Service: [2]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_Service3</td><td>1033</td><td>Service: [1]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_Service4</td><td>1033</td><td>Service: [1]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_Shortcut</td><td>1033</td><td>Shortcut: [1]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_Shortcut1</td><td>1033</td><td>Shortcut: [1]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_StartingServices</td><td>1033</td><td>Starting services</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_StoppingServices</td><td>1033</td><td>Stopping services</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_UnpublishProductFeatures</td><td>1033</td><td>Unpublishing product features</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_UnpublishQualified</td><td>1033</td><td>Unpublishing Qualified Components</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_UnpublishingProductInfo</td><td>1033</td><td>Unpublishing product information</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_UnregTypeLibs</td><td>1033</td><td>Unregistering type libraries</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_UnregisterClassServers</td><td>1033</td><td>Unregister class servers</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_UnregisterExtensionServers</td><td>1033</td><td>Unregistering extension servers</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_UnregisterModules</td><td>1033</td><td>Unregistering modules</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_UnregisteringComPlus</td><td>1033</td><td>Unregistering COM+ Applications and Components</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_UnregisteringFonts</td><td>1033</td><td>Unregistering fonts</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_UnregisteringMimeInfo</td><td>1033</td><td>Unregistering MIME info</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_UnregisteringProgramIds</td><td>1033</td><td>Unregistering program identifiers</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_UpdateComponentRegistration</td><td>1033</td><td>Updating component registration</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_UpdateEnvironmentStrings</td><td>1033</td><td>Updating environment strings</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_Validating</td><td>1033</td><td>Validating install</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_WritingINI</td><td>1033</td><td>Writing INI file values</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ACTIONTEXT_WritingRegistry</td><td>1033</td><td>Writing system registry values</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_BACK</td><td>1033</td><td>&lt; &amp;Back</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_CANCEL</td><td>1033</td><td>Cancel</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_CANCEL2</td><td>1033</td><td>&amp;Cancel</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_CHANGE</td><td>1033</td><td>&amp;Change...</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_COMPLUS_PROGRESSTEXT_COST</td><td>1033</td><td>Costing COM+ application: [1]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_COMPLUS_PROGRESSTEXT_INSTALL</td><td>1033</td><td>Installing COM+ application: [1]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_COMPLUS_PROGRESSTEXT_UNINSTALL</td><td>1033</td><td>Uninstalling COM+ application: [1]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_DatabaseFolder_InstallDatabaseTo</td><td>1033</td><td>Install [ProductName] database to:</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_0</td><td>1033</td><td>{{Fatal error: }}</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_1</td><td>1033</td><td>Error [1].</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_10</td><td>1033</td><td>=== Logging started: [Date] [Time] ===</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_100</td><td>1033</td><td>Could not remove shortcut [2]. Verify that the shortcut file exists and that you can access it.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_101</td><td>1033</td><td>Could not register type library for file [2]. Contact your support personnel.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_102</td><td>1033</td><td>Could not unregister type library for file [2]. Contact your support personnel.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_103</td><td>1033</td><td>Could not update the INI file [2][3]. Verify that the file exists and that you can access it.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_104</td><td>1033</td><td>Could not schedule file [2] to replace file [3] on reboot. Verify that you have write permissions to file [3].</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_105</td><td>1033</td><td>Error removing ODBC driver manager, ODBC error [2]: [3]. Contact your support personnel.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_106</td><td>1033</td><td>Error installing ODBC driver manager, ODBC error [2]: [3]. Contact your support personnel.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_107</td><td>1033</td><td>Error removing ODBC driver [4], ODBC error [2]: [3]. Verify that you have sufficient privileges to remove ODBC drivers.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_108</td><td>1033</td><td>Error installing ODBC driver [4], ODBC error [2]: [3]. Verify that the file [4] exists and that you can access it.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_109</td><td>1033</td><td>Error configuring ODBC data source [4], ODBC error [2]: [3]. Verify that the file [4] exists and that you can access it.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_11</td><td>1033</td><td>=== Logging stopped: [Date] [Time] ===</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_110</td><td>1033</td><td>Service [2] ([3]) failed to start. Verify that you have sufficient privileges to start system services.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_111</td><td>1033</td><td>Service [2] ([3]) could not be stopped. Verify that you have sufficient privileges to stop system services.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_112</td><td>1033</td><td>Service [2] ([3]) could not be deleted. Verify that you have sufficient privileges to remove system services.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_113</td><td>1033</td><td>Service [2] ([3]) could not be installed. Verify that you have sufficient privileges to install system services.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_114</td><td>1033</td><td>Could not update environment variable [2]. Verify that you have sufficient privileges to modify environment variables.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_115</td><td>1033</td><td>You do not have sufficient privileges to complete this installation for all users of the machine. Log on as an administrator and then retry this installation.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_116</td><td>1033</td><td>Could not set file security for file [3]. Error: [2]. Verify that you have sufficient privileges to modify the security permissions for this file.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_117</td><td>1033</td><td>Component Services (COM+ 1.0) are not installed on this computer. This installation requires Component Services in order to complete successfully. Component Services are available on Windows 2000.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_118</td><td>1033</td><td>Error registering COM+ application. Contact your support personnel for more information.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_119</td><td>1033</td><td>Error unregistering COM+ application. Contact your support personnel for more information.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_12</td><td>1033</td><td>Action start [Time]: [1].</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_120</td><td>1033</td><td>Removing older versions of this application</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_121</td><td>1033</td><td>Preparing to remove older versions of this application</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_122</td><td>1033</td><td>Error applying patch to file [2]. It has probably been updated by other means, and can no longer be modified by this patch. For more information contact your patch vendor. {{System Error: [3]}}</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_123</td><td>1033</td><td>[2] cannot install one of its required products. Contact your technical support group. {{System Error: [3].}}</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_124</td><td>1033</td><td>The older version of [2] cannot be removed. Contact your technical support group. {{System Error [3].}}</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_125</td><td>1033</td><td>The description for service '[2]' ([3]) could not be changed.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_126</td><td>1033</td><td>The Windows Installer service cannot update the system file [2] because the file is protected by Windows. You may need to update your operating system for this program to work correctly. {{Package version: [3], OS Protected version: [4]}}</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_127</td><td>1033</td><td>The Windows Installer service cannot update the protected Windows file [2]. {{Package version: [3], OS Protected version: [4], SFP Error: [5]}}</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_128</td><td>1033</td><td>The Windows Installer service cannot update one or more protected Windows files. SFP Error: [2]. List of protected files: [3]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_129</td><td>1033</td><td>User installations are disabled via policy on the machine.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_13</td><td>1033</td><td>Action ended [Time]: [1]. Return value [2].</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_130</td><td>1033</td><td>This setup requires Internet Information Server 4.0 or higher for configuring IIS Virtual Roots. Please make sure that you have IIS 4.0 or higher.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_131</td><td>1033</td><td>This setup requires Administrator privileges for configuring IIS Virtual Roots.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_14</td><td>1033</td><td>Time remaining: {[1] minutes }{[2] seconds}</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_15</td><td>1033</td><td>Out of memory. Shut down other applications before retrying.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_16</td><td>1033</td><td>Installer is no longer responding.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_17</td><td>1033</td><td>Installer terminated prematurely.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_18</td><td>1033</td><td>Please wait while Windows configures [ProductName]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_19</td><td>1033</td><td>Gathering required information...</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_2</td><td>1033</td><td>Warning [1].</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_20</td><td>1033</td><td>{[ProductName] }Setup completed successfully.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_21</td><td>1033</td><td>{[ProductName] }Setup failed.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_22</td><td>1033</td><td>Error reading from file: [2]. {{ System error [3].}} Verify that the file exists and that you can access it.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_23</td><td>1033</td><td>Cannot create the file [3]. A directory with this name already exists. Cancel the installation and try installing to a different location.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_2331</td><td>1033</td><td>Error loading library [2] or finding entry point [3].</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_24</td><td>1033</td><td>Please insert the disk: [2]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_25</td><td>1033</td><td>The installer has insufficient privileges to access this directory: [2]. The installation cannot continue. Log on as an administrator or contact your system administrator.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_26</td><td>1033</td><td>Error writing to file [2]. Verify that you have access to that directory.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27</td><td>1033</td><td>Error reading from file [2]. Verify that the file exists and that you can access it.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27502</td><td>1033</td><td>Could not connect to [2] '[3]'. [4]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27503</td><td>1033</td><td>Error retrieving version string from [2] '[3]'. [4]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27504</td><td>1033</td><td>SQL version requirements not met: [3]. This installation requires [2] [4] or later.</td><td>0</td><td/><td/></row>
+ <row><td>IDS_ERROR_27505</td><td>1033</td><td>Could not open SQL script file [2].</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27506</td><td>1033</td><td>Error executing SQL script [2]. Line [3]. [4]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27507</td><td>1033</td><td>Connection or browsing for database servers requires that MDAC be installed.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27508</td><td>1033</td><td>Error installing COM+ application [2]. [3]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27509</td><td>1033</td><td>Error uninstalling COM+ application [2]. [3]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27510</td><td>1033</td><td>Error installing COM+ application [2]. Could not load Microsoft(R) .NET class libraries. Registering .NET serviced components requires that Microsoft(R) .NET Framework be installed.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27511</td><td>1033</td><td>Could not execute SQL script file [2]. Connection not open: [3]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27512</td><td>1033</td><td>Error beginning transactions for [2] '[3]'. Database [4]. [5]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27513</td><td>1033</td><td>Error committing transactions for [2] '[3]'. Database [4]. [5]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27514</td><td>1033</td><td>This installation requires a Microsoft SQL Server. The specified server '[3]' is a Microsoft SQL Server Desktop Engine (MSDE).</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27515</td><td>1033</td><td>Error retrieving schema version from [2] '[3]'. Database: '[4]'. [5]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27516</td><td>1033</td><td>Error writing schema version to [2] '[3]'. Database: '[4]'. [5]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27517</td><td>1033</td><td>This installation requires Administrator privileges for installing COM+ applications. Log on as an administrator and then retry this installation.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27518</td><td>1033</td><td>The COM+ application "[2]" is configured to run as an NT service; this requires COM+ 1.5 or later on the system. Since your system has COM+ 1.0, this application will not be installed.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27519</td><td>1033</td><td>Error updating XML file [2]. [3]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27520</td><td>1033</td><td>Error opening XML file [2]. [3]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27521</td><td>1033</td><td>This setup requires MSXML 3.0 or higher for configuring XML files. Please make sure that you have version 3.0 or higher.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27522</td><td>1033</td><td>Error creating XML file [2]. [3]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27523</td><td>1033</td><td>Error loading servers.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27524</td><td>1033</td><td>Error loading NetApi32.DLL. The ISNetApi.dll needs to have NetApi32.DLL properly loaded and requires an NT based operating system.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27525</td><td>1033</td><td>Server not found. Verify that the specified server exists. The server name can not be empty.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27526</td><td>1033</td><td>Unspecified error from ISNetApi.dll.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27527</td><td>1033</td><td>The buffer is too small.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27528</td><td>1033</td><td>Access denied. Check administrative rights.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27529</td><td>1033</td><td>Invalid computer.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27530</td><td>1033</td><td>Undefined switch case.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27531</td><td>1033</td><td>Unhandled exception.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27532</td><td>1033</td><td>Invalid user name for this server or domain.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27533</td><td>1033</td><td>The case-sensitive passwords do not match.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27534</td><td>1033</td><td>The list is empty.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27535</td><td>1033</td><td>Access violation.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27536</td><td>1033</td><td>Error getting group.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27537</td><td>1033</td><td>Error adding user to group. Verify that the group exists for this domain or server.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27538</td><td>1033</td><td>Error creating user.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27539</td><td>1033</td><td>ERROR_NETAPI_ERROR_NOT_PRIMARY returned from NetAPI.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27540</td><td>1033</td><td>The specified user already exists.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27541</td><td>1033</td><td>The specified group already exists.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27542</td><td>1033</td><td>Invalid password. Verify that the password is in accordance with your network password policy.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27543</td><td>1033</td><td>Invalid name.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27544</td><td>1033</td><td>Invalid group.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27545</td><td>1033</td><td>The user name can not be empty and must be in the format DOMAIN\Username.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27546</td><td>1033</td><td>Error loading or creating INI file in the user TEMP directory.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27547</td><td>1033</td><td>ISNetAPI.dll is not loaded or there was an error loading the dll. This dll needs to be loaded for this operation. Verify that the dll is in the SUPPORTDIR directory.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27548</td><td>1033</td><td>Error deleting INI file containing new user information from the user's TEMP directory.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27549</td><td>1033</td><td>Error getting the primary domain controller (PDC).</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27550</td><td>1033</td><td>Every field must have a value in order to create a user.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27551</td><td>1033</td><td>ODBC driver for [2] not found. This is required to connect to [2] database servers.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_27552</td><td>1033</td><td>Error creating database [4]. Server: [2] [3]. [5]</td><td>0</td><td/><td/></row>
+ <row><td>IDS_ERROR_27553</td><td>1033</td><td>Error connecting to database [4]. Server: [2] [3]. [5]</td><td>0</td><td/><td/></row>
+ <row><td>IDS_ERROR_27554</td><td>1033</td><td>Error attempting to open connection [2]. No valid database metadata associated with this connection.</td><td>0</td><td/><td/></row>
+ <row><td>IDS_ERROR_28</td><td>1033</td><td>Another application has exclusive access to the file [2]. Please shut down all other applications, then click Retry.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_29</td><td>1033</td><td>There is not enough disk space to install the file [2]. Free some disk space and click Retry, or click Cancel to exit.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_3</td><td>1033</td><td>Info [1].</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_30</td><td>1033</td><td>Source file not found: [2]. Verify that the file exists and that you can access it.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_31</td><td>1033</td><td>Error reading from file: [3]. {{ System error [2].}} Verify that the file exists and that you can access it.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_32</td><td>1033</td><td>Error writing to file: [3]. {{ System error [2].}} Verify that you have access to that directory.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_33</td><td>1033</td><td>Source file not found{{(cabinet)}}: [2]. Verify that the file exists and that you can access it.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_34</td><td>1033</td><td>Cannot create the directory [2]. A file with this name already exists. Please rename or remove the file and click Retry, or click Cancel to exit.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_35</td><td>1033</td><td>The volume [2] is currently unavailable. Please select another.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_36</td><td>1033</td><td>The specified path [2] is unavailable.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_37</td><td>1033</td><td>Unable to write to the specified folder [2].</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_38</td><td>1033</td><td>A network error occurred while attempting to read from the file [2]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_39</td><td>1033</td><td>An error occurred while attempting to create the directory [2]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_4</td><td>1033</td><td>Internal Error [1]. [2]{, [3]}{, [4]}</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_40</td><td>1033</td><td>A network error occurred while attempting to create the directory [2]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_41</td><td>1033</td><td>A network error occurred while attempting to open the source file cabinet [2].</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_42</td><td>1033</td><td>The specified path is too long [2].</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_43</td><td>1033</td><td>The Installer has insufficient privileges to modify the file [2].</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_44</td><td>1033</td><td>A portion of the path [2] exceeds the length allowed by the system.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_45</td><td>1033</td><td>The path [2] contains words that are not valid in folders.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_46</td><td>1033</td><td>The path [2] contains an invalid character.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_47</td><td>1033</td><td>[2] is not a valid short file name.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_48</td><td>1033</td><td>Error getting file security: [3] GetLastError: [2]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_49</td><td>1033</td><td>Invalid Drive: [2]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_5</td><td>1033</td><td>{{Disk full: }}</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_50</td><td>1033</td><td>Could not create key [2]. {{ System error [3].}} Verify that you have sufficient access to that key, or contact your support personnel.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_51</td><td>1033</td><td>Could not open key: [2]. {{ System error [3].}} Verify that you have sufficient access to that key, or contact your support personnel.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_52</td><td>1033</td><td>Could not delete value [2] from key [3]. {{ System error [4].}} Verify that you have sufficient access to that key, or contact your support personnel.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_53</td><td>1033</td><td>Could not delete key [2]. {{ System error [3].}} Verify that you have sufficient access to that key, or contact your support personnel.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_54</td><td>1033</td><td>Could not read value [2] from key [3]. {{ System error [4].}} Verify that you have sufficient access to that key, or contact your support personnel.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_55</td><td>1033</td><td>Could not write value [2] to key [3]. {{ System error [4].}} Verify that you have sufficient access to that key, or contact your support personnel.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_56</td><td>1033</td><td>Could not get value names for key [2]. {{ System error [3].}} Verify that you have sufficient access to that key, or contact your support personnel.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_57</td><td>1033</td><td>Could not get sub key names for key [2]. {{ System error [3].}} Verify that you have sufficient access to that key, or contact your support personnel.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_58</td><td>1033</td><td>Could not read security information for key [2]. {{ System error [3].}} Verify that you have sufficient access to that key, or contact your support personnel.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_59</td><td>1033</td><td>Could not increase the available registry space. [2] KB of free registry space is required for the installation of this application.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_6</td><td>1033</td><td>Action [Time]: [1]. [2]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_60</td><td>1033</td><td>Another installation is in progress. You must complete that installation before continuing this one.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_61</td><td>1033</td><td>Error accessing secured data. Please make sure the Windows Installer is configured properly and try the installation again.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_62</td><td>1033</td><td>User [2] has previously initiated an installation for product [3]. That user will need to run that installation again before using that product. Your current installation will now continue.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_63</td><td>1033</td><td>User [2] has previously initiated an installation for product [3]. That user will need to run that installation again before using that product.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_64</td><td>1033</td><td>Out of disk space -- Volume: '[2]'; required space: [3] KB; available space: [4] KB. Free some disk space and retry.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_65</td><td>1033</td><td>Are you sure you want to cancel?</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_66</td><td>1033</td><td>The file [2][3] is being held in use{ by the following process: Name: [4], ID: [5], Window Title: [6]}. Close that application and retry.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_67</td><td>1033</td><td>The product [2] is already installed, preventing the installation of this product. The two products are incompatible.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_68</td><td>1033</td><td>Out of disk space -- Volume: [2]; required space: [3] KB; available space: [4] KB. If rollback is disabled, enough space is available. Click Cancel to quit, Retry to check available disk space again, or Ignore to continue without rollback.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_69</td><td>1033</td><td>Could not access network location [2].</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_7</td><td>1033</td><td>[ProductName]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_70</td><td>1033</td><td>The following applications should be closed before continuing the installation:</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_71</td><td>1033</td><td>Could not find any previously installed compliant products on the machine for installing this product.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_72</td><td>1033</td><td>The key [2] is not valid. Verify that you entered the correct key.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_73</td><td>1033</td><td>The installer must restart your system before configuration of [2] can continue. Click Yes to restart now or No if you plan to restart later.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_74</td><td>1033</td><td>You must restart your system for the configuration changes made to [2] to take effect. Click Yes to restart now or No if you plan to restart later.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_75</td><td>1033</td><td>An installation for [2] is currently suspended. You must undo the changes made by that installation to continue. Do you want to undo those changes?</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_76</td><td>1033</td><td>A previous installation for this product is in progress. You must undo the changes made by that installation to continue. Do you want to undo those changes?</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_77</td><td>1033</td><td>No valid source could be found for product [2]. The Windows Installer cannot continue.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_78</td><td>1033</td><td>Installation operation completed successfully.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_79</td><td>1033</td><td>Installation operation failed.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_8</td><td>1033</td><td>{[2]}{, [3]}{, [4]}</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_80</td><td>1033</td><td>Product: [2] -- [3]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_81</td><td>1033</td><td>You may either restore your computer to its previous state or continue the installation later. Would you like to restore?</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_82</td><td>1033</td><td>An error occurred while writing installation information to disk. Check to make sure enough disk space is available, and click Retry, or Cancel to end the installation.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_83</td><td>1033</td><td>One or more of the files required to restore your computer to its previous state could not be found. Restoration will not be possible.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_84</td><td>1033</td><td>The path [2] is not valid. Please specify a valid path.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_85</td><td>1033</td><td>Out of memory. Shut down other applications before retrying.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_86</td><td>1033</td><td>There is no disk in drive [2]. Please insert one and click Retry, or click Cancel to go back to the previously selected volume.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_87</td><td>1033</td><td>There is no disk in drive [2]. Please insert one and click Retry, or click Cancel to return to the browse dialog and select a different volume.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_88</td><td>1033</td><td>The folder [2] does not exist. Please enter a path to an existing folder.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_89</td><td>1033</td><td>You have insufficient privileges to read this folder.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_9</td><td>1033</td><td>Message type: [1], Argument: [2]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_90</td><td>1033</td><td>A valid destination folder for the installation could not be determined.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_91</td><td>1033</td><td>Error attempting to read from the source installation database: [2].</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_92</td><td>1033</td><td>Scheduling reboot operation: Renaming file [2] to [3]. Must reboot to complete operation.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_93</td><td>1033</td><td>Scheduling reboot operation: Deleting file [2]. Must reboot to complete operation.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_94</td><td>1033</td><td>Module [2] failed to register. HRESULT [3]. Contact your support personnel.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_95</td><td>1033</td><td>Module [2] failed to unregister. HRESULT [3]. Contact your support personnel.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_96</td><td>1033</td><td>Failed to cache package [2]. Error: [3]. Contact your support personnel.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_97</td><td>1033</td><td>Could not register font [2]. Verify that you have sufficient permissions to install fonts, and that the system supports this font.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_98</td><td>1033</td><td>Could not unregister font [2]. Verify that you have sufficient permissions to remove fonts.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ERROR_99</td><td>1033</td><td>Could not create shortcut [2]. Verify that the destination folder exists and that you can access it.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_INSTALLDIR</td><td>1033</td><td>[INSTALLDIR]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_INSTALLSHIELD</td><td>1033</td><td>InstallShield</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_INSTALLSHIELD_FORMATTED</td><td>1033</td><td>{&amp;MSSWhiteSerif8}InstallShield</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ISSCRIPT_VERSION_MISSING</td><td>1033</td><td>The InstallScript engine is missing from this machine. If available, please run ISScript.msi, or contact your support personnel for further assistance.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_ISSCRIPT_VERSION_OLD</td><td>1033</td><td>The InstallScript engine on this machine is older than the version required to run this setup. If available, please install the latest version of ISScript.msi, or contact your support personnel for further assistance.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_NEXT</td><td>1033</td><td>&amp;Next &gt;</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_OK</td><td>1033</td><td>OK</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_PRINT_BUTTON</td><td>1033</td><td>&amp;Print</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_PRODUCTNAME_INSTALLSHIELD</td><td>1033</td><td>[ProductName] - InstallShield Wizard</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_PROGMSG_IIS_CREATEAPPPOOL</td><td>1033</td><td>Creating application pool %s</td><td>0</td><td/><td/></row>
+ <row><td>IDS_PROGMSG_IIS_CREATEAPPPOOLS</td><td>1033</td><td>Creating application Pools...</td><td>0</td><td/><td/></row>
+ <row><td>IDS_PROGMSG_IIS_CREATEVROOT</td><td>1033</td><td>Creating IIS virtual directory %s</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_PROGMSG_IIS_CREATEVROOTS</td><td>1033</td><td>Creating IIS virtual directories...</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_PROGMSG_IIS_CREATEWEBSERVICEEXTENSION</td><td>1033</td><td>Creating web service extension</td><td>0</td><td/><td/></row>
+ <row><td>IDS_PROGMSG_IIS_CREATEWEBSERVICEEXTENSIONS</td><td>1033</td><td>Creating web service extensions...</td><td>0</td><td/><td/></row>
+ <row><td>IDS_PROGMSG_IIS_EXTRACT</td><td>1033</td><td>Extracting information for IIS virtual directories...</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_PROGMSG_IIS_EXTRACTDONE</td><td>1033</td><td>Extracted information for IIS virtual directories...</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_PROGMSG_IIS_REMOVEAPPPOOL</td><td>1033</td><td>Removing application pool</td><td>0</td><td/><td/></row>
+ <row><td>IDS_PROGMSG_IIS_REMOVEAPPPOOLS</td><td>1033</td><td>Removing application pools...</td><td>0</td><td/><td/></row>
+ <row><td>IDS_PROGMSG_IIS_REMOVESITE</td><td>1033</td><td>Removing web site at port %d</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_PROGMSG_IIS_REMOVEVROOT</td><td>1033</td><td>Removing IIS virtual directory %s</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_PROGMSG_IIS_REMOVEVROOTS</td><td>1033</td><td>Removing IIS virtual directories...</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_PROGMSG_IIS_REMOVEWEBSERVICEEXTENSION</td><td>1033</td><td>Removing web service extension</td><td>0</td><td/><td/></row>
+ <row><td>IDS_PROGMSG_IIS_REMOVEWEBSERVICEEXTENSIONS</td><td>1033</td><td>Removing web service extensions...</td><td>0</td><td/><td/></row>
+ <row><td>IDS_PROGMSG_IIS_ROLLBACKAPPPOOLS</td><td>1033</td><td>Rolling back application pools...</td><td>0</td><td/><td/></row>
+ <row><td>IDS_PROGMSG_IIS_ROLLBACKVROOTS</td><td>1033</td><td>Rolling back virtual directory and web site changes...</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_PROGMSG_IIS_ROLLBACKWEBSERVICEEXTENSIONS</td><td>1033</td><td>Rolling back web service extensions...</td><td>0</td><td/><td/></row>
+ <row><td>IDS_PROGMSG_XML_COSTING</td><td>1033</td><td>Costing XML files...</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_PROGMSG_XML_CREATE_FILE</td><td>1033</td><td>Creating XML file %s...</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_PROGMSG_XML_FILES</td><td>1033</td><td>Performing XML file changes...</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_PROGMSG_XML_REMOVE_FILE</td><td>1033</td><td>Removing XML file %s...</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_PROGMSG_XML_ROLLBACK_FILES</td><td>1033</td><td>Rolling back XML file changes...</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_PROGMSG_XML_UPDATE_FILE</td><td>1033</td><td>Updating XML file %s...</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_SQLBROWSE_INTRO</td><td>1033</td><td>From the list of servers below, select the database server you would like to target.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_SQLLOGIN_BROWSE</td><td>1033</td><td>B&amp;rowse...</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_SQLLOGIN_CONNECT</td><td>1033</td><td>Connect using:</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_SQLLOGIN_DESC</td><td>1033</td><td>Select database server and authentication method</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_SQLLOGIN_ID</td><td>1033</td><td>&amp;Login ID:</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_SQLLOGIN_INTRO</td><td>1033</td><td>Select the database server to install to from the list below or click Browse to see a list of all database servers. You can also specify the way to authenticate your login using your current credentials or a SQL Login ID and Password.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_SQLLOGIN_PSWD</td><td>1033</td><td>&amp;Password:</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_SQLLOGIN_SERVER</td><td>1033</td><td>&amp;Database Server:</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_SQLLOGIN_SQL</td><td>1033</td><td>S&amp;erver authentication using the Login ID and password below</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_SQLLOGIN_TITLE</td><td>1033</td><td>{&amp;MSSansBold8}Database Server</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_SQLLOGIN_WIN</td><td>1033</td><td>&amp;Windows authentication credentials of current user</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_SQLSCRIPT_INSTALLING</td><td>1033</td><td>Executing SQL Install Script...</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_SQLSCRIPT_UNINSTALLING</td><td>1033</td><td>Executing SQL Uninstall Script...</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_STANDARD_USE_SETUPEXE</td><td>1033</td><td>This installation cannot be run by directly launching the MSI package. You must run setup.exe.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_SetupTips_Advertise</td><td>1033</td><td>Will be installed on first use. (Available only if the feature supports this option.)</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_SetupTips_AllInstalledLocal</td><td>1033</td><td>Will be completely installed to the local hard drive.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_SetupTips_CustomSetup</td><td>1033</td><td>{&amp;MSSansBold8}Custom Setup Tips</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_SetupTips_CustomSetupDescription</td><td>1033</td><td>Custom Setup allows you to selectively install program features.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_SetupTips_IconInstallState</td><td>1033</td><td>The icon next to the feature name indicates the install state of the feature. Click the icon to drop down the install state menu for each feature.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_SetupTips_InstallState</td><td>1033</td><td>This install state means the feature...</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_SetupTips_Network</td><td>1033</td><td>Will be installed to run from the network. (Available only if the feature supports this option.)</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_SetupTips_OK</td><td>1033</td><td>OK</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_SetupTips_SubFeaturesInstalledLocal</td><td>1033</td><td>Will have some subfeatures installed to the local hard drive. (Available only if the feature has subfeatures.)</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_SetupTips_WillNotBeInstalled</td><td>1033</td><td>Will not be installed.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_Available</td><td>1033</td><td>Available</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_Bytes</td><td>1033</td><td>bytes</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_CompilingFeaturesCost</td><td>1033</td><td>Compiling cost for this feature...</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_Differences</td><td>1033</td><td>Differences</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_DiskSize</td><td>1033</td><td>Disk Size</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_FeatureCompletelyRemoved</td><td>1033</td><td>This feature will be completely removed.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_FeatureContinueNetwork</td><td>1033</td><td>This feature will continue to be run from the network</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_FeatureFreeSpace</td><td>1033</td><td>This feature frees up [1] on your hard drive.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_FeatureInstalledCD</td><td>1033</td><td>This feature, and all subfeatures, will be installed to run from the CD.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_FeatureInstalledCD2</td><td>1033</td><td>This feature will be installed to run from CD.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_FeatureInstalledLocal</td><td>1033</td><td>This feature, and all subfeatures, will be installed on local hard drive.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_FeatureInstalledLocal2</td><td>1033</td><td>This feature will be installed on local hard drive.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_FeatureInstalledNetwork</td><td>1033</td><td>This feature, and all subfeatures, will be installed to run from the network.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_FeatureInstalledNetwork2</td><td>1033</td><td>This feature will be installed to run from network.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_FeatureInstalledRequired</td><td>1033</td><td>Will be installed when required.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_FeatureInstalledWhenRequired</td><td>1033</td><td>This feature will be set to be installed when required.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_FeatureInstalledWhenRequired2</td><td>1033</td><td>This feature will be installed when required.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_FeatureLocal</td><td>1033</td><td>This feature will be installed on the local hard drive.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_FeatureLocal2</td><td>1033</td><td>This feature will be installed on your local hard drive.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_FeatureNetwork</td><td>1033</td><td>This feature will be installed to run from the network.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_FeatureNetwork2</td><td>1033</td><td>This feature will be available to run from the network.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_FeatureNotAvailable</td><td>1033</td><td>This feature will not be available.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_FeatureOnCD</td><td>1033</td><td>This feature will be installed to run from CD.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_FeatureOnCD2</td><td>1033</td><td>This feature will be available to run from CD.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_FeatureRemainLocal</td><td>1033</td><td>This feature will remain on your local hard drive.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_FeatureRemoveNetwork</td><td>1033</td><td>This feature will be removed from your local hard drive, but will be still available to run from the network.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_FeatureRemovedCD</td><td>1033</td><td>This feature will be removed from your local hard drive but will still be available to run from CD.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_FeatureRemovedUnlessRequired</td><td>1033</td><td>This feature will be removed from your local hard drive but will be set to be installed when required.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_FeatureRequiredSpace</td><td>1033</td><td>This feature requires [1] on your hard drive.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_FeatureRunFromCD</td><td>1033</td><td>This feature will continue to be run from the CD</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_FeatureSpaceFree</td><td>1033</td><td>This feature frees up [1] on your hard drive. It has [2] of [3] subfeatures selected. The subfeatures free up [4] on your hard drive.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_FeatureSpaceFree2</td><td>1033</td><td>This feature frees up [1] on your hard drive. It has [2] of [3] subfeatures selected. The subfeatures require [4] on your hard drive.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_FeatureSpaceFree3</td><td>1033</td><td>This feature requires [1] on your hard drive. It has [2] of [3] subfeatures selected. The subfeatures free up [4] on your hard drive.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_FeatureSpaceFree4</td><td>1033</td><td>This feature requires [1] on your hard drive. It has [2] of [3] subfeatures selected. The subfeatures require [4] on your hard drive.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_FeatureUnavailable</td><td>1033</td><td>This feature will become unavailable.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_FeatureUninstallNoNetwork</td><td>1033</td><td>This feature will be uninstalled completely, and you won't be able to run it from the network.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_FeatureWasCD</td><td>1033</td><td>This feature was run from the CD but will be set to be installed when required.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_FeatureWasCDLocal</td><td>1033</td><td>This feature was run from the CD but will be installed on the local hard drive.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_FeatureWasOnNetworkInstalled</td><td>1033</td><td>This feature was run from the network but will be installed when required.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_FeatureWasOnNetworkLocal</td><td>1033</td><td>This feature was run from the network but will be installed on the local hard drive.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_FeatureWillBeUninstalled</td><td>1033</td><td>This feature will be uninstalled completely, and you won't be able to run it from CD.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_Folder</td><td>1033</td><td>Fldr|New Folder</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_GB</td><td>1033</td><td>GB</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_KB</td><td>1033</td><td>KB</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_MB</td><td>1033</td><td>MB</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_Required</td><td>1033</td><td>Required</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_TimeRemaining</td><td>1033</td><td>Time remaining: {[1] min }[2] sec</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS_UITEXT_Volume</td><td>1033</td><td>Volume</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__AgreeToLicense_0</td><td>1033</td><td>I &amp;do not accept the terms in the license agreement</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__AgreeToLicense_1</td><td>1033</td><td>I &amp;accept the terms in the license agreement</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__DatabaseFolder_ChangeFolder</td><td>1033</td><td>Click Next to install to this folder, or click Change to install to a different folder.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__DatabaseFolder_DatabaseDir</td><td>1033</td><td>[DATABASEDIR]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__DatabaseFolder_DatabaseFolder</td><td>1033</td><td>{&amp;MSSansBold8}Database Folder</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__DestinationFolder_Change</td><td>1033</td><td>&amp;Change...</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__DestinationFolder_ChangeFolder</td><td>1033</td><td>Click Next to install to this folder, or click Change to install to a different folder.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__DestinationFolder_DestinationFolder</td><td>1033</td><td>{&amp;MSSansBold8}Destination Folder</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__DestinationFolder_InstallTo</td><td>1033</td><td>Install [ProductName] to:</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__DisplayName_Custom</td><td>1033</td><td>Custom</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__DisplayName_Minimal</td><td>1033</td><td>Minimal</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__DisplayName_Typical</td><td>1033</td><td>Typical</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsAdminInstallBrowse_11</td><td>1033</td><td/><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsAdminInstallBrowse_4</td><td>1033</td><td/><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsAdminInstallBrowse_8</td><td>1033</td><td/><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsAdminInstallBrowse_BrowseDestination</td><td>1033</td><td>Browse to the destination folder.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsAdminInstallBrowse_ChangeDestination</td><td>1033</td><td>{&amp;MSSansBold8}Change Current Destination Folder</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsAdminInstallBrowse_CreateFolder</td><td>1033</td><td>Create new folder|</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsAdminInstallBrowse_FolderName</td><td>1033</td><td>&amp;Folder name:</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsAdminInstallBrowse_LookIn</td><td>1033</td><td>&amp;Look in:</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsAdminInstallBrowse_UpOneLevel</td><td>1033</td><td>Up one level|</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsAdminInstallPointWelcome_ServerImage</td><td>1033</td><td>The InstallShield(R) Wizard will create a server image of [ProductName] at a specified network location. To continue, click Next.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsAdminInstallPointWelcome_Wizard</td><td>1033</td><td>{&amp;TahomaBold10}Welcome to the InstallShield Wizard for [ProductName]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsAdminInstallPoint_Change</td><td>1033</td><td>&amp;Change...</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsAdminInstallPoint_EnterNetworkLocation</td><td>1033</td><td>Enter the network location or click Change to browse to a location. Click Install to create a server image of [ProductName] at the specified network location or click Cancel to exit the wizard.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsAdminInstallPoint_Install</td><td>1033</td><td>&amp;Install</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsAdminInstallPoint_NetworkLocation</td><td>1033</td><td>&amp;Network location:</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsAdminInstallPoint_NetworkLocationFormatted</td><td>1033</td><td>{&amp;MSSansBold8}Network Location</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsAdminInstallPoint_SpecifyNetworkLocation</td><td>1033</td><td>Specify a network location for the server image of the product.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsBrowseButton</td><td>1033</td><td>&amp;Browse...</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsBrowseFolderDlg_11</td><td>1033</td><td/><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsBrowseFolderDlg_4</td><td>1033</td><td/><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsBrowseFolderDlg_8</td><td>1033</td><td/><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsBrowseFolderDlg_BrowseDestFolder</td><td>1033</td><td>Browse to the destination folder.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsBrowseFolderDlg_ChangeCurrentFolder</td><td>1033</td><td>{&amp;MSSansBold8}Change Current Destination Folder</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsBrowseFolderDlg_CreateFolder</td><td>1033</td><td>Create New Folder|</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsBrowseFolderDlg_FolderName</td><td>1033</td><td>&amp;Folder name:</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsBrowseFolderDlg_LookIn</td><td>1033</td><td>&amp;Look in:</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsBrowseFolderDlg_OK</td><td>1033</td><td>OK</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsBrowseFolderDlg_UpOneLevel</td><td>1033</td><td>Up One Level|</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsBrowseForAccount</td><td>1033</td><td>Browse for a User Account</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsBrowseGroup</td><td>1033</td><td>Select a Group</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsBrowseUsernameTitle</td><td>1033</td><td>Select a User Name</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsCancelDlg_ConfirmCancel</td><td>1033</td><td>Are you sure you want to cancel [ProductName] installation?</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsCancelDlg_No</td><td>1033</td><td>&amp;No</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsCancelDlg_Yes</td><td>1033</td><td>&amp;Yes</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsConfirmPassword</td><td>1033</td><td>Con&amp;firm password:</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsCreateNewUserTitle</td><td>1033</td><td>New User Information</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsCreateUserBrowse</td><td>1033</td><td>N&amp;ew User Information...</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsCustomSelectionDlg_Change</td><td>1033</td><td>&amp;Change...</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsCustomSelectionDlg_ClickFeatureIcon</td><td>1033</td><td>Click on an icon in the list below to change how a feature is installed.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsCustomSelectionDlg_CustomSetup</td><td>1033</td><td>{&amp;MSSansBold8}Custom Setup</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsCustomSelectionDlg_FeatureDescription</td><td>1033</td><td>Feature Description</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsCustomSelectionDlg_FeaturePath</td><td>1033</td><td>&lt;selected feature path&gt;</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsCustomSelectionDlg_FeatureSize</td><td>1033</td><td>Feature size</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsCustomSelectionDlg_Help</td><td>1033</td><td>&amp;Help</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsCustomSelectionDlg_InstallTo</td><td>1033</td><td>Install to:</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsCustomSelectionDlg_MultilineDescription</td><td>1033</td><td>Multiline description of the currently selected item</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsCustomSelectionDlg_SelectFeatures</td><td>1033</td><td>Select the program features you want installed.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsCustomSelectionDlg_Space</td><td>1033</td><td>&amp;Space</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsDiskSpaceDlg_DiskSpace</td><td>1033</td><td>Disk space required for the installation exceeds available disk space.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsDiskSpaceDlg_HighlightedVolumes</td><td>1033</td><td>The highlighted volumes do not have enough disk space available for the currently selected features. You can remove files from the highlighted volumes, choose to install fewer features onto local drives, or select different destination drives.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsDiskSpaceDlg_Numbers</td><td>1033</td><td>{120}{70}{70}{70}{70}</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsDiskSpaceDlg_OK</td><td>1033</td><td>OK</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsDiskSpaceDlg_OutOfDiskSpace</td><td>1033</td><td>{&amp;MSSansBold8}Out of Disk Space</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsDomainOrServer</td><td>1033</td><td>&amp;Domain or server:</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsErrorDlg_Abort</td><td>1033</td><td>&amp;Abort</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsErrorDlg_ErrorText</td><td>1033</td><td>&lt;error text goes here&gt;&lt;error text goes here&gt;&lt;error text goes here&gt;&lt;error text goes here&gt;&lt;error text goes here&gt;&lt;error text goes here&gt;&lt;error text goes here&gt;&lt;error text goes here&gt;&lt;error text goes here&gt;&lt;error text goes here&gt;&lt;error text goes here&gt;</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsErrorDlg_Ignore</td><td>1033</td><td>&amp;Ignore</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsErrorDlg_InstallerInfo</td><td>1033</td><td>[ProductName] Installer Information</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsErrorDlg_NO</td><td>1033</td><td>&amp;No</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsErrorDlg_OK</td><td>1033</td><td>&amp;OK</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsErrorDlg_Retry</td><td>1033</td><td>&amp;Retry</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsErrorDlg_Yes</td><td>1033</td><td>&amp;Yes</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsExitDialog_Finish</td><td>1033</td><td>&amp;Finish</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsExitDialog_InstallSuccess</td><td>1033</td><td>The InstallShield Wizard has successfully installed [ProductName]. Click Finish to exit the wizard.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsExitDialog_LaunchProgram</td><td>1033</td><td>Launch the program</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsExitDialog_ShowReadMe</td><td>1033</td><td>Show the readme file</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsExitDialog_UninstallSuccess</td><td>1033</td><td>The InstallShield Wizard has successfully uninstalled [ProductName]. Click Finish to exit the wizard.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsExitDialog_Update_InternetConnection</td><td>1033</td><td>Your Internet connection can be used to make sure that you have the latest updates.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsExitDialog_Update_PossibleUpdates</td><td>1033</td><td>Some program files might have been updated since you purchased your copy of [ProductName].</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsExitDialog_Update_SetupFinished</td><td>1033</td><td>Setup has finished installing [ProductName].</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsExitDialog_Update_YesCheckForUpdates</td><td>1033</td><td>&amp;Yes, check for program updates (Recommended) after the setup completes.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsExitDialog_WizardCompleted</td><td>1033</td><td>{&amp;TahomaBold10}InstallShield Wizard Completed</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsFatalError_ClickFinish</td><td>1033</td><td>Click Finish to exit the wizard.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsFatalError_Finish</td><td>1033</td><td>&amp;Finish</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsFatalError_KeepOrRestore</td><td>1033</td><td>You can either keep any existing installed elements on your system to continue this installation at a later time or you can restore your system to its original state prior to the installation.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsFatalError_NotModified</td><td>1033</td><td>Your system has not been modified. To complete installation at another time, please run setup again.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsFatalError_RestoreOrContinueLater</td><td>1033</td><td>Click Restore or Continue Later to exit the wizard.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsFatalError_WizardCompleted</td><td>1033</td><td>{&amp;TahomaBold10}InstallShield Wizard Completed</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsFatalError_WizardInterrupted</td><td>1033</td><td>The wizard was interrupted before [ProductName] could be completely installed.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsFeatureDetailsDlg_DiskSpaceRequirements</td><td>1033</td><td>{&amp;MSSansBold8}Disk Space Requirements</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsFeatureDetailsDlg_Numbers</td><td>1033</td><td>{120}{70}{70}{70}{70}</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsFeatureDetailsDlg_OK</td><td>1033</td><td>OK</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsFeatureDetailsDlg_SpaceRequired</td><td>1033</td><td>The disk space required for the installation of the selected features.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsFeatureDetailsDlg_VolumesTooSmall</td><td>1033</td><td>The highlighted volumes do not have enough disk space available for the currently selected features. You can remove files from the highlighted volumes, choose to install fewer features onto local drives, or select different destination drives.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsFilesInUse_ApplicationsUsingFiles</td><td>1033</td><td>The following applications are using files that need to be updated by this setup. Close these applications and click Retry to continue.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsFilesInUse_Exit</td><td>1033</td><td>&amp;Exit</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsFilesInUse_FilesInUse</td><td>1033</td><td>{&amp;MSSansBold8}Files in Use</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsFilesInUse_FilesInUseMessage</td><td>1033</td><td>Some files that need to be updated are currently in use.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsFilesInUse_Ignore</td><td>1033</td><td>&amp;Ignore</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsFilesInUse_Retry</td><td>1033</td><td>&amp;Retry</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsGroup</td><td>1033</td><td>&amp;Group:</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsGroupLabel</td><td>1033</td><td>Gr&amp;oup:</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsInitDlg_1</td><td>1033</td><td/><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsInitDlg_2</td><td>1033</td><td/><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsInitDlg_PreparingWizard</td><td>1033</td><td>[ProductName] Setup is preparing the InstallShield Wizard which will guide you through the program setup process. Please wait.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsInitDlg_WelcomeWizard</td><td>1033</td><td>{&amp;TahomaBold10}Welcome to the InstallShield Wizard for [ProductName]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsLicenseDlg_LicenseAgreement</td><td>1033</td><td>{&amp;MSSansBold8}License Agreement</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsLicenseDlg_ReadLicenseAgreement</td><td>1033</td><td>Please read the following license agreement carefully.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsLogonInfoDescription</td><td>1033</td><td>Specify the user name and password of the user account that will logon to use this application. The user account must be in the form DOMAIN\Username.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsLogonInfoTitle</td><td>1033</td><td>{&amp;MSSansBold8}Logon Information</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsLogonInfoTitleDescription</td><td>1033</td><td>Specify a user name and password</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsLogonNewUserDescription</td><td>1033</td><td>Select the button below to specify information about a new user that will be created during the installation.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsMaintenanceDlg_11</td><td>1033</td><td/><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsMaintenanceDlg_ChangeFeatures</td><td>1033</td><td>Change which program features are installed. This option displays the Custom Selection dialog in which you can change the way features are installed.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsMaintenanceDlg_MaitenanceOptions</td><td>1033</td><td>Modify, repair, or remove the program.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsMaintenanceDlg_Modify</td><td>1033</td><td>{&amp;MSSansBold8}&amp;Modify</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsMaintenanceDlg_ProgramMaintenance</td><td>1033</td><td>{&amp;MSSansBold8}Program Maintenance</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsMaintenanceDlg_Remove</td><td>1033</td><td>{&amp;MSSansBold8}&amp;Remove</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsMaintenanceDlg_RemoveProductName</td><td>1033</td><td>Remove [ProductName] from your computer.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsMaintenanceDlg_Repair</td><td>1033</td><td>{&amp;MSSansBold8}Re&amp;pair</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsMaintenanceDlg_RepairMessage</td><td>1033</td><td>Repair installation errors in the program. This option fixes missing or corrupt files, shortcuts, and registry entries.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsMaintenanceWelcome_MaintenanceOptionsDescription</td><td>1033</td><td>The InstallShield(R) Wizard will allow you to modify, repair, or remove [ProductName]. To continue, click Next.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsMaintenanceWelcome_WizardWelcome</td><td>1033</td><td>{&amp;TahomaBold10}Welcome to the InstallShield Wizard for [ProductName]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsPatchDlg_PatchClickUpdate</td><td>1033</td><td>The InstallShield(R) Wizard will install the Patch for [ProductName] on your computer. To continue, click Update.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsPatchDlg_PatchWizard</td><td>1033</td><td>[ProductName] Patch - InstallShield Wizard</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsPatchDlg_Update</td><td>1033</td><td>&amp;Update &gt;</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsPatchDlg_WelcomePatchWizard</td><td>1033</td><td>{&amp;TahomaBold10}Welcome to the Patch for [ProductName]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsProgressDlg_2</td><td>1033</td><td/><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsProgressDlg_Hidden</td><td>1033</td><td>(Hidden for now)</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsProgressDlg_HiddenTimeRemaining</td><td>1033</td><td>)Hidden for now)Estimated time remaining:</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsProgressDlg_InstallingProductName</td><td>1033</td><td>{&amp;MSSansBold8}Installing [ProductName]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsProgressDlg_ProgressDone</td><td>1033</td><td>Progress done</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsProgressDlg_SecHidden</td><td>1033</td><td>(Hidden for now)Sec.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsProgressDlg_Status</td><td>1033</td><td>Status:</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsProgressDlg_Uninstalling</td><td>1033</td><td>{&amp;MSSansBold8}Uninstalling [ProductName]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsProgressDlg_UninstallingFeatures</td><td>1033</td><td>The program features you selected are being uninstalled.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsProgressDlg_UninstallingFeatures2</td><td>1033</td><td>The program features you selected are being installed.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsProgressDlg_WaitUninstall</td><td>1033</td><td>Please wait while the InstallShield Wizard uninstalls [ProductName]. This may take several minutes.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsProgressDlg_WaitUninstall2</td><td>1033</td><td>Please wait while the InstallShield Wizard installs [ProductName]. This may take several minutes.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsReadmeDlg_Cancel</td><td>1033</td><td>&amp;Cancel</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsReadmeDlg_PleaseReadInfo</td><td>1033</td><td>Please read the following readme information carefully.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsReadmeDlg_ReadMeInfo</td><td>1033</td><td>{&amp;MSSansBold8}Readme Information</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsRegisterUserDlg_16</td><td>1033</td><td/><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsRegisterUserDlg_Anyone</td><td>1033</td><td>&amp;Anyone who uses this computer (all users)</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsRegisterUserDlg_CustomerInformation</td><td>1033</td><td>{&amp;MSSansBold8}Customer Information</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsRegisterUserDlg_InstallFor</td><td>1033</td><td>Install this application for:</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsRegisterUserDlg_OnlyMe</td><td>1033</td><td>Only for &amp;me ([USERNAME])</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsRegisterUserDlg_Organization</td><td>1033</td><td>&amp;Organization:</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsRegisterUserDlg_PleaseEnterInfo</td><td>1033</td><td>Please enter your information.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsRegisterUserDlg_SerialNumber</td><td>1033</td><td>&amp;Serial Number:</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsRegisterUserDlg_Tahoma50</td><td>1033</td><td>{\Tahoma8}{50}</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsRegisterUserDlg_Tahoma80</td><td>1033</td><td>{\Tahoma8}{80}</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsRegisterUserDlg_UserName</td><td>1033</td><td>&amp;User Name:</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsResumeDlg_ResumeSuspended</td><td>1033</td><td>The InstallShield(R) Wizard will complete the suspended installation of [ProductName] on your computer. To continue, click Next.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsResumeDlg_Resuming</td><td>1033</td><td>{&amp;TahomaBold10}Resuming the InstallShield Wizard for [ProductName]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsResumeDlg_WizardResume</td><td>1033</td><td>The InstallShield(R) Wizard will complete the installation of [ProductName] on your computer. To continue, click Next.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsSelectDomainOrServer</td><td>1033</td><td>Select a Domain or Server</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsSelectDomainUserInstructions</td><td>1033</td><td>Use the browse buttons to select a domain\server and a user name.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsSetupTypeMinDlg_13</td><td>1033</td><td/><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsSetupTypeMinDlg_AllFeatures</td><td>1033</td><td>All program features will be installed. (Requires the most disk space.)</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsSetupTypeMinDlg_ChooseFeatures</td><td>1033</td><td>Choose which program features you want installed and where they will be installed. Recommended for advanced users.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsSetupTypeMinDlg_ChooseSetupType</td><td>1033</td><td>Choose the setup type that best suits your needs.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsSetupTypeMinDlg_Complete</td><td>1033</td><td>{&amp;MSSansBold8}&amp;Complete</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsSetupTypeMinDlg_Custom</td><td>1033</td><td>{&amp;MSSansBold8}Cu&amp;stom</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsSetupTypeMinDlg_Minimal</td><td>1033</td><td>{&amp;MSSansBold8}&amp;Minimal</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsSetupTypeMinDlg_MinimumFeatures</td><td>1033</td><td>Minimum required features will be installed.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsSetupTypeMinDlg_SelectSetupType</td><td>1033</td><td>Please select a setup type.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsSetupTypeMinDlg_SetupType</td><td>1033</td><td>{&amp;MSSansBold8}Setup Type</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsSetupTypeMinDlg_Typical</td><td>1033</td><td>{&amp;MSSansBold8}&amp;Typical</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsUserExit_ClickFinish</td><td>1033</td><td>Click Finish to exit the wizard.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsUserExit_Finish</td><td>1033</td><td>&amp;Finish</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsUserExit_KeepOrRestore</td><td>1033</td><td>You can either keep any existing installed elements on your system to continue this installation at a later time or you can restore your system to its original state prior to the installation.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsUserExit_NotModified</td><td>1033</td><td>Your system has not been modified. To install this program at a later time, please run the installation again.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsUserExit_RestoreOrContinue</td><td>1033</td><td>Click Restore or Continue Later to exit the wizard.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsUserExit_WizardCompleted</td><td>1033</td><td>{&amp;TahomaBold10}InstallShield Wizard Completed</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsUserExit_WizardInterrupted</td><td>1033</td><td>The wizard was interrupted before [ProductName] could be completely installed.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsUserNameLabel</td><td>1033</td><td>&amp;User name:</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsVerifyReadyDlg_BackOrCancel</td><td>1033</td><td>If you want to review or change any of your installation settings, click Back. Click Cancel to exit the wizard.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsVerifyReadyDlg_ClickInstall</td><td>1033</td><td>Click Install to begin the installation.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsVerifyReadyDlg_Company</td><td>1033</td><td>Company: [COMPANYNAME]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsVerifyReadyDlg_CurrentSettings</td><td>1033</td><td>Current Settings:</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsVerifyReadyDlg_DestFolder</td><td>1033</td><td>Destination Folder:</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsVerifyReadyDlg_Install</td><td>1033</td><td>&amp;Install</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsVerifyReadyDlg_Installdir</td><td>1033</td><td>[INSTALLDIR]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsVerifyReadyDlg_ModifyReady</td><td>1033</td><td>{&amp;MSSansBold8}Ready to Modify the Program</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsVerifyReadyDlg_ReadyInstall</td><td>1033</td><td>{&amp;MSSansBold8}Ready to Install the Program</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsVerifyReadyDlg_ReadyRepair</td><td>1033</td><td>{&amp;MSSansBold8}Ready to Repair the Program</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsVerifyReadyDlg_SelectedSetupType</td><td>1033</td><td>[SelectedSetupType]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsVerifyReadyDlg_Serial</td><td>1033</td><td>Serial: [ISX_SERIALNUM]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsVerifyReadyDlg_SetupType</td><td>1033</td><td>Setup Type:</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsVerifyReadyDlg_UserInfo</td><td>1033</td><td>User Information:</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsVerifyReadyDlg_UserName</td><td>1033</td><td>Name: [USERNAME]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsVerifyReadyDlg_WizardReady</td><td>1033</td><td>The wizard is ready to begin installation.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsVerifyRemoveAllDlg_ChoseRemoveProgram</td><td>1033</td><td>You have chosen to remove the program from your system.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsVerifyRemoveAllDlg_ClickBack</td><td>1033</td><td>If you want to review or change any settings, click Back.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsVerifyRemoveAllDlg_ClickRemove</td><td>1033</td><td>Click Remove to remove [ProductName] from your computer. After removal, this program will no longer be available for use.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsVerifyRemoveAllDlg_Remove</td><td>1033</td><td>&amp;Remove</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsVerifyRemoveAllDlg_RemoveProgram</td><td>1033</td><td>{&amp;MSSansBold8}Remove the Program</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsWelcomeDlg_InstallProductName</td><td>1033</td><td>The InstallShield(R) Wizard will install [ProductName] on your computer. To continue, click Next.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsWelcomeDlg_WarningCopyright</td><td>1033</td><td>WARNING: This program is protected by copyright law and international treaties.</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__IsWelcomeDlg_WelcomeProductName</td><td>1033</td><td>{&amp;TahomaBold10}Welcome to the InstallShield Wizard for [ProductName]</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__TargetReq_DESC_COLOR</td><td>1033</td><td>The color settings of your system are not adequate for running [ProductName].</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__TargetReq_DESC_OS</td><td>1033</td><td>The operating system is not adequate for running [ProductName].</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__TargetReq_DESC_PROCESSOR</td><td>1033</td><td>The processor is not adequate for running [ProductName].</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__TargetReq_DESC_RAM</td><td>1033</td><td>The amount of RAM is not adequate for running [ProductName].</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>IDS__TargetReq_DESC_RESOLUTION</td><td>1033</td><td>The screen resolution is not adequate for running [ProductName].</td><td>0</td><td/><td>-1256677244</td></row>
+ <row><td>ID_STRING1</td><td>1033</td><td>http://jakarta.apache.org</td><td>0</td><td/><td>2115538665</td></row>
+ <row><td>ID_STRING2</td><td>1033</td><td>DisplayName1</td><td>0</td><td/><td>2115549418</td></row>
+ <row><td>ID_STRING3</td><td>1033</td><td>jakarta</td><td>0</td><td/><td>2115510538</td></row>
+ <row><td>ID_STRING4</td><td>1033</td><td>CoreFiles</td><td>0</td><td/><td>2115544011</td></row>
+ <row><td>ID_STRING5</td><td>1033</td><td>Tomcat Isapi Redirector</td><td>0</td><td/><td>161207880</td></row>
+ <row><td>ID_STRING6</td><td>1033</td><td>See http://tomcat.apache.org/connectors-doc/</td><td>0</td><td/><td>161197672</td></row>
+ <row><td>IIDS_UITEXT_FeatureUninstalled</td><td>1033</td><td>This feature will remain uninstalled.</td><td>0</td><td/><td>-1256677244</td></row>
+ </table>
+
+ <table name="ISTargetImage">
+ <col key="yes" def="s13">UpgradedImage_</col>
+ <col key="yes" def="s13">Name</col>
+ <col def="s0">MsiPath</col>
+ <col def="i2">Order</col>
+ <col def="I4">Flags</col>
+ <col def="i2">IgnoreMissingFiles</col>
+ </table>
+
+ <table name="ISUpgradeMsiItem">
+ <col key="yes" def="s72">UpgradeItem</col>
+ <col def="s0">ObjectSetupPath</col>
+ <col def="S255">ISReleaseFlags</col>
+ <col def="i2">ISAttributes</col>
+ </table>
+
+ <table name="ISUpgradedImage">
+ <col key="yes" def="s13">Name</col>
+ <col def="s0">MsiPath</col>
+ <col def="s8">Family</col>
+ </table>
+
+ <table name="ISVRoot">
+ <col key="yes" def="s50">VRootKey</col>
+ <col def="l255">VRootName</col>
+ <col def="s50">VRootDir</col>
+ <col def="i4">VRootProps</col>
+ <col def="S255">VRootAppName</col>
+ <col def="S255">VRootDefDoc</col>
+ <col def="S255">Condition</col>
+ <col def="I4">SessionTimeout</col>
+ <col def="I4">ScriptTimeout</col>
+ <col def="S255">AnonyUserName</col>
+ <col def="S255">AnonyPasswrd</col>
+ <col def="s72">Component_</col>
+ <row><td>ISIISCommonVRoot</td><td>Obsolete</td><td>Obsolete</td><td>0</td><td/><td/><td/><td/><td/><td/><td/><td>VirtualDirComponent</td></row>
+ </table>
+
+ <table name="ISVRootAppMaps">
+ <col key="yes" def="s255">VRootKey</col>
+ <col key="yes" def="s255">VRootAppMapKey</col>
+ <col def="l50">Extension</col>
+ <col def="l255">ExecPath</col>
+ <col def="l255">Verb</col>
+ <col def="i4">AppMapProps</col>
+ </table>
+
+ <table name="ISWebSite">
+ <col key="yes" def="s50">ISIISCommon_</col>
+ <col def="s50">Port</col>
+ <col def="S50">IP</col>
+ <col def="s50">SiteNumber</col>
+ <col def="I4">WebSiteProps</col>
+ <row><td>ISIISCommonWebsite1</td><td>80</td><td/><td>1</td><td>0</td></row>
+ </table>
+
+ <table name="ISXmlElement">
+ <col key="yes" def="s72">ISXmlElement</col>
+ <col def="s72">ISXmlFile_</col>
+ <col def="S72">ISXmlElement_Parent</col>
+ <col def="L0">XPath</col>
+ <col def="L0">Content</col>
+ <col def="I4">ISAttributes</col>
+ </table>
+
+ <table name="ISXmlElementAttrib">
+ <col key="yes" def="s72">ISXmlElementAttrib</col>
+ <col key="yes" def="s72">ISXmlElement_</col>
+ <col def="L255">Name</col>
+ <col def="L0">Value</col>
+ <col def="I4">ISAttributes</col>
+ </table>
+
+ <table name="ISXmlFile">
+ <col key="yes" def="s72">ISXmlFile</col>
+ <col def="l255">FileName</col>
+ <col def="s72">Component_</col>
+ <col def="s50">Directory</col>
+ <col def="I4">ISAttributes</col>
+ <col def="S0">SelectionNamespaces</col>
+ </table>
+
+ <table name="ISXmlLocator">
+ <col key="yes" def="s72">Signature_</col>
+ <col key="yes" def="S72">Parent</col>
+ <col def="S255">Element</col>
+ <col def="S255">Attribute</col>
+ <col def="I2">ISAttributes</col>
+ </table>
+
+ <table name="Icon">
+ <col key="yes" def="s72">Name</col>
+ <col def="V0">Data</col>
+ <col def="S255">ISBuildSourcePath</col>
+ <col def="I2">ISIconIndex</col>
+ <row><td>ARPPRODUCTICON.exe</td><td/><td>&lt;ISProjectFolder&gt;\tomcat.ico</td><td>0</td></row>
+ </table>
+
+ <table name="IniFile">
+ <col key="yes" def="s72">IniFile</col>
+ <col def="l255">FileName</col>
+ <col def="S72">DirProperty</col>
+ <col def="l255">Section</col>
+ <col def="l128">Key</col>
+ <col def="s255">Value</col>
+ <col def="i2">Action</col>
+ <col def="s72">Component_</col>
+ </table>
+
+ <table name="IniLocator">
+ <col key="yes" def="s72">Signature_</col>
+ <col def="s255">FileName</col>
+ <col def="s96">Section</col>
+ <col def="s128">Key</col>
+ <col def="I2">Field</col>
+ <col def="I2">Type</col>
+ </table>
+
+ <table name="InstallExecuteSequence">
+ <col key="yes" def="s72">Action</col>
+ <col def="S255">Condition</col>
+ <col def="I2">Sequence</col>
+ <col def="S255">ISComments</col>
+ <col def="I4">ISAttributes</col>
+ <row><td>AllocateRegistrySpace</td><td>NOT Installed</td><td>1550</td><td>AllocateRegistrySpace</td><td/></row>
+ <row><td>AppSearch</td><td/><td>400</td><td>AppSearch</td><td/></row>
+ <row><td>BindImage</td><td/><td>4300</td><td>BindImage</td><td/></row>
+ <row><td>CCPSearch</td><td>CCP_TEST</td><td>500</td><td>CCPSearch</td><td/></row>
+ <row><td>CostFinalize</td><td/><td>1000</td><td>CostFinalize</td><td/></row>
+ <row><td>CostInitialize</td><td/><td>800</td><td>CostInitialize</td><td/></row>
+ <row><td>CreateFolders</td><td/><td>3700</td><td>CreateFolders</td><td/></row>
+ <row><td>CreateShortcuts</td><td/><td>4500</td><td>CreateShortcuts</td><td/></row>
+ <row><td>DeleteServices</td><td>VersionNT</td><td>2000</td><td>DeleteServices</td><td/></row>
+ <row><td>DuplicateFiles</td><td/><td>4210</td><td>DuplicateFiles</td><td/></row>
+ <row><td>FileCost</td><td/><td>900</td><td>FileCost</td><td/></row>
+ <row><td>FindRelatedProducts</td><td>NOT ISSETUPDRIVEN</td><td>420</td><td>FindRelatedProducts</td><td/></row>
+ <row><td>ISSelfRegisterCosting</td><td/><td>2201</td><td/><td/></row>
+ <row><td>ISSelfRegisterFiles</td><td/><td>5601</td><td/><td/></row>
+ <row><td>ISSelfRegisterFinalize</td><td/><td>6601</td><td/><td/></row>
+ <row><td>ISUnSelfRegisterFiles</td><td/><td>2202</td><td/><td/></row>
+ <row><td>InstallFiles</td><td/><td>4000</td><td>InstallFiles</td><td/></row>
+ <row><td>InstallFilter</td><td/><td>4001</td><td/><td/></row>
+ <row><td>InstallFinalize</td><td/><td>6600</td><td>InstallFinalize</td><td/></row>
+ <row><td>InstallInitialize</td><td/><td>1501</td><td>InstallInitialize</td><td/></row>
+ <row><td>InstallODBC</td><td/><td>5400</td><td>InstallODBC</td><td/></row>
+ <row><td>InstallServices</td><td>VersionNT</td><td>5800</td><td>InstallServices</td><td/></row>
+ <row><td>InstallValidate</td><td/><td>1400</td><td>InstallValidate</td><td/></row>
+ <row><td>IsolateComponents</td><td/><td>950</td><td>IsolateComponents</td><td/></row>
+ <row><td>LaunchConditions</td><td>Not Installed</td><td>410</td><td>LaunchConditions</td><td/></row>
+ <row><td>MigrateFeatureStates</td><td/><td>1200</td><td>MigrateFeatureStates</td><td/></row>
+ <row><td>MoveFiles</td><td/><td>3800</td><td>MoveFiles</td><td/></row>
+ <row><td>MsiPublishAssemblies</td><td/><td>6250</td><td>MsiPublishAssemblies</td><td/></row>
+ <row><td>MsiUnpublishAssemblies</td><td/><td>1750</td><td>MsiUnpublishAssemblies</td><td/></row>
+ <row><td>PatchFiles</td><td/><td>4090</td><td>PatchFiles</td><td/></row>
+ <row><td>ProcessComponents</td><td/><td>1600</td><td>ProcessComponents</td><td/></row>
+ <row><td>PublishComponents</td><td/><td>6200</td><td>PublishComponents</td><td/></row>
+ <row><td>PublishFeatures</td><td/><td>6300</td><td>PublishFeatures</td><td/></row>
+ <row><td>PublishProduct</td><td/><td>6400</td><td>PublishProduct</td><td/></row>
+ <row><td>RMCCPSearch</td><td>Not CCP_SUCCESS And CCP_TEST</td><td>600</td><td>RMCCPSearch</td><td/></row>
+ <row><td>RegisterClassInfo</td><td/><td>4600</td><td>RegisterClassInfo</td><td/></row>
+ <row><td>RegisterComPlus</td><td/><td>5700</td><td>RegisterComPlus</td><td/></row>
+ <row><td>RegisterExtensionInfo</td><td/><td>4700</td><td>RegisterExtensionInfo</td><td/></row>
+ <row><td>RegisterFonts</td><td/><td>5300</td><td>RegisterFonts</td><td/></row>
+ <row><td>RegisterMIMEInfo</td><td/><td>4900</td><td>RegisterMIMEInfo</td><td/></row>
+ <row><td>RegisterProduct</td><td/><td>6100</td><td>RegisterProduct</td><td/></row>
+ <row><td>RegisterProgIdInfo</td><td/><td>4800</td><td>RegisterProgIdInfo</td><td/></row>
+ <row><td>RegisterTypeLibraries</td><td/><td>5500</td><td>RegisterTypeLibraries</td><td/></row>
+ <row><td>RegisterUser</td><td/><td>6000</td><td>RegisterUser</td><td/></row>
+ <row><td>RemoveDuplicateFiles</td><td/><td>3400</td><td>RemoveDuplicateFiles</td><td/></row>
+ <row><td>RemoveEnvironmentStrings</td><td/><td>3300</td><td>RemoveEnvironmentStrings</td><td/></row>
+ <row><td>RemoveExistingProducts</td><td/><td>1410</td><td>RemoveExistingProducts</td><td/></row>
+ <row><td>RemoveFiles</td><td/><td>3500</td><td>RemoveFiles</td><td/></row>
+ <row><td>RemoveFolders</td><td/><td>3600</td><td>RemoveFolders</td><td/></row>
+ <row><td>RemoveIniValues</td><td/><td>3100</td><td>RemoveIniValues</td><td/></row>
+ <row><td>RemoveODBC</td><td/><td>2400</td><td>RemoveODBC</td><td/></row>
+ <row><td>RemoveRegistryValues</td><td/><td>2600</td><td>RemoveRegistryValues</td><td/></row>
+ <row><td>RemoveShortcuts</td><td/><td>3200</td><td>RemoveShortcuts</td><td/></row>
+ <row><td>ScheduleReboot</td><td>ISSCHEDULEREBOOT</td><td>6410</td><td>ScheduleReboot</td><td/></row>
+ <row><td>SelfRegModules</td><td/><td>5600</td><td>SelfRegModules</td><td/></row>
+ <row><td>SelfUnregModules</td><td/><td>2200</td><td>SelfUnregModules</td><td/></row>
+ <row><td>SetARPINSTALLLOCATION</td><td>Not Installed</td><td>1010</td><td>SetARPINSTALLLOCATION</td><td/></row>
+ <row><td>SetODBCFolders</td><td/><td>1100</td><td>SetODBCFolders</td><td/></row>
+ <row><td>StartServices</td><td>VersionNT</td><td>5900</td><td>StartServices</td><td/></row>
+ <row><td>StopServices</td><td>VersionNT</td><td>1900</td><td>StopServices</td><td/></row>
+ <row><td>UnpublishComponents</td><td/><td>1700</td><td>UnpublishComponents</td><td/></row>
+ <row><td>UnpublishFeatures</td><td/><td>1800</td><td>UnpublishFeatures</td><td/></row>
+ <row><td>UnregisterClassInfo</td><td/><td>2700</td><td>UnregisterClassInfo</td><td/></row>
+ <row><td>UnregisterComPlus</td><td/><td>2100</td><td>UnregisterComPlus</td><td/></row>
+ <row><td>UnregisterExtensionInfo</td><td/><td>2800</td><td>UnregisterExtensionInfo</td><td/></row>
+ <row><td>UnregisterFonts</td><td/><td>2500</td><td>UnregisterFonts</td><td/></row>
+ <row><td>UnregisterMIMEInfo</td><td/><td>3000</td><td>UnregisterMIMEInfo</td><td/></row>
+ <row><td>UnregisterProgIdInfo</td><td/><td>2900</td><td>UnregisterProgIdInfo</td><td/></row>
+ <row><td>UnregisterTypeLibraries</td><td/><td>2300</td><td>UnregisterTypeLibraries</td><td/></row>
+ <row><td>ValidateProductID</td><td/><td>700</td><td>ValidateProductID</td><td/></row>
+ <row><td>WriteEnvironmentStrings</td><td/><td>5200</td><td>WriteEnvironmentStrings</td><td/></row>
+ <row><td>WriteIniValues</td><td/><td>5100</td><td>WriteIniValues</td><td/></row>
+ <row><td>WriteRegistryValues</td><td/><td>5000</td><td>WriteRegistryValues</td><td/></row>
+ <row><td>caCreateVRoots</td><td/><td>4002</td><td/><td/></row>
+ <row><td>caExtractIISSuppFiles</td><td/><td>1500</td><td/><td/></row>
+ <row><td>caIISCleanup</td><td/><td>6602</td><td/><td/></row>
+ <row><td>caRemoveVRoots</td><td/><td>3503</td><td/><td/></row>
+ <row><td>caRlbackVRoots</td><td/><td>3502</td><td/><td/></row>
+ </table>
+
+ <table name="InstallShield">
+ <col key="yes" def="s72">Property</col>
+ <col def="S0">Value</col>
+ <row><td>ActiveLanguage</td><td>1033</td></row>
+ <row><td>Comments</td><td/></row>
+ <row><td>CurrentMedia</td><td dt:dt="bin.base64" md5="ad56c01706a65016783625b2b7eb1639">
+TQBzAGkAAQBSAGUAbABlAGEAcwBlAA==
+ </td></row>
+ <row><td>ISCompilerOption_CompileBeforeBuild</td><td>1</td></row>
+ <row><td>ISCompilerOption_Debug</td><td>0</td></row>
+ <row><td>ISCompilerOption_IncludePath</td><td/></row>
+ <row><td>ISCompilerOption_MaxErrors</td><td>50</td></row>
+ <row><td>ISCompilerOption_MaxWarnings</td><td>50</td></row>
+ <row><td>ISCompilerOption_OutputPath</td><td>&lt;ISProjectDataFolder&gt;\Script Files</td></row>
+ <row><td>ISCompilerOption_PreProcessor</td><td/></row>
+ <row><td>ISCompilerOption_WarningLevel</td><td>3</td></row>
+ <row><td>ISCompilerOption_WarningsAsErrors</td><td>1</td></row>
+ <row><td>ISDialogLangID</td><td/></row>
+ <row><td>ISUSLock</td><td>{3872C0E8-6909-4854-B023-A63C791DEF8B}</td></row>
+ <row><td>ISUSSignature</td><td>{33FEE5F9-7895-4F44-87E1-D98785707659}</td></row>
+ <row><td>IsProjectFileText</td><td>1</td></row>
+ <row><td>MsiExecCmdLineOptions</td><td/></row>
+ <row><td>MsiLogFile</td><td/></row>
+ <row><td>OnUpgrade</td><td>1</td></row>
+ <row><td>Owner</td><td>Mladen Turk</td></row>
+ <row><td>PatchFamily</td><td>MyPatchFamily1</td></row>
+ <row><td>PatchSequence</td><td>1.0.0</td></row>
+ <row><td>SaveAsSchema</td><td/></row>
+ <row><td>SccEnabled</td><td>0</td></row>
+ <row><td>SccPath</td><td/></row>
+ <row><td>SchemaVersion</td><td>763</td></row>
+ <row><td>Type</td><td>MSI</td></row>
+ </table>
+
+ <table name="InstallUISequence">
+ <col key="yes" def="s72">Action</col>
+ <col def="S255">Condition</col>
+ <col def="I2">Sequence</col>
+ <col def="S255">ISComments</col>
+ <col def="I4">ISAttributes</col>
+ <row><td>AppSearch</td><td/><td>400</td><td>AppSearch</td><td/></row>
+ <row><td>CCPSearch</td><td>CCP_TEST</td><td>500</td><td>CCPSearch</td><td/></row>
+ <row><td>CostFinalize</td><td/><td>1000</td><td>CostFinalize</td><td/></row>
+ <row><td>CostInitialize</td><td/><td>800</td><td>CostInitialize</td><td/></row>
+ <row><td>ExecuteAction</td><td/><td>1300</td><td>ExecuteAction</td><td/></row>
+ <row><td>FileCost</td><td/><td>900</td><td>FileCost</td><td/></row>
+ <row><td>FindRelatedProducts</td><td/><td>430</td><td>FindRelatedProducts</td><td/></row>
+ <row><td>InstallWelcome</td><td>Not Installed And (Not PATCH Or IS_MAJOR_UPGRADE)</td><td>1210</td><td>InstallWelcome</td><td/></row>
+ <row><td>IsolateComponents</td><td/><td>950</td><td>IsolateComponents</td><td/></row>
+ <row><td>LaunchConditions</td><td>Not Installed</td><td>410</td><td>LaunchConditions</td><td/></row>
+ <row><td>MaintenanceWelcome</td><td>Installed And Not RESUME And Not Preselected And Not PATCH</td><td>1230</td><td>MaintenanceWelcome</td><td/></row>
+ <row><td>MigrateFeatureStates</td><td/><td>1200</td><td>MigrateFeatureStates</td><td/></row>
+ <row><td>PatchWelcome</td><td>PATCH And Not IS_MAJOR_UPGRADE</td><td>1205</td><td>Patch Panel</td><td/></row>
+ <row><td>RMCCPSearch</td><td>Not CCP_SUCCESS And CCP_TEST</td><td>600</td><td>RMCCPSearch</td><td/></row>
+ <row><td>ResolveSource</td><td>Not Installed And Not PATCH</td><td>990</td><td>ResolveSource</td><td/></row>
+ <row><td>SetAllUsersProfileNT</td><td>VersionNT = 400</td><td>970</td><td/><td/></row>
+ <row><td>SetupCompleteError</td><td/><td>-3</td><td>SetupCompleteError</td><td/></row>
+ <row><td>SetupCompleteSuccess</td><td/><td>-1</td><td>SetupCompleteSuccess</td><td/></row>
+ <row><td>SetupInitialization</td><td/><td>420</td><td>SetupInitialization</td><td/></row>
+ <row><td>SetupInterrupted</td><td/><td>-2</td><td>SetupInterrupted</td><td/></row>
+ <row><td>SetupProgress</td><td/><td>1240</td><td>SetupProgress</td><td/></row>
+ <row><td>SetupResume</td><td>Installed And (RESUME Or Preselected) And Not PATCH</td><td>1220</td><td>SetupResume</td><td/></row>
+ <row><td>ValidateProductID</td><td/><td>700</td><td>ValidateProductID</td><td/></row>
+ <row><td>setAllUsersProfile2K</td><td>VersionNT &gt;= 500</td><td>980</td><td/><td/></row>
+ <row><td>setUserProfileNT</td><td>VersionNT</td><td>960</td><td/><td/></row>
+ </table>
+
+ <table name="IsolatedComponent">
+ <col key="yes" def="s72">Component_Shared</col>
+ <col key="yes" def="s72">Component_Application</col>
+ </table>
+
+ <table name="LaunchCondition">
+ <col key="yes" def="s255">Condition</col>
+ <col def="l255">Description</col>
+ <row><td>(Not Version9X)</td><td>##IDPROP_EXPRESS_LAUNCH_CONDITION_OS##</td></row>
+ </table>
+
+ <table name="ListBox">
+ <col key="yes" def="s72">Property</col>
+ <col key="yes" def="i2">Order</col>
+ <col def="s64">Value</col>
+ <col def="L64">Text</col>
+ <row><td>IS_SQLSERVER_LIST</td><td>1</td><td>TestValue</td><td/></row>
+ </table>
+
+ <table name="ListView">
+ <col key="yes" def="s72">Property</col>
+ <col key="yes" def="i2">Order</col>
+ <col def="s64">Value</col>
+ <col def="L64">Text</col>
+ <col def="S72">Binary_</col>
+ </table>
+
+ <table name="LockPermissions">
+ <col key="yes" def="s72">LockObject</col>
+ <col key="yes" def="s32">Table</col>
+ <col key="yes" def="S255">Domain</col>
+ <col key="yes" def="s255">User</col>
+ <col def="I4">Permission</col>
+ </table>
+
+ <table name="MIME">
+ <col key="yes" def="s64">ContentType</col>
+ <col def="s255">Extension_</col>
+ <col def="S38">CLSID</col>
+ </table>
+
+ <table name="Media">
+ <col key="yes" def="i2">DiskId</col>
+ <col def="i2">LastSequence</col>
+ <col def="L64">DiskPrompt</col>
+ <col def="S255">Cabinet</col>
+ <col def="S32">VolumeLabel</col>
+ <col def="S32">Source</col>
+ </table>
+
+ <table name="MoveFile">
+ <col key="yes" def="s72">FileKey</col>
+ <col def="s72">Component_</col>
+ <col def="L255">SourceName</col>
+ <col def="L255">DestName</col>
+ <col def="S72">SourceFolder</col>
+ <col def="s72">DestFolder</col>
+ <col def="i2">Options</col>
+ </table>
+
+ <table name="MsiAssembly">
+ <col key="yes" def="s72">Component_</col>
+ <col def="s38">Feature_</col>
+ <col def="S72">File_Manifest</col>
+ <col def="S72">File_Application</col>
+ <col def="I2">Attributes</col>
+ </table>
+
+ <table name="MsiAssemblyName">
+ <col key="yes" def="s72">Component_</col>
+ <col key="yes" def="s255">Name</col>
+ <col def="s255">Value</col>
+ </table>
+
+ <table name="MsiDigitalCertificate">
+ <col key="yes" def="s72">DigitalCertificate</col>
+ <col def="v0">CertData</col>
+ </table>
+
+ <table name="MsiDigitalSignature">
+ <col key="yes" def="s32">Table</col>
+ <col key="yes" def="s72">SignObject</col>
+ <col def="s72">DigitalCertificate_</col>
+ <col def="V0">Hash</col>
+ </table>
+
+ <table name="MsiDriverPackages">
+ <col key="yes" def="s72">Component</col>
+ <col def="i4">Flags</col>
+ <col def="I4">Sequence</col>
+ <col def="S0">ReferenceComponents</col>
+ </table>
+
+ <table name="MsiFileHash">
+ <col key="yes" def="s72">File_</col>
+ <col def="i2">Options</col>
+ <col def="i4">HashPart1</col>
+ <col def="i4">HashPart2</col>
+ <col def="i4">HashPart3</col>
+ <col def="i4">HashPart4</col>
+ </table>
+
+ <table name="MsiPatchCertificate">
+ <col key="yes" def="S72">PatchCertificate</col>
+ <col def="s72">DigitalCertificate_</col>
+ </table>
+
+ <table name="MsiPatchMetadata">
+ <col key="yes" def="s72">PatchConfiguration_</col>
+ <col key="yes" def="S72">Company</col>
+ <col key="yes" def="s72">Property</col>
+ <col def="S0">Value</col>
+ </table>
+
+ <table name="MsiPatchOldAssemblyFile">
+ <col key="yes" def="s72">File_</col>
+ <col key="yes" def="S72">Assembly_</col>
+ </table>
+
+ <table name="MsiPatchOldAssemblyName">
+ <col key="yes" def="s72">Assembly_</col>
+ <col key="yes" def="s255">Name</col>
+ <col def="S255">Value</col>
+ </table>
+
+ <table name="MsiPatchSequence">
+ <col key="yes" def="s72">PatchConfiguration_</col>
+ <col key="yes" def="s0">PatchFamily</col>
+ <col key="yes" def="S0">Target</col>
+ <col def="s0">Sequence</col>
+ <col def="i2">Supersede</col>
+ </table>
+
+ <table name="ODBCAttribute">
+ <col key="yes" def="s72">Driver_</col>
+ <col key="yes" def="s40">Attribute</col>
+ <col def="S255">Value</col>
+ </table>
+
+ <table name="ODBCDataSource">
+ <col key="yes" def="s72">DataSource</col>
+ <col def="s72">Component_</col>
+ <col def="s255">Description</col>
+ <col def="s255">DriverDescription</col>
+ <col def="i2">Registration</col>
+ </table>
+
+ <table name="ODBCDriver">
+ <col key="yes" def="s72">Driver</col>
+ <col def="s72">Component_</col>
+ <col def="s255">Description</col>
+ <col def="s72">File_</col>
+ <col def="S72">File_Setup</col>
+ </table>
+
+ <table name="ODBCSourceAttribute">
+ <col key="yes" def="s72">DataSource_</col>
+ <col key="yes" def="s32">Attribute</col>
+ <col def="S255">Value</col>
+ </table>
+
+ <table name="ODBCTranslator">
+ <col key="yes" def="s72">Translator</col>
+ <col def="s72">Component_</col>
+ <col def="s255">Description</col>
+ <col def="s72">File_</col>
+ <col def="S72">File_Setup</col>
+ </table>
+
+ <table name="Patch">
+ <col key="yes" def="s72">File_</col>
+ <col key="yes" def="i2">Sequence</col>
+ <col def="i4">PatchSize</col>
+ <col def="i2">Attributes</col>
+ <col def="V0">Header</col>
+ <col def="S255">ISBuildSourcePath</col>
+ </table>
+
+ <table name="PatchPackage">
+ <col key="yes" def="s38">PatchId</col>
+ <col def="i2">Media_</col>
+ </table>
+
+ <table name="ProgId">
+ <col key="yes" def="s255">ProgId</col>
+ <col def="S255">ProgId_Parent</col>
+ <col def="S38">Class_</col>
+ <col def="L255">Description</col>
+ <col def="S72">Icon_</col>
+ <col def="I2">IconIndex</col>
+ <col def="I4">ISAttributes</col>
+ </table>
+
+ <table name="Property">
+ <col key="yes" def="s72">Property</col>
+ <col def="L0">Value</col>
+ <col def="S255">ISComments</col>
+ <row><td>ARPPRODUCTICON</td><td>ARPPRODUCTICON.exe</td><td/></row>
+ <row><td>ARPURLINFOABOUT</td><td>##ID_STRING1##</td><td/></row>
+ <row><td>AgreeToLicense</td><td>No</td><td/></row>
+ <row><td>ApplicationUsers</td><td>AllUsers</td><td/></row>
+ <row><td>DWUSINTERVAL</td><td>30</td><td/></row>
+ <row><td>DWUSLINK</td><td>CEAC2798B9CCC7BFDEAC879F5E6C978F29BC978F69DCE0AFCEFC673F895C57EF898B905F79AC</td><td/></row>
+ <row><td>DefaultUIFont</td><td>Tahoma8</td><td/></row>
+ <row><td>DialogCaption</td><td>InstallShield for Windows Installer</td><td/></row>
+ <row><td>DiskPrompt</td><td>[1]</td><td/></row>
+ <row><td>DisplayNameCustom</td><td>##IDS__DisplayName_Custom##</td><td/></row>
+ <row><td>DisplayNameMinimal</td><td>##IDS__DisplayName_Minimal##</td><td/></row>
+ <row><td>DisplayNameTypical</td><td>##IDS__DisplayName_Typical##</td><td/></row>
+ <row><td>Display_IsBitmapDlg</td><td>1</td><td/></row>
+ <row><td>ErrorDialog</td><td>SetupError</td><td/></row>
+ <row><td>INSTALLLEVEL</td><td>100</td><td/></row>
+ <row><td>ISCHECKFORPRODUCTUPDATES</td><td>1</td><td/></row>
+ <row><td>ISENABLEDWUSFINISHDIALOG</td><td/><td/></row>
+ <row><td>ISVROOT_PORT_NO</td><td>0</td><td/></row>
+ <row><td>IS_COMPLUS_PROGRESSTEXT_COST</td><td>##IDS_COMPLUS_PROGRESSTEXT_COST##</td><td/></row>
+ <row><td>IS_COMPLUS_PROGRESSTEXT_INSTALL</td><td>##IDS_COMPLUS_PROGRESSTEXT_INSTALL##</td><td/></row>
+ <row><td>IS_COMPLUS_PROGRESSTEXT_UNINSTALL</td><td>##IDS_COMPLUS_PROGRESSTEXT_UNINSTALL##</td><td/></row>
+ <row><td>IS_PROGMSG_XML_COSTING</td><td>##IDS_PROGMSG_XML_COSTING##</td><td/></row>
+ <row><td>IS_PROGMSG_XML_CREATE_FILE</td><td>##IDS_PROGMSG_XML_CREATE_FILE##</td><td/></row>
+ <row><td>IS_PROGMSG_XML_FILES</td><td>##IDS_PROGMSG_XML_FILES##</td><td/></row>
+ <row><td>IS_PROGMSG_XML_REMOVE_FILE</td><td>##IDS_PROGMSG_XML_REMOVE_FILE##</td><td/></row>
+ <row><td>IS_PROGMSG_XML_ROLLBACK_FILES</td><td>##IDS_PROGMSG_XML_ROLLBACK_FILES##</td><td/></row>
+ <row><td>IS_PROGMSG_XML_UPDATE_FILE</td><td>##IDS_PROGMSG_XML_UPDATE_FILE##</td><td/></row>
+ <row><td>IS_SQLSERVER_AUTHENTICATION</td><td>0</td><td/></row>
+ <row><td>IS_SQLSERVER_DATABASE</td><td/><td/></row>
+ <row><td>IS_SQLSERVER_PASSWORD</td><td/><td/></row>
+ <row><td>IS_SQLSERVER_SERVER</td><td/><td/></row>
+ <row><td>IS_SQLSERVER_USERNAME</td><td>sa</td><td/></row>
+ <row><td>InstallChoice</td><td>AR</td><td/></row>
+ <row><td>Manufacturer</td><td>##COMPANY_NAME##</td><td/></row>
+ <row><td>PIDTemplate</td><td>12345&lt;###-%%%%%%%&gt;@@@@@</td><td/></row>
+ <row><td>PROGMSG_IIS_CREATEAPPPOOL</td><td>##IDS_PROGMSG_IIS_CREATEAPPPOOL##</td><td/></row>
+ <row><td>PROGMSG_IIS_CREATEAPPPOOLS</td><td>##IDS_PROGMSG_IIS_CREATEAPPPOOLS##</td><td/></row>
+ <row><td>PROGMSG_IIS_CREATEVROOT</td><td>##IDS_PROGMSG_IIS_CREATEVROOT##</td><td/></row>
+ <row><td>PROGMSG_IIS_CREATEVROOTS</td><td>##IDS_PROGMSG_IIS_CREATEVROOTS##</td><td/></row>
+ <row><td>PROGMSG_IIS_CREATEWEBSERVICEEXTENSION</td><td>##IDS_PROGMSG_IIS_CREATEWEBSERVICEEXTENSION##</td><td/></row>
+ <row><td>PROGMSG_IIS_CREATEWEBSERVICEEXTENSIONS</td><td>##IDS_PROGMSG_IIS_CREATEWEBSERVICEEXTENSIONS##</td><td/></row>
+ <row><td>PROGMSG_IIS_EXTRACT</td><td>##IDS_PROGMSG_IIS_EXTRACT##</td><td/></row>
+ <row><td>PROGMSG_IIS_EXTRACTDONE</td><td>##IDS_PROGMSG_IIS_EXTRACTDONE##</td><td/></row>
+ <row><td>PROGMSG_IIS_REMOVEAPPPOOL</td><td>##IDS_PROGMSG_IIS_REMOVEAPPPOOL##</td><td/></row>
+ <row><td>PROGMSG_IIS_REMOVEAPPPOOLS</td><td>##IDS_PROGMSG_IIS_REMOVEAPPPOOLS##</td><td/></row>
+ <row><td>PROGMSG_IIS_REMOVESITE</td><td>##IDS_PROGMSG_IIS_REMOVESITE##</td><td/></row>
+ <row><td>PROGMSG_IIS_REMOVEVROOT</td><td>##IDS_PROGMSG_IIS_REMOVEVROOT##</td><td/></row>
+ <row><td>PROGMSG_IIS_REMOVEVROOTS</td><td>##IDS_PROGMSG_IIS_REMOVEVROOTS##</td><td/></row>
+ <row><td>PROGMSG_IIS_REMOVEWEBSERVICEEXTENSION</td><td>##IDS_PROGMSG_IIS_REMOVEWEBSERVICEEXTENSION##</td><td/></row>
+ <row><td>PROGMSG_IIS_REMOVEWEBSERVICEEXTENSIONS</td><td>##IDS_PROGMSG_IIS_REMOVEWEBSERVICEEXTENSIONS##</td><td/></row>
+ <row><td>PROGMSG_IIS_ROLLBACKAPPPOOLS</td><td>##IDS_PROGMSG_IIS_ROLLBACKAPPPOOLS##</td><td/></row>
+ <row><td>PROGMSG_IIS_ROLLBACKVROOTS</td><td>##IDS_PROGMSG_IIS_ROLLBACKVROOTS##</td><td/></row>
+ <row><td>PROGMSG_IIS_ROLLBACKWEBSERVICEEXTENSIONS</td><td>##IDS_PROGMSG_IIS_ROLLBACKWEBSERVICEEXTENSIONS##</td><td/></row>
+ <row><td>ProductCode</td><td>{8B799ADD-7E5C-41B9-936B-942F3CAE42A0}</td><td/></row>
+ <row><td>ProductID</td><td>none</td><td/></row>
+ <row><td>ProductLanguage</td><td>1033</td><td/></row>
+ <row><td>ProductName</td><td>Tomcat Isapi Redirector</td><td/></row>
+ <row><td>ProductVersion</td><td>1.2.32</td><td/></row>
+ <row><td>ProgressType0</td><td>install</td><td/></row>
+ <row><td>ProgressType1</td><td>Installing</td><td/></row>
+ <row><td>ProgressType2</td><td>installed</td><td/></row>
+ <row><td>ProgressType3</td><td>installs</td><td/></row>
+ <row><td>RebootYesNo</td><td>Yes</td><td/></row>
+ <row><td>ReinstallModeText</td><td>omus</td><td/></row>
+ <row><td>SHOWLAUNCHPROGRAM</td><td>0</td><td/></row>
+ <row><td>SetupType</td><td>Typical</td><td/></row>
+ <row><td>UpgradeCode</td><td>{0BE8FA4C-503F-4209-A3DA-79B605E542E0}</td><td/></row>
+ <row><td>_IsMaintenance</td><td>Change</td><td/></row>
+ <row><td>_IsSetupTypeMin</td><td>Typical</td><td/></row>
+ </table>
+
+ <table name="PublishComponent">
+ <col key="yes" def="s38">ComponentId</col>
+ <col key="yes" def="s255">Qualifier</col>
+ <col key="yes" def="s72">Component_</col>
+ <col def="L255">AppData</col>
+ <col def="s38">Feature_</col>
+ </table>
+
+ <table name="RadioButton">
+ <col key="yes" def="s72">Property</col>
+ <col key="yes" def="i2">Order</col>
+ <col def="s64">Value</col>
+ <col def="i2">X</col>
+ <col def="i2">Y</col>
+ <col def="i2">Width</col>
+ <col def="i2">Height</col>
+ <col def="L64">Text</col>
+ <col def="L50">Help</col>
+ <col def="I4">ISControlId</col>
+ <row><td>AgreeToLicense</td><td>1</td><td>No</td><td>0</td><td>15</td><td>291</td><td>15</td><td>##IDS__AgreeToLicense_0##</td><td/><td/></row>
+ <row><td>AgreeToLicense</td><td>2</td><td>Yes</td><td>0</td><td>0</td><td>291</td><td>15</td><td>##IDS__AgreeToLicense_1##</td><td/><td/></row>
+ <row><td>ApplicationUsers</td><td>1</td><td>AllUsers</td><td>1</td><td>7</td><td>290</td><td>14</td><td>##IDS__IsRegisterUserDlg_Anyone##</td><td/><td/></row>
+ <row><td>ApplicationUsers</td><td>2</td><td>OnlyCurrentUser</td><td>1</td><td>23</td><td>290</td><td>14</td><td>##IDS__IsRegisterUserDlg_OnlyMe##</td><td/><td/></row>
+ <row><td>IS_SQLSERVER_AUTHENTICATION</td><td>1</td><td>0</td><td>0</td><td>0</td><td>327</td><td>14</td><td>##IDS_SQLLOGIN_WIN##</td><td/><td>0</td></row>
+ <row><td>IS_SQLSERVER_AUTHENTICATION</td><td>2</td><td>1</td><td>0</td><td>14</td><td>327</td><td>19</td><td>##IDS_SQLLOGIN_SQL##</td><td/><td>0</td></row>
+ <row><td>_IsMaintenance</td><td>1</td><td>Change</td><td>0</td><td>0</td><td>290</td><td>14</td><td>##IDS__IsMaintenanceDlg_Modify##</td><td/><td/></row>
+ <row><td>_IsMaintenance</td><td>2</td><td>Reinstall</td><td>0</td><td>60</td><td>290</td><td>14</td><td>##IDS__IsMaintenanceDlg_Repair##</td><td/><td/></row>
+ <row><td>_IsMaintenance</td><td>3</td><td>Remove</td><td>0</td><td>120</td><td>290</td><td>14</td><td>##IDS__IsMaintenanceDlg_Remove##</td><td/><td/></row>
+ <row><td>_IsSetupTypeMin</td><td>1</td><td>Typical</td><td>0</td><td>0</td><td>264</td><td>14</td><td>##IDS__IsSetupTypeMinDlg_Complete##</td><td/><td/></row>
+ <row><td>_IsSetupTypeMin</td><td>2</td><td>Custom</td><td>0</td><td>60</td><td>264</td><td>14</td><td>##IDS__IsSetupTypeMinDlg_Custom##</td><td/><td/></row>
+ </table>
+
+ <table name="RegLocator">
+ <col key="yes" def="s72">Signature_</col>
+ <col def="i2">Root</col>
+ <col def="s255">Key</col>
+ <col def="S255">Name</col>
+ <col def="I2">Type</col>
+ <row><td>_IISROOTFOLDER</td><td>2</td><td>Software\Microsoft\InetStp</td><td>PathWWWRoot</td><td>0</td></row>
+ <row><td>_IIS_VERSION</td><td>2</td><td>SYSTEM\CurrentControlSet\Services\W3SVC\Parameters</td><td>MajorVersion</td><td>2</td></row>
+ </table>
+
+ <table name="Registry">
+ <col key="yes" def="s72">Registry</col>
+ <col def="i2">Root</col>
+ <col def="s255">Key</col>
+ <col def="S255">Name</col>
+ <col def="S0">Value</col>
+ <col def="s72">Component_</col>
+ <col def="I4">ISAttributes</col>
+ <row><td>Registry1</td><td>2</td><td>SOFTWARE\Apache Software Foundation\Jakarta Isapi Redirector\1.0</td><td>rewrite_rule_file</td><td>[INSTALLDIR]conf\rewrite.properties</td><td>ISRegistryComponent1</td><td>0</td></row>
+ <row><td>Registry10</td><td>2</td><td>SOFTWARE\Apache Software Foundation</td><td/><td/><td>ISRegistryComponent1</td><td>0</td></row>
+ <row><td>Registry11</td><td>2</td><td>SOFTWARE\Apache Software Foundation\Jakarta Isapi Redirector</td><td/><td/><td>ISRegistryComponent1</td><td>0</td></row>
+ <row><td>Registry12</td><td>2</td><td>SOFTWARE\Apache Software Foundation\Jakarta Isapi Redirector\1.0</td><td/><td/><td>ISRegistryComponent1</td><td>0</td></row>
+ <row><td>Registry13</td><td>2</td><td>SOFTWARE\Apache Software Foundation\Jakarta Isapi Redirector\1.0</td><td>extension_uri</td><td>/jakarta/isapi_redirect.dll</td><td>ISRegistryComponent1</td><td>0</td></row>
+ <row><td>Registry14</td><td>2</td><td>SOFTWARE\Apache Software Foundation\Jakarta Isapi Redirector\1.0</td><td>log_file</td><td>[INSTALLDIR]log\isapi_redirect.log</td><td>ISRegistryComponent1</td><td>0</td></row>
+ <row><td>Registry15</td><td>2</td><td>SOFTWARE\Apache Software Foundation\Jakarta Isapi Redirector\1.0</td><td>log_level</td><td>info</td><td>ISRegistryComponent1</td><td>0</td></row>
+ <row><td>Registry16</td><td>2</td><td>SOFTWARE\Apache Software Foundation\Jakarta Isapi Redirector\1.0</td><td>worker_file</td><td>[INSTALLDIR]conf\workers.properties.minimal</td><td>ISRegistryComponent1</td><td>0</td></row>
+ <row><td>Registry17</td><td>2</td><td>SOFTWARE\Apache Software Foundation\Jakarta Isapi Redirector\1.0</td><td>worker_mount_file</td><td>[INSTALLDIR]conf\uriworkermap.properties</td><td>ISRegistryComponent1</td><td>0</td></row>
+ </table>
+
+ <table name="RemoveFile">
+ <col key="yes" def="s72">FileKey</col>
+ <col def="s72">Component_</col>
+ <col def="L255">FileName</col>
+ <col def="s72">DirProperty</col>
+ <col def="i2">InstallMode</col>
+ </table>
+
+ <table name="RemoveIniFile">
+ <col key="yes" def="s72">RemoveIniFile</col>
+ <col def="l255">FileName</col>
+ <col def="S72">DirProperty</col>
+ <col def="l96">Section</col>
+ <col def="l128">Key</col>
+ <col def="L255">Value</col>
+ <col def="i2">Action</col>
+ <col def="s72">Component_</col>
+ </table>
+
+ <table name="RemoveRegistry">
+ <col key="yes" def="s72">RemoveRegistry</col>
+ <col def="i2">Root</col>
+ <col def="l255">Key</col>
+ <col def="L255">Name</col>
+ <col def="s72">Component_</col>
+ </table>
+
+ <table name="ReserveCost">
+ <col key="yes" def="s72">ReserveKey</col>
+ <col def="s72">Component_</col>
+ <col def="S72">ReserveFolder</col>
+ <col def="i4">ReserveLocal</col>
+ <col def="i4">ReserveSource</col>
+ </table>
+
+ <table name="SFPCatalog">
+ <col key="yes" def="s255">SFPCatalog</col>
+ <col def="V0">Catalog</col>
+ <col def="S0">Dependency</col>
+ </table>
+
+ <table name="SelfReg">
+ <col key="yes" def="s72">File_</col>
+ <col def="I2">Cost</col>
+ </table>
+
+ <table name="ServiceControl">
+ <col key="yes" def="s72">ServiceControl</col>
+ <col def="s255">Name</col>
+ <col def="i2">Event</col>
+ <col def="S255">Arguments</col>
+ <col def="I2">Wait</col>
+ <col def="s72">Component_</col>
+ </table>
+
+ <table name="ServiceInstall">
+ <col key="yes" def="s72">ServiceInstall</col>
+ <col def="s255">Name</col>
+ <col def="L255">DisplayName</col>
+ <col def="i4">ServiceType</col>
+ <col def="i4">StartType</col>
+ <col def="i4">ErrorControl</col>
+ <col def="S255">LoadOrderGroup</col>
+ <col def="S255">Dependencies</col>
+ <col def="S255">StartName</col>
+ <col def="S255">Password</col>
+ <col def="S255">Arguments</col>
+ <col def="s72">Component_</col>
+ <col def="L255">Description</col>
+ </table>
+
+ <table name="Shortcut">
+ <col key="yes" def="s72">Shortcut</col>
+ <col def="s72">Directory_</col>
+ <col def="l128">Name</col>
+ <col def="s72">Component_</col>
+ <col def="s255">Target</col>
+ <col def="S255">Arguments</col>
+ <col def="L255">Description</col>
+ <col def="I2">Hotkey</col>
+ <col def="S72">Icon_</col>
+ <col def="I2">IconIndex</col>
+ <col def="I2">ShowCmd</col>
+ <col def="S72">WkDir</col>
+ <col def="S255">ISComments</col>
+ <col def="S255">ISShortcutName</col>
+ <col def="I4">ISAttributes</col>
+ </table>
+
+ <table name="Signature">
+ <col key="yes" def="s72">Signature</col>
+ <col def="s255">FileName</col>
+ <col def="S20">MinVersion</col>
+ <col def="S20">MaxVersion</col>
+ <col def="I4">MinSize</col>
+ <col def="I4">MaxSize</col>
+ <col def="I4">MinDate</col>
+ <col def="I4">MaxDate</col>
+ <col def="S255">Languages</col>
+ </table>
+
+ <table name="TextStyle">
+ <col key="yes" def="s72">TextStyle</col>
+ <col def="s32">FaceName</col>
+ <col def="i2">Size</col>
+ <col def="I4">Color</col>
+ <col def="I2">StyleBits</col>
+ <row><td>Arial8</td><td>Arial</td><td>8</td><td/><td/></row>
+ <row><td>Arial9</td><td>Arial</td><td>9</td><td/><td/></row>
+ <row><td>ArialBlue10</td><td>Arial</td><td>10</td><td>16711680</td><td/></row>
+ <row><td>ArialBlueStrike10</td><td>Arial</td><td>10</td><td>16711680</td><td>8</td></row>
+ <row><td>CourierNew8</td><td>Courier New</td><td>8</td><td/><td/></row>
+ <row><td>CourierNew9</td><td>Courier New</td><td>9</td><td/><td/></row>
+ <row><td>MSGothic9</td><td>MS Gothic</td><td>9</td><td/><td/></row>
+ <row><td>MSSGreySerif8</td><td>MS Sans Serif</td><td>8</td><td>8421504</td><td/></row>
+ <row><td>MSSWhiteSerif8</td><td>Tahoma</td><td>8</td><td>16777215</td><td/></row>
+ <row><td>MSSansBold8</td><td>Tahoma</td><td>8</td><td/><td>1</td></row>
+ <row><td>MSSansSerif8</td><td>MS Sans Serif</td><td>8</td><td/><td/></row>
+ <row><td>MSSansSerif9</td><td>MS Sans Serif</td><td>9</td><td/><td/></row>
+ <row><td>Tahoma10</td><td>Tahoma</td><td>10</td><td/><td/></row>
+ <row><td>Tahoma8</td><td>Tahoma</td><td>8</td><td/><td/></row>
+ <row><td>Tahoma9</td><td>Tahoma</td><td>9</td><td/><td/></row>
+ <row><td>TahomaBold10</td><td>Tahoma</td><td>10</td><td/><td>1</td></row>
+ <row><td>TahomaBold8</td><td>Tahoma</td><td>8</td><td/><td>1</td></row>
+ <row><td>Times8</td><td>Times New Roman</td><td>8</td><td/><td/></row>
+ <row><td>Times9</td><td>Times New Roman</td><td>9</td><td/><td/></row>
+ <row><td>TimesItalic12</td><td>Times New Roman</td><td>12</td><td/><td>2</td></row>
+ <row><td>TimesItalicBlue10</td><td>Times New Roman</td><td>10</td><td>16711680</td><td>2</td></row>
+ <row><td>TimesRed16</td><td>Times New Roman</td><td>16</td><td>255</td><td/></row>
+ </table>
+
+ <table name="TypeLib">
+ <col key="yes" def="s38">LibID</col>
+ <col key="yes" def="i2">Language</col>
+ <col key="yes" def="s72">Component_</col>
+ <col def="I4">Version</col>
+ <col def="L128">Description</col>
+ <col def="S72">Directory_</col>
+ <col def="s38">Feature_</col>
+ <col def="I4">Cost</col>
+ </table>
+
+ <table name="UIText">
+ <col key="yes" def="s72">Key</col>
+ <col def="L255">Text</col>
+ <row><td>AbsentPath</td><td/></row>
+ <row><td>GB</td><td>##IDS_UITEXT_GB##</td></row>
+ <row><td>KB</td><td>##IDS_UITEXT_KB##</td></row>
+ <row><td>MB</td><td>##IDS_UITEXT_MB##</td></row>
+ <row><td>MenuAbsent</td><td>##IDS_UITEXT_FeatureNotAvailable##</td></row>
+ <row><td>MenuAdvertise</td><td>##IDS_UITEXT_FeatureInstalledWhenRequired2##</td></row>
+ <row><td>MenuAllCD</td><td>##IDS_UITEXT_FeatureInstalledCD##</td></row>
+ <row><td>MenuAllLocal</td><td>##IDS_UITEXT_FeatureInstalledLocal##</td></row>
+ <row><td>MenuAllNetwork</td><td>##IDS_UITEXT_FeatureInstalledNetwork##</td></row>
+ <row><td>MenuCD</td><td>##IDS_UITEXT_FeatureInstalledCD2##</td></row>
+ <row><td>MenuLocal</td><td>##IDS_UITEXT_FeatureInstalledLocal2##</td></row>
+ <row><td>MenuNetwork</td><td>##IDS_UITEXT_FeatureInstalledNetwork2##</td></row>
+ <row><td>NewFolder</td><td>##IDS_UITEXT_Folder##</td></row>
+ <row><td>SelAbsentAbsent</td><td>##IDS_UITEXT_GB##</td></row>
+ <row><td>SelAbsentAdvertise</td><td>##IDS_UITEXT_FeatureInstalledWhenRequired##</td></row>
+ <row><td>SelAbsentCD</td><td>##IDS_UITEXT_FeatureOnCD##</td></row>
+ <row><td>SelAbsentLocal</td><td>##IDS_UITEXT_FeatureLocal##</td></row>
+ <row><td>SelAbsentNetwork</td><td>##IDS_UITEXT_FeatureNetwork##</td></row>
+ <row><td>SelAdvertiseAbsent</td><td>##IDS_UITEXT_FeatureUnavailable##</td></row>
+ <row><td>SelAdvertiseAdvertise</td><td>##IDS_UITEXT_FeatureInstalledRequired##</td></row>
+ <row><td>SelAdvertiseCD</td><td>##IDS_UITEXT_FeatureOnCD2##</td></row>
+ <row><td>SelAdvertiseLocal</td><td>##IDS_UITEXT_FeatureLocal2##</td></row>
+ <row><td>SelAdvertiseNetwork</td><td>##IDS_UITEXT_FeatureNetwork2##</td></row>
+ <row><td>SelCDAbsent</td><td>##IDS_UITEXT_FeatureWillBeUninstalled##</td></row>
+ <row><td>SelCDAdvertise</td><td>##IDS_UITEXT_FeatureWasCD##</td></row>
+ <row><td>SelCDCD</td><td>##IDS_UITEXT_FeatureRunFromCD##</td></row>
+ <row><td>SelCDLocal</td><td>##IDS_UITEXT_FeatureWasCDLocal##</td></row>
+ <row><td>SelChildCostNeg</td><td>##IDS_UITEXT_FeatureFreeSpace##</td></row>
+ <row><td>SelChildCostPos</td><td>##IDS_UITEXT_FeatureRequiredSpace##</td></row>
+ <row><td>SelCostPending</td><td>##IDS_UITEXT_CompilingFeaturesCost##</td></row>
+ <row><td>SelLocalAbsent</td><td>##IDS_UITEXT_FeatureCompletelyRemoved##</td></row>
+ <row><td>SelLocalAdvertise</td><td>##IDS_UITEXT_FeatureRemovedUnlessRequired##</td></row>
+ <row><td>SelLocalCD</td><td>##IDS_UITEXT_FeatureRemovedCD##</td></row>
+ <row><td>SelLocalLocal</td><td>##IDS_UITEXT_FeatureRemainLocal##</td></row>
+ <row><td>SelLocalNetwork</td><td>##IDS_UITEXT_FeatureRemoveNetwork##</td></row>
+ <row><td>SelNetworkAbsent</td><td>##IDS_UITEXT_FeatureUninstallNoNetwork##</td></row>
+ <row><td>SelNetworkAdvertise</td><td>##IDS_UITEXT_FeatureWasOnNetworkInstalled##</td></row>
+ <row><td>SelNetworkLocal</td><td>##IDS_UITEXT_FeatureWasOnNetworkLocal##</td></row>
+ <row><td>SelNetworkNetwork</td><td>##IDS_UITEXT_FeatureContinueNetwork##</td></row>
+ <row><td>SelParentCostNegNeg</td><td>##IDS_UITEXT_FeatureSpaceFree##</td></row>
+ <row><td>SelParentCostNegPos</td><td>##IDS_UITEXT_FeatureSpaceFree2##</td></row>
+ <row><td>SelParentCostPosNeg</td><td>##IDS_UITEXT_FeatureSpaceFree3##</td></row>
+ <row><td>SelParentCostPosPos</td><td>##IDS_UITEXT_FeatureSpaceFree4##</td></row>
+ <row><td>TimeRemaining</td><td>##IDS_UITEXT_TimeRemaining##</td></row>
+ <row><td>VolumeCostAvailable</td><td>##IDS_UITEXT_Available##</td></row>
+ <row><td>VolumeCostDifference</td><td>##IDS_UITEXT_Differences##</td></row>
+ <row><td>VolumeCostRequired</td><td>##IDS_UITEXT_Required##</td></row>
+ <row><td>VolumeCostSize</td><td>##IDS_UITEXT_DiskSize##</td></row>
+ <row><td>VolumeCostVolume</td><td>##IDS_UITEXT_Volume##</td></row>
+ <row><td>bytes</td><td>##IDS_UITEXT_Bytes##</td></row>
+ </table>
+
+ <table name="Upgrade">
+ <col key="yes" def="s38">UpgradeCode</col>
+ <col key="yes" def="S20">VersionMin</col>
+ <col key="yes" def="S20">VersionMax</col>
+ <col key="yes" def="S255">Language</col>
+ <col key="yes" def="i4">Attributes</col>
+ <col def="S255">Remove</col>
+ <col def="s72">ActionProperty</col>
+ <col def="S72">ISDisplayName</col>
+ </table>
+
+ <table name="Verb">
+ <col key="yes" def="s255">Extension_</col>
+ <col key="yes" def="s32">Verb</col>
+ <col def="I2">Sequence</col>
+ <col def="L255">Command</col>
+ <col def="L255">Argument</col>
+ </table>
+
+ <table name="_Validation">
+ <col key="yes" def="s32">Table</col>
+ <col key="yes" def="s32">Column</col>
+ <col def="s4">Nullable</col>
+ <col def="I4">MinValue</col>
+ <col def="I4">MaxValue</col>
+ <col def="S255">KeyTable</col>
+ <col def="I2">KeyColumn</col>
+ <col def="S32">Category</col>
+ <col def="S255">Set</col>
+ <col def="S255">Description</col>
+ <row><td>ActionText</td><td>Action</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Name of action to be described.</td></row>
+ <row><td>ActionText</td><td>Description</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Localized description displayed in progress dialog and log when action is executing.</td></row>
+ <row><td>ActionText</td><td>Template</td><td>Y</td><td/><td/><td/><td/><td>Template</td><td/><td>Optional localized format template used to format action data records for display during action execution.</td></row>
+ <row><td>AdminExecuteSequence</td><td>Action</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Name of action to invoke, either in the engine or the handler DLL.</td></row>
+ <row><td>AdminExecuteSequence</td><td>Condition</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Optional expression which skips the action if evaluates to expFalse.If the expression syntax is invalid, the engine will terminate, returning iesBadActionData.</td></row>
+ <row><td>AdminExecuteSequence</td><td>ISAttributes</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>This is used to store MM Custom Action Types</td></row>
+ <row><td>AdminExecuteSequence</td><td>ISComments</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Author’s comments on this Sequence.</td></row>
+ <row><td>AdminExecuteSequence</td><td>Sequence</td><td>Y</td><td>-4</td><td>32767</td><td/><td/><td/><td/><td>Number that determines the sort order in which the actions are to be executed. Leave blank to suppress action.</td></row>
+ <row><td>AdminUISequence</td><td>Action</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Name of action to invoke, either in the engine or the handler DLL.</td></row>
+ <row><td>AdminUISequence</td><td>Condition</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Optional expression which skips the action if evaluates to expFalse.If the expression syntax is invalid, the engine will terminate, returning iesBadActionData.</td></row>
+ <row><td>AdminUISequence</td><td>ISAttributes</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>This is used to store MM Custom Action Types</td></row>
+ <row><td>AdminUISequence</td><td>ISComments</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Author’s comments on this Sequence.</td></row>
+ <row><td>AdminUISequence</td><td>Sequence</td><td>Y</td><td>-4</td><td>32767</td><td/><td/><td/><td/><td>Number that determines the sort order in which the actions are to be executed. Leave blank to suppress action.</td></row>
+ <row><td>AdvtExecuteSequence</td><td>Action</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Name of action to invoke, either in the engine or the handler DLL.</td></row>
+ <row><td>AdvtExecuteSequence</td><td>Condition</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Optional expression which skips the action if evaluates to expFalse.If the expression syntax is invalid, the engine will terminate, returning iesBadActionData.</td></row>
+ <row><td>AdvtExecuteSequence</td><td>ISAttributes</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>This is used to store MM Custom Action Types</td></row>
+ <row><td>AdvtExecuteSequence</td><td>ISComments</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Author’s comments on this Sequence.</td></row>
+ <row><td>AdvtExecuteSequence</td><td>Sequence</td><td>Y</td><td>-4</td><td>32767</td><td/><td/><td/><td/><td>Number that determines the sort order in which the actions are to be executed. Leave blank to suppress action.</td></row>
+ <row><td>AdvtUISequence</td><td>Action</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Name of action to invoke, either in the engine or the handler DLL.</td></row>
+ <row><td>AdvtUISequence</td><td>Condition</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Optional expression which skips the action if evaluates to expFalse.If the expression syntax is invalid, the engine will terminate, returning iesBadActionData.</td></row>
+ <row><td>AdvtUISequence</td><td>ISAttributes</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>This is used to store MM Custom Action Types</td></row>
+ <row><td>AdvtUISequence</td><td>ISComments</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Author’s comments on this Sequence.</td></row>
+ <row><td>AdvtUISequence</td><td>Sequence</td><td>Y</td><td>-4</td><td>32767</td><td/><td/><td/><td/><td>Number that determines the sort order in which the actions are to be executed. Leave blank to suppress action.</td></row>
+ <row><td>AppId</td><td>ActivateAtStorage</td><td>Y</td><td>0</td><td>1</td><td/><td/><td/><td/><td/></row>
+ <row><td>AppId</td><td>AppId</td><td>N</td><td/><td/><td/><td/><td>Guid</td><td/><td/></row>
+ <row><td>AppId</td><td>DllSurrogate</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td/></row>
+ <row><td>AppId</td><td>LocalService</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td/></row>
+ <row><td>AppId</td><td>RemoteServerName</td><td>Y</td><td/><td/><td/><td/><td>Formatted</td><td/><td/></row>
+ <row><td>AppId</td><td>RunAsInteractiveUser</td><td>Y</td><td>0</td><td>1</td><td/><td/><td/><td/><td/></row>
+ <row><td>AppId</td><td>ServiceParameters</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td/></row>
+ <row><td>AppSearch</td><td>Property</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>The property associated with a Signature</td></row>
+ <row><td>AppSearch</td><td>Signature_</td><td>N</td><td/><td/><td>ISXmlLocator;Signature</td><td>1</td><td>Identifier</td><td/><td>The Signature_ represents a unique file signature and is also the foreign key in the Signature, RegLocator, IniLocator, CompLocator and the DrLocator tables.</td></row>
+ <row><td>BBControl</td><td>Attributes</td><td>Y</td><td>0</td><td>2147483647</td><td/><td/><td/><td/><td>A 32-bit word that specifies the attribute flags to be applied to this control.</td></row>
+ <row><td>BBControl</td><td>BBControl</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Name of the control. This name must be unique within a billboard, but can repeat on different billboard.</td></row>
+ <row><td>BBControl</td><td>Billboard_</td><td>N</td><td/><td/><td>Billboard</td><td>1</td><td>Identifier</td><td/><td>External key to the Billboard table, name of the billboard.</td></row>
+ <row><td>BBControl</td><td>Height</td><td>N</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>Height of the bounding rectangle of the control.</td></row>
+ <row><td>BBControl</td><td>Text</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>A string used to set the initial text contained within a control (if appropriate).</td></row>
+ <row><td>BBControl</td><td>Type</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>The type of the control.</td></row>
+ <row><td>BBControl</td><td>Width</td><td>N</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>Width of the bounding rectangle of the control.</td></row>
+ <row><td>BBControl</td><td>X</td><td>N</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>Horizontal coordinate of the upper left corner of the bounding rectangle of the control.</td></row>
+ <row><td>BBControl</td><td>Y</td><td>N</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>Vertical coordinate of the upper left corner of the bounding rectangle of the control.</td></row>
+ <row><td>Billboard</td><td>Action</td><td>Y</td><td/><td/><td/><td/><td>Identifier</td><td/><td>The name of an action. The billboard is displayed during the progress messages received from this action.</td></row>
+ <row><td>Billboard</td><td>Billboard</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Name of the billboard.</td></row>
+ <row><td>Billboard</td><td>Feature_</td><td>N</td><td/><td/><td>Feature</td><td>1</td><td>Identifier</td><td/><td>An external key to the Feature Table. The billboard is shown only if this feature is being installed.</td></row>
+ <row><td>Billboard</td><td>Ordering</td><td>Y</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>A positive integer. If there is more than one billboard corresponding to an action they will be shown in the order defined by this column.</td></row>
+ <row><td>Binary</td><td>Data</td><td>Y</td><td/><td/><td/><td/><td>Binary</td><td/><td>Binary stream. The binary icon data in PE (.DLL or .EXE) or icon (.ICO) format.</td></row>
+ <row><td>Binary</td><td>ISBuildSourcePath</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Full path to the ICO or EXE file.</td></row>
+ <row><td>Binary</td><td>Name</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Unique key identifying the binary data.</td></row>
+ <row><td>BindImage</td><td>File_</td><td>N</td><td/><td/><td>File</td><td>1</td><td>Identifier</td><td/><td>The index into the File table. This must be an executable file.</td></row>
+ <row><td>BindImage</td><td>Path</td><td>Y</td><td/><td/><td/><td/><td>Paths</td><td/><td>A list of ; delimited paths that represent the paths to be searched for the import DLLS. The list is usually a list of properties each enclosed within square brackets [] .</td></row>
+ <row><td>CCPSearch</td><td>Signature_</td><td>N</td><td/><td/><td>Signature</td><td>1</td><td>Identifier</td><td/><td>The Signature_ represents a unique file signature and is also the foreign key in the Signature, RegLocator, IniLocator, CompLocator and the DrLocator tables.</td></row>
+ <row><td>CheckBox</td><td>Property</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>A named property to be tied to the item.</td></row>
+ <row><td>CheckBox</td><td>Value</td><td>Y</td><td/><td/><td/><td/><td>Formatted</td><td/><td>The value string associated with the item.</td></row>
+ <row><td>Class</td><td>AppId_</td><td>Y</td><td/><td/><td>AppId</td><td>1</td><td>Guid</td><td/><td>Optional AppID containing DCOM information for associated application (string GUID).</td></row>
+ <row><td>Class</td><td>Argument</td><td>Y</td><td/><td/><td/><td/><td>Formatted</td><td/><td>optional argument for LocalServers.</td></row>
+ <row><td>Class</td><td>Attributes</td><td>Y</td><td/><td>32767</td><td/><td/><td/><td/><td>Class registration attributes.</td></row>
+ <row><td>Class</td><td>CLSID</td><td>N</td><td/><td/><td/><td/><td>Guid</td><td/><td>The CLSID of an OLE factory.</td></row>
+ <row><td>Class</td><td>Component_</td><td>N</td><td/><td/><td>Component</td><td>1</td><td>Identifier</td><td/><td>Required foreign key into the Component Table, specifying the component for which to return a path when called through LocateComponent.</td></row>
+ <row><td>Class</td><td>Context</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>The numeric server context for this server. CLSCTX_xxxx</td></row>
+ <row><td>Class</td><td>DefInprocHandler</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td>1;2;3</td><td>Optional default inproc handler. Only optionally provided if Context=CLSCTX_LOCAL_SERVER. Typically "ole32.dll" or "mapi32.dll"</td></row>
+ <row><td>Class</td><td>Description</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Localized description for the Class.</td></row>
+ <row><td>Class</td><td>Feature_</td><td>N</td><td/><td/><td>Feature</td><td>1</td><td>Identifier</td><td/><td>Required foreign key into the Feature Table, specifying the feature to validate or install in order for the CLSID factory to be operational.</td></row>
+ <row><td>Class</td><td>FileTypeMask</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Optional string containing information for the HKCRthis CLSID) key. If multiple patterns exist, they must be delimited by a semicolon, and numeric subkeys will be generated: 0,1,2...</td></row>
+ <row><td>Class</td><td>IconIndex</td><td>Y</td><td>-32767</td><td>32767</td><td/><td/><td/><td/><td>Optional icon index.</td></row>
+ <row><td>Class</td><td>Icon_</td><td>Y</td><td/><td/><td>Icon</td><td>1</td><td>Identifier</td><td/><td>Optional foreign key into the Icon Table, specifying the icon file associated with this CLSID. Will be written under the DefaultIcon key.</td></row>
+ <row><td>Class</td><td>ProgId_Default</td><td>Y</td><td/><td/><td>ProgId</td><td>1</td><td>Text</td><td/><td>Optional ProgId associated with this CLSID.</td></row>
+ <row><td>ComboBox</td><td>Order</td><td>N</td><td>1</td><td>32767</td><td/><td/><td/><td/><td>A positive integer used to determine the ordering of the items within one list. The integers do not have to be consecutive.</td></row>
+ <row><td>ComboBox</td><td>Property</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>A named property to be tied to this item. All the items tied to the same property become part of the same combobox.</td></row>
+ <row><td>ComboBox</td><td>Text</td><td>Y</td><td/><td/><td/><td/><td>Formatted</td><td/><td>The visible text to be assigned to the item. Optional. If this entry or the entire column is missing, the text is the same as the value.</td></row>
+ <row><td>ComboBox</td><td>Value</td><td>N</td><td/><td/><td/><td/><td>Formatted</td><td/><td>The value string associated with this item. Selecting the line will set the associated property to this value.</td></row>
+ <row><td>CompLocator</td><td>ComponentId</td><td>N</td><td/><td/><td/><td/><td>Guid</td><td/><td>A string GUID unique to this component, version, and language.</td></row>
+ <row><td>CompLocator</td><td>Signature_</td><td>N</td><td/><td/><td>Signature</td><td>1</td><td>Identifier</td><td/><td>The table key. The Signature_ represents a unique file signature and is also the foreign key in the Signature table.</td></row>
+ <row><td>CompLocator</td><td>Type</td><td>Y</td><td>0</td><td>1</td><td/><td/><td/><td/><td>A boolean value that determines if the registry value is a filename or a directory location.</td></row>
+ <row><td>Complus</td><td>Component_</td><td>N</td><td/><td/><td>Component</td><td>1</td><td>Identifier</td><td/><td>Foreign key referencing Component that controls the ComPlus component.</td></row>
+ <row><td>Complus</td><td>ExpType</td><td>Y</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>ComPlus component attributes.</td></row>
+ <row><td>Component</td><td>Attributes</td><td>N</td><td/><td/><td/><td/><td/><td/><td>Remote execution option, one of irsEnum</td></row>
+ <row><td>Component</td><td>Component</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Primary key used to identify a particular component record.</td></row>
+ <row><td>Component</td><td>ComponentId</td><td>Y</td><td/><td/><td/><td/><td>Guid</td><td/><td>A string GUID unique to this component, version, and language.</td></row>
+ <row><td>Component</td><td>Condition</td><td>Y</td><td/><td/><td/><td/><td>Condition</td><td/><td>A conditional statement that will disable this component if the specified condition evaluates to the 'True' state. If a component is disabled, it will not be installed, regardless of the 'Action' state associated with the component.</td></row>
+ <row><td>Component</td><td>Directory_</td><td>N</td><td/><td/><td>Directory</td><td>1</td><td>Identifier</td><td/><td>Required key of a Directory table record. This is actually a property name whose value contains the actual path, set either by the AppSearch action or with the default setting obtained from the Directory table.</td></row>
+ <row><td>Component</td><td>ISAttributes</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>This is used to store Installshield custom properties of a component.</td></row>
+ <row><td>Component</td><td>ISComments</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>User Comments.</td></row>
+ <row><td>Component</td><td>ISDotNetInstallerArgsCommit</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Arguments passed to the key file of the component if if implements the .NET Installer class</td></row>
+ <row><td>Component</td><td>ISDotNetInstallerArgsInstall</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Arguments passed to the key file of the component if if implements the .NET Installer class</td></row>
+ <row><td>Component</td><td>ISDotNetInstallerArgsRollback</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Arguments passed to the key file of the component if if implements the .NET Installer class</td></row>
+ <row><td>Component</td><td>ISDotNetInstallerArgsUninstall</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Arguments passed to the key file of the component if if implements the .NET Installer class</td></row>
+ <row><td>Component</td><td>ISRegFileToMergeAtBuild</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Path and File name of a .REG file to merge into the component at build time.</td></row>
+ <row><td>Component</td><td>ISScanAtBuildFile</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>File used by the Dot Net scanner to populate dependant assemblies' File_Application field.</td></row>
+ <row><td>Component</td><td>KeyPath</td><td>Y</td><td/><td/><td>File;ODBCDataSource;Registry</td><td>1</td><td>Identifier</td><td/><td>Either the primary key into the File table, Registry table, or ODBCDataSource table. This extract path is stored when the component is installed, and is used to detect the presence of the component and to return the path to it.</td></row>
+ <row><td>Condition</td><td>Condition</td><td>Y</td><td/><td/><td/><td/><td>Condition</td><td/><td>Expression evaluated to determine if Level in the Feature table is to change.</td></row>
+ <row><td>Condition</td><td>Feature_</td><td>N</td><td/><td/><td>Feature</td><td>1</td><td>Identifier</td><td/><td>Reference to a Feature entry in Feature table.</td></row>
+ <row><td>Condition</td><td>Level</td><td>N</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>New selection Level to set in Feature table if Condition evaluates to TRUE.</td></row>
+ <row><td>Control</td><td>Attributes</td><td>Y</td><td>0</td><td>2147483647</td><td/><td/><td/><td/><td>A 32-bit word that specifies the attribute flags to be applied to this control.</td></row>
+ <row><td>Control</td><td>Binary_</td><td>Y</td><td/><td/><td>Binary</td><td>1</td><td>Identifier</td><td/><td>External key to the Binary table.</td></row>
+ <row><td>Control</td><td>Control</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Name of the control. This name must be unique within a dialog, but can repeat on different dialogs. </td></row>
+ <row><td>Control</td><td>Control_Next</td><td>Y</td><td/><td/><td>Control</td><td>2</td><td>Identifier</td><td/><td>The name of an other control on the same dialog. This link defines the tab order of the controls. The links have to form one or more cycles!</td></row>
+ <row><td>Control</td><td>Dialog_</td><td>N</td><td/><td/><td>Dialog</td><td>1</td><td>Identifier</td><td/><td>External key to the Dialog table, name of the dialog.</td></row>
+ <row><td>Control</td><td>Height</td><td>N</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>Height of the bounding rectangle of the control.</td></row>
+ <row><td>Control</td><td>Help</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>The help strings used with the button. The text is optional. </td></row>
+ <row><td>Control</td><td>ISBuildSourcePath</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Full path to .rtf file for scrollable text control</td></row>
+ <row><td>Control</td><td>ISControlId</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>A number used to represent the control ID of the Control, Used in Dialog export</td></row>
+ <row><td>Control</td><td>ISWindowStyle</td><td>Y</td><td>0</td><td>2147483647</td><td/><td/><td/><td/><td>A 32-bit word that specifies non-MSI window styles to be applied to this control.</td></row>
+ <row><td>Control</td><td>Property</td><td>Y</td><td/><td/><td/><td/><td>Identifier</td><td/><td>The name of a defined property to be linked to this control. </td></row>
+ <row><td>Control</td><td>Text</td><td>Y</td><td/><td/><td/><td/><td>Formatted</td><td/><td>A string used to set the initial text contained within a control (if appropriate).</td></row>
+ <row><td>Control</td><td>Type</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>The type of the control.</td></row>
+ <row><td>Control</td><td>Width</td><td>N</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>Width of the bounding rectangle of the control.</td></row>
+ <row><td>Control</td><td>X</td><td>N</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>Horizontal coordinate of the upper left corner of the bounding rectangle of the control.</td></row>
+ <row><td>Control</td><td>Y</td><td>N</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>Vertical coordinate of the upper left corner of the bounding rectangle of the control.</td></row>
+ <row><td>ControlCondition</td><td>Action</td><td>N</td><td/><td/><td/><td/><td/><td>Default;Disable;Enable;Hide;Show</td><td>The desired action to be taken on the specified control.</td></row>
+ <row><td>ControlCondition</td><td>Condition</td><td>N</td><td/><td/><td/><td/><td>Condition</td><td/><td>A standard conditional statement that specifies under which conditions the action should be triggered.</td></row>
+ <row><td>ControlCondition</td><td>Control_</td><td>N</td><td/><td/><td>Control</td><td>2</td><td>Identifier</td><td/><td>A foreign key to the Control table, name of the control.</td></row>
+ <row><td>ControlCondition</td><td>Dialog_</td><td>N</td><td/><td/><td>Dialog</td><td>1</td><td>Identifier</td><td/><td>A foreign key to the Dialog table, name of the dialog.</td></row>
+ <row><td>ControlEvent</td><td>Argument</td><td>N</td><td/><td/><td/><td/><td>Formatted</td><td/><td>A value to be used as a modifier when triggering a particular event.</td></row>
+ <row><td>ControlEvent</td><td>Condition</td><td>Y</td><td/><td/><td/><td/><td>Condition</td><td/><td>A standard conditional statement that specifies under which conditions an event should be triggered.</td></row>
+ <row><td>ControlEvent</td><td>Control_</td><td>N</td><td/><td/><td>Control</td><td>2</td><td>Identifier</td><td/><td>A foreign key to the Control table, name of the control</td></row>
+ <row><td>ControlEvent</td><td>Dialog_</td><td>N</td><td/><td/><td>Dialog</td><td>1</td><td>Identifier</td><td/><td>A foreign key to the Dialog table, name of the dialog.</td></row>
+ <row><td>ControlEvent</td><td>Event</td><td>N</td><td/><td/><td/><td/><td>Formatted</td><td/><td>An identifier that specifies the type of the event that should take place when the user interacts with control specified by the first two entries.</td></row>
+ <row><td>ControlEvent</td><td>Ordering</td><td>Y</td><td>0</td><td>2147483647</td><td/><td/><td/><td/><td>An integer used to order several events tied to the same control. Can be left blank.</td></row>
+ <row><td>CreateFolder</td><td>Component_</td><td>N</td><td/><td/><td>Component</td><td>1</td><td>Identifier</td><td/><td>Foreign key into the Component table.</td></row>
+ <row><td>CreateFolder</td><td>Directory_</td><td>N</td><td/><td/><td>Directory</td><td>1</td><td>Identifier</td><td/><td>Primary key, could be foreign key into the Directory table.</td></row>
+ <row><td>CustomAction</td><td>Action</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Primary key, name of action, normally appears in sequence table unless private use.</td></row>
+ <row><td>CustomAction</td><td>ISComments</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Author’s comments for this custom action.</td></row>
+ <row><td>CustomAction</td><td>Source</td><td>Y</td><td/><td/><td/><td/><td>CustomSource</td><td/><td>The table reference of the source of the code.</td></row>
+ <row><td>CustomAction</td><td>Target</td><td>Y</td><td/><td/><td>ISDLLWrapper;ISInstallScriptAction</td><td>1</td><td>Formatted</td><td/><td>Excecution parameter, depends on the type of custom action</td></row>
+ <row><td>CustomAction</td><td>Type</td><td>N</td><td>1</td><td>32767</td><td/><td/><td/><td/><td>The numeric custom action type, consisting of source location, code type, entry, option flags.</td></row>
+ <row><td>Dialog</td><td>Attributes</td><td>Y</td><td>0</td><td>2147483647</td><td/><td/><td/><td/><td>A 32-bit word that specifies the attribute flags to be applied to this dialog.</td></row>
+ <row><td>Dialog</td><td>Control_Cancel</td><td>Y</td><td/><td/><td>Control</td><td>2</td><td>Identifier</td><td/><td>Defines the cancel control. Hitting escape or clicking on the close icon on the dialog is equivalent to pushing this button.</td></row>
+ <row><td>Dialog</td><td>Control_Default</td><td>Y</td><td/><td/><td>Control</td><td>2</td><td>Identifier</td><td/><td>Defines the default control. Hitting return is equivalent to pushing this button.</td></row>
+ <row><td>Dialog</td><td>Control_First</td><td>N</td><td/><td/><td>Control</td><td>2</td><td>Identifier</td><td/><td>Defines the control that has the focus when the dialog is created.</td></row>
+ <row><td>Dialog</td><td>Dialog</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Name of the dialog.</td></row>
+ <row><td>Dialog</td><td>HCentering</td><td>N</td><td>0</td><td>100</td><td/><td/><td/><td/><td>Horizontal position of the dialog on a 0-100 scale. 0 means left end, 100 means right end of the screen, 50 center.</td></row>
+ <row><td>Dialog</td><td>Height</td><td>N</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>Height of the bounding rectangle of the dialog.</td></row>
+ <row><td>Dialog</td><td>ISComments</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Author’s comments for this dialog.</td></row>
+ <row><td>Dialog</td><td>ISResourceId</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>A Number the Specifies the Dialog ID to be used in Dialog Export</td></row>
+ <row><td>Dialog</td><td>ISWindowStyle</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>A 32-bit word that specifies non-MSI window styles to be applied to this control. This is only used in Script Based Setups.</td></row>
+ <row><td>Dialog</td><td>TextStyle_</td><td>Y</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Foreign Key into TextStyle table, only used in Script Based Projects.</td></row>
+ <row><td>Dialog</td><td>Title</td><td>Y</td><td/><td/><td/><td/><td>Formatted</td><td/><td>A text string specifying the title to be displayed in the title bar of the dialog's window.</td></row>
+ <row><td>Dialog</td><td>VCentering</td><td>N</td><td>0</td><td>100</td><td/><td/><td/><td/><td>Vertical position of the dialog on a 0-100 scale. 0 means top end, 100 means bottom end of the screen, 50 center.</td></row>
+ <row><td>Dialog</td><td>Width</td><td>N</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>Width of the bounding rectangle of the dialog.</td></row>
+ <row><td>Directory</td><td>DefaultDir</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>The default sub-path under parent's path.</td></row>
+ <row><td>Directory</td><td>Directory</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Unique identifier for directory entry, primary key. If a property by this name is defined, it contains the full path to the directory.</td></row>
+ <row><td>Directory</td><td>Directory_Parent</td><td>Y</td><td/><td/><td>Directory</td><td>1</td><td>Identifier</td><td/><td>Reference to the entry in this table specifying the default parent directory. A record parented to itself or with a Null parent represents a root of the install tree.</td></row>
+ <row><td>Directory</td><td>ISAttributes</td><td>Y</td><td/><td/><td/><td/><td/><td>0;1;2;3;4;5;6;7</td><td>This is used to store Installshield custom properties of a directory. Currently the only one is Shortcut.</td></row>
+ <row><td>Directory</td><td>ISDescription</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Description of folder</td></row>
+ <row><td>Directory</td><td>ISFolderName</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>This is used in Pro projects because the pro identifier used in the tree wasn't necessarily unique.</td></row>
+ <row><td>DrLocator</td><td>Depth</td><td>Y</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>The depth below the path to which the Signature_ is recursively searched. If absent, the depth is assumed to be 0.</td></row>
+ <row><td>DrLocator</td><td>Parent</td><td>Y</td><td/><td/><td/><td/><td>Identifier</td><td/><td>The parent file signature. It is also a foreign key in the Signature table. If null and the Path column does not expand to a full path, then all the fixed drives of the user system are searched using the Path.</td></row>
+ <row><td>DrLocator</td><td>Path</td><td>Y</td><td/><td/><td/><td/><td>AnyPath</td><td/><td>The path on the user system. This is a either a subpath below the value of the Parent or a full path. The path may contain properties enclosed within [ ] that will be expanded.</td></row>
+ <row><td>DrLocator</td><td>Signature_</td><td>N</td><td/><td/><td>Signature</td><td>1</td><td>Identifier</td><td/><td>The Signature_ represents a unique file signature and is also the foreign key in the Signature table.</td></row>
+ <row><td>DuplicateFile</td><td>Component_</td><td>N</td><td/><td/><td>Component</td><td>1</td><td>Identifier</td><td/><td>Foreign key referencing Component that controls the duplicate file.</td></row>
+ <row><td>DuplicateFile</td><td>DestFolder</td><td>Y</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Name of a property whose value is assumed to resolve to the full pathname to a destination folder.</td></row>
+ <row><td>DuplicateFile</td><td>DestName</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Filename to be given to the duplicate file.</td></row>
+ <row><td>DuplicateFile</td><td>FileKey</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Primary key used to identify a particular file entry</td></row>
+ <row><td>DuplicateFile</td><td>File_</td><td>N</td><td/><td/><td>File</td><td>1</td><td>Identifier</td><td/><td>Foreign key referencing the source file to be duplicated.</td></row>
+ <row><td>Environment</td><td>Component_</td><td>N</td><td/><td/><td>Component</td><td>1</td><td>Identifier</td><td/><td>Foreign key into the Component table referencing component that controls the installing of the environmental value.</td></row>
+ <row><td>Environment</td><td>Environment</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Unique identifier for the environmental variable setting</td></row>
+ <row><td>Environment</td><td>Name</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>The name of the environmental value.</td></row>
+ <row><td>Environment</td><td>Value</td><td>Y</td><td/><td/><td/><td/><td>Formatted</td><td/><td>The value to set in the environmental settings.</td></row>
+ <row><td>Error</td><td>Error</td><td>N</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>Integer error number, obtained from header file IError(...) macros.</td></row>
+ <row><td>Error</td><td>Message</td><td>Y</td><td/><td/><td/><td/><td>Template</td><td/><td>Error formatting template, obtained from user ed. or localizers.</td></row>
+ <row><td>EventMapping</td><td>Attribute</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>The name of the control attribute, that is set when this event is received.</td></row>
+ <row><td>EventMapping</td><td>Control_</td><td>N</td><td/><td/><td>Control</td><td>2</td><td>Identifier</td><td/><td>A foreign key to the Control table, name of the control.</td></row>
+ <row><td>EventMapping</td><td>Dialog_</td><td>N</td><td/><td/><td>Dialog</td><td>1</td><td>Identifier</td><td/><td>A foreign key to the Dialog table, name of the Dialog.</td></row>
+ <row><td>EventMapping</td><td>Event</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>An identifier that specifies the type of the event that the control subscribes to.</td></row>
+ <row><td>Extension</td><td>Component_</td><td>N</td><td/><td/><td>Component</td><td>1</td><td>Identifier</td><td/><td>Required foreign key into the Component Table, specifying the component for which to return a path when called through LocateComponent.</td></row>
+ <row><td>Extension</td><td>Extension</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>The extension associated with the table row.</td></row>
+ <row><td>Extension</td><td>Feature_</td><td>N</td><td/><td/><td>Feature</td><td>1</td><td>Identifier</td><td/><td>Required foreign key into the Feature Table, specifying the feature to validate or install in order for the CLSID factory to be operational.</td></row>
+ <row><td>Extension</td><td>MIME_</td><td>Y</td><td/><td/><td>MIME</td><td>1</td><td>Text</td><td/><td>Optional Context identifier, typically "type/format" associated with the extension</td></row>
+ <row><td>Extension</td><td>ProgId_</td><td>Y</td><td/><td/><td>ProgId</td><td>1</td><td>Text</td><td/><td>Optional ProgId associated with this extension.</td></row>
+ <row><td>Feature</td><td>Attributes</td><td>N</td><td/><td/><td/><td/><td/><td>0;1;2;4;5;6;8;9;10;16;17;18;20;21;22;24;25;26;32;33;34;36;37;38;48;49;50;52;53;54</td><td>Feature attributes</td></row>
+ <row><td>Feature</td><td>Description</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Longer descriptive text describing a visible feature item.</td></row>
+ <row><td>Feature</td><td>Directory_</td><td>Y</td><td/><td/><td>Directory</td><td>1</td><td>UpperCase</td><td/><td>The name of the Directory that can be configured by the UI. A non-null value will enable the browse button.</td></row>
+ <row><td>Feature</td><td>Display</td><td>Y</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>Numeric sort order, used to force a specific display ordering.</td></row>
+ <row><td>Feature</td><td>Feature</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Primary key used to identify a particular feature record.</td></row>
+ <row><td>Feature</td><td>Feature_Parent</td><td>Y</td><td/><td/><td>Feature</td><td>1</td><td>Identifier</td><td/><td>Optional key of a parent record in the same table. If the parent is not selected, then the record will not be installed. Null indicates a root item.</td></row>
+ <row><td>Feature</td><td>ISComments</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>Comments</td></row>
+ <row><td>Feature</td><td>ISFeatureCabName</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>Name of CAB used when compressing CABs by Feature. Used to override build generated name for CAB file.</td></row>
+ <row><td>Feature</td><td>ISProFeatureName</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>The name of the feature used by pro projects. This doesn't have to be unique.</td></row>
+ <row><td>Feature</td><td>ISReleaseFlags</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>Release Flags that specify whether this feature will be built in a particular release.</td></row>
+ <row><td>Feature</td><td>Level</td><td>N</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>The install level at which record will be initially selected. An install level of 0 will disable an item and prevent its display.</td></row>
+ <row><td>Feature</td><td>Title</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Short text identifying a visible feature item.</td></row>
+ <row><td>FeatureComponents</td><td>Component_</td><td>N</td><td/><td/><td>Component</td><td>1</td><td>Identifier</td><td/><td>Foreign key into Component table.</td></row>
+ <row><td>FeatureComponents</td><td>Feature_</td><td>N</td><td/><td/><td>Feature</td><td>1</td><td>Identifier</td><td/><td>Foreign key into Feature table.</td></row>
+ <row><td>File</td><td>Attributes</td><td>Y</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>Integer containing bit flags representing file attributes (with the decimal value of each bit position in parentheses)</td></row>
+ <row><td>File</td><td>Component_</td><td>N</td><td/><td/><td>Component</td><td>1</td><td>Identifier</td><td/><td>Foreign key referencing Component that controls the file.</td></row>
+ <row><td>File</td><td>File</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Primary key, non-localized token, must match identifier in cabinet. For uncompressed files, this field is ignored.</td></row>
+ <row><td>File</td><td>FileName</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>File name used for installation. This may contain a "short name|long name" pair. It may be just a long name, hence it cannot be of the Filename data type.</td></row>
+ <row><td>File</td><td>FileSize</td><td>N</td><td>0</td><td>2147483647</td><td/><td/><td/><td/><td>Size of file in bytes (long integer).</td></row>
+ <row><td>File</td><td>ISAttributes</td><td>Y</td><td>0</td><td>2147483647</td><td/><td/><td/><td/><td>This field contains the following attributes: UseSystemSettings(0x1)</td></row>
+ <row><td>File</td><td>ISBuildSourcePath</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Full path, the category is of Text instead of Path because of potential use of path variables.</td></row>
+ <row><td>File</td><td>ISComponentSubFolder_</td><td>Y</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Foreign key referencing component subfolder containing this file. Only for Pro.</td></row>
+ <row><td>File</td><td>Language</td><td>Y</td><td/><td/><td/><td/><td>Language</td><td/><td>List of decimal language Ids, comma-separated if more than one.</td></row>
+ <row><td>File</td><td>Sequence</td><td>N</td><td>1</td><td>32767</td><td/><td/><td/><td/><td>Sequence with respect to the media images; order must track cabinet order.</td></row>
+ <row><td>File</td><td>Version</td><td>Y</td><td/><td/><td>File</td><td>1</td><td>Version</td><td/><td>Version string for versioned files; Blank for unversioned files.</td></row>
+ <row><td>FileSFPCatalog</td><td>File_</td><td>N</td><td/><td/><td>File</td><td>1</td><td>Identifier</td><td/><td>File associated with the catalog</td></row>
+ <row><td>FileSFPCatalog</td><td>SFPCatalog_</td><td>N</td><td/><td/><td>SFPCatalog</td><td>1</td><td>Text</td><td/><td>Catalog associated with the file</td></row>
+ <row><td>Font</td><td>File_</td><td>N</td><td/><td/><td>File</td><td>1</td><td>Identifier</td><td/><td>Primary key, foreign key into File table referencing font file.</td></row>
+ <row><td>Font</td><td>FontTitle</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Font name.</td></row>
+ <row><td>ISAssistantTag</td><td>Data</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISAssistantTag</td><td>Tag</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEApp</td><td>AppKey</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEApp</td><td>AppName</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEApp</td><td>Attributes</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEApp</td><td>CompanyName</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEApp</td><td>Component_</td><td>Y</td><td/><td/><td>Component</td><td>1</td><td/><td/><td/></row>
+ <row><td>ISCEApp</td><td>DefDir</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEApp</td><td>DeleteMedia</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEApp</td><td>Description</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEApp</td><td>DesktopTargetDir</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEApp</td><td>DeviceFile</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEApp</td><td>IconIndex</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEApp</td><td>IconPath</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEApp</td><td>InstallNetCF</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEApp</td><td>InstallSQLClient</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEApp</td><td>InstallSQLDev</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEApp</td><td>InstallSQLServer</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEApp</td><td>NoUninstall</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEApp</td><td>PVKFile</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEApp</td><td>PostXML</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEApp</td><td>PreXML</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEApp</td><td>RawDeviceFile</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEApp</td><td>SPCFile</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEDir</td><td>AppKey</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEDir</td><td>DirKey</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEDir</td><td>DirParent</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEDir</td><td>DirValue</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEFile</td><td>AdvancedOptions</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEFile</td><td>AppKey</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEFile</td><td>CopyOption</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEFile</td><td>Destination</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEFile</td><td>FileKey</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEFile</td><td>FileOption</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEFile</td><td>Name</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEFile</td><td>Platform</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEFile</td><td>Processor</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEFile</td><td>Source</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEFileExt</td><td>AppKey</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEFileExt</td><td>Description</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEFileExt</td><td>ExtKey</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEFileExt</td><td>Extension</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEFileExt</td><td>FileKey</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEFileExt</td><td>IconIndex</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEInstall</td><td>CEAppName</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEInstall</td><td>CECabs</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEInstall</td><td>CEDesktopDir</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEInstall</td><td>CEIcoFile</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEInstall</td><td>CEIniFileKey</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEInstall</td><td>CEInstallKey</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEInstall</td><td>Component_</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEInstall</td><td>DeleteMedia</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEOtherAppCABs</td><td>AppKey</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEOtherAppCABs</td><td>BuildSourcePath</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEOtherAppCABs</td><td>FileKey</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCERegistry</td><td>AppKey</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCERegistry</td><td>Key</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCERegistry</td><td>Name</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCERegistry</td><td>Overwrite</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCERegistry</td><td>Platform</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCERegistry</td><td>Processor</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCERegistry</td><td>RegKey</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCERegistry</td><td>Root</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCERegistry</td><td>Value</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCESetupFile</td><td>AppKey</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCESetupFile</td><td>Name</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCESetupFile</td><td>Platform</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCESetupFile</td><td>Processor</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCESetupFile</td><td>SetupFileKey</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCESetupFile</td><td>Source</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEShtCut</td><td>AppKey</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEShtCut</td><td>Destination</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEShtCut</td><td>DisplayName</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEShtCut</td><td>Platform</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEShtCut</td><td>ShtCutKey</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISCEShtCut</td><td>Target</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISComCatalogAttribute</td><td>ISComCatalogObject_</td><td>N</td><td/><td/><td>ISComCatalogObject</td><td>1</td><td>Identifier</td><td/><td>Foreign key into the ISComCatalogObject table.</td></row>
+ <row><td>ISComCatalogAttribute</td><td>ItemName</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>The named attribute for a catalog object.</td></row>
+ <row><td>ISComCatalogAttribute</td><td>ItemValue</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>A value associated with the attribute defined in the ItemName column.</td></row>
+ <row><td>ISComCatalogCollection</td><td>CollectionName</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>A catalog collection name.</td></row>
+ <row><td>ISComCatalogCollection</td><td>ISComCatalogCollection</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>A unique key for the ISComCatalogCollection table.</td></row>
+ <row><td>ISComCatalogCollection</td><td>ISComCatalogObject_</td><td>N</td><td/><td/><td>ISComCatalogObject</td><td>1</td><td>Identifier</td><td/><td>Foreign key into the ISComCatalogObject table.</td></row>
+ <row><td>ISComCatalogCollectionObjects</td><td>ISComCatalogCollection_</td><td>N</td><td/><td/><td>ISComCatalogCollection</td><td>1</td><td>Identifier</td><td/><td>A unique key for the ISComCatalogCollection table.</td></row>
+ <row><td>ISComCatalogCollectionObjects</td><td>ISComCatalogObject_</td><td>N</td><td/><td/><td>ISComCatalogObject</td><td>1</td><td>Identifier</td><td/><td>Foreign key into the ISComCatalogObject table.</td></row>
+ <row><td>ISComCatalogObject</td><td>DisplayName</td><td>N</td><td/><td/><td/><td/><td/><td/><td>The display name of a catalog object.</td></row>
+ <row><td>ISComCatalogObject</td><td>ISComCatalogObject</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>A unique key for the ISComCatalogObject table.</td></row>
+ <row><td>ISComPlusApplication</td><td>Component_</td><td>N</td><td/><td/><td>Component</td><td>1</td><td>Identifier</td><td/><td>Foreign key into the Component table that a COM+ application belongs to.</td></row>
+ <row><td>ISComPlusApplication</td><td>ComputerName</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Computer name that a COM+ application belongs to.</td></row>
+ <row><td>ISComPlusApplication</td><td>DepFiles</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>List of the dependent files.</td></row>
+ <row><td>ISComPlusApplication</td><td>ISAttributes</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>InstallShield custom attributes associated with a COM+ application.</td></row>
+ <row><td>ISComPlusApplication</td><td>ISComCatalogObject_</td><td>N</td><td/><td/><td>ISComCatalogObject</td><td>1</td><td>Identifier</td><td/><td>Foreign key into the ISComCatalogObject table.</td></row>
+ <row><td>ISComPlusProxy</td><td>Component_</td><td>Y</td><td/><td/><td>Component</td><td>1</td><td>Identifier</td><td/><td>Foreign key into the Component table that a COM+ application proxy belongs to.</td></row>
+ <row><td>ISComPlusProxy</td><td>DepFiles</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>List of the dependent files.</td></row>
+ <row><td>ISComPlusProxy</td><td>ISAttributes</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>InstallShield custom attributes associated with a COM+ application proxy.</td></row>
+ <row><td>ISComPlusProxy</td><td>ISComPlusApplication_</td><td>N</td><td/><td/><td>ISComPlusApplication</td><td>1</td><td>Identifier</td><td/><td>Foreign key into the ISComPlusApplication table that a COM+ application proxy belongs to.</td></row>
+ <row><td>ISComPlusProxy</td><td>ISComPlusProxy</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>A unique key for the ISComPlusProxy table.</td></row>
+ <row><td>ISComponentExtended</td><td>Component_</td><td>N</td><td/><td/><td>Component</td><td>1</td><td>Identifier</td><td/><td>Primary key used to identify a particular component record.</td></row>
+ <row><td>ISComponentExtended</td><td>FTPLocation</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>FTP Location</td></row>
+ <row><td>ISComponentExtended</td><td>FilterProperty</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Property to set if you want to filter a component</td></row>
+ <row><td>ISComponentExtended</td><td>HTTPLocation</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>HTTP Location</td></row>
+ <row><td>ISComponentExtended</td><td>Language</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Language</td></row>
+ <row><td>ISComponentExtended</td><td>Miscellaneous</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Miscellaneous</td></row>
+ <row><td>ISComponentExtended</td><td>OS</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>bitwise addition of OSs</td></row>
+ <row><td>ISComponentExtended</td><td>Platforms</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>bitwise addition of Platforms.</td></row>
+ <row><td>ISDIMDependency</td><td>ISDIMReference_</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>This is the primary key to the ISDIMDependency table</td></row>
+ <row><td>ISDIMDependency</td><td>RequiredBuildVersion</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>the build version identifying the required DIM</td></row>
+ <row><td>ISDIMDependency</td><td>RequiredMajorVersion</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>the major version identifying the required DIM</td></row>
+ <row><td>ISDIMDependency</td><td>RequiredMinorVersion</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>the minor version identifying the required DIM</td></row>
+ <row><td>ISDIMDependency</td><td>RequiredRevisionVersion</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>the revision version identifying the required DIM</td></row>
+ <row><td>ISDIMDependency</td><td>RequiredUUID</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>the UUID identifying the required DIM</td></row>
+ <row><td>ISDIMReference</td><td>ISBuildSourcePath</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Full path, the category is of Text instead of Path because of potential use of path variables.</td></row>
+ <row><td>ISDIMReference</td><td>ISDIMReference</td><td>N</td><td/><td/><td>ISDIMDependency</td><td>1</td><td>Identifier</td><td/><td>This is the primary key to the ISDIMReference table</td></row>
+ <row><td>ISDIMReferenceDependencies</td><td>ISDIMDependency_</td><td>N</td><td/><td/><td>ISDIMDependency</td><td>1</td><td>Identifier</td><td/><td>Foreign key into ISDIMDependency table.</td></row>
+ <row><td>ISDIMReferenceDependencies</td><td>ISDIMReference_Parent</td><td>N</td><td/><td/><td>ISDIMReference</td><td>1</td><td>Identifier</td><td/><td>Foreign key into ISDIMReference table.</td></row>
+ <row><td>ISDIMVariable</td><td>ISDIMReference_</td><td>N</td><td/><td/><td>ISDIMReference</td><td>1</td><td>Identifier</td><td/><td>Foreign key into ISDIMReference table.</td></row>
+ <row><td>ISDIMVariable</td><td>ISDIMVariable</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>This is the primary key to the ISDIMVariable table</td></row>
+ <row><td>ISDIMVariable</td><td>Name</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Name of a variable defined in the .dim file</td></row>
+ <row><td>ISDIMVariable</td><td>NewValue</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>New value that you want to override with</td></row>
+ <row><td>ISDIMVariable</td><td>Type</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>Type of the variable. 0: Build Variable, 1: Runtime Variable</td></row>
+ <row><td>ISDLLWrapper</td><td>EntryPoint</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>This is a foreign key to the target column in the CustomAction table</td></row>
+ <row><td>ISDLLWrapper</td><td>Source</td><td>N</td><td/><td/><td/><td/><td>Formatted</td><td/><td>This is column points to the source file for the DLLWrapper Custom Action</td></row>
+ <row><td>ISDLLWrapper</td><td>Target</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>The function signature</td></row>
+ <row><td>ISDLLWrapper</td><td>Type</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>Type</td></row>
+ <row><td>ISDRMFile</td><td>File_</td><td>Y</td><td/><td/><td>File</td><td>1</td><td>Identifier</td><td/><td>Foreign key into File table. A null value will cause a build warning.</td></row>
+ <row><td>ISDRMFile</td><td>ISDRMFile</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Unique identifier for this item.</td></row>
+ <row><td>ISDRMFile</td><td>ISDRMLicense_</td><td>Y</td><td/><td/><td>ISDRMLicense</td><td>1</td><td>Identifier</td><td/><td>Foreign key referencing License that packages this file.</td></row>
+ <row><td>ISDRMFile</td><td>Shell</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Text indicating the activation shell used at runtime.</td></row>
+ <row><td>ISDRMFileAttribute</td><td>ISDRMFile_</td><td>N</td><td/><td/><td>ISDRMFile</td><td>1</td><td>Identifier</td><td/><td>Primary foreign key into ISDRMFile table.</td></row>
+ <row><td>ISDRMFileAttribute</td><td>Property</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>The name of the attribute</td></row>
+ <row><td>ISDRMFileAttribute</td><td>Value</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>The value of the attribute</td></row>
+ <row><td>ISDRMLicense</td><td>Attributes</td><td>Y</td><td/><td/><td/><td/><td>Number</td><td/><td>Bitwise field used to specify binary attributes of this license.</td></row>
+ <row><td>ISDRMLicense</td><td>Description</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>An internal description of this license.</td></row>
+ <row><td>ISDRMLicense</td><td>ISDRMLicense</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Unique key identifying the license record.</td></row>
+ <row><td>ISDRMLicense</td><td>LicenseNumber</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>The license number.</td></row>
+ <row><td>ISDRMLicense</td><td>ProjectVersion</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>The version of the project that this license is tied to.</td></row>
+ <row><td>ISDRMLicense</td><td>RequestCode</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>The request code.</td></row>
+ <row><td>ISDRMLicense</td><td>ResponseCode</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>The response code.</td></row>
+ <row><td>ISDependency</td><td>Exclude</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISDependency</td><td>ISDependency</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISDisk1File</td><td>Disk</td><td>Y</td><td/><td/><td/><td/><td/><td>-1;0;1</td><td>Used to differentiate between disk1(1), last disk(-1), and other(0).</td></row>
+ <row><td>ISDisk1File</td><td>ISBuildSourcePath</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Full path of file to be copied to Disk1 folder</td></row>
+ <row><td>ISDisk1File</td><td>ISDisk1File</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Primary key for ISDisk1File table</td></row>
+ <row><td>ISDynamicFile</td><td>Component_</td><td>N</td><td/><td/><td>Component</td><td>1</td><td>Identifier</td><td/><td>Foreign key referencing Component that controls the file.</td></row>
+ <row><td>ISDynamicFile</td><td>ExcludeFiles</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Wildcards for excluded files.</td></row>
+ <row><td>ISDynamicFile</td><td>ISAttributes</td><td>Y</td><td/><td/><td/><td/><td/><td>0;1;2;3</td><td>This is used to store Installshield custom properties of a dynamic filet. Currently the only one is SelfRegister.</td></row>
+ <row><td>ISDynamicFile</td><td>IncludeFiles</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Wildcards for included files.</td></row>
+ <row><td>ISDynamicFile</td><td>IncludeFlags</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>Include flags.</td></row>
+ <row><td>ISDynamicFile</td><td>SourceFolder</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Full path, the category is of Text instead of Path because of potential use of path variables.</td></row>
+ <row><td>ISFeatureDIMReferences</td><td>Feature_</td><td>N</td><td/><td/><td>Feature</td><td>1</td><td>Identifier</td><td/><td>Foreign key into Feature table.</td></row>
+ <row><td>ISFeatureDIMReferences</td><td>ISDIMReference_</td><td>N</td><td/><td/><td>ISDIMReference</td><td>1</td><td>Identifier</td><td/><td>Foreign key into ISDIMReference table.</td></row>
+ <row><td>ISFeatureMergeModuleExcludes</td><td>Feature_</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Foreign key into Feature table.</td></row>
+ <row><td>ISFeatureMergeModuleExcludes</td><td>Language</td><td>N</td><td/><td/><td/><td/><td/><td/><td>Foreign key into ISMergeModule table.</td></row>
+ <row><td>ISFeatureMergeModuleExcludes</td><td>ModuleID</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Foreign key into ISMergeModule table.
+</td></row>
+ <row><td>ISFeatureMergeModules</td><td>Feature_</td><td>N</td><td/><td/><td>Feature</td><td>1</td><td>Identifier</td><td/><td>Foreign key into Feature table.</td></row>
+ <row><td>ISFeatureMergeModules</td><td>ISMergeModule_</td><td>N</td><td/><td/><td>ISMergeModule</td><td>1</td><td>Text</td><td/><td>Foreign key into ISMergeModule table.
+</td></row>
+ <row><td>ISFeatureMergeModules</td><td>Language_</td><td>N</td><td/><td/><td>ISMergeModule</td><td>2</td><td/><td/><td>Foreign key into ISMergeModule table.</td></row>
+ <row><td>ISFileManifests</td><td>File_</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Foreign key into File table.</td></row>
+ <row><td>ISFileManifests</td><td>Manifest_</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Foreign key into File table.</td></row>
+ <row><td>ISIISAppPool</td><td>AppPool</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISIISAppPool</td><td>Attributes</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISIISAppPool</td><td>CPUMon</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISIISAppPool</td><td>Component_</td><td>N</td><td/><td/><td>Component</td><td>1</td><td>Text</td><td/><td>Foreign key into Component table</td></row>
+ <row><td>ISIISAppPool</td><td>IdleTimeout</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISIISAppPool</td><td>MaxProc</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISIISAppPool</td><td>Name</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Localizable Display Name</td></row>
+ <row><td>ISIISAppPool</td><td>QueueLimit</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISIISAppPool</td><td>RecycleMinutes</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISIISAppPool</td><td>RecycleRequests</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISIISAppPool</td><td>RecycleTimes</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISIISAppPool</td><td>User</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISIISAppPool</td><td>UserPassword</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISIISCommon</td><td>AnonyPasswrd</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Password for anonymous access</td></row>
+ <row><td>ISIISCommon</td><td>AnonyUserName</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>User name for anonymous access</td></row>
+ <row><td>ISIISCommon</td><td>AppName</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>AppName of this VRoot</td></row>
+ <row><td>ISIISCommon</td><td>AppPool_</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Localizable Application Pool Name</td></row>
+ <row><td>ISIISCommon</td><td>Attributes</td><td>N</td><td/><td/><td/><td/><td>Number</td><td/><td>Attributes for this IIS node</td></row>
+ <row><td>ISIISCommon</td><td>CustomErrors</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Delimited list of custom errors</td></row>
+ <row><td>ISIISCommon</td><td>DefDoc</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Localizable Defeault Doc</td></row>
+ <row><td>ISIISCommon</td><td>DisplayName</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Localizable Virtual Root Name</td></row>
+ <row><td>ISIISCommon</td><td>ISIISCommon</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Primary key used to identify a particular record.</td></row>
+ <row><td>ISIISCommon</td><td>ISIISCommon_Parent</td><td>Y</td><td/><td/><td>ISIISCommon</td><td>1</td><td>Identifier</td><td/><td>This record's parent record.</td></row>
+ <row><td>ISIISCommon</td><td>RootDir</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Root directory for this IIS Node</td></row>
+ <row><td>ISIISCommon</td><td>SSLCert</td><td>Y</td><td/><td/><td>Binary</td><td>1</td><td>Identifier</td><td/><td>Foreign key into the binary table.</td></row>
+ <row><td>ISIISCommon</td><td>ScriptTimeout</td><td>Y</td><td/><td/><td/><td/><td>Number</td><td/><td>ASP Script Timeout</td></row>
+ <row><td>ISIISCommon</td><td>SessionTimeout</td><td>Y</td><td/><td/><td/><td/><td>Number</td><td/><td>Session Timeout</td></row>
+ <row><td>ISIISMetaData</td><td>ISIISCommon_</td><td>N</td><td/><td/><td>ISIISCommon</td><td>1</td><td>Identifier</td><td/><td>Foreign key into ISIISCommon table</td></row>
+ <row><td>ISIISMetaData</td><td>MetaDataAttributes</td><td>N</td><td/><td/><td/><td/><td/><td/><td>This is the dwMDAttributes item in the METADATA_RECORD structure</td></row>
+ <row><td>ISIISMetaData</td><td>MetaDataProp</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>This is the dwMDIdentifier item in the METADATA_RECORD structure</td></row>
+ <row><td>ISIISMetaData</td><td>MetaDataType</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>This is the dwMDDataType item in the METADATA_RECORD structure</td></row>
+ <row><td>ISIISMetaData</td><td>MetaDataUserType</td><td>N</td><td/><td/><td/><td/><td/><td/><td>This is the dwMDUserType item in the METADATA_RECORD structure</td></row>
+ <row><td>ISIISMetaData</td><td>MetaDataValue</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>This is the pbMDData item in the METADATA_RECORD structure</td></row>
+ <row><td>ISIISMetaData</td><td>Order</td><td>N</td><td/><td/><td/><td/><td/><td/><td>Use this column to order the meta data properties.</td></row>
+ <row><td>ISIISWebServiceExtension</td><td>Attributes</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISIISWebServiceExtension</td><td>Component_</td><td>N</td><td/><td/><td>Component</td><td>1</td><td>Text</td><td/><td>Foreign key into Component table</td></row>
+ <row><td>ISIISWebServiceExtension</td><td>Description</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Localizable Description</td></row>
+ <row><td>ISIISWebServiceExtension</td><td>File</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISIISWebServiceExtension</td><td>Group</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISIISWebServiceExtension</td><td>WebServiceExtension</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISInstallScriptAction</td><td>EntryPoint</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>This is a foreign key to the target column in the CustomAction table</td></row>
+ <row><td>ISInstallScriptAction</td><td>Source</td><td>N</td><td/><td/><td/><td/><td>Formatted</td><td/><td>This is column points to the source file for the DLLWrapper Custom Action</td></row>
+ <row><td>ISInstallScriptAction</td><td>Target</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>The function signature</td></row>
+ <row><td>ISInstallScriptAction</td><td>Type</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>Type</td></row>
+ <row><td>ISLanguage</td><td>ISLanguage</td><td>N</td><td/><td/><td/><td/><td>Language</td><td/><td>This is the language ID.</td></row>
+ <row><td>ISLanguage</td><td>Included</td><td>Y</td><td/><td/><td/><td/><td/><td>0;1</td><td>Specify whether this language should be included.</td></row>
+ <row><td>ISLinkerLibrary</td><td>ISLinkerLibrary</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Unique identifier for the link library.
+</td></row>
+ <row><td>ISLinkerLibrary</td><td>Library</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Full path of the object library (.obl file).
+</td></row>
+ <row><td>ISLinkerLibrary</td><td>Order</td><td>N</td><td/><td/><td/><td/><td/><td/><td>Order of the Library</td></row>
+ <row><td>ISLocalControl</td><td>Attributes</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>A 32-bit word that specifies the attribute flags to be applied to this control.</td></row>
+ <row><td>ISLocalControl</td><td>Binary_</td><td>Y</td><td/><td/><td>Binary</td><td>1</td><td>Identifier</td><td/><td>External key to the Binary table.</td></row>
+ <row><td>ISLocalControl</td><td>Control_</td><td>N</td><td/><td/><td>Control</td><td>2</td><td>Identifier</td><td/><td>Name of the control. This name must be unique within a dialog, but can repeat on different dialogs.</td></row>
+ <row><td>ISLocalControl</td><td>Dialog_</td><td>N</td><td/><td/><td>Dialog</td><td>1</td><td>Identifier</td><td/><td>External key to the Dialog table, name of the dialog.</td></row>
+ <row><td>ISLocalControl</td><td>Height</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>Height of the bounding rectangle of the control.</td></row>
+ <row><td>ISLocalControl</td><td>ISBuildSourcePath</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Full path to .rtf file for scrollable text control</td></row>
+ <row><td>ISLocalControl</td><td>ISLanguage_</td><td>N</td><td/><td/><td>ISLanguage</td><td>1</td><td>Language</td><td/><td>This is a foreign key to the ISLanguage table.</td></row>
+ <row><td>ISLocalControl</td><td>Width</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>Width of the bounding rectangle of the control.</td></row>
+ <row><td>ISLocalControl</td><td>X</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>Horizontal coordinate of the upper left corner of the bounding rectangle of the control.</td></row>
+ <row><td>ISLocalControl</td><td>Y</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>Vertical coordinate of the upper left corner of the bounding rectangle of the control.</td></row>
+ <row><td>ISLocalDialog</td><td>Attributes</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>A 32-bit word that specifies the attribute flags to be applied to this dialog.</td></row>
+ <row><td>ISLocalDialog</td><td>Dialog_</td><td>Y</td><td/><td/><td>Dialog</td><td>1</td><td>Identifier</td><td/><td>Name of the dialog.</td></row>
+ <row><td>ISLocalDialog</td><td>Height</td><td>N</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>Height of the bounding rectangle of the dialog.</td></row>
+ <row><td>ISLocalDialog</td><td>ISLanguage_</td><td>Y</td><td/><td/><td>ISLanguage</td><td>1</td><td>Language</td><td/><td>This is a foreign key to the ISLanguage table.</td></row>
+ <row><td>ISLocalDialog</td><td>TextStyle_</td><td>Y</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Foreign Key into TextStyle table, only used in Script Based Projects.</td></row>
+ <row><td>ISLocalDialog</td><td>Width</td><td>N</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>Width of the bounding rectangle of the dialog.</td></row>
+ <row><td>ISLocalRadioButton</td><td>Height</td><td>N</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>The height of the button.</td></row>
+ <row><td>ISLocalRadioButton</td><td>ISLanguage_</td><td>N</td><td/><td/><td>ISLanguage</td><td>1</td><td>Language</td><td/><td>This is a foreign key to the ISLanguage table.</td></row>
+ <row><td>ISLocalRadioButton</td><td>Order</td><td>N</td><td>1</td><td>32767</td><td>RadioButton</td><td>2</td><td/><td/><td>A positive integer used to determine the ordering of the items within one list..The integers do not have to be consecutive.</td></row>
+ <row><td>ISLocalRadioButton</td><td>Property</td><td>N</td><td/><td/><td>RadioButton</td><td>1</td><td>Identifier</td><td/><td>A named property to be tied to this radio button. All the buttons tied to the same property become part of the same group.</td></row>
+ <row><td>ISLocalRadioButton</td><td>Width</td><td>N</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>The width of the button.</td></row>
+ <row><td>ISLocalRadioButton</td><td>X</td><td>N</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>The horizontal coordinate of the upper left corner of the bounding rectangle of the radio button.</td></row>
+ <row><td>ISLocalRadioButton</td><td>Y</td><td>N</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>The vertical coordinate of the upper left corner of the bounding rectangle of the radio button.</td></row>
+ <row><td>ISLogicalDisk</td><td>Cabinet</td><td>Y</td><td/><td/><td/><td/><td>Cabinet</td><td/><td>If some or all of the files stored on the media are compressed in a cabinet, the name of that cabinet.</td></row>
+ <row><td>ISLogicalDisk</td><td>DiskId</td><td>N</td><td>1</td><td>32767</td><td/><td/><td/><td/><td>Primary key, integer to determine sort order for table.</td></row>
+ <row><td>ISLogicalDisk</td><td>DiskPrompt</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Disk name: the visible text actually printed on the disk. This will be used to prompt the user when this disk needs to be inserted.</td></row>
+ <row><td>ISLogicalDisk</td><td>ISProductConfiguration_</td><td>N</td><td/><td/><td>ISProductConfiguration</td><td>1</td><td>Text</td><td/><td>Foreign key into the ISProductConfiguration table.</td></row>
+ <row><td>ISLogicalDisk</td><td>ISRelease_</td><td>N</td><td/><td/><td>ISRelease</td><td>1</td><td>Text</td><td/><td>Foreign key into the ISRelease table.</td></row>
+ <row><td>ISLogicalDisk</td><td>LastSequence</td><td>N</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>File sequence number for the last file for this media.</td></row>
+ <row><td>ISLogicalDisk</td><td>Source</td><td>Y</td><td/><td/><td/><td/><td>Property</td><td/><td>The property defining the location of the cabinet file.</td></row>
+ <row><td>ISLogicalDisk</td><td>VolumeLabel</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>The label attributed to the volume.</td></row>
+ <row><td>ISLogicalDiskFeatures</td><td>Feature_</td><td>Y</td><td/><td/><td>Feature</td><td>1</td><td>Identifier</td><td/><td>Required foreign key into the Feature Table,</td></row>
+ <row><td>ISLogicalDiskFeatures</td><td>ISAttributes</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>This is used to store Installshield custom properties, like Compressed, etc.</td></row>
+ <row><td>ISLogicalDiskFeatures</td><td>ISLogicalDisk_</td><td>N</td><td>1</td><td>32767</td><td>ISLogicalDisk</td><td>1</td><td>Identifier</td><td/><td>Foreign key into the ISLogicalDisk table.</td></row>
+ <row><td>ISLogicalDiskFeatures</td><td>ISProductConfiguration_</td><td>N</td><td/><td/><td>ISProductConfiguration</td><td>1</td><td>Text</td><td/><td>Foreign key into the ISProductConfiguration table.</td></row>
+ <row><td>ISLogicalDiskFeatures</td><td>ISRelease_</td><td>N</td><td/><td/><td>ISRelease</td><td>1</td><td>Text</td><td/><td>Foreign key into the ISRelease table.</td></row>
+ <row><td>ISLogicalDiskFeatures</td><td>Sequence</td><td>N</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>File sequence number for the file for this media.</td></row>
+ <row><td>ISMergeModule</td><td>Destination</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Destination.
+</td></row>
+ <row><td>ISMergeModule</td><td>ISAttributes</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>This is used to store Installshield custom properties of a merge module.</td></row>
+ <row><td>ISMergeModule</td><td>ISMergeModule</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>The GUID identifying the merge module.
+</td></row>
+ <row><td>ISMergeModule</td><td>Language</td><td>N</td><td/><td/><td/><td/><td/><td/><td>Default decimal language of module.</td></row>
+ <row><td>ISMergeModule</td><td>Name</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Name of the merge module.
+</td></row>
+ <row><td>ISMergeModuleCfgValues</td><td>Attributes</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>Attributes (from configurable merge module)</td></row>
+ <row><td>ISMergeModuleCfgValues</td><td>ContextData</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>ContextData (from configurable merge module)</td></row>
+ <row><td>ISMergeModuleCfgValues</td><td>DefaultValue</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>DefaultValue (from configurable merge module)</td></row>
+ <row><td>ISMergeModuleCfgValues</td><td>Description</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Description (from configurable merge module)</td></row>
+ <row><td>ISMergeModuleCfgValues</td><td>DisplayName</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>DisplayName (from configurable merge module)</td></row>
+ <row><td>ISMergeModuleCfgValues</td><td>Format</td><td>N</td><td/><td/><td/><td/><td/><td/><td>Format (from configurable merge module)</td></row>
+ <row><td>ISMergeModuleCfgValues</td><td>HelpKeyword</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>HelpKeyword (from configurable merge module)</td></row>
+ <row><td>ISMergeModuleCfgValues</td><td>HelpLocation</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>HelpLocation (from configurable merge module)</td></row>
+ <row><td>ISMergeModuleCfgValues</td><td>ISMergeModule_</td><td>N</td><td/><td/><td>ISMergeModule</td><td>1</td><td>Text</td><td/><td>The module signature, a foreign key into the ISMergeModule table</td></row>
+ <row><td>ISMergeModuleCfgValues</td><td>Language_</td><td>N</td><td/><td/><td>ISMergeModule</td><td>2</td><td/><td/><td>Default decimal language of module.</td></row>
+ <row><td>ISMergeModuleCfgValues</td><td>ModuleConfiguration_</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Identifier, foreign key into ModuleConfiguration table (ModuleConfiguration.Name)</td></row>
+ <row><td>ISMergeModuleCfgValues</td><td>Type</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Type (from configurable merge module)</td></row>
+ <row><td>ISMergeModuleCfgValues</td><td>Value</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Value for this item.</td></row>
+ <row><td>ISObject</td><td>Language</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td/></row>
+ <row><td>ISObject</td><td>ObjectName</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td/></row>
+ <row><td>ISObjectProperty</td><td>IncludeInBuild</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>Boolean, 0 for false non 0 for true</td></row>
+ <row><td>ISObjectProperty</td><td>ObjectName</td><td>Y</td><td/><td/><td>ISObject</td><td>1</td><td>Text</td><td/><td/></row>
+ <row><td>ISObjectProperty</td><td>Property</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td/></row>
+ <row><td>ISObjectProperty</td><td>Value</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td/></row>
+ <row><td>ISPalmApp</td><td>Component</td><td>N</td><td/><td/><td>Component</td><td>1</td><td/><td/><td/></row>
+ <row><td>ISPalmApp</td><td>PalmApp</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISPalmAppFile</td><td>Destination</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISPalmAppFile</td><td>FileKey</td><td>N</td><td/><td/><td>File</td><td>1</td><td/><td/><td/></row>
+ <row><td>ISPalmAppFile</td><td>PalmApp</td><td>N</td><td/><td/><td>ISPalmApp</td><td>1</td><td/><td/><td/></row>
+ <row><td>ISPatchConfigImage</td><td>PatchConfiguration_</td><td>Y</td><td/><td/><td>ISPatchConfiguration</td><td>1</td><td>Text</td><td/><td>Foreign key to the ISPatchConfigurationTable</td></row>
+ <row><td>ISPatchConfigImage</td><td>UpgradedImage_</td><td>N</td><td/><td/><td>ISUpgradedImage</td><td>1</td><td>Text</td><td/><td>Foreign key to the ISUpgradedImageTable</td></row>
+ <row><td>ISPatchConfiguration</td><td>Attributes</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>PatchConfiguration attributes</td></row>
+ <row><td>ISPatchConfiguration</td><td>CanPCDiffer</td><td>N</td><td/><td/><td/><td/><td/><td/><td>This is determine whether Product Codes may differ</td></row>
+ <row><td>ISPatchConfiguration</td><td>CanPVDiffer</td><td>N</td><td/><td/><td/><td/><td/><td/><td>This is determine whether the Major Product Version may differ</td></row>
+ <row><td>ISPatchConfiguration</td><td>EnablePatchCache</td><td>N</td><td/><td/><td/><td/><td/><td/><td>This is determine whether to Enable Patch cacheing</td></row>
+ <row><td>ISPatchConfiguration</td><td>Flags</td><td>N</td><td/><td/><td/><td/><td/><td/><td>Patching API Flags</td></row>
+ <row><td>ISPatchConfiguration</td><td>IncludeWholeFiles</td><td>N</td><td/><td/><td/><td/><td/><td/><td>This is determine whether to build a binary level patch</td></row>
+ <row><td>ISPatchConfiguration</td><td>LeaveDecompressed</td><td>N</td><td/><td/><td/><td/><td/><td/><td>This is determine whether to leave intermediate files devcompressed when finished</td></row>
+ <row><td>ISPatchConfiguration</td><td>MinMsiVersion</td><td>N</td><td/><td/><td/><td/><td/><td/><td>Minimum Required MSI Version</td></row>
+ <row><td>ISPatchConfiguration</td><td>Name</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Name of the Patch Configuration</td></row>
+ <row><td>ISPatchConfiguration</td><td>OptimizeForSize</td><td>N</td><td/><td/><td/><td/><td/><td/><td>This is determine whether to Optimize for large files</td></row>
+ <row><td>ISPatchConfiguration</td><td>OutputPath</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Build Location</td></row>
+ <row><td>ISPatchConfiguration</td><td>PatchCacheDir</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Directory to recieve the Patch Cache information</td></row>
+ <row><td>ISPatchConfiguration</td><td>PatchGuid</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Unique Patch Identifier</td></row>
+ <row><td>ISPatchConfiguration</td><td>PatchGuidsToReplace</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>List Of Patch Guids to unregister</td></row>
+ <row><td>ISPatchConfiguration</td><td>TargetProductCodes</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>List Of target Product Codes</td></row>
+ <row><td>ISPatchConfigurationProperty</td><td>ISPatchConfiguration_</td><td>Y</td><td/><td/><td>ISPatchConfiguration</td><td>1</td><td>Text</td><td/><td>Name of the Patch Configuration</td></row>
+ <row><td>ISPatchConfigurationProperty</td><td>Property</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Name of the Patch Configuration Property value</td></row>
+ <row><td>ISPatchConfigurationProperty</td><td>Value</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Value of the Patch Configuration Property</td></row>
+ <row><td>ISPatchExternalFile</td><td>FileKey</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Filekey</td></row>
+ <row><td>ISPatchExternalFile</td><td>FilePath</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Filepath</td></row>
+ <row><td>ISPatchExternalFile</td><td>ISUpgradedImage_</td><td>N</td><td/><td/><td>ISUpgradedImage</td><td>1</td><td>Text</td><td/><td>Foreign key to the isupgraded image table</td></row>
+ <row><td>ISPatchExternalFile</td><td>Name</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Uniqu name to identify this record.</td></row>
+ <row><td>ISPatchWholeFile</td><td>Component</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Component containing file key</td></row>
+ <row><td>ISPatchWholeFile</td><td>FileKey</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Key of file to be included as whole</td></row>
+ <row><td>ISPatchWholeFile</td><td>UpgradedImage</td><td>N</td><td/><td/><td>ISUpgradedImage</td><td>1</td><td>Text</td><td/><td>Foreign key to ISUpgradedImage Table</td></row>
+ <row><td>ISPathVariable</td><td>ISPathVariable</td><td>N</td><td/><td/><td/><td/><td/><td/><td>The name of the path variable.</td></row>
+ <row><td>ISPathVariable</td><td>TestValue</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>The test value of the path variable.</td></row>
+ <row><td>ISPathVariable</td><td>Type</td><td>N</td><td/><td/><td/><td/><td/><td>1;2;4;8</td><td>The type of the path variable.</td></row>
+ <row><td>ISPathVariable</td><td>Value</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>The value of the path variable.</td></row>
+ <row><td>ISProductConfiguration</td><td>GeneratePackageCode</td><td>Y</td><td/><td/><td/><td/><td>Number</td><td>0;1</td><td>Indicates whether or not to generate a package code.
+</td></row>
+ <row><td>ISProductConfiguration</td><td>ISProductConfiguration</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>The name of the product configuration.
+</td></row>
+ <row><td>ISProductConfiguration</td><td>ProductConfigurationFlags</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Product configuration (release) flags.
+</td></row>
+ <row><td>ISProductConfigurationInstance</td><td>ISProductConfiguration_</td><td>N</td><td/><td/><td>ISProductConfiguration</td><td>1</td><td>Text</td><td/><td>Foreign key into the ISProductConfiguration table.
+</td></row>
+ <row><td>ISProductConfigurationInstance</td><td>InstanceId</td><td>N</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>Identifies the instance number of this instance. This value is stored in the Property InstanceId.</td></row>
+ <row><td>ISProductConfigurationInstance</td><td>Property</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Product Congiuration property name</td></row>
+ <row><td>ISProductConfigurationInstance</td><td>Value</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>String value for property.</td></row>
+ <row><td>ISProductConfigurationProperty</td><td>ISProductConfiguration_</td><td>N</td><td/><td/><td>ISProductConfiguration</td><td>1</td><td>Text</td><td/><td>Foreign key into the ISProductConfiguration table.
+</td></row>
+ <row><td>ISProductConfigurationProperty</td><td>Property</td><td>N</td><td/><td/><td>Property</td><td>1</td><td>Text</td><td/><td>Product Congiuration property name</td></row>
+ <row><td>ISProductConfigurationProperty</td><td>Value</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>String value for property. Never null or empty.
+
+
+
+</td></row>
+ <row><td>ISRelease</td><td>Attributes</td><td>N</td><td/><td/><td/><td/><td/><td/><td>Bitfield holding boolean values for various release attributes.</td></row>
+ <row><td>ISRelease</td><td>BuildLocation</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Build location.</td></row>
+ <row><td>ISRelease</td><td>CDBrowser</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Demoshield browser location.</td></row>
+ <row><td>ISRelease</td><td>DefaultLanguage</td><td>N</td><td/><td/><td/><td/><td>Language</td><td/><td>Default language for setup.</td></row>
+ <row><td>ISRelease</td><td>DigitalPVK</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Digital signing private key (.pvk) file.</td></row>
+ <row><td>ISRelease</td><td>DigitalSPC</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Digital signing Software Publisher Certificate (.spc) file.</td></row>
+ <row><td>ISRelease</td><td>DigitalURL</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Digital signing URL.</td></row>
+ <row><td>ISRelease</td><td>DiskClusterSize</td><td>N</td><td/><td/><td/><td/><td/><td/><td>Disk cluster size.</td></row>
+ <row><td>ISRelease</td><td>DiskSize</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Disk size.</td></row>
+ <row><td>ISRelease</td><td>DiskSizeUnit</td><td>N</td><td/><td/><td/><td/><td/><td>0;1;2</td><td>Disk size units (KB or MB).</td></row>
+ <row><td>ISRelease</td><td>DiskSpanning</td><td>N</td><td/><td/><td/><td/><td/><td>0;1;2</td><td>Disk spanning (automatic, enforce size, etc.).</td></row>
+ <row><td>ISRelease</td><td>DotNetBuildConfiguration</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Build Configuration for .NET solutions.</td></row>
+ <row><td>ISRelease</td><td>ISProductConfiguration_</td><td>N</td><td/><td/><td>ISProductConfiguration</td><td>1</td><td>Text</td><td/><td>Foreign key into the ISProductConfiguration table.</td></row>
+ <row><td>ISRelease</td><td>ISRelease</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>The name of the release.
+</td></row>
+ <row><td>ISRelease</td><td>ISSetupPrerequisiteLocation</td><td>Y</td><td/><td/><td/><td/><td/><td>0;1;2</td><td>Location the Setup Prerequisites will be placed in</td></row>
+ <row><td>ISRelease</td><td>MediaLocation</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Media location on disk.</td></row>
+ <row><td>ISRelease</td><td>MsiCommandLine</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Command line passed to the msi package from setup.exe</td></row>
+ <row><td>ISRelease</td><td>MsiSourceType</td><td>N</td><td>-1</td><td>4</td><td/><td/><td/><td/><td>MSI media source type.</td></row>
+ <row><td>ISRelease</td><td>PackageName</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Package name.</td></row>
+ <row><td>ISRelease</td><td>Password</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Password.</td></row>
+ <row><td>ISRelease</td><td>Platforms</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Platforms supported (Intel, Alpha, etc.).</td></row>
+ <row><td>ISRelease</td><td>ReleaseFlags</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Release flags.</td></row>
+ <row><td>ISRelease</td><td>ReleaseType</td><td>N</td><td/><td/><td/><td/><td/><td>1;2;4</td><td>Release type (single, uncompressed, etc.).</td></row>
+ <row><td>ISRelease</td><td>SupportedLanguagesData</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Languages supported (for component filtering).</td></row>
+ <row><td>ISRelease</td><td>SupportedLanguagesUI</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>UI languages supported.</td></row>
+ <row><td>ISRelease</td><td>SupportedOSs</td><td>N</td><td/><td/><td/><td/><td/><td/><td>Indicate which operating systmes are supported.</td></row>
+ <row><td>ISRelease</td><td>SynchMsi</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>MSI file to synchronize file keys and other data with (patch-like functionality).</td></row>
+ <row><td>ISRelease</td><td>Type</td><td>N</td><td>0</td><td>6</td><td/><td/><td/><td/><td>Release type (CDROM, Network, etc.).</td></row>
+ <row><td>ISRelease</td><td>URLLocation</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Media location via URL.</td></row>
+ <row><td>ISRelease</td><td>VersionCopyright</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Version stamp information.</td></row>
+ <row><td>ISReleaseASPublishInfo</td><td>ISProductConfiguration_</td><td>N</td><td/><td/><td>ISProductConfiguration</td><td>1</td><td>Text</td><td/><td>Foreign key into the ISProductConfiguration table.</td></row>
+ <row><td>ISReleaseASPublishInfo</td><td>ISRelease_</td><td>N</td><td/><td/><td>ISRelease</td><td>1</td><td>Text</td><td/><td>Foreign key into the ISRelease table.</td></row>
+ <row><td>ISReleaseASPublishInfo</td><td>Property</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>AS Repository property name</td></row>
+ <row><td>ISReleaseASPublishInfo</td><td>Value</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>AS Repository property value</td></row>
+ <row><td>ISReleaseExtended</td><td>Attributes</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>Bitfield holding boolean values for various release attributes.</td></row>
+ <row><td>ISReleaseExtended</td><td>CertPassword</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Digital certificate password</td></row>
+ <row><td>ISReleaseExtended</td><td>DigitalCertificateDBaseNS</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Path to cerificate database for Netscape digital signature</td></row>
+ <row><td>ISReleaseExtended</td><td>DigitalCertificateIdNS</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Path to cerificate ID for Netscape digital signature</td></row>
+ <row><td>ISReleaseExtended</td><td>DigitalCertificatePasswordNS</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Password for Netscape digital signature</td></row>
+ <row><td>ISReleaseExtended</td><td>DotNetBaseLanguage</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Base Languge of .NET Redist</td></row>
+ <row><td>ISReleaseExtended</td><td>DotNetFxCmdLine</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Command Line to pass to DotNetFx.exe</td></row>
+ <row><td>ISReleaseExtended</td><td>DotNetLangPackCmdLine</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Command Line to pass to LangPack.exe</td></row>
+ <row><td>ISReleaseExtended</td><td>DotNetLangaugePacks</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>.NET Redist language packs to include</td></row>
+ <row><td>ISReleaseExtended</td><td>DotNetRedistLocation</td><td>Y</td><td>0</td><td>3</td><td/><td/><td/><td/><td>Location of .NET framework Redist (Web, SetupExe, Source, None)</td></row>
+ <row><td>ISReleaseExtended</td><td>DotNetRedistURL</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>URL to .NET framework Redist</td></row>
+ <row><td>ISReleaseExtended</td><td>DotNetVersion</td><td>Y</td><td>0</td><td>2</td><td/><td/><td/><td/><td>Version of .NET framework Redist (1.0, 1.1)</td></row>
+ <row><td>ISReleaseExtended</td><td>EngineLocation</td><td>Y</td><td>0</td><td>2</td><td/><td/><td/><td/><td>Location of msi engine (Web, SetupExe...)</td></row>
+ <row><td>ISReleaseExtended</td><td>ISEngineLocation</td><td>Y</td><td>0</td><td>2</td><td/><td/><td/><td/><td>Location of ISScript engine (Web, SetupExe...)</td></row>
+ <row><td>ISReleaseExtended</td><td>ISEngineURL</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>URL to InstallShield scripting engine</td></row>
+ <row><td>ISReleaseExtended</td><td>ISProductConfiguration_</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Foreign key into the ISProductConfiguration table.</td></row>
+ <row><td>ISReleaseExtended</td><td>ISRelease_</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>The name of the release.</td></row>
+ <row><td>ISReleaseExtended</td><td>JSharpCmdLine</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Command Line to pass to vjredist.exe</td></row>
+ <row><td>ISReleaseExtended</td><td>JSharpRedistLocation</td><td>Y</td><td>0</td><td>3</td><td/><td/><td/><td/><td>Location of J# framework Redist (Web, SetupExe, Source, None)</td></row>
+ <row><td>ISReleaseExtended</td><td>MsiEngineVersion</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>Bitfield holding selected MSI engine versions included in this release</td></row>
+ <row><td>ISReleaseExtended</td><td>OneClickCabName</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>File name of generated cabfile</td></row>
+ <row><td>ISReleaseExtended</td><td>OneClickHtmlName</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>File name of generated html page</td></row>
+ <row><td>ISReleaseExtended</td><td>OneClickTargetBrowser</td><td>Y</td><td>0</td><td>2</td><td/><td/><td/><td/><td>Target browser (IE, Netscape, both...)</td></row>
+ <row><td>ISReleaseExtended</td><td>WebCabSize</td><td>Y</td><td>0</td><td>2147483647</td><td/><td/><td/><td/><td>Size of the cabfile</td></row>
+ <row><td>ISReleaseExtended</td><td>WebLocalCachePath</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Directory to cache downloaded package</td></row>
+ <row><td>ISReleaseExtended</td><td>WebType</td><td>Y</td><td>0</td><td>2</td><td/><td/><td/><td/><td>Type of web install (One Executable, Downloader...)</td></row>
+ <row><td>ISReleaseExtended</td><td>WebURL</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>URL to .msi package</td></row>
+ <row><td>ISReleaseExtended</td><td>Win9xMsiUrl</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>URL to Ansi MSI engine</td></row>
+ <row><td>ISReleaseExtended</td><td>WinMsi30Url</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>URL to MSI 3.0 engine</td></row>
+ <row><td>ISReleaseExtended</td><td>WinNTMsiUrl</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>URL to Unicode MSI engine</td></row>
+ <row><td>ISReleasePublishInfo</td><td>Description</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Repository item description</td></row>
+ <row><td>ISReleasePublishInfo</td><td>DisplayName</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Repository item display name</td></row>
+ <row><td>ISReleasePublishInfo</td><td>ISAttributes</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>Bitfield holding various attributes</td></row>
+ <row><td>ISReleasePublishInfo</td><td>ISProductConfiguration_</td><td>N</td><td/><td/><td>ISProductConfiguration</td><td>1</td><td>Text</td><td/><td>Foreign key into the ISProductConfiguration table.</td></row>
+ <row><td>ISReleasePublishInfo</td><td>ISRelease_</td><td>N</td><td/><td/><td>ISRelease</td><td>1</td><td>Text</td><td/><td>The name of the release.</td></row>
+ <row><td>ISReleasePublishInfo</td><td>Publisher</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Repository item publisher</td></row>
+ <row><td>ISReleasePublishInfo</td><td>Repository</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Repository which to publish the built merge module</td></row>
+ <row><td>ISSQLConnection</td><td>Attributes</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLConnection</td><td>Authentication</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLConnection</td><td>BatchSeparator</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLConnection</td><td>CmdTimeout</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLConnection</td><td>Comments</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLConnection</td><td>Database</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLConnection</td><td>ISSQLConnection</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLConnection</td><td>Order</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLConnection</td><td>Password</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLConnection</td><td>Server</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLConnection</td><td>UserName</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLConnectionDBServer</td><td>ISSQLConnectionDBServer</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLConnectionDBServer</td><td>ISSQLConnection_</td><td>N</td><td/><td/><td>ISSQLConnection</td><td>1</td><td/><td/><td/></row>
+ <row><td>ISSQLConnectionDBServer</td><td>ISSQLDBMetaData_</td><td>N</td><td/><td/><td>ISSQLDBMetaData</td><td>1</td><td/><td/><td/></row>
+ <row><td>ISSQLConnectionDBServer</td><td>Order</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLConnectionScript</td><td>ISSQLConnection_</td><td>N</td><td/><td/><td>ISSQLConnection</td><td>1</td><td/><td/><td/></row>
+ <row><td>ISSQLConnectionScript</td><td>ISSQLScriptFile_</td><td>N</td><td/><td/><td>ISSQLScriptFile</td><td>1</td><td/><td/><td/></row>
+ <row><td>ISSQLConnectionScript</td><td>Order</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLDBMetaData</td><td>AdoCxnDatabase</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLDBMetaData</td><td>AdoCxnDriver</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLDBMetaData</td><td>AdoCxnNetLibrary</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLDBMetaData</td><td>AdoCxnPassword</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLDBMetaData</td><td>AdoCxnServer</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLDBMetaData</td><td>AdoCxnUserID</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLDBMetaData</td><td>AdoCxnWindowsSecurity</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLDBMetaData</td><td>AdoDriverName</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLDBMetaData</td><td>CreateDbCmd</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLDBMetaData</td><td>DisplayName</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLDBMetaData</td><td>DsnODBCName</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLDBMetaData</td><td>ISAttributes</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLDBMetaData</td><td>ISSQLDBMetaData</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLDBMetaData</td><td>LocalInstanceNames</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLDBMetaData</td><td>SwitchDbCmd</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLDBMetaData</td><td>TestDatabaseCmd</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLDBMetaData</td><td>TestTableCmd</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLDBMetaData</td><td>TestTableCmd2</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLDBMetaData</td><td>VersionBeginToken</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLDBMetaData</td><td>VersionEndToken</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLDBMetaData</td><td>VersionInfoCmd</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLDBMetaData</td><td>WinAuthentUserId</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLRequirement</td><td>Attributes</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLRequirement</td><td>ISSQLConnectionDBServer_</td><td>Y</td><td/><td/><td>ISSQLConnectionDBServer</td><td>1</td><td/><td/><td/></row>
+ <row><td>ISSQLRequirement</td><td>ISSQLConnection_</td><td>N</td><td/><td/><td>ISSQLConnection</td><td>1</td><td/><td/><td/></row>
+ <row><td>ISSQLRequirement</td><td>ISSQLRequirement</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLRequirement</td><td>MajorVersion</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLRequirement</td><td>ServicePackLevel</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLScriptError</td><td>Attributes</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLScriptError</td><td>ErrHandling</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLScriptError</td><td>ErrNumber</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLScriptError</td><td>ISSQLScriptFile_</td><td>Y</td><td/><td/><td>ISSQLScriptFile</td><td>1</td><td>Identifier</td><td/><td>Foreign key referencing ISSQLScriptFile</td></row>
+ <row><td>ISSQLScriptError</td><td>Message</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Custom end-user message. Reserved for future use.</td></row>
+ <row><td>ISSQLScriptFile</td><td>Attributes</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLScriptFile</td><td>Comments</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Comments</td></row>
+ <row><td>ISSQLScriptFile</td><td>Component_</td><td>N</td><td/><td/><td>Component</td><td>1</td><td>Identifier</td><td/><td>Foreign key referencing Component that controls the SQL script.</td></row>
+ <row><td>ISSQLScriptFile</td><td>ErrorHandling</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLScriptFile</td><td>ISBuildSourcePath</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Full path, the category is of Text instead of Path because of potential use of path variables.</td></row>
+ <row><td>ISSQLScriptFile</td><td>ISSQLScriptFile</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>This is the primary key to the ISSQLScriptFile table</td></row>
+ <row><td>ISSQLScriptFile</td><td>InstallText</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Feedback end-user text at install</td></row>
+ <row><td>ISSQLScriptFile</td><td>Scheduling</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLScriptFile</td><td>UninstallText</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Feedback end-user text at Uninstall</td></row>
+ <row><td>ISSQLScriptFile</td><td>Version</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Schema Version (####.#####.####)</td></row>
+ <row><td>ISSQLScriptImport</td><td>Attributes</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLScriptImport</td><td>Authentication</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLScriptImport</td><td>Database</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLScriptImport</td><td>ExcludeTables</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLScriptImport</td><td>ISSQLScriptFile_</td><td>N</td><td/><td/><td>ISSQLScriptFile</td><td>1</td><td/><td/><td/></row>
+ <row><td>ISSQLScriptImport</td><td>IncludeTables</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLScriptImport</td><td>Password</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLScriptImport</td><td>Server</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLScriptImport</td><td>UserName</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLScriptReplace</td><td>Attributes</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLScriptReplace</td><td>ISSQLScriptFile_</td><td>N</td><td/><td/><td>ISSQLScriptFile</td><td>1</td><td/><td/><td/></row>
+ <row><td>ISSQLScriptReplace</td><td>ISSQLScriptReplace</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLScriptReplace</td><td>Replace</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSQLScriptReplace</td><td>Search</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISScriptFile</td><td>ISScriptFile</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>This is the full path of the script file. The path portion may be expressed in path variable form.
+</td></row>
+ <row><td>ISSelfReg</td><td>CmdLine</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSelfReg</td><td>Cost</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSelfReg</td><td>FileKey</td><td>N</td><td/><td/><td>File</td><td>1</td><td>Identifier</td><td/><td>Foreign key to the file table</td></row>
+ <row><td>ISSelfReg</td><td>Order</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSetupFile</td><td>FileName</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>This is the file name to use when streaming the file to the support files location</td></row>
+ <row><td>ISSetupFile</td><td>ISSetupFile</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>This is the primary key to the ISSetupFile table</td></row>
+ <row><td>ISSetupFile</td><td>Language</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Four digit language identifier. 0 for Language Neutral</td></row>
+ <row><td>ISSetupFile</td><td>Path</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Link to the source file on the build machine</td></row>
+ <row><td>ISSetupFile</td><td>Splash</td><td>Y</td><td/><td/><td/><td/><td>Short</td><td/><td>Boolean value indication whether his setup file entry belongs in the Splasc Screen section</td></row>
+ <row><td>ISSetupFile</td><td>Stream</td><td>Y</td><td/><td/><td/><td/><td>Binary</td><td/><td>Binary stream. The bits to stream to the support location</td></row>
+ <row><td>ISSetupPrerequisites</td><td>ISBuildSourcePath</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSetupPrerequisites</td><td>ISSetupPrerequisites</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSetupPrerequisites</td><td>Order</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISSetupType</td><td>Comments</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>User Comments.</td></row>
+ <row><td>ISSetupType</td><td>Description</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Longer descriptive text describing a visible feature item.</td></row>
+ <row><td>ISSetupType</td><td>Display</td><td>N</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>Numeric sort order, used to force a specific display ordering.</td></row>
+ <row><td>ISSetupType</td><td>Display_Name</td><td>Y</td><td/><td/><td/><td/><td>Formatted</td><td/><td>A string used to set the initial text contained within a control (if appropriate).</td></row>
+ <row><td>ISSetupType</td><td>ISSetupType</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Primary key used to identify a particular feature record.</td></row>
+ <row><td>ISSetupTypeFeatures</td><td>Feature_</td><td>N</td><td/><td/><td>Feature</td><td>1</td><td>Identifier</td><td/><td>Foreign key into Feature table.</td></row>
+ <row><td>ISSetupTypeFeatures</td><td>ISSetupType_</td><td>N</td><td/><td/><td>ISSetupType</td><td>1</td><td>Identifier</td><td/><td>Foreign key into ISSetupType table.</td></row>
+ <row><td>ISStorages</td><td>ISBuildSourcePath</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>Path to the file to stream into sub-storage</td></row>
+ <row><td>ISStorages</td><td>Name</td><td>N</td><td/><td/><td/><td/><td/><td/><td>Name of the sub-storage key</td></row>
+ <row><td>ISString</td><td>Comment</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Comment</td></row>
+ <row><td>ISString</td><td>Encoded</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>Encoding for multi-byte strings.</td></row>
+ <row><td>ISString</td><td>ISLanguage_</td><td>N</td><td/><td/><td/><td/><td>Language</td><td/><td>This is a foreign key to the ISLanguage table.</td></row>
+ <row><td>ISString</td><td>ISString</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>String id.</td></row>
+ <row><td>ISString</td><td>TimeStamp</td><td>Y</td><td/><td/><td/><td/><td>Time/Date</td><td/><td>Time Stamp. MSI's Time/Date column type is just an int, with bits packed in a certain order.</td></row>
+ <row><td>ISString</td><td>Value</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>real string value.</td></row>
+ <row><td>ISTargetImage</td><td>Flags</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>relative order of the target image</td></row>
+ <row><td>ISTargetImage</td><td>IgnoreMissingFiles</td><td>N</td><td/><td/><td/><td/><td/><td/><td>If true, ignore missing source files when creating patch</td></row>
+ <row><td>ISTargetImage</td><td>MsiPath</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Path to the target image</td></row>
+ <row><td>ISTargetImage</td><td>Name</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Name of the TargetImage</td></row>
+ <row><td>ISTargetImage</td><td>Order</td><td>N</td><td/><td/><td/><td/><td/><td/><td>relative order of the target image</td></row>
+ <row><td>ISTargetImage</td><td>UpgradedImage_</td><td>N</td><td/><td/><td>ISUpgradedImage</td><td>1</td><td>Text</td><td/><td>foreign key to the upgraded Image table</td></row>
+ <row><td>ISUpgradeMsiItem</td><td>ISAttributes</td><td>N</td><td/><td/><td/><td/><td/><td>0;1</td><td/></row>
+ <row><td>ISUpgradeMsiItem</td><td>ISReleaseFlags</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISUpgradeMsiItem</td><td>ObjectSetupPath</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>The path to the setup you want to upgrade.</td></row>
+ <row><td>ISUpgradeMsiItem</td><td>UpgradeItem</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>The name of the Upgrade Item.</td></row>
+ <row><td>ISUpgradedImage</td><td>Family</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Name of the image family</td></row>
+ <row><td>ISUpgradedImage</td><td>MsiPath</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Path to the upgraded image</td></row>
+ <row><td>ISUpgradedImage</td><td>Name</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Name of the UpgradedImage</td></row>
+ <row><td>ISVRoot</td><td>AnonyPasswrd</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Obsolete column. Moved to IISCommon</td></row>
+ <row><td>ISVRoot</td><td>AnonyUserName</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Obsolete column. Moved to IISCommon</td></row>
+ <row><td>ISVRoot</td><td>Component_</td><td>N</td><td/><td/><td>Component</td><td>1</td><td>Text</td><td/><td>Foreign key into Component table</td></row>
+ <row><td>ISVRoot</td><td>Condition</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Obsolete column. Moved to Component</td></row>
+ <row><td>ISVRoot</td><td>ScriptTimeout</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>Obsolete column. Moved to IISCommon</td></row>
+ <row><td>ISVRoot</td><td>SessionTimeout</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>Obsolete column. Moved to IISCommon</td></row>
+ <row><td>ISVRoot</td><td>VRootAppName</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>AppName of this VRoot</td></row>
+ <row><td>ISVRoot</td><td>VRootDefDoc</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Obsolete column. Moved to IISCommon</td></row>
+ <row><td>ISVRoot</td><td>VRootDir</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Obsolete column. Moved to IISCommon</td></row>
+ <row><td>ISVRoot</td><td>VRootKey</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Foreign key into ISIISCommon table</td></row>
+ <row><td>ISVRoot</td><td>VRootName</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Obsolete column. Moved to IISCommon</td></row>
+ <row><td>ISVRoot</td><td>VRootProps</td><td>N</td><td/><td/><td/><td/><td/><td/><td>Properties of this VRoot</td></row>
+ <row><td>ISVRootAppMaps</td><td>AppMapProps</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISVRootAppMaps</td><td>ExecPath</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Localizable Exec Path</td></row>
+ <row><td>ISVRootAppMaps</td><td>Extension</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Localizable Extension</td></row>
+ <row><td>ISVRootAppMaps</td><td>VRootAppMapKey</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISVRootAppMaps</td><td>VRootKey</td><td>N</td><td/><td/><td>ISIISCommon</td><td>1</td><td/><td/><td/></row>
+ <row><td>ISVRootAppMaps</td><td>Verb</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Localizable Verb</td></row>
+ <row><td>ISWebSite</td><td>IP</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISWebSite</td><td>ISIISCommon_</td><td>N</td><td/><td/><td>ISIISCommon</td><td>1</td><td>Text</td><td/><td>Foreign key into ISIISCommon table</td></row>
+ <row><td>ISWebSite</td><td>Port</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISWebSite</td><td>SiteNumber</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISWebSite</td><td>WebSiteProps</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>ISXmlElement</td><td>Content</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Element contents</td></row>
+ <row><td>ISXmlElement</td><td>ISAttributes</td><td>Y</td><td/><td/><td/><td/><td>Number</td><td/><td>Internal XML element attributes</td></row>
+ <row><td>ISXmlElement</td><td>ISXmlElement</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Primary key, non-localized, internal token for Xml element</td></row>
+ <row><td>ISXmlElement</td><td>ISXmlElement_Parent</td><td>Y</td><td/><td/><td>ISXmlElement</td><td>1</td><td>Identifier</td><td/><td>Foreign key into ISXMLElement table.</td></row>
+ <row><td>ISXmlElement</td><td>ISXmlFile_</td><td>N</td><td/><td/><td>ISXmlFile</td><td>1</td><td>Identifier</td><td/><td>Foreign key into XmlFile table.</td></row>
+ <row><td>ISXmlElement</td><td>XPath</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>XPath fragment including any operators</td></row>
+ <row><td>ISXmlElementAttrib</td><td>ISAttributes</td><td>Y</td><td/><td/><td/><td/><td>Number</td><td/><td>Internal XML elementattib attributes</td></row>
+ <row><td>ISXmlElementAttrib</td><td>ISXmlElementAttrib</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Primary key, non-localized, internal token for Xml element attribute</td></row>
+ <row><td>ISXmlElementAttrib</td><td>ISXmlElement_</td><td>N</td><td/><td/><td>ISXmlElement</td><td>1</td><td>Identifier</td><td/><td>Foreign key into ISXMLElement table.</td></row>
+ <row><td>ISXmlElementAttrib</td><td>Name</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Localized attribute name</td></row>
+ <row><td>ISXmlElementAttrib</td><td>Value</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Localized attribute value</td></row>
+ <row><td>ISXmlFile</td><td>Component_</td><td>N</td><td/><td/><td>Component</td><td>1</td><td>Identifier</td><td/><td>Foreign key into Component table.</td></row>
+ <row><td>ISXmlFile</td><td>Directory</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Foreign key into Directory table.</td></row>
+ <row><td>ISXmlFile</td><td>FileName</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Localized XML file name</td></row>
+ <row><td>ISXmlFile</td><td>ISAttributes</td><td>Y</td><td/><td/><td/><td/><td>Number</td><td/><td>Internal XML file attributes</td></row>
+ <row><td>ISXmlFile</td><td>ISXmlFile</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Primary key, non-localized,internal token for Xml file</td></row>
+ <row><td>ISXmlFile</td><td>SelectionNamespaces</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Selection namespaces</td></row>
+ <row><td>ISXmlLocator</td><td>Attribute</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>The name of an attribute within the XML element.</td></row>
+ <row><td>ISXmlLocator</td><td>Element</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>XPath query that will locate an element in an XML file.</td></row>
+ <row><td>ISXmlLocator</td><td>ISAttributes</td><td>Y</td><td/><td/><td/><td/><td/><td>0;1;2</td><td/></row>
+ <row><td>ISXmlLocator</td><td>Parent</td><td>Y</td><td/><td/><td/><td/><td>Identifier</td><td/><td>The parent file signature. It is also a foreign key in the Signature table.</td></row>
+ <row><td>ISXmlLocator</td><td>Signature_</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>The Signature_ represents a unique file signature and is also the foreign key in the Signature, RegLocator, IniLocator, ISXmlLocator, CompLocator and the DrLocator tables.</td></row>
+ <row><td>Icon</td><td>Data</td><td>Y</td><td/><td/><td/><td/><td>Binary</td><td/><td>Binary stream. The binary icon data in PE (.DLL or .EXE) or icon (.ICO) format.</td></row>
+ <row><td>Icon</td><td>ISBuildSourcePath</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Full path to the ICO or EXE file.</td></row>
+ <row><td>Icon</td><td>ISIconIndex</td><td>Y</td><td>-32767</td><td>32767</td><td/><td/><td/><td/><td>Optional icon index to be extracted.</td></row>
+ <row><td>Icon</td><td>Name</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Primary key. Name of the icon file.</td></row>
+ <row><td>IniFile</td><td>Action</td><td>N</td><td/><td/><td/><td/><td/><td>0;1;3</td><td>The type of modification to be made, one of iifEnum</td></row>
+ <row><td>IniFile</td><td>Component_</td><td>N</td><td/><td/><td>Component</td><td>1</td><td>Identifier</td><td/><td>Foreign key into the Component table referencing component that controls the installing of the .INI value.</td></row>
+ <row><td>IniFile</td><td>DirProperty</td><td>Y</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Foreign key into the Directory table denoting the directory where the .INI file is.</td></row>
+ <row><td>IniFile</td><td>FileName</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>The .INI file name in which to write the information</td></row>
+ <row><td>IniFile</td><td>IniFile</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Primary key, non-localized token.</td></row>
+ <row><td>IniFile</td><td>Key</td><td>N</td><td/><td/><td/><td/><td>Formatted</td><td/><td>The .INI file key below Section.</td></row>
+ <row><td>IniFile</td><td>Section</td><td>N</td><td/><td/><td/><td/><td>Formatted</td><td/><td>The .INI file Section.</td></row>
+ <row><td>IniFile</td><td>Value</td><td>N</td><td/><td/><td/><td/><td>Formatted</td><td/><td>The value to be written.</td></row>
+ <row><td>IniLocator</td><td>Field</td><td>Y</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>The field in the .INI line. If Field is null or 0 the entire line is read.</td></row>
+ <row><td>IniLocator</td><td>FileName</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>The .INI file name.</td></row>
+ <row><td>IniLocator</td><td>Key</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Key value (followed by an equals sign in INI file).</td></row>
+ <row><td>IniLocator</td><td>Section</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Section name within in file (within square brackets in INI file).</td></row>
+ <row><td>IniLocator</td><td>Signature_</td><td>N</td><td/><td/><td>Signature</td><td>1</td><td>Identifier</td><td/><td>The table key. The Signature_ represents a unique file signature and is also the foreign key in the Signature table.</td></row>
+ <row><td>IniLocator</td><td>Type</td><td>Y</td><td>0</td><td>2</td><td/><td/><td/><td/><td>An integer value that determines if the .INI value read is a filename or a directory location or to be used as is w/o interpretation.</td></row>
+ <row><td>InstallExecuteSequence</td><td>Action</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Name of action to invoke, either in the engine or the handler DLL.</td></row>
+ <row><td>InstallExecuteSequence</td><td>Condition</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Optional expression which skips the action if evaluates to expFalse.If the expression syntax is invalid, the engine will terminate, returning iesBadActionData.</td></row>
+ <row><td>InstallExecuteSequence</td><td>ISAttributes</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>This is used to store MM Custom Action Types</td></row>
+ <row><td>InstallExecuteSequence</td><td>ISComments</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Author’s comments on this Sequence.</td></row>
+ <row><td>InstallExecuteSequence</td><td>Sequence</td><td>Y</td><td>-4</td><td>32767</td><td/><td/><td/><td/><td>Number that determines the sort order in which the actions are to be executed. Leave blank to suppress action.</td></row>
+ <row><td>InstallShield</td><td>Property</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Name of property, uppercase if settable by launcher or loader.</td></row>
+ <row><td>InstallShield</td><td>Value</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>String value for property.</td></row>
+ <row><td>InstallUISequence</td><td>Action</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Name of action to invoke, either in the engine or the handler DLL.</td></row>
+ <row><td>InstallUISequence</td><td>Condition</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Optional expression which skips the action if evaluates to expFalse.If the expression syntax is invalid, the engine will terminate, returning iesBadActionData.</td></row>
+ <row><td>InstallUISequence</td><td>ISAttributes</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>This is used to store MM Custom Action Types</td></row>
+ <row><td>InstallUISequence</td><td>ISComments</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Author’s comments on this Sequence.</td></row>
+ <row><td>InstallUISequence</td><td>Sequence</td><td>Y</td><td>-4</td><td>32767</td><td/><td/><td/><td/><td>Number that determines the sort order in which the actions are to be executed. Leave blank to suppress action.</td></row>
+ <row><td>IsolatedComponent</td><td>Component_Application</td><td>N</td><td/><td/><td>Component</td><td>1</td><td>Identifier</td><td/><td>Key to Component table item for application</td></row>
+ <row><td>IsolatedComponent</td><td>Component_Shared</td><td>N</td><td/><td/><td>Component</td><td>1</td><td>Identifier</td><td/><td>Key to Component table item to be isolated</td></row>
+ <row><td>LaunchCondition</td><td>Condition</td><td>N</td><td/><td/><td/><td/><td>Condition</td><td/><td>Expression which must evaluate to TRUE in order for install to commence.</td></row>
+ <row><td>LaunchCondition</td><td>Description</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Localizable text to display when condition fails and install must abort.</td></row>
+ <row><td>ListBox</td><td>Order</td><td>N</td><td>1</td><td>32767</td><td/><td/><td/><td/><td>A positive integer used to determine the ordering of the items within one list..The integers do not have to be consecutive.</td></row>
+ <row><td>ListBox</td><td>Property</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>A named property to be tied to this item. All the items tied to the same property become part of the same listbox.</td></row>
+ <row><td>ListBox</td><td>Text</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>The visible text to be assigned to the item. Optional. If this entry or the entire column is missing, the text is the same as the value.</td></row>
+ <row><td>ListBox</td><td>Value</td><td>N</td><td/><td/><td/><td/><td>Formatted</td><td/><td>The value string associated with this item. Selecting the line will set the associated property to this value.</td></row>
+ <row><td>ListView</td><td>Binary_</td><td>Y</td><td/><td/><td>Binary</td><td>1</td><td>Identifier</td><td/><td>The name of the icon to be displayed with the icon. The binary information is looked up from the Binary Table.</td></row>
+ <row><td>ListView</td><td>Order</td><td>N</td><td>1</td><td>32767</td><td/><td/><td/><td/><td>A positive integer used to determine the ordering of the items within one list..The integers do not have to be consecutive.</td></row>
+ <row><td>ListView</td><td>Property</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>A named property to be tied to this item. All the items tied to the same property become part of the same listview.</td></row>
+ <row><td>ListView</td><td>Text</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>The visible text to be assigned to the item. Optional. If this entry or the entire column is missing, the text is the same as the value.</td></row>
+ <row><td>ListView</td><td>Value</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>The value string associated with this item. Selecting the line will set the associated property to this value.</td></row>
+ <row><td>LockPermissions</td><td>Domain</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Domain name for user whose permissions are being set. (usually a property)</td></row>
+ <row><td>LockPermissions</td><td>LockObject</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Foreign key into Registry or File table</td></row>
+ <row><td>LockPermissions</td><td>Permission</td><td>Y</td><td>-2147483647</td><td>2147483647</td><td/><td/><td/><td/><td>Permission Access mask. Full Control = 268435456 (GENERIC_ALL = 0x10000000)</td></row>
+ <row><td>LockPermissions</td><td>Table</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td>Directory;File;Registry</td><td>Reference to another table name</td></row>
+ <row><td>LockPermissions</td><td>User</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>User for permissions to be set. (usually a property)</td></row>
+ <row><td>MIME</td><td>CLSID</td><td>Y</td><td/><td/><td>Class</td><td>1</td><td>Guid</td><td/><td>Optional associated CLSID.</td></row>
+ <row><td>MIME</td><td>ContentType</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Primary key. Context identifier, typically "type/format".</td></row>
+ <row><td>MIME</td><td>Extension_</td><td>N</td><td/><td/><td>Extension</td><td>1</td><td>Text</td><td/><td>Optional associated extension (without dot)</td></row>
+ <row><td>Media</td><td>Cabinet</td><td>Y</td><td/><td/><td/><td/><td>Cabinet</td><td/><td>If some or all of the files stored on the media are compressed in a cabinet, the name of that cabinet.</td></row>
+ <row><td>Media</td><td>DiskId</td><td>N</td><td>1</td><td>32767</td><td/><td/><td/><td/><td>Primary key, integer to determine sort order for table.</td></row>
+ <row><td>Media</td><td>DiskPrompt</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Disk name: the visible text actually printed on the disk. This will be used to prompt the user when this disk needs to be inserted.</td></row>
+ <row><td>Media</td><td>LastSequence</td><td>N</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>File sequence number for the last file for this media.</td></row>
+ <row><td>Media</td><td>Source</td><td>Y</td><td/><td/><td/><td/><td>Property</td><td/><td>The property defining the location of the cabinet file.</td></row>
+ <row><td>Media</td><td>VolumeLabel</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>The label attributed to the volume.</td></row>
+ <row><td>MoveFile</td><td>Component_</td><td>N</td><td/><td/><td>Component</td><td>1</td><td>Identifier</td><td/><td>If this component is not "selected" for installation or removal, no action will be taken on the associated MoveFile entry</td></row>
+ <row><td>MoveFile</td><td>DestFolder</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Name of a property whose value is assumed to resolve to the full path to the destination directory</td></row>
+ <row><td>MoveFile</td><td>DestName</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Name to be given to the original file after it is moved or copied. If blank, the destination file will be given the same name as the source file</td></row>
+ <row><td>MoveFile</td><td>FileKey</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Primary key that uniquely identifies a particular MoveFile record</td></row>
+ <row><td>MoveFile</td><td>Options</td><td>N</td><td>0</td><td>1</td><td/><td/><td/><td/><td>Integer value specifying the MoveFile operating mode, one of imfoEnum</td></row>
+ <row><td>MoveFile</td><td>SourceFolder</td><td>Y</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Name of a property whose value is assumed to resolve to the full path to the source directory</td></row>
+ <row><td>MoveFile</td><td>SourceName</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Name of the source file(s) to be moved or copied. Can contain the '*' or '?' wildcards.</td></row>
+ <row><td>MsiAssembly</td><td>Attributes</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>Assembly attributes</td></row>
+ <row><td>MsiAssembly</td><td>Component_</td><td>N</td><td/><td/><td>Component</td><td>1</td><td>Identifier</td><td/><td>Foreign key into Component table.</td></row>
+ <row><td>MsiAssembly</td><td>Feature_</td><td>N</td><td/><td/><td>Feature</td><td>1</td><td>Identifier</td><td/><td>Foreign key into Feature table.</td></row>
+ <row><td>MsiAssembly</td><td>File_Application</td><td>Y</td><td/><td/><td>File</td><td>1</td><td>Identifier</td><td/><td>Foreign key into File table, denoting the application context for private assemblies. Null for global assemblies.</td></row>
+ <row><td>MsiAssembly</td><td>File_Manifest</td><td>Y</td><td/><td/><td>File</td><td>1</td><td>Identifier</td><td/><td>Foreign key into the File table denoting the manifest file for the assembly.</td></row>
+ <row><td>MsiAssemblyName</td><td>Component_</td><td>N</td><td/><td/><td>Component</td><td>1</td><td>Identifier</td><td/><td>Foreign key into Component table.</td></row>
+ <row><td>MsiAssemblyName</td><td>Name</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>The name part of the name-value pairs for the assembly name.</td></row>
+ <row><td>MsiAssemblyName</td><td>Value</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>The value part of the name-value pairs for the assembly name.</td></row>
+ <row><td>MsiDigitalCertificate</td><td>CertData</td><td>N</td><td/><td/><td/><td/><td>Binary</td><td/><td>A certificate context blob for a signer certificate</td></row>
+ <row><td>MsiDigitalCertificate</td><td>DigitalCertificate</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>A unique identifier for the row</td></row>
+ <row><td>MsiDigitalSignature</td><td>DigitalCertificate_</td><td>N</td><td/><td/><td>MsiDigitalCertificate</td><td>1</td><td>Identifier</td><td/><td>Foreign key to MsiDigitalCertificate table identifying the signer certificate</td></row>
+ <row><td>MsiDigitalSignature</td><td>Hash</td><td>Y</td><td/><td/><td/><td/><td>Binary</td><td/><td>The encoded hash blob from the digital signature</td></row>
+ <row><td>MsiDigitalSignature</td><td>SignObject</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Foreign key to Media table</td></row>
+ <row><td>MsiDigitalSignature</td><td>Table</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Reference to another table name (only Media table is supported)</td></row>
+ <row><td>MsiDriverPackages</td><td>Component</td><td>N</td><td/><td/><td>Component</td><td>1</td><td>Identifier</td><td/><td>Primary key used to identify a particular component record.</td></row>
+ <row><td>MsiDriverPackages</td><td>Flags</td><td>N</td><td/><td/><td/><td/><td/><td/><td>Driver package flags</td></row>
+ <row><td>MsiDriverPackages</td><td>ReferenceComponents</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>MsiDriverPackages</td><td>Sequence</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>Installation sequence number</td></row>
+ <row><td>MsiFileHash</td><td>File_</td><td>N</td><td/><td/><td>File</td><td>1</td><td>Identifier</td><td/><td>Primary key, foreign key into File table referencing file with this hash</td></row>
+ <row><td>MsiFileHash</td><td>HashPart1</td><td>N</td><td/><td/><td/><td/><td/><td/><td>Size of file in bytes (long integer).</td></row>
+ <row><td>MsiFileHash</td><td>HashPart2</td><td>N</td><td/><td/><td/><td/><td/><td/><td>Size of file in bytes (long integer).</td></row>
+ <row><td>MsiFileHash</td><td>HashPart3</td><td>N</td><td/><td/><td/><td/><td/><td/><td>Size of file in bytes (long integer).</td></row>
+ <row><td>MsiFileHash</td><td>HashPart4</td><td>N</td><td/><td/><td/><td/><td/><td/><td>Size of file in bytes (long integer).</td></row>
+ <row><td>MsiFileHash</td><td>Options</td><td>N</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>Various options and attributes for this hash.</td></row>
+ <row><td>MsiPatchCertificate</td><td>DigitalCertificate_</td><td>N</td><td/><td/><td>MsiDigitalCertificate</td><td>1</td><td>Identifier</td><td/><td>A foreign key to the digital certificate table</td></row>
+ <row><td>MsiPatchCertificate</td><td>PatchCertificate</td><td>Y</td><td/><td/><td/><td/><td>Identifier</td><td/><td>A unique identifier for the row</td></row>
+ <row><td>MsiPatchMetadata</td><td>Company</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Optional company name</td></row>
+ <row><td>MsiPatchMetadata</td><td>PatchConfiguration_</td><td>N</td><td/><td/><td>ISPatchConfiguration</td><td>1</td><td>Text</td><td/><td>Foreign key to the ISPatchConfiguration table</td></row>
+ <row><td>MsiPatchMetadata</td><td>Property</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Name of the metadata</td></row>
+ <row><td>MsiPatchMetadata</td><td>Value</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Value of the metadata</td></row>
+ <row><td>MsiPatchOldAssemblyFile</td><td>Assembly_</td><td>Y</td><td/><td/><td>MsiPatchOldAssemblyName</td><td>1</td><td/><td/><td/></row>
+ <row><td>MsiPatchOldAssemblyFile</td><td>File_</td><td>N</td><td/><td/><td>File</td><td>1</td><td/><td/><td/></row>
+ <row><td>MsiPatchOldAssemblyName</td><td>Assembly_</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>MsiPatchOldAssemblyName</td><td>Name</td><td>N</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>MsiPatchOldAssemblyName</td><td>Value</td><td>Y</td><td/><td/><td/><td/><td/><td/><td/></row>
+ <row><td>MsiPatchSequence</td><td>PatchConfiguration_</td><td>N</td><td/><td/><td>ISPatchConfiguration</td><td>1</td><td>Text</td><td/><td>Foreign key to the patch configuration table</td></row>
+ <row><td>MsiPatchSequence</td><td>PatchFamily</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Name of the family to which this patch belongs</td></row>
+ <row><td>MsiPatchSequence</td><td>Sequence</td><td>N</td><td/><td/><td/><td/><td>Version</td><td/><td>The version of this patch in this family</td></row>
+ <row><td>MsiPatchSequence</td><td>Supersede</td><td>N</td><td/><td/><td/><td/><td>Integer</td><td/><td>Supersede</td></row>
+ <row><td>MsiPatchSequence</td><td>Target</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Target product codes for this patch family</td></row>
+ <row><td>ODBCAttribute</td><td>Attribute</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Name of ODBC driver attribute</td></row>
+ <row><td>ODBCAttribute</td><td>Driver_</td><td>N</td><td/><td/><td>ODBCDriver</td><td>1</td><td>Identifier</td><td/><td>Reference to ODBC driver in ODBCDriver table</td></row>
+ <row><td>ODBCAttribute</td><td>Value</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Value for ODBC driver attribute</td></row>
+ <row><td>ODBCDataSource</td><td>Component_</td><td>N</td><td/><td/><td>Component</td><td>1</td><td>Identifier</td><td/><td>Reference to associated component</td></row>
+ <row><td>ODBCDataSource</td><td>DataSource</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Primary key, non-localized.internal token for data source</td></row>
+ <row><td>ODBCDataSource</td><td>Description</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Text used as registered name for data source</td></row>
+ <row><td>ODBCDataSource</td><td>DriverDescription</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Reference to driver description, may be existing driver</td></row>
+ <row><td>ODBCDataSource</td><td>Registration</td><td>N</td><td>0</td><td>1</td><td/><td/><td/><td/><td>Registration option: 0=machine, 1=user, others t.b.d.</td></row>
+ <row><td>ODBCDriver</td><td>Component_</td><td>N</td><td/><td/><td>Component</td><td>1</td><td>Identifier</td><td/><td>Reference to associated component</td></row>
+ <row><td>ODBCDriver</td><td>Description</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Text used as registered name for driver, non-localized</td></row>
+ <row><td>ODBCDriver</td><td>Driver</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Primary key, non-localized.internal token for driver</td></row>
+ <row><td>ODBCDriver</td><td>File_</td><td>N</td><td/><td/><td>File</td><td>1</td><td>Identifier</td><td/><td>Reference to key driver file</td></row>
+ <row><td>ODBCDriver</td><td>File_Setup</td><td>Y</td><td/><td/><td>File</td><td>1</td><td>Identifier</td><td/><td>Optional reference to key driver setup DLL</td></row>
+ <row><td>ODBCSourceAttribute</td><td>Attribute</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Name of ODBC data source attribute</td></row>
+ <row><td>ODBCSourceAttribute</td><td>DataSource_</td><td>N</td><td/><td/><td>ODBCDataSource</td><td>1</td><td>Identifier</td><td/><td>Reference to ODBC data source in ODBCDataSource table</td></row>
+ <row><td>ODBCSourceAttribute</td><td>Value</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Value for ODBC data source attribute</td></row>
+ <row><td>ODBCTranslator</td><td>Component_</td><td>N</td><td/><td/><td>Component</td><td>1</td><td>Identifier</td><td/><td>Reference to associated component</td></row>
+ <row><td>ODBCTranslator</td><td>Description</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>Text used as registered name for translator</td></row>
+ <row><td>ODBCTranslator</td><td>File_</td><td>N</td><td/><td/><td>File</td><td>1</td><td>Identifier</td><td/><td>Reference to key translator file</td></row>
+ <row><td>ODBCTranslator</td><td>File_Setup</td><td>Y</td><td/><td/><td>File</td><td>1</td><td>Identifier</td><td/><td>Optional reference to key translator setup DLL</td></row>
+ <row><td>ODBCTranslator</td><td>Translator</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Primary key, non-localized.internal token for translator</td></row>
+ <row><td>Patch</td><td>Attributes</td><td>N</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>Integer containing bit flags representing patch attributes</td></row>
+ <row><td>Patch</td><td>File_</td><td>N</td><td/><td/><td>File</td><td>1</td><td>Identifier</td><td/><td>Primary key, non-localized token, foreign key to File table, must match identifier in cabinet.</td></row>
+ <row><td>Patch</td><td>Header</td><td>Y</td><td/><td/><td/><td/><td>Binary</td><td/><td>Binary stream. The patch header, used for patch validation.</td></row>
+ <row><td>Patch</td><td>ISBuildSourcePath</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Full path to patch header.</td></row>
+ <row><td>Patch</td><td>PatchSize</td><td>N</td><td>0</td><td>2147483647</td><td/><td/><td/><td/><td>Size of patch in bytes (long integer).</td></row>
+ <row><td>Patch</td><td>Sequence</td><td>N</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>Primary key, sequence with respect to the media images; order must track cabinet order.</td></row>
+ <row><td>PatchPackage</td><td>Media_</td><td>N</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>Foreign key to DiskId column of Media table. Indicates the disk containing the patch package.</td></row>
+ <row><td>PatchPackage</td><td>PatchId</td><td>N</td><td/><td/><td/><td/><td>Guid</td><td/><td>A unique string GUID representing this patch.</td></row>
+ <row><td>ProgId</td><td>Class_</td><td>Y</td><td/><td/><td>Class</td><td>1</td><td>Guid</td><td/><td>The CLSID of an OLE factory corresponding to the ProgId.</td></row>
+ <row><td>ProgId</td><td>Description</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Localized description for the Program identifier.</td></row>
+ <row><td>ProgId</td><td>ISAttributes</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>This is used to store Installshield custom properties of a component, like ExtractIcon, etc.</td></row>
+ <row><td>ProgId</td><td>IconIndex</td><td>Y</td><td>-32767</td><td>32767</td><td/><td/><td/><td/><td>Optional icon index.</td></row>
+ <row><td>ProgId</td><td>Icon_</td><td>Y</td><td/><td/><td>Icon</td><td>1</td><td>Identifier</td><td/><td>Optional foreign key into the Icon Table, specifying the icon file associated with this ProgId. Will be written under the DefaultIcon key.</td></row>
+ <row><td>ProgId</td><td>ProgId</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>The Program Identifier. Primary key.</td></row>
+ <row><td>ProgId</td><td>ProgId_Parent</td><td>Y</td><td/><td/><td>ProgId</td><td>1</td><td>Text</td><td/><td>The Parent Program Identifier. If specified, the ProgId column becomes a version independent prog id.</td></row>
+ <row><td>Property</td><td>ISComments</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>User Comments.</td></row>
+ <row><td>Property</td><td>Property</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Name of property, uppercase if settable by launcher or loader.</td></row>
+ <row><td>Property</td><td>Value</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>String value for property.</td></row>
+ <row><td>PublishComponent</td><td>AppData</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>This is localisable Application specific data that can be associated with a Qualified Component.</td></row>
+ <row><td>PublishComponent</td><td>ComponentId</td><td>N</td><td/><td/><td/><td/><td>Guid</td><td/><td>A string GUID that represents the component id that will be requested by the alien product.</td></row>
+ <row><td>PublishComponent</td><td>Component_</td><td>N</td><td/><td/><td>Component</td><td>1</td><td>Identifier</td><td/><td>Foreign key into the Component table.</td></row>
+ <row><td>PublishComponent</td><td>Feature_</td><td>N</td><td/><td/><td>Feature</td><td>1</td><td>Identifier</td><td/><td>Foreign key into the Feature table.</td></row>
+ <row><td>PublishComponent</td><td>Qualifier</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>This is defined only when the ComponentId column is an Qualified Component Id. This is the Qualifier for ProvideComponentIndirect.</td></row>
+ <row><td>RadioButton</td><td>Height</td><td>N</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>The height of the button.</td></row>
+ <row><td>RadioButton</td><td>Help</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>The help strings used with the button. The text is optional.</td></row>
+ <row><td>RadioButton</td><td>ISControlId</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>A number used to represent the control ID of the Control, Used in Dialog export</td></row>
+ <row><td>RadioButton</td><td>Order</td><td>N</td><td>1</td><td>32767</td><td/><td/><td/><td/><td>A positive integer used to determine the ordering of the items within one list..The integers do not have to be consecutive.</td></row>
+ <row><td>RadioButton</td><td>Property</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>A named property to be tied to this radio button. All the buttons tied to the same property become part of the same group.</td></row>
+ <row><td>RadioButton</td><td>Text</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>The visible title to be assigned to the radio button.</td></row>
+ <row><td>RadioButton</td><td>Value</td><td>N</td><td/><td/><td/><td/><td>Formatted</td><td/><td>The value string associated with this button. Selecting the button will set the associated property to this value.</td></row>
+ <row><td>RadioButton</td><td>Width</td><td>N</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>The width of the button.</td></row>
+ <row><td>RadioButton</td><td>X</td><td>N</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>The horizontal coordinate of the upper left corner of the bounding rectangle of the radio button.</td></row>
+ <row><td>RadioButton</td><td>Y</td><td>N</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>The vertical coordinate of the upper left corner of the bounding rectangle of the radio button.</td></row>
+ <row><td>RegLocator</td><td>Key</td><td>N</td><td/><td/><td/><td/><td>RegPath</td><td/><td>The key for the registry value.</td></row>
+ <row><td>RegLocator</td><td>Name</td><td>Y</td><td/><td/><td/><td/><td>Formatted</td><td/><td>The registry value name.</td></row>
+ <row><td>RegLocator</td><td>Root</td><td>N</td><td>0</td><td>3</td><td/><td/><td/><td/><td>The predefined root key for the registry value, one of rrkEnum.</td></row>
+ <row><td>RegLocator</td><td>Signature_</td><td>N</td><td/><td/><td>Signature</td><td>1</td><td>Identifier</td><td/><td>The table key. The Signature_ represents a unique file signature and is also the foreign key in the Signature table. If the type is 0, the registry values refers a directory, and _Signature is not a foreign key.</td></row>
+ <row><td>RegLocator</td><td>Type</td><td>Y</td><td>0</td><td>18</td><td/><td/><td/><td/><td>An integer value that determines if the registry value is a filename or a directory location or to be used as is w/o interpretation.</td></row>
+ <row><td>Registry</td><td>Component_</td><td>N</td><td/><td/><td>Component</td><td>1</td><td>Identifier</td><td/><td>Foreign key into the Component table referencing component that controls the installing of the registry value.</td></row>
+ <row><td>Registry</td><td>ISAttributes</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>This is used to store Installshield custom properties of a registry item. Currently the only one is Automatic.</td></row>
+ <row><td>Registry</td><td>Key</td><td>N</td><td/><td/><td/><td/><td>RegPath</td><td/><td>The key for the registry value.</td></row>
+ <row><td>Registry</td><td>Name</td><td>Y</td><td/><td/><td/><td/><td>Formatted</td><td/><td>The registry value name.</td></row>
+ <row><td>Registry</td><td>Registry</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Primary key, non-localized token.</td></row>
+ <row><td>Registry</td><td>Root</td><td>N</td><td>-1</td><td>3</td><td/><td/><td/><td/><td>The predefined root key for the registry value, one of rrkEnum.</td></row>
+ <row><td>Registry</td><td>Value</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>The registry value.</td></row>
+ <row><td>RemoveFile</td><td>Component_</td><td>N</td><td/><td/><td>Component</td><td>1</td><td>Identifier</td><td/><td>Foreign key referencing Component that controls the file to be removed.</td></row>
+ <row><td>RemoveFile</td><td>DirProperty</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Name of a property whose value is assumed to resolve to the full pathname to the folder of the file to be removed.</td></row>
+ <row><td>RemoveFile</td><td>FileKey</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Primary key used to identify a particular file entry</td></row>
+ <row><td>RemoveFile</td><td>FileName</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Name of the file to be removed.</td></row>
+ <row><td>RemoveFile</td><td>InstallMode</td><td>N</td><td/><td/><td/><td/><td/><td>1;2;3</td><td>Installation option, one of iimEnum.</td></row>
+ <row><td>RemoveIniFile</td><td>Action</td><td>N</td><td/><td/><td/><td/><td/><td>2;4</td><td>The type of modification to be made, one of iifEnum.</td></row>
+ <row><td>RemoveIniFile</td><td>Component_</td><td>N</td><td/><td/><td>Component</td><td>1</td><td>Identifier</td><td/><td>Foreign key into the Component table referencing component that controls the deletion of the .INI value.</td></row>
+ <row><td>RemoveIniFile</td><td>DirProperty</td><td>Y</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Foreign key into the Directory table denoting the directory where the .INI file is.</td></row>
+ <row><td>RemoveIniFile</td><td>FileName</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>The .INI file name in which to delete the information</td></row>
+ <row><td>RemoveIniFile</td><td>Key</td><td>N</td><td/><td/><td/><td/><td>Formatted</td><td/><td>The .INI file key below Section.</td></row>
+ <row><td>RemoveIniFile</td><td>RemoveIniFile</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Primary key, non-localized token.</td></row>
+ <row><td>RemoveIniFile</td><td>Section</td><td>N</td><td/><td/><td/><td/><td>Formatted</td><td/><td>The .INI file Section.</td></row>
+ <row><td>RemoveIniFile</td><td>Value</td><td>Y</td><td/><td/><td/><td/><td>Formatted</td><td/><td>The value to be deleted. The value is required when Action is iifIniRemoveTag</td></row>
+ <row><td>RemoveRegistry</td><td>Component_</td><td>N</td><td/><td/><td>Component</td><td>1</td><td>Identifier</td><td/><td>Foreign key into the Component table referencing component that controls the deletion of the registry value.</td></row>
+ <row><td>RemoveRegistry</td><td>Key</td><td>N</td><td/><td/><td/><td/><td>RegPath</td><td/><td>The key for the registry value.</td></row>
+ <row><td>RemoveRegistry</td><td>Name</td><td>Y</td><td/><td/><td/><td/><td>Formatted</td><td/><td>The registry value name.</td></row>
+ <row><td>RemoveRegistry</td><td>RemoveRegistry</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Primary key, non-localized token.</td></row>
+ <row><td>RemoveRegistry</td><td>Root</td><td>N</td><td>-1</td><td>3</td><td/><td/><td/><td/><td>The predefined root key for the registry value, one of rrkEnum</td></row>
+ <row><td>ReserveCost</td><td>Component_</td><td>N</td><td/><td/><td>Component</td><td>1</td><td>Identifier</td><td/><td>Reserve a specified amount of space if this component is to be installed.</td></row>
+ <row><td>ReserveCost</td><td>ReserveFolder</td><td>Y</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Name of a property whose value is assumed to resolve to the full path to the destination directory</td></row>
+ <row><td>ReserveCost</td><td>ReserveKey</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Primary key that uniquely identifies a particular ReserveCost record</td></row>
+ <row><td>ReserveCost</td><td>ReserveLocal</td><td>N</td><td>0</td><td>2147483647</td><td/><td/><td/><td/><td>Disk space to reserve if linked component is installed locally.</td></row>
+ <row><td>ReserveCost</td><td>ReserveSource</td><td>N</td><td>0</td><td>2147483647</td><td/><td/><td/><td/><td>Disk space to reserve if linked component is installed to run from the source location.</td></row>
+ <row><td>SFPCatalog</td><td>Catalog</td><td>Y</td><td/><td/><td/><td/><td>Binary</td><td/><td>SFP Catalog</td></row>
+ <row><td>SFPCatalog</td><td>Dependency</td><td>Y</td><td/><td/><td/><td/><td>Formatted</td><td/><td>Parent catalog - only used by SFP</td></row>
+ <row><td>SFPCatalog</td><td>SFPCatalog</td><td>N</td><td/><td/><td/><td/><td>Filename</td><td/><td>File name for the catalog.</td></row>
+ <row><td>SelfReg</td><td>Cost</td><td>Y</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>The cost of registering the module.</td></row>
+ <row><td>SelfReg</td><td>File_</td><td>N</td><td/><td/><td>File</td><td>1</td><td>Identifier</td><td/><td>Foreign key into the File table denoting the module that needs to be registered.</td></row>
+ <row><td>ServiceControl</td><td>Arguments</td><td>Y</td><td/><td/><td/><td/><td>Formatted</td><td/><td>Arguments for the service. Separate by [~].</td></row>
+ <row><td>ServiceControl</td><td>Component_</td><td>N</td><td/><td/><td>Component</td><td>1</td><td>Identifier</td><td/><td>Required foreign key into the Component Table that controls the startup of the service</td></row>
+ <row><td>ServiceControl</td><td>Event</td><td>N</td><td>0</td><td>187</td><td/><td/><td/><td/><td>Bit field: Install: 0x1 = Start, 0x2 = Stop, 0x8 = Delete, Uninstall: 0x10 = Start, 0x20 = Stop, 0x80 = Delete</td></row>
+ <row><td>ServiceControl</td><td>Name</td><td>N</td><td/><td/><td/><td/><td>Formatted</td><td/><td>Name of a service. /, \, comma and space are invalid</td></row>
+ <row><td>ServiceControl</td><td>ServiceControl</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Primary key, non-localized token.</td></row>
+ <row><td>ServiceControl</td><td>Wait</td><td>Y</td><td>0</td><td>1</td><td/><td/><td/><td/><td>Boolean for whether to wait for the service to fully start</td></row>
+ <row><td>ServiceInstall</td><td>Arguments</td><td>Y</td><td/><td/><td/><td/><td>Formatted</td><td/><td>Arguments to include in every start of the service, passed to WinMain</td></row>
+ <row><td>ServiceInstall</td><td>Component_</td><td>N</td><td/><td/><td>Component</td><td>1</td><td>Identifier</td><td/><td>Required foreign key into the Component Table that controls the startup of the service</td></row>
+ <row><td>ServiceInstall</td><td>Dependencies</td><td>Y</td><td/><td/><td/><td/><td>Formatted</td><td/><td>Other services this depends on to start. Separate by [~], and end with [~][~]</td></row>
+ <row><td>ServiceInstall</td><td>Description</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Description of service.</td></row>
+ <row><td>ServiceInstall</td><td>DisplayName</td><td>Y</td><td/><td/><td/><td/><td>Formatted</td><td/><td>External Name of the Service</td></row>
+ <row><td>ServiceInstall</td><td>ErrorControl</td><td>N</td><td>-2147483647</td><td>2147483647</td><td/><td/><td/><td/><td>Severity of error if service fails to start</td></row>
+ <row><td>ServiceInstall</td><td>LoadOrderGroup</td><td>Y</td><td/><td/><td/><td/><td>Formatted</td><td/><td>LoadOrderGroup</td></row>
+ <row><td>ServiceInstall</td><td>Name</td><td>N</td><td/><td/><td/><td/><td>Formatted</td><td/><td>Internal Name of the Service</td></row>
+ <row><td>ServiceInstall</td><td>Password</td><td>Y</td><td/><td/><td/><td/><td>Formatted</td><td/><td>password to run service with. (with StartName)</td></row>
+ <row><td>ServiceInstall</td><td>ServiceInstall</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Primary key, non-localized token.</td></row>
+ <row><td>ServiceInstall</td><td>ServiceType</td><td>N</td><td>-2147483647</td><td>2147483647</td><td/><td/><td/><td/><td>Type of the service</td></row>
+ <row><td>ServiceInstall</td><td>StartName</td><td>Y</td><td/><td/><td/><td/><td>Formatted</td><td/><td>User or object name to run service as</td></row>
+ <row><td>ServiceInstall</td><td>StartType</td><td>N</td><td>0</td><td>4</td><td/><td/><td/><td/><td>Type of the service</td></row>
+ <row><td>Shortcut</td><td>Arguments</td><td>Y</td><td/><td/><td/><td/><td>Formatted</td><td/><td>The command-line arguments for the shortcut.</td></row>
+ <row><td>Shortcut</td><td>Component_</td><td>N</td><td/><td/><td>Component</td><td>1</td><td>Identifier</td><td/><td>Foreign key into the Component table denoting the component whose selection gates the the shortcut creation/deletion.</td></row>
+ <row><td>Shortcut</td><td>Description</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>The description for the shortcut.</td></row>
+ <row><td>Shortcut</td><td>Directory_</td><td>N</td><td/><td/><td>Directory</td><td>1</td><td>Identifier</td><td/><td>Foreign key into the Directory table denoting the directory where the shortcut file is created.</td></row>
+ <row><td>Shortcut</td><td>Hotkey</td><td>Y</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>The hotkey for the shortcut. It has the virtual-key code for the key in the low-order byte, and the modifier flags in the high-order byte. </td></row>
+ <row><td>Shortcut</td><td>ISAttributes</td><td>Y</td><td/><td/><td/><td/><td/><td/><td>This is used to store Installshield custom properties of a shortcut. Mainly used in pro project types.</td></row>
+ <row><td>Shortcut</td><td>ISComments</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Author’s comments on this Shortcut.</td></row>
+ <row><td>Shortcut</td><td>ISShortcutName</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>A non-unique name for the shortcut. Mainly used by pro pro project types.</td></row>
+ <row><td>Shortcut</td><td>IconIndex</td><td>Y</td><td>-32767</td><td>32767</td><td/><td/><td/><td/><td>The icon index for the shortcut.</td></row>
+ <row><td>Shortcut</td><td>Icon_</td><td>Y</td><td/><td/><td>Icon</td><td>1</td><td>Identifier</td><td/><td>Foreign key into the File table denoting the external icon file for the shortcut.</td></row>
+ <row><td>Shortcut</td><td>Name</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>The name of the shortcut to be created.</td></row>
+ <row><td>Shortcut</td><td>Shortcut</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Primary key, non-localized token.</td></row>
+ <row><td>Shortcut</td><td>ShowCmd</td><td>Y</td><td/><td/><td/><td/><td/><td>1;3;7</td><td>The show command for the application window.The following values may be used.</td></row>
+ <row><td>Shortcut</td><td>Target</td><td>N</td><td/><td/><td/><td/><td>Shortcut</td><td/><td>The shortcut target. This is usually a property that is expanded to a file or a folder that the shortcut points to.</td></row>
+ <row><td>Shortcut</td><td>WkDir</td><td>Y</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Name of property defining location of working directory.</td></row>
+ <row><td>Signature</td><td>FileName</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>The name of the file. This may contain a "short name|long name" pair.</td></row>
+ <row><td>Signature</td><td>Languages</td><td>Y</td><td/><td/><td/><td/><td>Language</td><td/><td>The languages supported by the file.</td></row>
+ <row><td>Signature</td><td>MaxDate</td><td>Y</td><td>0</td><td>2147483647</td><td/><td/><td/><td/><td>The maximum creation date of the file.</td></row>
+ <row><td>Signature</td><td>MaxSize</td><td>Y</td><td>0</td><td>2147483647</td><td/><td/><td/><td/><td>The maximum size of the file. </td></row>
+ <row><td>Signature</td><td>MaxVersion</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>The maximum version of the file.</td></row>
+ <row><td>Signature</td><td>MinDate</td><td>Y</td><td>0</td><td>2147483647</td><td/><td/><td/><td/><td>The minimum creation date of the file.</td></row>
+ <row><td>Signature</td><td>MinSize</td><td>Y</td><td>0</td><td>2147483647</td><td/><td/><td/><td/><td>The minimum size of the file.</td></row>
+ <row><td>Signature</td><td>MinVersion</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>The minimum version of the file.</td></row>
+ <row><td>Signature</td><td>Signature</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>The table key. The Signature represents a unique file signature.</td></row>
+ <row><td>TextStyle</td><td>Color</td><td>Y</td><td>0</td><td>16777215</td><td/><td/><td/><td/><td>A long integer indicating the color of the string in the RGB format (Red, Green, Blue each 0-255, RGB = R + 256*G + 256^2*B).</td></row>
+ <row><td>TextStyle</td><td>FaceName</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>A string indicating the name of the font used. Required. The string must be at most 31 characters long.</td></row>
+ <row><td>TextStyle</td><td>Size</td><td>N</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>The size of the font used. This size is given in our units (1/12 of the system font height). Assuming that the system font is set to 12 point size, this is equivalent to the point size.</td></row>
+ <row><td>TextStyle</td><td>StyleBits</td><td>Y</td><td>0</td><td>15</td><td/><td/><td/><td/><td>A combination of style bits.</td></row>
+ <row><td>TextStyle</td><td>TextStyle</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Name of the style. The primary key of this table. This name is embedded in the texts to indicate a style change.</td></row>
+ <row><td>TypeLib</td><td>Component_</td><td>N</td><td/><td/><td>Component</td><td>1</td><td>Identifier</td><td/><td>Required foreign key into the Component Table, specifying the component for which to return a path when called through LocateComponent.</td></row>
+ <row><td>TypeLib</td><td>Cost</td><td>Y</td><td>0</td><td>2147483647</td><td/><td/><td/><td/><td>The cost associated with the registration of the typelib. This column is currently optional.</td></row>
+ <row><td>TypeLib</td><td>Description</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td/></row>
+ <row><td>TypeLib</td><td>Directory_</td><td>Y</td><td/><td/><td>Directory</td><td>1</td><td>Identifier</td><td/><td>Optional. The foreign key into the Directory table denoting the path to the help file for the type library.</td></row>
+ <row><td>TypeLib</td><td>Feature_</td><td>N</td><td/><td/><td>Feature</td><td>1</td><td>Identifier</td><td/><td>Required foreign key into the Feature Table, specifying the feature to validate or install in order for the type library to be operational.</td></row>
+ <row><td>TypeLib</td><td>Language</td><td>N</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>The language of the library.</td></row>
+ <row><td>TypeLib</td><td>LibID</td><td>N</td><td/><td/><td/><td/><td>Guid</td><td/><td>The GUID that represents the library.</td></row>
+ <row><td>TypeLib</td><td>Version</td><td>Y</td><td>0</td><td>2147483647</td><td/><td/><td/><td/><td>The version of the library. The major version is in the upper 8 bits of the short integer. The minor version is in the lower 8 bits.</td></row>
+ <row><td>UIText</td><td>Key</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>A unique key that identifies the particular string.</td></row>
+ <row><td>UIText</td><td>Text</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>The localized version of the string.</td></row>
+ <row><td>Upgrade</td><td>ActionProperty</td><td>N</td><td/><td/><td/><td/><td>UpperCase</td><td/><td>The property to set when a product in this set is found.</td></row>
+ <row><td>Upgrade</td><td>Attributes</td><td>N</td><td>0</td><td>2147483647</td><td/><td/><td/><td/><td>The attributes of this product set.</td></row>
+ <row><td>Upgrade</td><td>ISDisplayName</td><td>Y</td><td/><td/><td>ISUpgradeMsiItem</td><td>1</td><td/><td/><td/></row>
+ <row><td>Upgrade</td><td>Language</td><td>Y</td><td/><td/><td/><td/><td>Language</td><td/><td>A comma-separated list of languages for either products in this set or products not in this set.</td></row>
+ <row><td>Upgrade</td><td>Remove</td><td>Y</td><td/><td/><td/><td/><td>Formatted</td><td/><td>The list of features to remove when uninstalling a product from this set. The default is "ALL".</td></row>
+ <row><td>Upgrade</td><td>UpgradeCode</td><td>N</td><td/><td/><td/><td/><td>Guid</td><td/><td>The UpgradeCode GUID belonging to the products in this set.</td></row>
+ <row><td>Upgrade</td><td>VersionMax</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>The maximum ProductVersion of the products in this set. The set may or may not include products with this particular version.</td></row>
+ <row><td>Upgrade</td><td>VersionMin</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>The minimum ProductVersion of the products in this set. The set may or may not include products with this particular version.</td></row>
+ <row><td>Verb</td><td>Argument</td><td>Y</td><td/><td/><td/><td/><td>Formatted</td><td/><td>Optional value for the command arguments.</td></row>
+ <row><td>Verb</td><td>Command</td><td>Y</td><td/><td/><td/><td/><td>Formatted</td><td/><td>The command text.</td></row>
+ <row><td>Verb</td><td>Extension_</td><td>N</td><td/><td/><td>Extension</td><td>1</td><td>Text</td><td/><td>The extension associated with the table row.</td></row>
+ <row><td>Verb</td><td>Sequence</td><td>Y</td><td>0</td><td>32767</td><td/><td/><td/><td/><td>Order within the verbs for a particular extension. Also used simply to specify the default verb.</td></row>
+ <row><td>Verb</td><td>Verb</td><td>N</td><td/><td/><td/><td/><td>Text</td><td/><td>The verb for the command.</td></row>
+ <row><td>_Validation</td><td>Category</td><td>Y</td><td/><td/><td/><td/><td/><td>"Text";"Formatted";"Template";"Condition";"Guid";"Path";"Version";"Language";"Identifier";"Binary";"UpperCase";"LowerCase";"Filename";"Paths";"AnyPath";"WildCardFilename";"RegPath";"KeyFormatted";"CustomSource";"Property";"Cabinet";"Shortcut";"URL";"DefaultDir"</td><td>String category</td></row>
+ <row><td>_Validation</td><td>Column</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Name of column</td></row>
+ <row><td>_Validation</td><td>Description</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Description of column</td></row>
+ <row><td>_Validation</td><td>KeyColumn</td><td>Y</td><td>1</td><td>32</td><td/><td/><td/><td/><td>Column to which foreign key connects</td></row>
+ <row><td>_Validation</td><td>KeyTable</td><td>Y</td><td/><td/><td/><td/><td>Identifier</td><td/><td>For foreign key, Name of table to which data must link</td></row>
+ <row><td>_Validation</td><td>MaxValue</td><td>Y</td><td>-2147483647</td><td>2147483647</td><td/><td/><td/><td/><td>Maximum value allowed</td></row>
+ <row><td>_Validation</td><td>MinValue</td><td>Y</td><td>-2147483647</td><td>2147483647</td><td/><td/><td/><td/><td>Minimum value allowed</td></row>
+ <row><td>_Validation</td><td>Nullable</td><td>N</td><td/><td/><td/><td/><td/><td>Y;N;@</td><td>Whether the column is nullable</td></row>
+ <row><td>_Validation</td><td>Set</td><td>Y</td><td/><td/><td/><td/><td>Text</td><td/><td>Set of values that are permitted</td></row>
+ <row><td>_Validation</td><td>Table</td><td>N</td><td/><td/><td/><td/><td>Identifier</td><td/><td>Name of table</td></row>
+ </table>
+</msi>
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/log/README b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/log/README
new file mode 100644
index 00000000..f14507ee
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/log/README
@@ -0,0 +1 @@
+Jakarta Isapi Redirector log files \ No newline at end of file
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/tomcat.ico b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/tomcat.ico
new file mode 100644
index 00000000..6c5bd2c6
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/installer/tomcat.ico
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/isapi.def b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/isapi.def
new file mode 100644
index 00000000..ac43622d
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/isapi.def
@@ -0,0 +1,24 @@
+; Licensed to the Apache Software Foundation (ASF) under one or more
+; contributor license agreements. See the NOTICE file distributed with
+; this work for additional information regarding copyright ownership.
+; The ASF licenses this file to You under the Apache License, Version 2.0
+; (the "License"); you may not use this file except in compliance with
+; the License. You may obtain a copy of the License at
+;
+; http://www.apache.org/licenses/LICENSE-2.0
+;
+; Unless required by applicable law or agreed to in writing, software
+; distributed under the License is distributed on an "AS IS" BASIS,
+; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+; See the License for the specific language governing permissions and
+; limitations under the License.
+;
+LIBRARY "isapi_redirect"
+
+EXPORTS
+ HttpFilterProc
+ GetFilterVersion
+ GetExtensionVersion
+ HttpExtensionProc
+ TerminateFilter
+ TerminateExtension
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/isapi.dsp b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/isapi.dsp
new file mode 100644
index 00000000..a85e5515
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/isapi.dsp
@@ -0,0 +1,307 @@
+# Microsoft Developer Studio Project File - Name="isapi" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=isapi - 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 "isapi.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 "isapi.mak" CFG="isapi - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "isapi - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "isapi - 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)" == "isapi - 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" /D "_MBCS" /D "_USRDLL" /D "JK_ISAPI" /D "ISAPI_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /Zi /O2 /I "..\common" /I "pcre" /I "$(JAVA_HOME)\include" /I "$(JAVA_HOME)\include\win32" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "JK_ISAPI" /D "ISAPI_EXPORTS" /D "HAS_PCRE" /D "PCRE_STATIC" /Fd"Release/isapi_redirector_src" /FD /c
+# 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 0x809 /d "JK_ISAPI" /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 kernel32.lib user32.lib advapi32.lib ws2_32.lib mswsock.lib strsafe.lib /nologo /base:"0x6A6B0000" /dll /debug /machine:I386 /out:"Release\isapi_redirect.dll"
+
+!ELSEIF "$(CFG)" == "isapi - 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" /D "_MBCS" /D "_USRDLL" /D "JK_ISAPI" /D "ISAPI_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /GX /Zi /Od /I "..\common" /I "pcre" /I "$(JAVA_HOME)\include" /I "$(JAVA_HOME)\include\win32" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "JK_ISAPI" /D "ISAPI_EXPORTS" /D "HAS_PCRE" /D "PCRE_STATIC" /Fd"Debug/isapi_redirector_src" /FD /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 0x809 /d "JK_ISAPI" /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 kernel32.lib user32.lib advapi32.lib ws2_32.lib mswsock.lib strsafe.lib /nologo /base:"0x6A6B0000" /dll /incremental:no /debug /machine:I386 /out:"Debug\isapi_redirect.dll"
+
+!ENDIF
+
+# Begin Target
+
+# Name "isapi - Win32 Release"
+# Name "isapi - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\common\jk.rc
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp12_worker.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp13.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp13_worker.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp14.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp14_worker.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp_common.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_connect.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_context.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\jk_isapi_plugin.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_jni_worker.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_lb_worker.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_map.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_md5.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_msg_buff.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_nwmain.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_pool.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_shm.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_sockbuf.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_status.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_uri_worker_map.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_url.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_util.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_worker.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\common\jk_ajp13.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp13_worker.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp14.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp14_worker.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp_common.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_channel.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_connect.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_context.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_env.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_global.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_jni_worker.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_lb_worker.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_logger.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_map.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_md5.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_msg_buff.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_mt.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_pool.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_service.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_shm.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_status.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_uri_worker_map.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_url.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_util.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_version.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_worker.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=.\isapi.def
+# End Source File
+# End Group
+# End Target
+# End Project
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/isapi.dsw b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/isapi.dsw
new file mode 100644
index 00000000..8a4aa5b0
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/isapi.dsw
@@ -0,0 +1,59 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "dftables"=".\pcre\dftables.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "isapi"=".\isapi.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name pcre
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "pcre"=".\pcre\pcre.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name dftables
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/isapi_install.vbs b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/isapi_install.vbs
new file mode 100644
index 00000000..7daa8d74
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/isapi_install.vbs
@@ -0,0 +1,224 @@
+'
+' Licensed to the Apache Software Foundation (ASF) under one or more
+' contributor license agreements. See the NOTICE file distributed with
+' this work for additional information regarding copyright ownership.
+' The ASF licenses this file to You under the Apache License, Version 2.0
+' (the "License"); you may not use this file except in compliance with
+' the License. You may obtain a copy of the License at
+'
+' http://www.apache.org/licenses/LICENSE-2.0
+'
+' Unless required by applicable law or agreed to in writing, software
+' distributed under the License is distributed on an "AS IS" BASIS,
+' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+' See the License for the specific language governing permissions and
+' limitations under the License.
+'
+
+' =========================================================================
+' Description: Install script for Tomcat ISAPI redirector
+' Author: Peter S. Horne <horneps@yahoo.com.au>
+' Version: $Revision: 572120 $
+' =========================================================================
+'
+' This script automatically installs the tomcat isapi_redirector for use in
+' both out-of and in-process installations on IIS/Win2K. See the command line
+' usage section for usage instructions.
+
+'
+' Check the command line
+'
+set args = wscript.arguments
+if args.count <> 6 then
+ info ""
+ info "Tomcat ISAPI Redirector Installation Utility"
+ info "usage: isapi_install <server> <fdir> <worker> <mount> <log> <level>"
+ info " server: The Web Server Name (for example 'Default Web Site')"
+ info " fdir: the full path to the directory that contains the isapi filter"
+ info " worker: Full path and file name of the worker properties file"
+ info " mount: Full path and file name of the worker mount properties file"
+ info " log: Full path and file name of the log file"
+ info " level: The log level emerg | info"
+ info "(Re-runs are ok and will change/reset settings)"
+ info ""
+ fail "Incorrect Arguments"
+end if
+
+' Setup the args
+serverName = args(0)
+filterDir = args(1)
+filterName = "jakarta"
+filterLib = "\isapi_redirect.dll"
+workerFile = args(2)
+mountFile = args(3)
+logFile = args(4)
+logLevel = args(5)
+
+'
+' Get a shell
+'
+dim shell
+set shell = WScript.CreateObject("WScript.Shell")
+
+'
+' Find the indicated server from all the servers in the service
+' Note: they aren't all Web!
+'
+set service = GetObject("IIS://LocalHost/W3SVC" )
+serverId = ""
+for each thing in service
+ if thing.Class = "IIsWebServer" then
+ if thing.ServerComment = serverName then
+ set server = thing
+ serverId = thing.name
+ exit for
+ end if
+ end if
+next
+if serverId = "" then fail "Server " + serverName + " not found."
+info "Found Server <" + serverName + "> at index [" + serverId + "]."
+
+'
+' Stop everything to release any dlls - needed for a re-install
+'
+' info "Stopping server <" + serverName + ">..."
+' server.stop
+' info "Done"
+
+'
+' Get a handle to the filters for the server - we process all errors
+'
+On Error Resume Next
+dim filters
+set filters = GetObject("IIS://LocalHost/W3SVC/" + serverId + "/Filters")
+if err then
+ err.clear
+ info "Filters not found for server - creating"
+ set filters = server.create( "IIsFilters", "Filters" )
+ filters.setInfo
+ if err then fail "Error Creating Filters"
+end if
+info "Got Filters"
+
+'
+' Create the filter - if it fails then delete it and try again
+'
+name = filterName
+info "Creating Filter - " + filterName
+dim filter
+set filter = filters.Create( "IISFilter", filterName )
+if err then
+ err.clear
+ info "Filter exists - deleting"
+ filters.delete "IISFilter", filterName
+ if err then fail "Error Deleting Filter"
+ set filter = filters.Create( "IISFilter", filterName )
+ if err then fail "Error Creating Filter"
+end if
+info "Created Filter"
+
+'
+' Set the filter info and save it
+'
+filter.FilterPath = filterDir + filterLib
+filter.FilterEnabled=true
+filter.description = filterName
+filter.notifyOrderHigh = true
+filter.setInfo
+
+'
+' Set the load order - only if it's not in the list already
+'
+on error goto 0
+loadOrders = filters.FilterLoadOrder
+list = Split( loadOrders, "," )
+found = false
+for each item in list
+ if Trim( item ) = filterName then found = true
+next
+
+if found = false then
+ info "Filter is not in load order - adding now."
+ if len(loadOrders) <> 0 then loadOrders = loadOrders + ","
+ filters.FilterLoadOrder = loadOrders + filterName
+ filters.setInfo
+ info "Filter added."
+else
+ info "Filter already exists in load order - no update required."
+end if
+
+'
+' Set the registry up
+'
+regRoot = "HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Jakarta Isapi Redirector\1.0\"
+err.clear
+on error resume next
+shell.RegDelete( regRoot )
+if err then
+ info "Entering Registry Information for the first time"
+else
+ info "Deleted existing Registry Setting"
+end if
+
+on error goto 0
+info "Updating Registry"
+shell.RegWrite regRoot + "extension_uri", "/jakarta/isapi_redirect.dll"
+shell.RegWrite regRoot + "log_file", logFile
+shell.RegWrite regRoot + "log_level", logLevel
+shell.RegWrite regRoot + "worker_file", workerFile
+shell.RegWrite regRoot + "worker_mount_file", mountFile
+info "Registry Settings Created"
+
+'
+' Finally, create the virtual directory matching th extension uri
+'
+on error goto 0
+set root = GetObject( "IIS://LocalHost/W3SVC/" + serverID + "/ROOT" )
+on error resume next
+set vdir = root.Create("IISWebVirtualDir", filterName )
+if err then
+ info "Directory exists - deleting"
+ on error resume next
+ root.delete "IISWebVirtualDir", filterName
+ root.setInfo
+ if err then fail "Error Deleting Directory"
+ set vdir = root.create("IISWebVirtualDir", filterName )
+ if err then fail "Error Creating Directory"
+end if
+info "Directory Created"
+
+' Set the directory information - make it an application directory
+info "Setting Directory Information"
+vdir.AppCreate2 1
+vdir.AccessExecute = TRUE
+vdir.AppFriendlyName = filterName
+vdir.AccessRead = false
+vdir.ContentIndexed = false
+vdir.Path = filterDir
+vdir.setInfo
+if err then fail "Error saving new directory"
+info "Directory Saved"
+'
+' Re Start
+'
+' info "Starting server <" + serverName + ">..."
+' server.start
+' info "Done"
+
+info "All done... Bye."
+wscript.quit(0)
+
+'
+' Helper function for snafus
+'
+function fail( message )
+ wscript.echo "E: " + message
+ wscript.quit(1)
+end function
+
+'
+' Helper function for info
+'
+function info( message )
+ wscript.echo " " + message
+end function
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/isapi_redirect.reg b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/isapi_redirect.reg
new file mode 100644
index 00000000..67998835
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/isapi_redirect.reg
@@ -0,0 +1,7 @@
+REGEDIT4
+
+[HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Jakarta Isapi Redirector\1.0]
+"log_file"="C:\\tomcat\\logs\\isapi.log"
+"log_level"="debug"
+"worker_file"="C:\\tomcat\\conf\\workers.properties"
+"worker_mount_file"="C:\\tomcat\\conf\\uriworkermap.properties"
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/jk_isapi_plugin.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/jk_isapi_plugin.c
new file mode 100644
index 00000000..7c9f67be
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/jk_isapi_plugin.c
@@ -0,0 +1,3495 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: ISAPI plugin for IIS/PWS *
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Author: Larry Isaacs <larryi@apache.org> *
+ * Author: Ignacio J. Ortega <nacho@apache.org> *
+ * Author: Mladen Turk <mturk@apache.org> *
+ * Version: $Revision: 1129429 $ *
+ ***************************************************************************/
+
+// This define is needed to include wincrypt,h, needed to get client certificates
+#ifndef _WIN32_WINNT
+#define _WIN32_WINNT 0x0500
+#endif
+#include <winsock2.h>
+#include <httpext.h>
+#include <httpfilt.h>
+#include <wininet.h>
+
+#include "jk_global.h"
+#include "jk_url.h"
+#include "jk_util.h"
+#include "jk_map.h"
+#include "jk_pool.h"
+#include "jk_service.h"
+#include "jk_worker.h"
+#include "jk_uri_worker_map.h"
+#include "jk_shm.h"
+#include "jk_ajp13.h"
+#include "pcre.h"
+
+#ifndef POSIX_MALLOC_THRESHOLD
+#define POSIX_MALLOC_THRESHOLD (10)
+#endif
+
+#include <strsafe.h>
+
+#define VERSION_STRING "Jakarta/ISAPI/" JK_EXPOSED_VERSION
+#define FULL_VERSION_STRING "Jakarta/ISAPI/" JK_FULL_EXPOSED_VERSION
+#define SHM_DEF_NAME "JKISAPISHMEM"
+#define DEFAULT_WORKER_NAME ("ajp13")
+
+/*
+ * This is default value found inside httpd.conf
+ * for MaxClients
+ */
+#define DEFAULT_WORKER_THREADS 250
+
+/*
+ * We use special headers to pass values from the filter to the
+ * extension. These values are:
+ *
+ * 1. The real URI before redirection took place
+ * 2. The name of the worker to be used.
+ * 3. The contents of the Translate header, if any
+ *
+ */
+#define URI_HEADER_NAME_BASE ("TOMCATURI")
+#define QUERY_HEADER_NAME_BASE ("TOMCATQUERY")
+#define WORKER_HEADER_NAME_BASE ("TOMCATWORKER")
+#define WORKER_HEADER_INDEX_BASE ("TOMCATWORKERIDX")
+#define TOMCAT_TRANSLATE_HEADER_NAME_BASE ("TOMCATTRANSLATE")
+#ifndef USE_CGI_HEADERS
+#define CONTENT_LENGTH ("CONTENT-LENGTH:")
+#else
+#define CONTENT_LENGTH ("CONTENT_LENGTH:")
+#endif
+
+/* The HTTP_ form of the header for use in ExtensionProc */
+#define HTTP_HEADER_PREFIX "HTTP_"
+#ifdef USE_CGI_HEADERS
+#define HTTP_HEADER_PREFIX_LEN 5
+#endif
+
+/* The template used to construct our unique headers
+ * from the base name and module instance
+ */
+#define HEADER_TEMPLATE "%s%p:"
+#define HTTP_HEADER_TEMPLATE HTTP_HEADER_PREFIX "%s%p"
+
+static char URI_HEADER_NAME[MAX_PATH];
+static char QUERY_HEADER_NAME[MAX_PATH];
+static char WORKER_HEADER_NAME[MAX_PATH];
+static char TOMCAT_TRANSLATE_HEADER_NAME[MAX_PATH];
+static char WORKER_HEADER_INDEX[MAX_PATH];
+
+/* The variants of the special headers after IIS adds
+ * "HTTP_" to the front of them
+ */
+static char HTTP_URI_HEADER_NAME[MAX_PATH];
+static char HTTP_QUERY_HEADER_NAME[MAX_PATH];
+static char HTTP_WORKER_HEADER_NAME[MAX_PATH];
+static char HTTP_WORKER_HEADER_INDEX[MAX_PATH];
+
+#define REGISTRY_LOCATION ("Software\\Apache Software Foundation\\Jakarta Isapi Redirector\\1.0")
+#define W3SVC_REGISTRY_KEY ("SYSTEM\\CurrentControlSet\\Services\\W3SVC\\Parameters")
+#define EXTENSION_URI_TAG ("extension_uri")
+
+#define URI_SELECT_TAG ("uri_select")
+#define URI_SELECT_PARSED_VERB ("parsed")
+#define URI_SELECT_UNPARSED_VERB ("unparsed")
+#define URI_SELECT_ESCAPED_VERB ("escaped")
+#define URI_SELECT_PROXY_VERB ("proxy")
+#define URI_REWRITE_TAG ("rewrite_rule_file")
+#define SHM_SIZE_TAG ("shm_size")
+#define WORKER_MOUNT_RELOAD_TAG ("worker_mount_reload")
+#define STRIP_SESSION_TAG ("strip_session")
+#ifndef AUTOMATIC_AUTH_NOTIFICATION
+#define AUTH_COMPLETE_TAG ("auth_complete")
+#endif
+#define REJECT_UNSAFE_TAG ("reject_unsafe")
+#define WATCHDOG_INTERVAL_TAG ("watchdog_interval")
+#define ENABLE_CHUNKED_ENCODING_TAG ("enable_chunked_encoding")
+#define ERROR_PAGE_TAG ("error_page")
+
+#define LOG_ROTATION_TIME_TAG ("log_rotationtime")
+#define LOG_FILESIZE_TAG ("log_filesize")
+
+/* HTTP standard headers */
+#define TRANSFER_ENCODING_CHUNKED_HEADER_COMPLETE ("Transfer-Encoding: chunked")
+#define TRANSFER_ENCODING_CHUNKED_HEADER_COMPLETE_LEN (26)
+#define TRANSFER_ENCODING_HEADER_NAME ("Transfer-Encoding")
+#define TRANSFER_ENCODING_HEADER_NAME_LEN (17)
+#define TRANSFER_ENCODING_IDENTITY_VALUE ("identity")
+#define TRANSFER_ENCODING_CHUNKED_VALUE ("chunked")
+#define TRANSFER_ENCODING_CHUNKED_VALUE_LEN (7)
+
+#define CONTENT_LENGTH_HEADER_NAME ("Content-Length")
+#define CONTENT_LENGTH_HEADER_NAME_LEN (14)
+
+#define CONNECTION_HEADER_NAME ("Connection")
+#define CONNECTION_CLOSE_VALUE ("Close")
+
+#define TRANSLATE_HEADER ("Translate:")
+#define TRANSLATE_HEADER_NAME ("Translate")
+#define TRANSLATE_HEADER_NAME_LC ("translate")
+
+/* HTTP protocol CRLF */
+#define CRLF ("\r\n")
+#define CRLF_LEN (2)
+
+/* Transfer-Encoding: chunked content trailer */
+#define CHUNKED_ENCODING_TRAILER ("0\r\n\r\n")
+#define CHUNKED_ENCODING_TRAILER_LEN (5)
+
+/* Hex of chunk length (one char per byte) + CRLF + terminator. */
+#define CHUNK_HEADER_BUFFER_SIZE (sizeof(unsigned int)*2+CRLF_LEN+1)
+
+#define BAD_REQUEST -1
+#define BAD_PATH -2
+#define MAX_SERVERNAME 128
+#define MAX_INSTANCEID 32
+#define MAX_PACKET_SIZE 65536
+
+char HTML_ERROR_HEAD[] = "<!--\n"
+ " Licensed to the Apache Software Foundation (ASF) under one or more\n"
+ " contributor license agreements. See the NOTICE file distributed with\n"
+ " this work for additional information regarding copyright ownership.\n"
+ " The ASF licenses this file to You under the Apache License, Version 2.0\n"
+ " (the \"License\"); you may not use this file except in compliance with\n"
+ " the License. You may obtain a copy of the License at\n\n"
+ " http://www.apache.org/licenses/LICENSE-2.0\n\n"
+ " Unless required by applicable law or agreed to in writing, software\n"
+ " distributed under the License is distributed on an \"AS IS\" BASIS,\n"
+ " WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n"
+ " See the License for the specific language governing permissions and\n"
+ " limitations under the License.\n"
+ " -->\n"
+ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"\n"
+ "\"http://www.w3c.org/TR/REC-html40/loose.dtd\">\n"
+ "<HTML>\n<HEAD>\n"
+ "<META http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1\">\n"
+ "<STYLE TYPE=\"text/css\">\n"
+ " body {\n"
+ " color: #000000;\n"
+ " background-color: #FFFFFF;\n"
+ " font-family: Verdana, Tahoma, Arial, Helvetica, sans-serif;\n"
+ " font-size: 9pt;\n"
+ " margin: 10px 10px;\n"
+ " }\n"
+ " p#footer {\n"
+ " text-align: right;\n"
+ " font-size: 80%;\n"
+ " }\n"
+ "</STYLE>\n";
+
+#define HTML_ERROR_BODY_FMT "<TITLE>%s!</TITLE>\n</HEAD>\n<BODY>\n<H1>%s!</H1>\n<P>\n%s\n</P>\n"
+
+char HTML_ERROR_TAIL[] = "<P>\n<BR/>&nbsp;<BR/>&nbsp;<BR/>&nbsp;<BR/>&nbsp;\n"
+ FULL_VERSION_STRING "\n"
+ "<BR/>&nbsp;\n"
+ "<HR/>\n"
+ "<P id=\"footer\">\n"
+ "Copyright &copy; 1999-2011 Apache Software Foundation<BR/>\n"
+ "All Rights Reserved\n"
+ "</P>\n</BODY>\n</HTML>\n";
+
+static struct error_reasons {
+ int status;
+ const char *reason;
+ const char *title;
+ const char *description;
+} error_reasons[] = {
+ { 100,
+ "Continue",
+ NULL,
+ NULL
+ },
+ { 101,
+ "Switching Protocols",
+ NULL,
+ NULL
+ },
+ { 200,
+ "OK",
+ NULL,
+ NULL
+ },
+ { 201,
+ "Created",
+ NULL,
+ NULL
+ },
+ { 202,
+ "Accepted",
+ NULL,
+ NULL
+ },
+ { 203,
+ "Non-Authoritative Information",
+ NULL,
+ NULL
+ },
+ { 204,
+ "No Content",
+ NULL,
+ NULL
+ },
+ { 205,
+ "Reset Content",
+ NULL,
+ NULL
+ },
+ { 206,
+ "Partial Content",
+ NULL,
+ NULL
+ },
+ { 300,
+ "Multiple Choices",
+ NULL,
+ NULL
+ },
+ { 301,
+ "Moved Permanently",
+ NULL,
+ NULL
+ },
+ { 302,
+ "Moved Temporarily",
+ NULL,
+ NULL
+ },
+ { 303,
+ "See Other",
+ NULL,
+ NULL
+ },
+ { 304,
+ "Not Modified",
+ NULL,
+ NULL
+ },
+ { 305,
+ "Use Proxy",
+ NULL,
+ NULL
+ },
+ { 400,
+ "Bad Request",
+ "Bad Request",
+ "Your browser (or proxy) sent a request that "
+ "this server could not understand."
+ },
+ { 401,
+ "Unauthorized",
+ "Access is denied due to invalid credentials",
+ "You do not have permission to view this directory or "
+ "page using the credentials that you supplied."
+ },
+ { 402,
+ "Payment Required",
+ NULL,
+ NULL
+ },
+ { 403,
+ "Forbidden",
+ "Access is denied",
+ "You do not have permission to view this directory or page "
+ "using the credentials that you supplied."
+ },
+ { 404,
+ "Not Found",
+ "The requested URL was not found on this server",
+ "If you entered the URL manually please check your"
+ "spelling and try again."
+ },
+ { 405,
+ "Method Not Allowed",
+ "HTTP method used to access this page is not allowed",
+ "The page you are looking for cannot be displayed because an "
+ "invalid method (HTTP method) was used to attempt access."
+ },
+ { 406,
+ "Not Acceptable",
+ "Client browser does not accept the MIME type of the requested page",
+ "The page you are looking for cannot be opened by your browser "
+ "because it has a file name extension that your browser "
+ "does not accept."
+ },
+ { 407,
+ "Proxy Authentication Required",
+ NULL,
+ "The client must first authenticate itself with the proxy"
+ },
+ { 408,
+ "Request Timeout",
+ NULL,
+ "The client did not produce a request within the time "
+ "that the server was prepared to wait."
+ },
+ { 409,
+ "Conflict",
+ NULL,
+ "The request could not be completed due to a conflict with "
+ "the current state of the resource."
+ },
+ { 410,
+ "Gone",
+ NULL,
+ "The requested resource is no longer available at the "
+ "server and no forwarding address is known."
+ },
+ { 411,
+ "Length Required",
+ NULL,
+ "The server refuses to accept the request without a "
+ "defined Content-Length."
+ },
+ { 412,
+ "Precondition Failed",
+ NULL,
+ "The precondition given in one or more of the request "
+ "header fields evaluated to false when it was tested on the server."
+ },
+ { 413,
+ "Request Entity Too Large",
+ NULL,
+ "The HTTP method does not allow the data transmitted, "
+ "or the data volume exceeds the capacity limit."
+ },
+ { 414,
+ "Request-URI Too Long",
+ "Submitted URI too large",
+ "The length of the requested URL exceeds the capacity limit "
+ "for this server. The request cannot be processed."
+ },
+ { 415,
+ "Unsupported Media Type",
+ NULL,
+ "The server is refusing to service the request because the "
+ "entity of the request is in a format not supported by the "
+ "requested resource for the requested method."
+ },
+ { 500,
+ "Internal Server Error",
+ NULL,
+ "The server encountered an internal error and was "
+ "unable to complete your request."
+ },
+ { 501,
+ "Not Implemented",
+ NULL,
+ "The server does not support the functionality required "
+ "to fulfill the request."
+ },
+ { 502,
+ "Bad Gateway",
+ NULL,
+ "There is a problem with the page you are looking for, "
+ "and it cannot be displayed. When the Web server (while "
+ "acting as a gateway or proxy) contacted the upstream content "
+ "server, it received an invalid response from the content server."
+ },
+ { 503,
+ "Service Unavailable",
+ "Service Temporary Unavailable",
+ "The server is temporarily unable to service your "
+ "request due to maintenance downtime or capacity problems. "
+ "Please try again later."
+ },
+ { 504,
+ "Gateway Timeout",
+ NULL,
+ "The server, while acting as a gateway or proxy, "
+ "did not receive a timely response from the upstream server"
+ },
+ { 505,
+ "HTTP Version Not Supported",
+ NULL,
+ "The server does not support, or refuses to support, the "
+ "HTTP protocol version that was used in the request message."
+ },
+ { 0,
+ NULL,
+ NULL,
+ NULL
+ }
+};
+
+
+
+#define STRNULL_FOR_NULL(x) ((x) ? (x) : "(null)")
+#ifdef USE_CGI_HEADERS
+#define JK_TOLOWER(x) ((char)tolower((BYTE)(x)))
+#endif
+
+#define GET_SERVER_VARIABLE_VALUE(name, place) \
+ do { \
+ (place) = NULL; \
+ huge_buf_sz = MAX_PACKET_SIZE; \
+ if (get_server_value(private_data->lpEcb, \
+ (name), \
+ huge_buf, \
+ huge_buf_sz)) { \
+ (place) = jk_pool_strdup(&private_data->p, \
+ huge_buf); \
+ } } while(0)
+
+#define GET_SERVER_VARIABLE_VALUE_INT(name, place, def) \
+ do { \
+ huge_buf_sz = MAX_PACKET_SIZE; \
+ if (get_server_value(private_data->lpEcb, \
+ (name), \
+ huge_buf, \
+ huge_buf_sz)) { \
+ (place) = atoi(huge_buf); \
+ if (((place) == 0) && (errno == EINVAL || \
+ errno == ERANGE)) { \
+ (place) = def; \
+ } \
+ } else { \
+ (place) = def; \
+ } } while(0)
+
+static char dll_file_path[MAX_PATH];
+static char ini_file_name[MAX_PATH];
+static int using_ini_file = JK_FALSE;
+static JK_CRIT_SEC init_cs;
+static int is_inited = JK_FALSE;
+static int is_mapread = JK_FALSE;
+
+static jk_uri_worker_map_t *uw_map = NULL;
+static jk_map_t *workers_map = NULL;
+static jk_map_t *rewrite_map = NULL;
+static jk_map_t *rregexp_map = NULL;
+static jk_map_t *jk_environment_map = NULL;
+
+static jk_logger_t *logger = NULL;
+static JK_CRIT_SEC log_cs;
+static char *SERVER_NAME = "SERVER_NAME";
+static char *SERVER_SOFTWARE = "SERVER_SOFTWARE";
+static char *INSTANCE_ID = "INSTANCE_ID";
+static char *CONTENT_TYPE = "Content-Type:text/html\r\n\r\n";
+
+static char extension_uri[INTERNET_MAX_URL_LENGTH] =
+ "/jakarta/isapi_redirect.dll";
+static char log_file[MAX_PATH * 2];
+static char log_file_effective[MAX_PATH * 2];
+static int log_level = JK_LOG_DEF_LEVEL;
+static long log_rotationtime = 0;
+static time_t log_next_rotate_time = 0;
+static ULONGLONG log_filesize = 0;
+
+static char worker_file[MAX_PATH * 2];
+static char worker_mount_file[MAX_PATH * 2] = {0};
+static int worker_mount_reload = JK_URIMAP_DEF_RELOAD;
+static char rewrite_rule_file[MAX_PATH * 2] = {0};
+static size_t shm_config_size = 0;
+static int strip_session = 0;
+#ifndef AUTOMATIC_AUTH_NOTIFICATION
+static int use_auth_notification_flags = 1;
+#endif
+static int chunked_encoding_enabled = JK_FALSE;
+static int reject_unsafe = 0;
+static int watchdog_interval = 0;
+static HANDLE watchdog_handle = NULL;
+static char error_page_buf[INTERNET_MAX_URL_LENGTH] = {0};
+static char *error_page = NULL;
+
+#define URI_SELECT_OPT_PARSED 0
+#define URI_SELECT_OPT_UNPARSED 1
+#define URI_SELECT_OPT_ESCAPED 2
+#define URI_SELECT_OPT_PROXY 3
+
+static int uri_select_option = URI_SELECT_OPT_PROXY;
+
+static jk_worker_env_t worker_env;
+
+typedef struct isapi_private_data_t isapi_private_data_t;
+struct isapi_private_data_t
+{
+ jk_pool_t p;
+
+ unsigned int bytes_read_so_far;
+ int chunk_content; /* Whether we're responding with Transfer-Encoding: chunked content */
+ LPEXTENSION_CONTROL_BLOCK lpEcb;
+};
+
+typedef struct isapi_log_data_t isapi_log_data_t;
+struct isapi_log_data_t {
+ char uri[INTERNET_MAX_URL_LENGTH];
+ char query[INTERNET_MAX_URL_LENGTH];
+ int request_matched; /* Whether this request (within a multi-request connection)
+ was handled and needs the log values adjusted */
+};
+
+typedef struct iis_info_t iis_info_t;
+struct iis_info_t {
+ int major; /* The major version */
+ int minor; /* The minor version */
+ DWORD filter_notify_event; /* The primary filter SF_NOTIFY_* event */
+};
+
+static iis_info_t iis_info;
+
+static int JK_METHOD start_response(jk_ws_service_t *s,
+ int status,
+ const char *reason,
+ const char *const *header_names,
+ const char *const *header_values,
+ unsigned int num_of_headers);
+
+static int JK_METHOD iis_read(jk_ws_service_t *s,
+ void *b, unsigned int l, unsigned int *a);
+
+static int JK_METHOD iis_write(jk_ws_service_t *s, const void *b, unsigned int l);
+
+static int JK_METHOD iis_done(jk_ws_service_t *s);
+
+static int init_ws_service(isapi_private_data_t * private_data,
+ jk_ws_service_t *s, char **worker_name);
+
+static int init_jk(char *serverName);
+
+
+static int JK_METHOD iis_log_to_file(jk_logger_t *l, int level,
+ int used, char *what);
+
+static BOOL initialize_extension(void);
+
+static int read_registry_init_data(void);
+
+static int get_config_parameter(LPVOID src, const char *tag,
+ char *val, DWORD sz);
+
+static int get_config_bool(LPVOID src, const char *tag, int def);
+
+static int get_config_int(LPVOID src, const char *tag, int def);
+
+static int get_registry_config_parameter(HKEY hkey,
+ const char *tag, char *b, DWORD sz);
+
+static int get_registry_config_number(HKEY hkey, const char *tag,
+ int *val);
+
+
+static int get_server_value(LPEXTENSION_CONTROL_BLOCK lpEcb,
+ char *name,
+ char *buf, DWORD bufsz);
+
+static int base64_encode_cert_len(int len);
+
+static int base64_encode_cert(char *encoded,
+ const char *string, int len);
+
+static int get_iis_info(iis_info_t *info);
+
+static int isapi_write_client(isapi_private_data_t *p, const char *buf, unsigned int write_length);
+
+static char x2c(const char *what)
+{
+ register char digit;
+
+ digit =
+ ((what[0] >= 'A') ? ((what[0] & 0xdf) - 'A') + 10 : (what[0] - '0'));
+ digit *= 16;
+ digit +=
+ (what[1] >= 'A' ? ((what[1] & 0xdf) - 'A') + 10 : (what[1] - '0'));
+ return (digit);
+}
+
+static int unescape_url(char *url)
+{
+ register int x, y, badesc, badpath;
+
+ badesc = 0;
+ badpath = 0;
+ for (x = 0, y = 0; url[y]; ++x, ++y) {
+ if (url[y] != '%')
+ url[x] = url[y];
+ else {
+ if (!isxdigit(url[y + 1]) || !isxdigit(url[y + 2])) {
+ badesc = 1;
+ url[x] = '%';
+ }
+ else {
+ url[x] = x2c(&url[y + 1]);
+ y += 2;
+ if (url[x] == '/' || url[x] == '\0')
+ badpath = 1;
+ }
+ }
+ }
+ url[x] = '\0';
+ if (badesc)
+ return BAD_REQUEST;
+ else if (badpath)
+ return BAD_PATH;
+ else
+ return 0;
+}
+
+static void getparents(char *name)
+{
+ int l, w;
+
+ /* Four paseses, as per RFC 1808 */
+ /* a) remove ./ path segments */
+
+ for (l = 0, w = 0; name[l] != '\0';) {
+ if (name[l] == '.' && name[l + 1] == '/'
+ && (l == 0 || name[l - 1] == '/'))
+ l += 2;
+ else
+ name[w++] = name[l++];
+ }
+
+ /* b) remove trailing . path, segment */
+ if (w == 1 && name[0] == '.')
+ w--;
+ else if (w > 1 && name[w - 1] == '.' && name[w - 2] == '/')
+ w--;
+ name[w] = '\0';
+
+ /* c) remove all xx/../ segments. (including leading ../ and /../) */
+ l = 0;
+
+ while (name[l] != '\0') {
+ if (name[l] == '.' && name[l + 1] == '.' && name[l + 2] == '/' &&
+ (l == 0 || name[l - 1] == '/')) {
+ register int m = l + 3, n;
+
+ l = l - 2;
+ if (l >= 0) {
+ while (l >= 0 && name[l] != '/')
+ l--;
+ l++;
+ }
+ else
+ l = 0;
+ n = l;
+ while ((name[n] = name[m]) != '\0') {
+ n++;
+ m++;
+ }
+ }
+ else
+ ++l;
+ }
+
+ /* d) remove trailing xx/.. segment. */
+ if (l == 2 && name[0] == '.' && name[1] == '.')
+ name[0] = '\0';
+ else if (l > 2 && name[l - 1] == '.' && name[l - 2] == '.'
+ && name[l - 3] == '/') {
+ l = l - 4;
+ if (l >= 0) {
+ while (l >= 0 && name[l] != '/')
+ l--;
+ l++;
+ }
+ else
+ l = 0;
+ name[l] = '\0';
+ }
+}
+
+/* Apache code to escape a URL */
+
+#define T_OS_ESCAPE_PATH (4)
+
+static const BYTE test_char_table[256] = {
+ 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 0, 7, 6, 1, 6, 1, 1, 9, 9, 1, 0, 8, 0, 0, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 15, 15, 8, 15, 15,
+ 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 7, 0,
+ 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 7, 15, 1, 14,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6
+};
+
+#define TEST_CHAR(c, f) (test_char_table[(unsigned int)(c)] & (f))
+
+static const char c2x_table[] = "0123456789abcdef";
+
+static BYTE *c2x(unsigned int what, BYTE *where)
+{
+ *where++ = '%';
+ *where++ = c2x_table[what >> 4];
+ *where++ = c2x_table[what & 0xf];
+ return where;
+}
+
+static const char *status_reason(int status)
+{
+ struct error_reasons *r;
+
+ r = error_reasons;
+ while (r->status <= status) {
+ if (r->status == status)
+ return r->reason;
+ else
+ r++;
+ }
+ return "No Reason";
+}
+
+static const char *status_title(int status)
+{
+ struct error_reasons *r;
+
+ r = error_reasons;
+ while (r->status <= status) {
+ if (r->status == status) {
+ if (r->title)
+ return r->title;
+ else
+ return r->reason;
+ }
+ else
+ r++;
+ }
+ return "Unknown Error";
+}
+
+static const char *status_description(int status)
+{
+ struct error_reasons *r;
+
+ r = error_reasons;
+ while (r->status <= status) {
+ if (r->status == status) {
+ if (r->description)
+ return r->description;
+ else
+ return r->reason;
+ }
+ else
+ r++;
+ }
+ return "Unknown Error";
+}
+
+static int escape_url(const char *path, char *dest, int destsize)
+{
+ const BYTE *s = (const BYTE *)path;
+ BYTE *d = (BYTE *)dest;
+ BYTE *e = d + destsize - 1;
+ BYTE *ee = d + destsize - 3;
+
+ while (*s) {
+ if (TEST_CHAR(*s, T_OS_ESCAPE_PATH)) {
+ if (d >= ee)
+ return JK_FALSE;
+ d = c2x(*s, d);
+ }
+ else {
+ if (d >= e)
+ return JK_FALSE;
+ *d++ = *s;
+ }
+ ++s;
+ }
+ *d = '\0';
+ return JK_TRUE;
+}
+
+/*
+ * Find the first occurrence of find in s.
+ */
+static char *stristr(const char *s, const char *find)
+{
+ char c, sc;
+ size_t len;
+
+ if ((c = tolower((unsigned char)(*find++))) != 0) {
+ len = strlen(find);
+ do {
+ do {
+ if ((sc = tolower((unsigned char)(*s++))) == 0)
+ return (NULL);
+ } while (sc != c);
+ } while (strnicmp(s, find, len) != 0);
+ s--;
+ }
+ return ((char *)s);
+}
+
+static int uri_is_web_inf(const char *uri)
+{
+ if (stristr(uri, "/web-inf")) {
+ return JK_TRUE;
+ }
+ if (stristr(uri, "/meta-inf")) {
+ return JK_TRUE;
+ }
+
+ return JK_FALSE;
+}
+
+static void write_error_response(PHTTP_FILTER_CONTEXT pfc, int err)
+{
+ char status[MAX_PATH];
+ char body[8192] = "";
+ DWORD len;
+
+ /* reject !!! */
+ pfc->AddResponseHeaders(pfc, CONTENT_TYPE, 0);
+ StringCbPrintf(status, MAX_PATH, "%d %s", err, status_reason(err));
+ pfc->ServerSupportFunction(pfc,
+ SF_REQ_SEND_RESPONSE_HEADER,
+ status, 0, 0);
+ len = (DWORD)(sizeof(HTML_ERROR_HEAD) - 1);
+ pfc->WriteClient(pfc, HTML_ERROR_HEAD, &len,
+ HSE_IO_SYNC);
+ StringCbPrintf(body, sizeof(body), HTML_ERROR_BODY_FMT,
+ status_reason(err), status_title(err),
+ status_description(err));
+ len = (DWORD)(strlen(body));
+ pfc->WriteClient(pfc, body, &len,
+ HSE_IO_SYNC);
+ len = (DWORD)(sizeof(HTML_ERROR_TAIL) - 1);
+ pfc->WriteClient(pfc, HTML_ERROR_TAIL, &len,
+ HSE_IO_SYNC);
+}
+
+static void write_error_message(LPEXTENSION_CONTROL_BLOCK lpEcb, int err)
+{
+ DWORD len;
+ char status[MAX_PATH];
+ char body[8192] = "";
+
+ if (error_page) {
+ char error_page_url[INTERNET_MAX_URL_LENGTH] = "";
+ int len_of_error_page;
+ StringCbPrintf(error_page_url, INTERNET_MAX_URL_LENGTH,
+ (LPCSTR)error_page, err);
+ len_of_error_page = (int)strlen(error_page_url);
+ if (!lpEcb->ServerSupportFunction(lpEcb->ConnID,
+ HSE_REQ_SEND_URL_REDIRECT_RESP,
+ error_page_url,
+ (LPDWORD)&len_of_error_page,
+ (LPDWORD)NULL)) {
+ lpEcb->dwHttpStatusCode = err;
+ }
+ else {
+ return;
+ }
+ }
+ lpEcb->dwHttpStatusCode = err;
+
+ StringCbPrintf(status, MAX_PATH, "%d %s", err, status_reason(err));
+ lpEcb->ServerSupportFunction(lpEcb->ConnID,
+ HSE_REQ_SEND_RESPONSE_HEADER,
+ status,
+ 0,
+ (LPDWORD)CONTENT_TYPE);
+ /* First write the HEAD */
+ len = (DWORD)(sizeof(HTML_ERROR_HEAD) - 1);
+ lpEcb->WriteClient(lpEcb->ConnID,
+ HTML_ERROR_HEAD, &len,
+ HSE_IO_SYNC);
+ StringCbPrintf(body, sizeof(body), HTML_ERROR_BODY_FMT,
+ status_reason(err), status_title(err),
+ status_description(err));
+ len = (DWORD)(strlen(body));
+ lpEcb->WriteClient(lpEcb->ConnID,
+ body, &len,
+ HSE_IO_SYNC);
+ len = (DWORD)(sizeof(HTML_ERROR_TAIL) - 1);
+ lpEcb->WriteClient(lpEcb->ConnID,
+ HTML_ERROR_TAIL, &len,
+ HSE_IO_SYNC);
+
+}
+
+
+static int JK_METHOD start_response(jk_ws_service_t *s,
+ int status,
+ const char *reason,
+ const char *const *header_names,
+ const char *const *header_values,
+ unsigned int num_of_headers)
+{
+ JK_TRACE_ENTER(logger);
+ if (status < 100 || status > 1000) {
+ jk_log(logger, JK_LOG_ERROR,
+ "invalid status %d",
+ status);
+ JK_TRACE_EXIT(logger);
+ return JK_FALSE;
+ }
+
+ if (s && s->ws_private) {
+ int rv = JK_TRUE;
+ isapi_private_data_t *p = s->ws_private;
+
+ /* If we use proxy error pages, still pass
+ * through context headers needed for special status codes.
+ */
+ if (s->extension.use_server_error_pages &&
+ status >= s->extension.use_server_error_pages) {
+ if (status == JK_HTTP_UNAUTHORIZED) {
+ int found = JK_FALSE;
+ unsigned int h;
+ for (h = 0; h < num_of_headers; h++) {
+ if (!strcasecmp(header_names[h], "WWW-Authenticate")) {
+ /*
+ * TODO: we need to save a copy of header_values[h]
+ * for later reuse in write_error_message()
+ * which is called later on form HttpExtensionProc
+ * because of use_server_error_pages.
+ */
+ found = JK_TRUE;
+ }
+ }
+ if (found == JK_FALSE) {
+ jk_log(logger, JK_LOG_INFO,
+ "origin server sent 401 without"
+ " WWW-Authenticate header");
+ }
+ }
+ return JK_TRUE;
+ }
+
+ if (!s->response_started) {
+ char *status_str = NULL;
+ char *headers_str = NULL;
+ BOOL keep_alive = FALSE; /* Whether the downstream or us can supply content length */
+ BOOL rc;
+ size_t i, len_of_headers = 0;
+
+ s->response_started = JK_TRUE;
+
+ if (JK_IS_DEBUG_LEVEL(logger)) {
+ jk_log(logger, JK_LOG_DEBUG, "Starting response for URI '%s' (protocol %s)",
+ s->req_uri, s->protocol);
+ }
+
+ /*
+ * Create the status line
+ */
+ if (!reason) {
+ reason = status_reason(status);
+ }
+ status_str = (char *)malloc((6 + strlen(reason)));
+ StringCbPrintf(status_str, 6 + strlen(reason), "%d %s", status, reason);
+
+ if (chunked_encoding_enabled) {
+ /* Check if we've got an HTTP/1.1 response */
+ if (!strcasecmp(s->protocol, "HTTP/1.1")) {
+ keep_alive = TRUE;
+ /* Chunking only when HTTP/1.1 client and enabled */
+ p->chunk_content = JK_TRUE;
+ }
+ }
+
+ /*
+ * Create response headers string
+ */
+
+ /* Calculate length of headers block */
+ for (i = 0; i < num_of_headers; i++) {
+ len_of_headers += strlen(header_names[i]);
+ len_of_headers += strlen(header_values[i]);
+ len_of_headers += 4; /* extra for colon, space and crlf */
+ }
+
+ /*
+ * Exclude status codes that MUST NOT include message bodies
+ */
+ if ((status == 204) || (status == 205) || (status == 304)) {
+ p->chunk_content = JK_FALSE;
+ /* Keep alive is still possible */
+ if (JK_IS_DEBUG_LEVEL(logger))
+ jk_log(logger, JK_LOG_DEBUG, "Response status %d implies no message body", status );
+ }
+ if (p->chunk_content) {
+ for (i = 0; i < num_of_headers; i++) {
+ /* Check the downstream response to see whether
+ * it's appropriate to chunk the response content
+ * and whether it supports keeping the connection open.
+
+ * This implements the rules for HTTP/1.1 message length determination
+ * with the exception of multipart/byteranges media types.
+ * http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.4
+ */
+ if (!strcasecmp(CONTENT_LENGTH_HEADER_NAME, header_names[i])) {
+ p->chunk_content = JK_FALSE;
+ if (JK_IS_DEBUG_LEVEL(logger))
+ jk_log(logger, JK_LOG_DEBUG, "Response specifies Content-Length" );
+ }
+ else if (!strcasecmp(CONNECTION_HEADER_NAME, header_names[i])
+ && !strcasecmp(CONNECTION_CLOSE_VALUE, header_values[i])) {
+ keep_alive = FALSE;
+ p->chunk_content = JK_FALSE;
+ if (JK_IS_DEBUG_LEVEL(logger))
+ jk_log(logger, JK_LOG_DEBUG, "Response specifies Connection: Close" );
+ }
+ else if (!strcasecmp(TRANSFER_ENCODING_HEADER_NAME, header_names[i])
+ && !strcasecmp(TRANSFER_ENCODING_IDENTITY_VALUE, header_values[i])) {
+ /* HTTP states that this must include 'chunked' as the last value.
+ * 'identity' is the same as absence of the header */
+ p->chunk_content = JK_FALSE;
+ if (JK_IS_DEBUG_LEVEL(logger))
+ jk_log(logger, JK_LOG_DEBUG, "Response specifies Transfer-Encoding" );
+ }
+ }
+
+ /* Provide room in the buffer for the Transfer-Encoding header if we use it. */
+ len_of_headers += TRANSFER_ENCODING_CHUNKED_HEADER_COMPLETE_LEN + 2;
+ }
+
+ /* Allocate and init the headers string */
+ len_of_headers += 3; /* crlf and terminating null char */
+ headers_str = (char *)malloc(len_of_headers);
+ headers_str[0] = '\0';
+
+ /* Copy headers into headers block for sending */
+ for (i = 0; i < num_of_headers; i++) {
+ StringCbCat(headers_str, len_of_headers, header_names[i]);
+ StringCbCat(headers_str, len_of_headers, ": ");
+ StringCbCat(headers_str, len_of_headers, header_values[i]);
+ StringCbCat(headers_str, len_of_headers, CRLF);
+ }
+
+ if (p->chunk_content) {
+ /* Configure the response if chunked encoding is used */
+ if (JK_IS_DEBUG_LEVEL(logger))
+ jk_log(logger, JK_LOG_DEBUG, "Using Transfer-Encoding: chunked");
+
+ /** We will supply the transfer-encoding to allow IIS to keep the connection open */
+ keep_alive = TRUE;
+
+ /* Indicate to the client that the content will be chunked
+ - We've already reserved space for this */
+ StringCbCat(headers_str, len_of_headers, TRANSFER_ENCODING_CHUNKED_HEADER_COMPLETE);
+ StringCbCat(headers_str, len_of_headers, CRLF);
+ }
+
+ /* Terminate the headers */
+ StringCbCat(headers_str, len_of_headers, CRLF);
+
+ if (JK_IS_DEBUG_LEVEL(logger))
+ jk_log(logger, JK_LOG_DEBUG, "%ssing Keep-Alive", (keep_alive ? "U" : "Not u"));
+
+ if (keep_alive) {
+ HSE_SEND_HEADER_EX_INFO hi;
+
+ /* Fill in the response */
+ hi.pszStatus = status_str;
+ hi.pszHeader = headers_str;
+ hi.cchStatus = (DWORD)strlen(status_str);
+ hi.cchHeader = (DWORD)strlen(headers_str);
+
+ /*
+ * Using the extended form of the API means we have to get this right,
+ * i.e. IIS won't keep connections open if there's a Content-Length and close them if there isn't.
+ */
+ hi.fKeepConn = keep_alive;
+
+ /* Send the response to the client */
+ rc = p->lpEcb->ServerSupportFunction(p->lpEcb->ConnID,
+ HSE_REQ_SEND_RESPONSE_HEADER_EX,
+ &hi,
+ NULL, NULL);
+ }
+ else {
+ DWORD status_str_len = (DWORD)strlen(status_str);
+ /* Old style response - forces Connection: close if Tomcat response doesn't
+ specify necessary details to allow keep alive */
+ rc = p->lpEcb->ServerSupportFunction(p->lpEcb->ConnID,
+ HSE_REQ_SEND_RESPONSE_HEADER,
+ status_str,
+ &status_str_len,
+ (LPDWORD)headers_str);
+ }
+
+ if (!rc) {
+ jk_log(logger, JK_LOG_ERROR,
+ "HSE_REQ_SEND_RESPONSE_HEADER%s failed with error=%d (0x%08x)",
+ (keep_alive ? "_EX" : ""), GetLastError(), GetLastError());
+ rv = JK_FALSE;
+ }
+ if (headers_str)
+ free(headers_str);
+ if (status_str)
+ free(status_str);
+ }
+ JK_TRACE_EXIT(logger);
+ return rv;
+ }
+
+ JK_LOG_NULL_PARAMS(logger);
+ JK_TRACE_EXIT(logger);
+ return JK_FALSE;
+}
+
+static int JK_METHOD iis_read(jk_ws_service_t *s,
+ void *b, unsigned int l, unsigned int *a)
+{
+ JK_TRACE_ENTER(logger);
+
+ if (s && s->ws_private && b && a) {
+ isapi_private_data_t *p = s->ws_private;
+
+ if (JK_IS_DEBUG_LEVEL(logger)) {
+ jk_log(logger, JK_LOG_DEBUG,
+ "Preparing to read %d bytes. "
+ "ECB reports %d bytes total, with %d available.",
+ l, p->lpEcb->cbTotalBytes, p->lpEcb->cbAvailable);
+ }
+
+ *a = 0;
+ if (l) {
+ char *buf = b;
+ DWORD already_read = p->lpEcb->cbAvailable - p->bytes_read_so_far;
+
+ if (already_read >= l) {
+ if (JK_IS_DEBUG_LEVEL(logger)) {
+ jk_log(logger, JK_LOG_DEBUG,
+ "Already read %d bytes - supplying %d bytes from buffer",
+ already_read, l);
+ }
+ memcpy(buf, p->lpEcb->lpbData + p->bytes_read_so_far, l);
+ p->bytes_read_so_far += l;
+ *a = l;
+ }
+ else {
+ /*
+ * Try to copy what we already have
+ */
+ if (already_read > 0) {
+ if (JK_IS_DEBUG_LEVEL(logger)) {
+ jk_log(logger, JK_LOG_DEBUG,
+ "Supplying %d bytes from buffer",
+ already_read);
+ }
+ memcpy(buf, p->lpEcb->lpbData + p->bytes_read_so_far,
+ already_read);
+ buf += already_read;
+ l -= already_read;
+ p->bytes_read_so_far = p->lpEcb->cbAvailable;
+
+ *a = already_read;
+ }
+
+ /*
+ * Now try to read from the client ...
+ */
+ if (JK_IS_DEBUG_LEVEL(logger)) {
+ jk_log(logger, JK_LOG_DEBUG,
+ "Attempting to read %d bytes from client", l);
+ }
+ if (p->lpEcb->ReadClient(p->lpEcb->ConnID, buf, (LPDWORD)&l)) {
+ /* ReadClient will succeed with dwSize == 0 for last chunk
+ if request chunk encoded */
+ *a += l;
+ }
+ else {
+ jk_log(logger, JK_LOG_ERROR,
+ "ReadClient failed with %d (0x%08x)", GetLastError(), GetLastError());
+ JK_TRACE_EXIT(logger);
+ return JK_FALSE;
+ }
+ }
+ }
+ JK_TRACE_EXIT(logger);
+ return JK_TRUE;
+ }
+
+ JK_LOG_NULL_PARAMS(logger);
+ JK_TRACE_EXIT(logger);
+ return JK_FALSE;
+}
+
+/*
+ * Writes a buffer to the ISAPI response.
+ */
+static int isapi_write_client(isapi_private_data_t *p, const char *buf, unsigned int write_length)
+{
+ unsigned int written = 0;
+ DWORD try_to_write = 0;
+
+ JK_TRACE_ENTER(logger);
+
+ if (JK_IS_DEBUG_LEVEL(logger))
+ jk_log(logger, JK_LOG_DEBUG, "Writing %d bytes of data to client", write_length);
+
+ while (written < write_length) {
+ try_to_write = write_length - written;
+ if (!p->lpEcb->WriteClient(p->lpEcb->ConnID,
+ (LPVOID)(buf + written), &try_to_write, HSE_IO_SYNC)) {
+ jk_log(logger, JK_LOG_ERROR,
+ "WriteClient failed with %d (0x%08x)", GetLastError(), GetLastError());
+ JK_TRACE_EXIT(logger);
+ return JK_FALSE;
+ }
+ written += try_to_write;
+ if (JK_IS_DEBUG_LEVEL(logger))
+ jk_log(logger, JK_LOG_DEBUG, "Wrote %d bytes of data successfully", try_to_write);
+ }
+ JK_TRACE_EXIT(logger);
+ return JK_TRUE;
+}
+
+/*
+ * Write content to the response.
+ * If chunked encoding has been enabled and the client supports it
+ *(and it's appropriate for the response), then this will write a
+ * single "Transfer-Encoding: chunked" chunk
+ */
+static int JK_METHOD iis_write(jk_ws_service_t *s, const void *b, unsigned int l)
+{
+ JK_TRACE_ENTER(logger);
+
+ if (!l) {
+ JK_TRACE_EXIT(logger);
+ return JK_TRUE;
+ }
+
+ if (s && s->ws_private && b) {
+ isapi_private_data_t *p = s->ws_private;
+ const char *buf = (const char *)b;
+
+ if (!p) {
+ JK_TRACE_EXIT(logger);
+ return JK_FALSE;
+ }
+
+ if (!s->response_started) {
+ start_response(s, 200, NULL, NULL, NULL, 0);
+ }
+
+ if (p->chunk_content == JK_FALSE) {
+ if (isapi_write_client(p, buf, l) == JK_FALSE) {
+ JK_TRACE_EXIT(logger);
+ return JK_FALSE;
+ }
+ }
+ else {
+ char chunk_header[CHUNK_HEADER_BUFFER_SIZE];
+
+ /* Construct chunk header : HEX CRLF*/
+ StringCbPrintf(chunk_header, CHUNK_HEADER_BUFFER_SIZE, "%X%s", l, CRLF);
+
+ if (iis_info.major >= 6) {
+ HSE_RESPONSE_VECTOR response_vector;
+ HSE_VECTOR_ELEMENT response_elements[3];
+
+ response_elements[0].ElementType = HSE_VECTOR_ELEMENT_TYPE_MEMORY_BUFFER;
+ response_elements[0].pvContext = chunk_header;
+ response_elements[0].cbOffset = 0;
+ response_elements[0].cbSize = strlen(chunk_header);
+
+ response_elements[1].ElementType = HSE_VECTOR_ELEMENT_TYPE_MEMORY_BUFFER;
+ response_elements[1].pvContext = (PVOID)buf;
+ response_elements[1].cbOffset = 0;
+ response_elements[1].cbSize = l;
+
+ response_elements[2].ElementType = HSE_VECTOR_ELEMENT_TYPE_MEMORY_BUFFER;
+ response_elements[2].pvContext = CRLF;
+ response_elements[2].cbOffset = 0;
+ response_elements[2].cbSize = CRLF_LEN;
+
+ response_vector.dwFlags = HSE_IO_SYNC;
+ response_vector.pszStatus = NULL;
+ response_vector.pszHeaders = NULL;
+ response_vector.nElementCount = 3;
+ response_vector.lpElementArray = response_elements;
+
+ if (JK_IS_DEBUG_LEVEL(logger))
+ jk_log(logger, JK_LOG_DEBUG,
+ "Using vector write for chunk encoded %d byte chunk", l);
+
+ if (!p->lpEcb->ServerSupportFunction(p->lpEcb->ConnID,
+ HSE_REQ_VECTOR_SEND,
+ &response_vector,
+ (LPDWORD)NULL,
+ (LPDWORD)NULL)) {
+ jk_log(logger, JK_LOG_ERROR,
+ "Vector write of chunk encoded response failed with %d (0x%08x)",
+ GetLastError(), GetLastError());
+ JK_TRACE_EXIT(logger);
+ return JK_FALSE;
+ }
+ } else {
+ /* Write chunk header */
+ if (JK_IS_DEBUG_LEVEL(logger))
+ jk_log(logger, JK_LOG_DEBUG,
+ "Using chunked encoding - writing chunk header for %d byte chunk", l);
+
+ if (!isapi_write_client(p, chunk_header, (unsigned int)strlen(chunk_header))) {
+ jk_log(logger, JK_LOG_ERROR, "WriteClient for chunk header failed");
+ JK_TRACE_EXIT(logger);
+ return JK_FALSE;
+ }
+
+ /* Write chunk body (or simple body block) */
+ if (JK_IS_DEBUG_LEVEL(logger)) {
+ jk_log(logger, JK_LOG_DEBUG, "Writing %s of size %d",
+ (p->chunk_content ? "chunk body" : "simple response"), l);
+ }
+ if (!isapi_write_client(p, buf, l)) {
+ jk_log(logger, JK_LOG_ERROR, "WriteClient for response body chunk failed");
+ JK_TRACE_EXIT(logger);
+ return JK_FALSE;
+ }
+ /* Write chunk trailer */
+ if (JK_IS_DEBUG_LEVEL(logger)) {
+ jk_log(logger, JK_LOG_DEBUG, "Using chunked encoding - writing chunk trailer");
+ }
+
+ if (!isapi_write_client(p, CRLF, CRLF_LEN)) {
+ jk_log(logger, JK_LOG_ERROR, "WriteClient for chunk trailer failed");
+ JK_TRACE_EXIT(logger);
+ return JK_FALSE;
+ }
+ }
+ }
+
+ JK_TRACE_EXIT(logger);
+ return JK_TRUE;
+
+ }
+
+ JK_LOG_NULL_PARAMS(logger);
+ JK_TRACE_EXIT(logger);
+ return JK_FALSE;
+}
+
+/**
+ * In the case of a Transfer-Encoding: chunked response, this will write the terminator chunk.
+ */
+static int JK_METHOD iis_done(jk_ws_service_t *s)
+{
+ JK_TRACE_ENTER(logger);
+
+ if (s && s->ws_private) {
+ isapi_private_data_t *p = s->ws_private;
+
+ if (p->chunk_content == JK_FALSE) {
+ JK_TRACE_EXIT(logger);
+ return JK_TRUE;
+ }
+
+ /* Write last chunk + terminator */
+ if (iis_info.major >= 6) {
+ HSE_RESPONSE_VECTOR response_vector;
+ HSE_VECTOR_ELEMENT response_elements[1];
+
+ response_elements[0].ElementType = HSE_VECTOR_ELEMENT_TYPE_MEMORY_BUFFER;
+ response_elements[0].pvContext = CHUNKED_ENCODING_TRAILER;
+ response_elements[0].cbOffset = 0;
+ response_elements[0].cbSize = CHUNKED_ENCODING_TRAILER_LEN;
+
+ /* HSE_IO_FINAL_SEND lets IIS process the response to the client before we return */
+ response_vector.dwFlags = HSE_IO_SYNC | HSE_IO_FINAL_SEND;
+ response_vector.pszStatus = NULL;
+ response_vector.pszHeaders = NULL;
+ response_vector.nElementCount = 1;
+ response_vector.lpElementArray = response_elements;
+
+ if (JK_IS_DEBUG_LEVEL(logger))
+ jk_log(logger, JK_LOG_DEBUG,
+ "Using vector write to terminate chunk encoded response.");
+
+ if (!p->lpEcb->ServerSupportFunction(p->lpEcb->ConnID,
+ HSE_REQ_VECTOR_SEND,
+ &response_vector,
+ (LPDWORD)NULL,
+ (LPDWORD)NULL)) {
+ jk_log(logger, JK_LOG_ERROR,
+ "Vector termination of chunk encoded response failed with %d (0x%08x)",
+ GetLastError(), GetLastError());
+ JK_TRACE_EXIT(logger);
+ return JK_FALSE;
+ }
+ }
+ else {
+ if (JK_IS_DEBUG_LEVEL(logger))
+ jk_log(logger, JK_LOG_DEBUG, "Terminating chunk encoded response");
+
+ if (!isapi_write_client(p, CHUNKED_ENCODING_TRAILER, CHUNKED_ENCODING_TRAILER_LEN)) {
+ jk_log(logger, JK_LOG_ERROR,
+ "WriteClient for chunked response terminator failed with %d (0x%08x)",
+ GetLastError(), GetLastError());
+ JK_TRACE_EXIT(logger);
+ return JK_FALSE;
+ }
+ }
+
+ JK_TRACE_EXIT(logger);
+ return JK_TRUE;
+ }
+
+ JK_LOG_NULL_PARAMS(logger);
+ JK_TRACE_EXIT(logger);
+ return JK_FALSE;
+}
+
+BOOL WINAPI GetFilterVersion(PHTTP_FILTER_VERSION pVer)
+{
+ int rc;
+ BOOL rv = TRUE;
+ ULONG http_filter_revision = HTTP_FILTER_REVISION;
+
+ pVer->dwFilterVersion = pVer->dwServerFilterVersion;
+
+ if (pVer->dwFilterVersion > http_filter_revision) {
+ pVer->dwFilterVersion = http_filter_revision;
+ }
+ JK_ENTER_CS(&(init_cs), rc);
+ if (!is_inited) {
+ rv = initialize_extension();
+ }
+ JK_LEAVE_CS(&(init_cs), rc);
+ pVer->dwFlags = SF_NOTIFY_ORDER_HIGH |
+ SF_NOTIFY_SECURE_PORT |
+ SF_NOTIFY_NONSECURE_PORT |
+ SF_NOTIFY_LOG |
+ iis_info.filter_notify_event;
+
+ StringCbCopy(pVer->lpszFilterDesc, SF_MAX_FILTER_DESC_LEN, (VERSION_STRING));
+ return rv;
+}
+
+
+#define AP_REG_ICASE 0x01 /** use a case-insensitive match */
+#define AP_REG_NEWLINE 0x02 /** don't match newlines against '.' etc */
+#define AP_REG_NOTBOL 0x04 /** ^ will not match against start-of-string */
+#define AP_REG_NOTEOL 0x08 /** $ will not match against end-of-string */
+
+#define AP_REG_EXTENDED (0) /** unused */
+#define AP_REG_NOSUB (0) /** unused */
+/** The max number of regex captures that can be expanded by ap_pregsub */
+#define AP_MAX_REG_MATCH 10
+
+/* Error values: */
+enum {
+ AP_REG_ASSERT = 1, /** internal error ? */
+ AP_REG_ESPACE, /** failed to get memory */
+ AP_REG_INVARG, /** invalid argument */
+ AP_REG_NOMATCH /** match failed */
+};
+
+/* The structure representing a compiled regular expression. */
+typedef struct {
+ void *re_pcre;
+ size_t re_nsub;
+ size_t re_erroffset;
+ const char *real;
+ const char *fake;
+} ap_regex_t;
+
+/* The structure in which a captured offset is returned. */
+typedef struct {
+ int rm_so;
+ int rm_eo;
+} ap_regmatch_t;
+
+
+/* Table of error strings corresponding to POSIX error codes; must be
+ * kept in synch with include/ap_regex.h's AP_REG_E* definitions. */
+
+static const char *const pstring[] = {
+ "", /* Dummy for value 0 */
+ "internal error", /* AP_REG_ASSERT */
+ "failed to get memory", /* AP_REG_ESPACE */
+ "bad argument", /* AP_REG_INVARG */
+ "match failed" /* AP_REG_NOMATCH */
+};
+
+static size_t ap_regerror(int errcode, const ap_regex_t *preg,
+ char *errbuf, size_t errbuf_size)
+{
+ const char *message, *addmessage;
+ size_t length, addlength;
+
+ message = (errcode >= (int)(sizeof(pstring)/sizeof(char *))) ?
+ "unknown error code" : pstring[errcode];
+ length = strlen(message) + 1;
+
+ addmessage = " at offset ";
+ addlength = (preg != NULL && (int)preg->re_erroffset != -1)?
+ strlen(addmessage) + 6 : 0;
+
+ if (errbuf_size > 0) {
+ if (addlength > 0 && errbuf_size >= length + addlength)
+ StringCbPrintf(errbuf, sizeof(errbuf), "%s%s%-6d",
+ message, addmessage,
+ (int)preg->re_erroffset);
+ else {
+ strncpy(errbuf, message, errbuf_size - 1);
+ errbuf[errbuf_size-1] = 0;
+ }
+ }
+
+ return length + addlength;
+}
+
+/*************************************************
+ * Free store held by a regex *
+ *************************************************/
+
+static void ap_regfree(ap_regex_t *preg)
+{
+ (pcre_free)(preg->re_pcre);
+}
+
+
+
+
+/*************************************************
+ * Compile a regular expression *
+ *************************************************/
+
+/*
+Arguments:
+ preg points to a structure for recording the compiled expression
+ pattern the pattern to compile
+ cflags compilation flags
+
+Returns: 0 on success
+ various non-zero codes on failure
+*/
+
+static int ap_regcomp(ap_regex_t *preg, const char *pattern, int cflags)
+{
+ const char *errorptr;
+ int erroffset;
+ int options = 0;
+
+ if ((cflags & AP_REG_ICASE) != 0) options |= PCRE_CASELESS;
+ if ((cflags & AP_REG_NEWLINE) != 0) options |= PCRE_MULTILINE;
+
+ preg->re_pcre = pcre_compile(pattern, options, &errorptr, &erroffset, NULL);
+ preg->re_erroffset = erroffset;
+
+ if (preg->re_pcre == NULL) return AP_REG_INVARG;
+
+ preg->re_nsub = pcre_info((const pcre *)preg->re_pcre, NULL, NULL);
+ return 0;
+}
+
+/*************************************************
+ * Match a regular expression *
+ *************************************************/
+
+/* Unfortunately, PCRE requires 3 ints of working space for each captured
+substring, so we have to get and release working store instead of just using
+the POSIX structures as was done in earlier releases when PCRE needed only 2
+ints. However, if the number of possible capturing brackets is small, use a
+block of store on the stack, to reduce the use of malloc/free. The threshold is
+in a macro that can be changed at configure time. */
+
+static int ap_regexec(const ap_regex_t *preg, const char *string,
+ int nmatch, ap_regmatch_t pmatch[],
+ int eflags)
+{
+ int rc;
+ int options = 0;
+ int *ovector = NULL;
+ int small_ovector[POSIX_MALLOC_THRESHOLD * 3];
+ int allocated_ovector = 0;
+
+ if ((eflags & AP_REG_NOTBOL) != 0) options |= PCRE_NOTBOL;
+ if ((eflags & AP_REG_NOTEOL) != 0) options |= PCRE_NOTEOL;
+
+ ((ap_regex_t *)preg)->re_erroffset = (size_t)(-1); /* Only has meaning after compile */
+
+ if (nmatch > 0) {
+ if (nmatch <= POSIX_MALLOC_THRESHOLD) {
+ ovector = &(small_ovector[0]);
+ }
+ else {
+ ovector = (int *)malloc(sizeof(int) * nmatch * 3);
+ if (ovector == NULL)
+ return AP_REG_ESPACE;
+ allocated_ovector = 1;
+ }
+ }
+
+ rc = pcre_exec((const pcre *)preg->re_pcre, NULL, string,
+ (int)strlen(string),
+ 0, options, ovector, nmatch * 3);
+
+ if (rc == 0)
+ rc = nmatch; /* All captured slots were filled in */
+ if (rc >= 0) {
+ int i;
+ for (i = 0; i < rc; i++) {
+ pmatch[i].rm_so = ovector[i*2];
+ pmatch[i].rm_eo = ovector[i*2+1];
+ }
+ if (allocated_ovector)
+ free(ovector);
+ for (; i < nmatch; i++)
+ pmatch[i].rm_so = pmatch[i].rm_eo = -1;
+ return 0;
+ }
+ else {
+ if (allocated_ovector)
+ free(ovector);
+ switch(rc) {
+ case PCRE_ERROR_NOMATCH: return AP_REG_NOMATCH;
+ case PCRE_ERROR_NULL: return AP_REG_INVARG;
+ case PCRE_ERROR_BADOPTION: return AP_REG_INVARG;
+ case PCRE_ERROR_BADMAGIC: return AP_REG_INVARG;
+ case PCRE_ERROR_UNKNOWN_NODE: return AP_REG_ASSERT;
+ case PCRE_ERROR_NOMEMORY: return AP_REG_ESPACE;
+#ifdef PCRE_ERROR_MATCHLIMIT
+ case PCRE_ERROR_MATCHLIMIT: return AP_REG_ESPACE;
+#endif
+#ifdef PCRE_ERROR_BADUTF8
+ case PCRE_ERROR_BADUTF8: return AP_REG_INVARG;
+#endif
+#ifdef PCRE_ERROR_BADUTF8_OFFSET
+ case PCRE_ERROR_BADUTF8_OFFSET: return AP_REG_INVARG;
+#endif
+ default: return AP_REG_ASSERT;
+ }
+ }
+}
+
+/* This function substitutes for $0-$9, filling in regular expression
+ * submatches. Pass it the same nmatch and pmatch arguments that you
+ * passed ap_regexec(). pmatch should not be greater than the maximum number
+ * of subexpressions - i.e. one more than the re_nsub member of ap_regex_t.
+ *
+ * input should be the string with the $-expressions, source should be the
+ * string that was matched against.
+ *
+ * It returns the substituted string, or NULL on error.
+ *
+ * Parts of this code are based on Henry Spencer's regsub(), from his
+ * AT&T V8 regexp package.
+ */
+
+static char *ap_pregsub(const char *input,
+ const char *source, size_t nmatch,
+ ap_regmatch_t pmatch[])
+{
+ const char *src = input;
+ char *dest, *dst;
+ char c;
+ size_t no;
+ int len;
+
+ if (!source)
+ return NULL;
+ if (!nmatch)
+ return strdup(src);
+
+ /* First pass, find the size */
+ len = 0;
+
+ while ((c = *src++) != '\0') {
+ if (c == '&')
+ no = 0;
+ else if (c == '$' && isdigit((unsigned char)*src))
+ no = *src++ - '0';
+ else
+ no = 10;
+
+ if (no > 9) { /* Ordinary character. */
+ if (c == '\\' && (*src == '$' || *src == '&'))
+ c = *src++;
+ len++;
+ }
+ else if (no < nmatch && pmatch[no].rm_so < pmatch[no].rm_eo) {
+ len += pmatch[no].rm_eo - pmatch[no].rm_so;
+ }
+
+ }
+
+ dest = dst = calloc(1, len + 1);
+
+ /* Now actually fill in the string */
+
+ src = input;
+
+ while ((c = *src++) != '\0') {
+ if (c == '&')
+ no = 0;
+ else if (c == '$' && isdigit((unsigned char)*src))
+ no = *src++ - '0';
+ else
+ no = 10;
+
+ if (no > 9) { /* Ordinary character. */
+ if (c == '\\' && (*src == '$' || *src == '&'))
+ c = *src++;
+ *dst++ = c;
+ }
+ else if (no < nmatch && pmatch[no].rm_so < pmatch[no].rm_eo) {
+ len = pmatch[no].rm_eo - pmatch[no].rm_so;
+ memcpy(dst, source + pmatch[no].rm_so, len);
+ dst += len;
+ }
+
+ }
+ *dst = '\0';
+ return dest;
+}
+
+static int simple_rewrite(char *uri)
+{
+ if (rewrite_map) {
+ int i;
+ char buf[INTERNET_MAX_URL_LENGTH];
+ for (i = 0; i < jk_map_size(rewrite_map); i++) {
+ const char *src = jk_map_name_at(rewrite_map, i);
+ if (*src == '~')
+ continue; /* Skip regexp rewrites */
+ if (strncmp(uri, src, strlen(src)) == 0) {
+ StringCbCopy(buf, INTERNET_MAX_URL_LENGTH, jk_map_value_at(rewrite_map, i));
+ StringCbCat(buf, INTERNET_MAX_URL_LENGTH, uri + strlen(src));
+ StringCbCopy(uri, INTERNET_MAX_URL_LENGTH, buf);
+ return 1;
+ }
+ }
+ }
+ return 0;
+}
+
+static int rregex_rewrite(char *uri)
+{
+ ap_regmatch_t regm[AP_MAX_REG_MATCH];
+
+ if (rregexp_map) {
+ int i;
+ for (i = 0; i < jk_map_size(rregexp_map); i++) {
+ ap_regex_t *regexp = (ap_regex_t *)jk_map_value_at(rregexp_map, i);
+ if (!ap_regexec(regexp, uri, AP_MAX_REG_MATCH, regm, 0)) {
+ char *subs = ap_pregsub(regexp->fake, uri,
+ AP_MAX_REG_MATCH, regm);
+ if (subs) {
+ char buf[INTERNET_MAX_URL_LENGTH];
+ size_t diffsz = strlen(subs) - (regm[0].rm_eo - regm[0].rm_so);
+ memcpy(&buf[0], uri, regm[0].rm_so);
+ StringCbCopy(&buf[regm[0].rm_so], INTERNET_MAX_URL_LENGTH - regm[0].rm_so, subs);
+ StringCbCat(&buf[0], INTERNET_MAX_URL_LENGTH, uri + regm[0].rm_eo);
+ StringCbCopy(uri, INTERNET_MAX_URL_LENGTH, &buf[0]);
+ free(subs);
+ return 1;
+ }
+ }
+ }
+ }
+ return 0;
+}
+
+DWORD WINAPI HttpFilterProc(PHTTP_FILTER_CONTEXT pfc,
+ DWORD dwNotificationType, LPVOID pvNotification)
+{
+ int rc;
+
+ /* Initialise jk */
+ if (is_inited && !is_mapread) {
+ char serverName[MAX_SERVERNAME] = "";
+ char instanceId[MAX_INSTANCEID] = "";
+ DWORD dwLen = MAX_SERVERNAME - MAX_INSTANCEID - 1;
+
+ if (pfc->GetServerVariable(pfc, SERVER_NAME, serverName, &dwLen)) {
+ if (dwLen > 0) {
+ serverName[dwLen - 1] = '\0';
+ dwLen = MAX_INSTANCEID;
+ if (pfc->GetServerVariable(pfc, INSTANCE_ID, instanceId, &dwLen)) {
+ if (dwLen > 0) {
+ instanceId[dwLen - 1] = '\0';
+ StringCbCat(serverName, MAX_SERVERNAME, "_");
+ StringCbCat(serverName, MAX_SERVERNAME, instanceId);
+ }
+ }
+ }
+ JK_ENTER_CS(&(init_cs), rc);
+ if (!is_mapread && init_jk(serverName))
+ is_mapread = JK_TRUE;
+ JK_LEAVE_CS(&(init_cs), rc);
+ }
+ /* If we can't read the map we become dormant */
+ if (!is_mapread)
+ is_inited = JK_FALSE;
+ }
+ if (!is_inited) {
+ /* In case the initialization failed
+ * return error. This will make entire IIS
+ * unusable like with Apache servers
+ */
+ SetLastError(ERROR_INVALID_FUNCTION);
+ return SF_STATUS_REQ_ERROR;
+ }
+ if (iis_info.filter_notify_event == dwNotificationType) {
+ char uri[INTERNET_MAX_URL_LENGTH];
+ char snuri[INTERNET_MAX_URL_LENGTH] = "/";
+ char Host[INTERNET_MAX_URL_LENGTH] = "";
+ char Port[INTERNET_MAX_URL_LENGTH] = "";
+ char Translate[INTERNET_MAX_URL_LENGTH];
+ char squery[INTERNET_MAX_URL_LENGTH] = "";
+ char swindex[MAX_INSTANCEID] = "";
+ BOOL(WINAPI * GetHeader)
+ (struct _HTTP_FILTER_CONTEXT * pfc, LPSTR lpszName,
+ LPVOID lpvBuffer, LPDWORD lpdwSize);
+ BOOL(WINAPI * SetHeader)
+ (struct _HTTP_FILTER_CONTEXT * pfc, LPSTR lpszName,
+ LPSTR lpszValue);
+ BOOL(WINAPI * AddHeader)
+ (struct _HTTP_FILTER_CONTEXT * pfc, LPSTR lpszName,
+ LPSTR lpszValue);
+ char *query;
+ DWORD sz = sizeof(uri);
+ DWORD szHost = sizeof(Host);
+ DWORD szPort = sizeof(Port);
+ DWORD szTranslate = sizeof(Translate);
+
+ if (iis_info.filter_notify_event == SF_NOTIFY_AUTH_COMPLETE) {
+ GetHeader =
+ ((PHTTP_FILTER_AUTH_COMPLETE_INFO) pvNotification)->GetHeader;
+ SetHeader =
+ ((PHTTP_FILTER_AUTH_COMPLETE_INFO) pvNotification)->SetHeader;
+ AddHeader =
+ ((PHTTP_FILTER_AUTH_COMPLETE_INFO) pvNotification)->AddHeader;
+ }
+ else {
+ GetHeader =
+ ((PHTTP_FILTER_PREPROC_HEADERS) pvNotification)->GetHeader;
+ SetHeader =
+ ((PHTTP_FILTER_PREPROC_HEADERS) pvNotification)->SetHeader;
+ AddHeader =
+ ((PHTTP_FILTER_PREPROC_HEADERS) pvNotification)->AddHeader;
+ }
+
+ if (JK_IS_DEBUG_LEVEL(logger))
+ jk_log(logger, JK_LOG_DEBUG, "Filter started");
+
+ /*
+ * Just in case somebody set these headers in the request!
+ */
+ SetHeader(pfc, URI_HEADER_NAME, NULL);
+ SetHeader(pfc, QUERY_HEADER_NAME, NULL);
+ SetHeader(pfc, WORKER_HEADER_NAME, NULL);
+ SetHeader(pfc, WORKER_HEADER_INDEX, NULL);
+ SetHeader(pfc, TOMCAT_TRANSLATE_HEADER_NAME, NULL);
+
+ // Suppress logging of original uri/query when we don't map a URL
+ if (pfc->pFilterContext) {
+ isapi_log_data_t *ld = (isapi_log_data_t *)pfc->pFilterContext;
+ ld->request_matched = JK_FALSE;
+ }
+
+ if (!GetHeader(pfc, "url", (LPVOID) uri, (LPDWORD) & sz)) {
+ jk_log(logger, JK_LOG_ERROR,
+ "error while getting the url");
+ return SF_STATUS_REQ_ERROR;
+ }
+
+ if (strlen(uri)) {
+ int rc;
+ const char *worker = NULL;
+ rule_extension_t *extensions;
+ int worker_index = -1;
+ query = strchr(uri, '?');
+ if (query) {
+ *query++ = '\0';
+ StringCbCopy(squery, INTERNET_MAX_URL_LENGTH, query);
+ }
+
+ rc = unescape_url(uri);
+ if (rc == BAD_REQUEST) {
+ jk_log(logger, JK_LOG_ERROR,
+ "[%s] contains one or more invalid escape sequences.",
+ uri);
+ write_error_response(pfc, 400);
+ return SF_STATUS_REQ_FINISHED;
+ }
+ else if (rc == BAD_PATH) {
+ jk_log(logger, JK_LOG_EMERG,
+ "[%s] contains forbidden escape sequences.",
+ uri);
+ write_error_response(pfc, 404);
+ return SF_STATUS_REQ_FINISHED;
+ }
+ getparents(uri);
+ if (pfc->
+ GetServerVariable(pfc, SERVER_NAME, (LPVOID) Host,
+ (LPDWORD) & szHost)) {
+ if (szHost > 0) {
+ Host[szHost - 1] = '\0';
+ }
+ }
+ Port[0] = '\0';
+ if (pfc->
+ GetServerVariable(pfc, "SERVER_PORT", (LPVOID) Port,
+ (LPDWORD) & szPort)) {
+ if (szPort > 0) {
+ Port[szPort - 1] = '\0';
+ }
+ }
+ szPort = atoi(Port);
+ if (szPort != 80 && szPort != 443 && szHost > 0) {
+ StringCbCat(Host, INTERNET_MAX_URL_LENGTH, ":");
+ StringCbCat(Host, INTERNET_MAX_URL_LENGTH, Port);
+ }
+ if (szHost > 0) {
+ StringCbCat(snuri, INTERNET_MAX_URL_LENGTH, Host);
+ worker = map_uri_to_worker_ext(uw_map, uri, snuri,
+ &extensions, &worker_index, logger);
+ }
+ else {
+ worker = map_uri_to_worker_ext(uw_map, uri, NULL,
+ &extensions, &worker_index, logger);
+ }
+ /*
+ * Check if somebody is feading us with his own TOMCAT data headers.
+ * We reject such postings !
+ */
+ if (worker) {
+ char *forwardURI;
+
+ if (JK_IS_DEBUG_LEVEL(logger))
+ jk_log(logger, JK_LOG_DEBUG,
+ "check if [%s] points to the web-inf directory",
+ uri);
+
+ if (uri_is_web_inf(uri)) {
+ jk_log(logger, JK_LOG_EMERG,
+ "[%s] points to the web-inf or meta-inf directory. "
+ "Somebody tries to hack into the site!!!",
+ uri);
+
+ write_error_response(pfc, 404);
+ return SF_STATUS_REQ_FINISHED;
+ }
+
+ /* This is a servlet, should redirect ... */
+ if (JK_IS_DEBUG_LEVEL(logger))
+ jk_log(logger, JK_LOG_DEBUG,
+ "[%s] is a servlet url - should redirect to %s",
+ uri, worker);
+
+ /* get URI we should forward */
+ if (uri_select_option == URI_SELECT_OPT_UNPARSED) {
+ /* get original unparsed URI */
+ GetHeader(pfc, "url", (LPVOID) uri, (LPDWORD) & sz);
+ /* restore terminator for uri portion */
+ if (query)
+ *(query - 1) = '\0';
+ if (JK_IS_DEBUG_LEVEL(logger))
+ jk_log(logger, JK_LOG_DEBUG,
+ "forwarding original URI [%s]",
+ uri);
+ forwardURI = uri;
+ }
+ else if (uri_select_option == URI_SELECT_OPT_ESCAPED) {
+ if (!escape_url(uri, snuri, INTERNET_MAX_URL_LENGTH)) {
+ jk_log(logger, JK_LOG_ERROR,
+ "[%s] re-encoding request exceeds maximum buffer size.",
+ uri);
+ write_error_response(pfc, 400);
+ return SF_STATUS_REQ_FINISHED;
+ }
+ if (JK_IS_DEBUG_LEVEL(logger))
+ jk_log(logger, JK_LOG_DEBUG,
+ "fowarding escaped URI [%s]",
+ snuri);
+ forwardURI = snuri;
+ }
+ else if (uri_select_option == URI_SELECT_OPT_PROXY) {
+ if (!jk_canonenc(uri, snuri, INTERNET_MAX_URL_LENGTH)) {
+ jk_log(logger, JK_LOG_ERROR,
+ "[%s] re-encoding request exceeds maximum buffer size.",
+ uri);
+ write_error_response(pfc, 400);
+ return SF_STATUS_REQ_FINISHED;
+ }
+ if (JK_IS_DEBUG_LEVEL(logger))
+ jk_log(logger, JK_LOG_DEBUG,
+ "fowarding escaped URI [%s]",
+ snuri);
+ forwardURI = snuri;
+ }
+ else {
+ forwardURI = uri;
+ }
+ /* Do a simple rewrite .
+ * Note that URI can be escaped, so thus the rule has
+ * to be in that case.
+ *
+ * TODO: Add more advanced regexp rewrite.
+ */
+ if (JK_IS_DEBUG_LEVEL(logger)) {
+ char duri[INTERNET_MAX_URL_LENGTH];
+ StringCbCopy(duri, INTERNET_MAX_URL_LENGTH, forwardURI);
+ if (simple_rewrite(forwardURI)) {
+ jk_log(logger, JK_LOG_DEBUG,
+ "rewritten URI [%s]->[%s]",
+ duri, forwardURI);
+ }
+ else if (rregex_rewrite(forwardURI)) {
+ jk_log(logger, JK_LOG_DEBUG,
+ "rewritten URI [%s]->[%s]",
+ duri, forwardURI);
+ }
+ }
+ else {
+ if (!simple_rewrite(forwardURI))
+ rregex_rewrite(forwardURI);
+ }
+
+ itoa(worker_index, swindex, 10);
+ if (!AddHeader(pfc, URI_HEADER_NAME, forwardURI) ||
+ ((strlen(squery) > 0)
+ ? !AddHeader(pfc, QUERY_HEADER_NAME, squery) : FALSE) ||
+ !AddHeader(pfc, WORKER_HEADER_NAME, (LPSTR)worker) ||
+ !AddHeader(pfc, WORKER_HEADER_INDEX, swindex) ||
+ !SetHeader(pfc, "url", extension_uri)) {
+ jk_log(logger, JK_LOG_ERROR,
+ "error while adding request headers");
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return SF_STATUS_REQ_ERROR;
+ }
+
+ /* Move Translate: header to a temporary header so
+ * that the extension proc will be called.
+ * This allows the servlet to handle 'Translate: f'.
+ */
+ if (GetHeader
+ (pfc, TRANSLATE_HEADER, (LPVOID) Translate,
+ (LPDWORD) & szTranslate) && Translate != NULL
+ && szTranslate > 0) {
+ if (!AddHeader
+ (pfc, TOMCAT_TRANSLATE_HEADER_NAME, Translate)) {
+ jk_log(logger, JK_LOG_ERROR,
+ "error while adding Tomcat-Translate headers");
+ return SF_STATUS_REQ_ERROR;
+ }
+ SetHeader(pfc, "Translate:", NULL);
+ }
+ if (!pfc->pFilterContext) {
+ isapi_log_data_t *ld = (isapi_log_data_t *)pfc->AllocMem(pfc, sizeof(isapi_log_data_t), 0);
+ if (!ld) {
+ jk_log(logger, JK_LOG_ERROR,
+ "error while allocating memory");
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return SF_STATUS_REQ_ERROR;
+ }
+ memset(ld, 0, sizeof(isapi_log_data_t));
+ StringCbCopy(ld->uri, INTERNET_MAX_URL_LENGTH, forwardURI);
+ StringCbCopy(ld->query, INTERNET_MAX_URL_LENGTH, squery);
+ ld->request_matched = JK_TRUE;
+ pfc->pFilterContext = ld;
+ } else {
+ isapi_log_data_t *ld = (isapi_log_data_t *)pfc->pFilterContext;
+ memset(ld, 0, sizeof(isapi_log_data_t));
+ StringCbCopy(ld->uri, INTERNET_MAX_URL_LENGTH, forwardURI);
+ StringCbCopy(ld->query, INTERNET_MAX_URL_LENGTH, squery);
+ ld->request_matched = JK_TRUE;
+ }
+ }
+ else {
+ if (JK_IS_DEBUG_LEVEL(logger))
+ jk_log(logger, JK_LOG_DEBUG,
+ "[%s] is not a servlet url", uri);
+ if (strip_session) {
+ char *jsessionid = strstr(uri, JK_PATH_SESSION_IDENTIFIER);
+ if (jsessionid) {
+ if (JK_IS_DEBUG_LEVEL(logger))
+ jk_log(logger, JK_LOG_DEBUG,
+ "removing session identifier [%s] for non servlet url [%s]",
+ jsessionid, uri);
+ *jsessionid = '\0';
+ SetHeader(pfc, "url", uri);
+ }
+ }
+ }
+ }
+ }
+ else if (dwNotificationType == SF_NOTIFY_LOG) {
+ if (pfc->pFilterContext) {
+ isapi_log_data_t *ld = (isapi_log_data_t *)pfc->pFilterContext;
+ if (ld->request_matched) {
+ HTTP_FILTER_LOG *pl = (HTTP_FILTER_LOG *)pvNotification;
+ pl->pszTarget = ld->uri;
+ pl->pszParameters = ld->query;
+ }
+ }
+ }
+ return SF_STATUS_REQ_NEXT_NOTIFICATION;
+}
+
+
+BOOL WINAPI GetExtensionVersion(HSE_VERSION_INFO * pVer)
+{
+ int rc;
+ BOOL rv = TRUE;
+
+ pVer->dwExtensionVersion = MAKELONG(HSE_VERSION_MINOR, HSE_VERSION_MAJOR);
+
+ StringCbCopy(pVer->lpszExtensionDesc, HSE_MAX_EXT_DLL_NAME_LEN, (VERSION_STRING));
+
+
+ JK_ENTER_CS(&(init_cs), rc);
+ if (!is_inited) {
+ rv = initialize_extension();
+ }
+ JK_LEAVE_CS(&(init_cs), rc);
+
+ return rv;
+}
+
+DWORD WINAPI HttpExtensionProc(LPEXTENSION_CONTROL_BLOCK lpEcb)
+{
+ int rv;
+ DWORD rc = HSE_STATUS_ERROR;
+
+ lpEcb->dwHttpStatusCode = HTTP_STATUS_SERVER_ERROR;
+
+ JK_TRACE_ENTER(logger);
+
+ /* Initialise jk */
+ if (is_inited && !is_mapread) {
+ char serverName[MAX_SERVERNAME] = "";
+ char instanceId[MAX_INSTANCEID] = "";
+
+ DWORD dwLen = MAX_SERVERNAME - MAX_INSTANCEID - 1;
+ if (lpEcb->GetServerVariable(lpEcb->ConnID,
+ SERVER_NAME, serverName, &dwLen)) {
+ if (dwLen > 0) {
+ serverName[dwLen - 1] = '\0';
+ dwLen = MAX_INSTANCEID;
+ if (lpEcb->GetServerVariable(lpEcb->ConnID,
+ INSTANCE_ID, instanceId, &dwLen)) {
+ if (dwLen > 0) {
+ instanceId[dwLen - 1] = '\0';
+ StringCbCat(serverName, MAX_SERVERNAME, "_");
+ StringCbCat(serverName, MAX_SERVERNAME, instanceId);
+ }
+ }
+ }
+ JK_ENTER_CS(&(init_cs), rv);
+ if (!is_mapread && init_jk(serverName))
+ is_mapread = JK_TRUE;
+ JK_LEAVE_CS(&(init_cs), rv);
+ }
+ if (!is_mapread)
+ is_inited = JK_FALSE;
+ }
+
+ if (is_inited) {
+ isapi_private_data_t private_data;
+ jk_ws_service_t s;
+ jk_pool_atom_t buf[SMALL_POOL_SIZE];
+ char *worker_name;
+
+ if (!watchdog_interval)
+ wc_maintain(logger);
+ jk_init_ws_service(&s);
+ jk_open_pool(&private_data.p, buf, sizeof(buf));
+
+ private_data.bytes_read_so_far = 0;
+ private_data.lpEcb = lpEcb;
+ private_data.chunk_content = JK_FALSE;
+
+ s.ws_private = &private_data;
+ s.pool = &private_data.p;
+
+ if (init_ws_service(&private_data, &s, &worker_name)) {
+ jk_worker_t *worker = wc_get_worker_for_name(worker_name, logger);
+
+ if (JK_IS_DEBUG_LEVEL(logger))
+ jk_log(logger, JK_LOG_DEBUG,
+ "%s a worker for name %s",
+ worker ? "got" : "could not get", worker_name);
+
+ if (worker) {
+ jk_endpoint_t *e = NULL;
+ if (worker->get_endpoint(worker, &e, logger)) {
+ int is_error = JK_HTTP_SERVER_ERROR;
+ int result;
+ if ((result = e->service(e, &s, logger, &is_error)) > 0) {
+ if (s.extension.use_server_error_pages &&
+ s.http_response_status >= s.extension.use_server_error_pages) {
+ if (JK_IS_DEBUG_LEVEL(logger))
+ jk_log(logger, JK_LOG_DEBUG, "Forwarding status=%d"
+ " for worker=%s",
+ s.http_response_status, worker_name);
+ lpEcb->dwHttpStatusCode = s.http_response_status;
+ write_error_message(lpEcb, s.http_response_status);
+ }
+ else {
+ rc = HSE_STATUS_SUCCESS;
+ lpEcb->dwHttpStatusCode = s.http_response_status;
+ if (JK_IS_DEBUG_LEVEL(logger))
+ jk_log(logger, JK_LOG_DEBUG,
+ "service() returned OK");
+ }
+ }
+ else {
+ if ((result == JK_CLIENT_ERROR) && (is_error == JK_HTTP_OK)) {
+ jk_log(logger, JK_LOG_INFO,
+ "service() failed because client aborted connection");
+ }
+ else {
+ jk_log(logger, JK_LOG_ERROR,
+ "service() failed with http error %d", is_error);
+ }
+ lpEcb->dwHttpStatusCode = is_error;
+ write_error_message(lpEcb, is_error);
+ }
+ e->done(&e, logger);
+ }
+ else {
+ jk_log(logger, JK_LOG_ERROR,
+ "Failed to obtain an endpoint to service request - "
+ "your connection_pool_size is probably less than the threads in your web server!");
+ }
+ }
+ else {
+ jk_log(logger, JK_LOG_ERROR,
+ "could not get a worker for name %s",
+ worker_name);
+ }
+ }
+ else {
+ jk_log(logger, JK_LOG_ERROR,
+ "failed to init service for request.");
+ }
+ jk_close_pool(&private_data.p);
+ }
+ else {
+ jk_log(logger, JK_LOG_ERROR,
+ "not initialized");
+ }
+
+ JK_TRACE_EXIT(logger);
+ return rc;
+}
+
+
+
+BOOL WINAPI TerminateExtension(DWORD dwFlags)
+{
+ return TerminateFilter(dwFlags);
+}
+
+BOOL WINAPI TerminateFilter(DWORD dwFlags)
+{
+ int rc;
+
+ UNREFERENCED_PARAMETER(dwFlags);
+
+ JK_ENTER_CS(&(init_cs), rc);
+ if (is_inited) {
+ jk_log(logger, JK_LOG_INFO, "%s stopping", (FULL_VERSION_STRING));
+ is_inited = JK_FALSE;
+ watchdog_interval = 0;
+ if (watchdog_handle) {
+ WaitForSingleObject(watchdog_handle, INFINITE);
+ CloseHandle(watchdog_handle);
+ watchdog_handle = NULL;
+ }
+ if (is_mapread) {
+ uri_worker_map_free(&uw_map, logger);
+ is_mapread = JK_FALSE;
+ }
+ if (workers_map) {
+ jk_map_free(&workers_map);
+ }
+ if (rewrite_map) {
+ jk_map_free(&rewrite_map);
+ }
+ if (rregexp_map) {
+ int i;
+ for (i = 0; i < jk_map_size(rregexp_map); i++) {
+ ap_regex_t *regexp = (ap_regex_t *)jk_map_value_at(rregexp_map, i);
+ if (regexp) {
+ ap_regfree(regexp);
+ free(regexp);
+ }
+ }
+ jk_map_free(&rregexp_map);
+ }
+ wc_close(logger);
+ jk_shm_close();
+ JK_ENTER_CS(&(log_cs), rc);
+ if (logger) {
+ jk_close_file_logger(&logger);
+ }
+ JK_LEAVE_CS(&(log_cs), rc);
+ }
+ JK_LEAVE_CS(&(init_cs), rc);
+
+ return TRUE;
+}
+
+
+BOOL WINAPI DllMain(HINSTANCE hInst, // Instance Handle of the DLL
+ ULONG ulReason, // Reason why NT called this DLL
+ LPVOID lpReserved) // Reserved parameter for future use
+{
+ int rc;
+ BOOL fReturn = TRUE;
+ char fname[MAX_PATH];
+
+ UNREFERENCED_PARAMETER(lpReserved);
+
+ switch (ulReason) {
+ case DLL_PROCESS_ATTACH:
+ if (GetModuleFileName(hInst, fname, sizeof(fname))) {
+ char *p = strrchr(fname, '.');
+ if (p) {
+ *p = '\0';
+ StringCbCopy(ini_file_name, MAX_PATH, fname);
+ StringCbCat(ini_file_name, MAX_PATH, ".properties");
+ }
+ else {
+ /* Cannot obtain file name ? */
+ fReturn = JK_FALSE;
+ }
+ if ((p = strrchr(fname, '\\'))) {
+ *(p++) = '\0';
+ StringCbCopy(dll_file_path, MAX_PATH, fname);
+ jk_map_alloc(&jk_environment_map);
+ jk_map_add(jk_environment_map, "JKISAPI_PATH", dll_file_path);
+ jk_map_add(jk_environment_map, "JKISAPI_NAME", p);
+ }
+ else {
+ /* Cannot obtain file name ? */
+ fReturn = JK_FALSE;
+ }
+ }
+ else {
+ fReturn = JK_FALSE;
+ }
+ /* Construct redirector headers to use for this redirector instance */
+ StringCbPrintf(URI_HEADER_NAME, MAX_PATH, HEADER_TEMPLATE, URI_HEADER_NAME_BASE, hInst);
+ StringCbPrintf(QUERY_HEADER_NAME, MAX_PATH, HEADER_TEMPLATE, QUERY_HEADER_NAME_BASE, hInst);
+ StringCbPrintf(WORKER_HEADER_NAME, MAX_PATH, HEADER_TEMPLATE, WORKER_HEADER_NAME_BASE, hInst);
+ StringCbPrintf(WORKER_HEADER_INDEX, MAX_PATH, HEADER_TEMPLATE, WORKER_HEADER_INDEX_BASE, hInst);
+ StringCbPrintf(TOMCAT_TRANSLATE_HEADER_NAME, MAX_PATH, HEADER_TEMPLATE, TOMCAT_TRANSLATE_HEADER_NAME_BASE, hInst);
+
+ /* Construct the HTTP_ headers that will be seen in ExtensionProc */
+ StringCbPrintf(HTTP_URI_HEADER_NAME, MAX_PATH, HTTP_HEADER_TEMPLATE, URI_HEADER_NAME_BASE, hInst);
+ StringCbPrintf(HTTP_QUERY_HEADER_NAME, MAX_PATH, HTTP_HEADER_TEMPLATE, QUERY_HEADER_NAME_BASE, hInst);
+ StringCbPrintf(HTTP_WORKER_HEADER_NAME, MAX_PATH, HTTP_HEADER_TEMPLATE, WORKER_HEADER_NAME_BASE, hInst);
+ StringCbPrintf(HTTP_WORKER_HEADER_INDEX, MAX_PATH, HTTP_HEADER_TEMPLATE, WORKER_HEADER_INDEX_BASE, hInst);
+
+ JK_INIT_CS(&init_cs, rc);
+ JK_INIT_CS(&log_cs, rc);
+
+ break;
+ case DLL_PROCESS_DETACH:
+ __try {
+ TerminateFilter(HSE_TERM_MUST_UNLOAD);
+ }
+ __except(1) {
+ }
+ JK_DELETE_CS(&init_cs, rc);
+ JK_DELETE_CS(&log_cs, rc);
+ break;
+
+ default:
+ break;
+ }
+
+ return fReturn;
+}
+
+static DWORD WINAPI watchdog_thread(void *param)
+{
+ int i;
+ if (JK_IS_DEBUG_LEVEL(logger)) {
+ jk_log(logger, JK_LOG_DEBUG,
+ "Watchdog thread initialized with %u second interval",
+ watchdog_interval);
+ }
+ while (watchdog_interval) {
+ for (i = 0; i < (watchdog_interval * 10); i++) {
+ if (!watchdog_interval)
+ break;
+ Sleep(100);
+ }
+ if (!watchdog_interval)
+ break;
+ if (JK_IS_DEBUG_LEVEL(logger)) {
+ jk_log(logger, JK_LOG_DEBUG,
+ "Watchdog thread running");
+ }
+ if (worker_mount_file[0]) {
+ jk_shm_lock();
+ uri_worker_map_update(uw_map, 0, logger);
+ jk_shm_unlock();
+ }
+ wc_maintain(logger);
+ }
+ if (JK_IS_DEBUG_LEVEL(logger)) {
+ jk_log(logger, JK_LOG_DEBUG,
+ "Watchdog thread finished");
+ }
+ return 0;
+}
+
+/*
+ * Reinitializes the logger, formatting the log file name if rotation is enabled,
+ * and calculating the next rotation time if applicable.
+ */
+static int init_logger(int rotate, jk_logger_t **l)
+{
+ int rc = JK_TRUE;
+ int log_open = rotate; /* log is assumed open if a rotate is requested */
+ char *log_file_name;
+ char log_file_name_buf[MAX_PATH*2];
+
+ /* If log rotation is enabled, format the log filename */
+ if ((log_rotationtime > 0) || (log_filesize > 0)) {
+ time_t t;
+ t = time(NULL);
+
+ if (log_rotationtime > 0) {
+ /* Align time to rotationtime intervals */
+ t = (t / log_rotationtime) * log_rotationtime;
+
+ /* Calculate rotate time */
+ log_next_rotate_time = t + log_rotationtime;
+ }
+
+ log_file_name = log_file_name_buf;
+ if (strchr(log_file, '%')) {
+ struct tm *tm_now;
+
+ /* If there are %s in the log file name, treat it as a sprintf format */
+ tm_now = localtime(&t);
+ strftime(log_file_name, sizeof(log_file_name_buf), log_file, tm_now);
+ } else {
+ /* Otherwise append the number of seconds to the base name */
+ StringCbPrintf(log_file_name, sizeof(log_file_name_buf), "%s.%d", log_file, (long)t);
+ }
+ } else {
+ log_file_name = log_file;
+ }
+
+ /* Close the current log file if required, and the effective log file name has changed */
+ if (log_open && strncmp(log_file_name, log_file_effective, strlen(log_file_name)) != 0) {
+ FILE* lf = ((jk_file_logger_t* )logger->logger_private)->logfile;
+ fprintf(lf, "Log rotated to %s\r\n", log_file_name);
+ fflush(lf);
+ rc = jk_close_file_logger(&logger);
+ log_open = JK_FALSE;
+ }
+
+ if (!log_open) {
+ if (jk_open_file_logger(&logger, log_file_name, log_level)) {
+ logger->log = iis_log_to_file;
+
+ /* Remember the current log file name for the next potential rotate */
+ StringCbCopy(log_file_effective, sizeof(log_file_effective), log_file_name);
+ rc = JK_TRUE;
+ } else {
+ logger = NULL;
+ rc = JK_FALSE;
+ }
+ }
+
+ /* Update logger being used for this log call so it occurs on new file */
+ (*l) = logger;
+ return rc;
+}
+
+/*
+ * Checks whether the log needs to be rotated. Must be called while holding the log lock.
+ * The behaviour here is based on the Apache rotatelogs program.
+ * http://httpd.apache.org/docs/2.0/programs/rotatelogs.html
+ */
+static int JK_METHOD rotate_log_file(jk_logger_t **l)
+{
+ int rc = JK_TRUE;
+ int rotate = JK_FALSE;
+
+ if (log_rotationtime > 0) {
+ time_t t = time(NULL);
+
+ if (t >= log_next_rotate_time) {
+ rotate = JK_TRUE;
+ }
+ } else if (log_filesize > 0) {
+ LARGE_INTEGER filesize;
+ HANDLE h = (HANDLE)_get_osfhandle(fileno(((jk_file_logger_t *)(*l)->logger_private)->logfile));
+ GetFileSizeEx(h, &filesize);
+
+ if ((ULONGLONG)filesize.QuadPart >= log_filesize) {
+ rotate = JK_TRUE;
+ }
+ }
+ if (rotate) {
+ rc = init_logger(JK_TRUE, l);
+ }
+ return rc;
+}
+
+/*
+ * Log messages to the log file, rotating the log when required.
+ */
+static int JK_METHOD iis_log_to_file(jk_logger_t *l, int level,
+ int used, char *what)
+{
+ int rc = JK_FALSE;
+
+ if (l &&
+ (l->level <= level || level == JK_LOG_REQUEST_LEVEL) &&
+ l->logger_private && what && used > 0) {
+ jk_file_logger_t *p = l->logger_private;
+ rc = JK_TRUE;
+
+ if (p->logfile) {
+ what[used++] = '\r';
+ what[used++] = '\n';
+ what[used] = '\0';
+
+ /* Perform logging within critical section to protect rotation */
+ JK_ENTER_CS(&(log_cs), rc);
+ if (rc && rotate_log_file(&l)) {
+ /* The rotation process will reallocate the jk_logger_t structure, so refetch */
+ FILE *rotated = ((jk_file_logger_t *)l->logger_private)->logfile;
+ fputs(what, rotated);
+ fflush(rotated);
+ JK_LEAVE_CS(&(log_cs), rc);
+ }
+ }
+ }
+ return rc;
+}
+
+static int init_jk(char *serverName)
+{
+ char shm_name[MAX_PATH];
+ int rc = JK_FALSE;
+
+ init_logger(JK_FALSE, &logger);
+ /* TODO: Use System logging to notify the user that
+ * we cannot open the configured log file.
+ */
+
+ StringCbCopy(shm_name, MAX_PATH, SHM_DEF_NAME);
+
+ jk_log(logger, JK_LOG_INFO, "Starting %s", (FULL_VERSION_STRING));
+
+ if (*serverName) {
+ size_t i;
+ StringCbCat(shm_name, MAX_PATH, "_");
+ StringCbCat(shm_name, MAX_PATH, serverName);
+ for(i = 0; i < strlen(shm_name); i++) {
+ shm_name[i] = toupper(shm_name[i]);
+ if (!isalnum(shm_name[i]))
+ shm_name[i] = '_';
+ }
+ }
+
+ jk_set_worker_def_cache_size(DEFAULT_WORKER_THREADS);
+
+ /* Logging the initialization type: registry or properties file in virtual dir
+ */
+ if (JK_IS_DEBUG_LEVEL(logger)) {
+ jk_log(logger, JK_LOG_DEBUG, "Detected IIS version %d.%d", iis_info.major, iis_info.minor);
+ if (using_ini_file) {
+ jk_log(logger, JK_LOG_DEBUG, "Using ini file %s.", ini_file_name);
+ }
+ else {
+ jk_log(logger, JK_LOG_DEBUG, "Using registry.");
+ }
+
+ jk_log(logger, JK_LOG_DEBUG, "Using log file %s.", log_file);
+ jk_log(logger, JK_LOG_DEBUG, "Using log level %d.", log_level);
+ jk_log(logger, JK_LOG_DEBUG, "Using log rotation time %d seconds.", log_rotationtime);
+ jk_log(logger, JK_LOG_DEBUG, "Using log file size %d bytes.", log_filesize);
+
+ jk_log(logger, JK_LOG_DEBUG, "Using extension uri %s.", extension_uri);
+ jk_log(logger, JK_LOG_DEBUG, "Using worker file %s.", worker_file);
+ jk_log(logger, JK_LOG_DEBUG, "Using worker mount file %s.",
+ worker_mount_file);
+ jk_log(logger, JK_LOG_DEBUG, "Using rewrite rule file %s.",
+ rewrite_rule_file);
+ jk_log(logger, JK_LOG_DEBUG, "Using uri select %d.", uri_select_option);
+ jk_log(logger, JK_LOG_DEBUG, "Using%s chunked encoding.", (chunked_encoding_enabled ? "" : " no"));
+
+ jk_log(logger, JK_LOG_DEBUG, "Using notification event %s (0x%08x)",
+ (iis_info.filter_notify_event == SF_NOTIFY_AUTH_COMPLETE) ?
+ "SF_NOTIFY_AUTH_COMPLETE" :
+ ((iis_info.filter_notify_event == SF_NOTIFY_PREPROC_HEADERS) ?
+ "SF_NOTIFY_PREPROC_HEADERS" : "UNKNOWN"),
+ iis_info.filter_notify_event);
+
+ if (error_page) {
+ jk_log(logger, JK_LOG_DEBUG, "Using error page '%s'.", error_page);
+ }
+ jk_log(logger, JK_LOG_DEBUG, "Using uri header %s.", URI_HEADER_NAME);
+ jk_log(logger, JK_LOG_DEBUG, "Using query header %s.", QUERY_HEADER_NAME);
+ jk_log(logger, JK_LOG_DEBUG, "Using worker header %s.", WORKER_HEADER_NAME);
+ jk_log(logger, JK_LOG_DEBUG, "Using worker index %s.", WORKER_HEADER_INDEX);
+ jk_log(logger, JK_LOG_DEBUG, "Using translate header %s.", TOMCAT_TRANSLATE_HEADER_NAME);
+ jk_log(logger, JK_LOG_DEBUG, "Using a default of %d connections per pool.",
+ DEFAULT_WORKER_THREADS);
+ }
+
+ if ((log_rotationtime > 0) && (log_filesize > 0)) {
+ jk_log(logger, JK_LOG_WARNING,
+ "%s is defined in configuration, but will be ignored because %s is set. ",
+ LOG_FILESIZE_TAG, LOG_ROTATION_TIME_TAG);
+ }
+
+ if (rewrite_rule_file[0] && jk_map_alloc(&rewrite_map)) {
+ if (jk_map_read_properties(rewrite_map, NULL, rewrite_rule_file,
+ NULL, JK_MAP_HANDLE_RAW, logger)) {
+ int i;
+ if (JK_IS_DEBUG_LEVEL(logger)) {
+ jk_log(logger, JK_LOG_DEBUG, "Loaded rewrite rule file %s.",
+ rewrite_rule_file);
+
+ }
+ jk_map_alloc(&rregexp_map);
+ for (i = 0; i < jk_map_size(rewrite_map); i++) {
+ const char *src = jk_map_name_at(rewrite_map, i);
+ if (*src == '~') {
+ ap_regex_t *regexp = malloc(sizeof(ap_regex_t));
+ const char *val = jk_map_value_at(rewrite_map, i);
+ /* Skip leading tilde */
+ regexp->real = src + 1;
+ regexp->fake = val;
+ if (!ap_regcomp(regexp, regexp->real, AP_REG_EXTENDED)) {
+ jk_map_add(rregexp_map, regexp->real, regexp);
+ if (JK_IS_DEBUG_LEVEL(logger)) {
+ jk_log(logger, JK_LOG_DEBUG,
+ "Added regular expression rule %s -> %s",
+ regexp->real, regexp->fake);
+ }
+ }
+ else {
+ jk_log(logger, JK_LOG_ERROR,
+ "Unable to compile regular expression %s",
+ regexp->real);
+ free(regexp);
+ }
+ }
+ }
+ }
+ else {
+ jk_map_free(&rewrite_map);
+ rewrite_map = NULL;
+ }
+ }
+
+ if (uri_worker_map_alloc(&uw_map, NULL, logger)) {
+ rc = JK_FALSE;
+ if (reject_unsafe)
+ uw_map->reject_unsafe = 1;
+ else
+ uw_map->reject_unsafe = 0;
+ uw_map->reload = worker_mount_reload;
+ if (worker_mount_file[0]) {
+ uw_map->fname = worker_mount_file;
+ rc = uri_worker_map_load(uw_map, logger);
+ }
+ }
+ if (rc) {
+ rc = JK_FALSE;
+ if (jk_map_alloc(&workers_map)) {
+ if (jk_map_read_properties(workers_map, NULL, worker_file, NULL,
+ JK_MAP_HANDLE_DUPLICATES, logger)) {
+ int rv;
+
+ /* we add the URI->WORKER MAP since workers using AJP14 will feed it */
+
+ if (jk_map_resolve_references(workers_map, "worker.", 1, 1, logger) == JK_FALSE) {
+ jk_log(logger, JK_LOG_ERROR, "Error in resolving configuration references");
+ }
+ /*
+ * Create named shared memory for each server
+ */
+ if (shm_config_size == 0)
+ shm_config_size = jk_shm_calculate_size(workers_map, logger);
+ else {
+ jk_log(logger, JK_LOG_WARNING,
+ "The optimal shared memory size can now be determined automatically.");
+ jk_log(logger, JK_LOG_WARNING,
+ "You can remove the shm_size attribute if you want to use the optimal size.");
+ }
+ if ((rv = jk_shm_open(shm_name, shm_config_size, logger)) != 0) {
+ /* TODO: Do not try to open the worker if we cannot create
+ * the shared memory segment.
+ */
+ jk_log(logger, JK_LOG_ERROR,
+ "Initializing shm:%s errno=%d. Load balancing workers will not function properly.",
+ jk_shm_name(), rv);
+ }
+ worker_env.uri_to_worker = uw_map;
+ worker_env.server_name = serverName;
+ worker_env.pool = NULL;
+
+ if (wc_open(workers_map, &worker_env, logger)) {
+ rc = JK_TRUE;
+ }
+ uri_worker_map_ext(uw_map, logger);
+ uri_worker_map_switch(uw_map, logger);
+ }
+ else
+ jk_log(logger, JK_LOG_EMERG,
+ "Unable to read worker file %s.", worker_file);
+ if (rc != JK_TRUE) {
+ jk_map_free(&workers_map);
+ workers_map = NULL;
+ }
+ }
+ }
+ if (rc) {
+ if (watchdog_interval) {
+ DWORD wi;
+ watchdog_handle = CreateThread(NULL, 0, watchdog_thread,
+ NULL, 0, &wi);
+ if (!watchdog_handle) {
+ jk_log(logger, JK_LOG_EMERG, "Error %d (0x%08x) creating Watchdog thread",
+ GetLastError(), GetLastError());
+ watchdog_interval = 0;
+ }
+ }
+ jk_log(logger, JK_LOG_INFO, "%s initialized", (FULL_VERSION_STRING));
+ }
+ return rc;
+}
+
+static BOOL initialize_extension(void)
+{
+
+ if (read_registry_init_data()) {
+ if (get_iis_info(&iis_info) != JK_TRUE) {
+ jk_log(logger, JK_LOG_ERROR, "Could not retrieve IIS version from registry");
+ }
+ is_inited = JK_TRUE;
+ }
+ return is_inited;
+}
+
+int parse_uri_select(const char *uri_select)
+{
+ if (0 == strcasecmp(uri_select, URI_SELECT_PARSED_VERB)) {
+ return URI_SELECT_OPT_PARSED;
+ }
+
+ if (0 == strcasecmp(uri_select, URI_SELECT_UNPARSED_VERB)) {
+ return URI_SELECT_OPT_UNPARSED;
+ }
+
+ if (0 == strcasecmp(uri_select, URI_SELECT_ESCAPED_VERB)) {
+ return URI_SELECT_OPT_ESCAPED;
+ }
+
+ if (0 == strcasecmp(uri_select, URI_SELECT_PROXY_VERB)) {
+ return URI_SELECT_OPT_PROXY;
+ }
+
+ return -1;
+}
+
+static int read_registry_init_data(void)
+{
+ char tmpbuf[MAX_PATH];
+ int ok = JK_TRUE;
+ LPVOID src;
+ HKEY hkey;
+ jk_map_t *map = NULL;
+
+ if (jk_map_alloc(&map)) {
+ if (jk_map_read_properties(map, jk_environment_map, ini_file_name, NULL,
+ JK_MAP_HANDLE_DUPLICATES, logger)) {
+ using_ini_file = JK_TRUE;
+ src = map;
+ }
+ else {
+ jk_map_free(&map);
+ }
+ }
+ if (!using_ini_file) {
+ long rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, REGISTRY_LOCATION,
+ (DWORD)0, KEY_READ, &hkey);
+ if (ERROR_SUCCESS != rc) {
+ return JK_FALSE;
+ }
+ else {
+ src = &hkey;
+ }
+ }
+ ok = ok && get_config_parameter(src, JK_LOG_FILE_TAG, log_file, sizeof(log_file));
+ if (get_config_parameter(src, JK_LOG_LEVEL_TAG, tmpbuf, sizeof(tmpbuf))) {
+ log_level = jk_parse_log_level(tmpbuf);
+ }
+ if (get_config_parameter(src, LOG_ROTATION_TIME_TAG, tmpbuf, sizeof(tmpbuf))) {
+ log_rotationtime = atol(tmpbuf);
+ if (log_rotationtime < 0) {
+ log_rotationtime = 0;
+ }
+ }
+ if (get_config_parameter(src, LOG_FILESIZE_TAG, tmpbuf, sizeof(tmpbuf))) {
+ size_t tl = strlen(tmpbuf);
+ if (tl > 0) {
+ /* rotatelogs has an 'M' suffix on filesize, which we optionally support for consistency */
+ if (tmpbuf[tl - 1] == 'M') {
+ tmpbuf[tl - 1] = '\0';
+ }
+ log_filesize = atol(tmpbuf);
+ if (log_filesize < 0) {
+ log_filesize = 0;
+ }
+ /* Convert to MB as per Apache rotatelogs */
+ log_filesize *= (1000 * 1000);
+ }
+ }
+
+ ok = ok && get_config_parameter(src, EXTENSION_URI_TAG, extension_uri, sizeof(extension_uri));
+ ok = ok && get_config_parameter(src, JK_WORKER_FILE_TAG, worker_file, sizeof(worker_file));
+ ok = ok && get_config_parameter(src, JK_MOUNT_FILE_TAG, worker_mount_file, sizeof(worker_mount_file));
+ get_config_parameter(src, URI_REWRITE_TAG, rewrite_rule_file, sizeof(rewrite_rule_file));
+ if (get_config_parameter(src, URI_SELECT_TAG, tmpbuf, sizeof(tmpbuf))) {
+ int opt = parse_uri_select(tmpbuf);
+ if (opt >= 0) {
+ uri_select_option = opt;
+ }
+ else {
+ ok = JK_FALSE;
+ }
+ }
+ shm_config_size = (size_t) get_config_int(src, SHM_SIZE_TAG, 0);
+ worker_mount_reload = get_config_int(src, WORKER_MOUNT_RELOAD_TAG, JK_URIMAP_DEF_RELOAD);
+ strip_session = get_config_bool(src, STRIP_SESSION_TAG, JK_FALSE);
+#ifndef AUTOMATIC_AUTH_NOTIFICATION
+ use_auth_notification_flags = get_config_int(src, AUTH_COMPLETE_TAG, 1);
+#endif
+ reject_unsafe = get_config_bool(src, REJECT_UNSAFE_TAG, JK_FALSE);
+ watchdog_interval = get_config_int(src, WATCHDOG_INTERVAL_TAG, 0);
+ if (watchdog_interval < 0)
+ watchdog_interval = 0;
+ chunked_encoding_enabled = get_config_bool(src, ENABLE_CHUNKED_ENCODING_TAG, JK_FALSE);
+ if (get_config_parameter(src, ERROR_PAGE_TAG, error_page_buf, sizeof(error_page_buf))) {
+ error_page = error_page_buf;
+ }
+
+ if (using_ini_file) {
+ jk_map_free(&map);
+ }
+ else {
+ RegCloseKey(hkey);
+ }
+ return ok;
+}
+
+static int get_config_parameter(LPVOID src, const char *tag,
+ char *val, DWORD sz)
+{
+ const char *tmp = NULL;
+ if (using_ini_file) {
+ tmp = jk_map_get_string((jk_map_t*)src, tag, NULL);
+ if (tmp && (strlen(tmp) < sz)) {
+ StringCbCopy(val, sz, tmp);
+ return JK_TRUE;
+ }
+ else {
+ return JK_FALSE;
+ }
+ } else {
+ return get_registry_config_parameter(*((HKEY*)src), tag, val, sz);
+ }
+}
+
+static int get_config_int(LPVOID src, const char *tag, int def)
+{
+ if (using_ini_file) {
+ return jk_map_get_int((jk_map_t*)src, tag, def);
+ } else {
+ int val;
+ if (get_registry_config_number(*((HKEY*)src), tag, &val) ) {
+ return val;
+ }
+ else {
+ return def;
+ }
+ }
+}
+
+static int get_config_bool(LPVOID src, const char *tag, int def)
+{
+ if (using_ini_file) {
+ return jk_map_get_bool((jk_map_t*)src, tag, def);
+ } else {
+ char tmpbuf[128];
+ if (get_registry_config_parameter(*((HKEY*)src), tag,
+ tmpbuf, sizeof(tmpbuf))) {
+ return jk_get_bool_code(tmpbuf, def);
+ }
+ else {
+ return def;
+ }
+ }
+}
+
+static int get_registry_config_parameter(HKEY hkey,
+ const char *tag, char *b, DWORD sz)
+{
+ DWORD type = 0;
+ LONG lrc;
+
+ sz = sz - 1; /* Reserve space for RegQueryValueEx to add null terminator */
+ b[sz] = '\0'; /* Null terminate in case RegQueryValueEx doesn't */
+
+ lrc = RegQueryValueEx(hkey, tag, (LPDWORD) 0, &type, (LPBYTE) b, &sz);
+ if ((ERROR_SUCCESS != lrc) || (type != REG_SZ)) {
+ return JK_FALSE;
+ }
+
+ return JK_TRUE;
+}
+
+static int get_registry_config_number(HKEY hkey,
+ const char *tag, int *val)
+{
+ DWORD type = 0;
+ DWORD data = 0;
+ DWORD sz = sizeof(DWORD);
+ LONG lrc;
+
+ lrc = RegQueryValueEx(hkey, tag, (LPDWORD)0, &type, (LPBYTE)&data, &sz);
+ if ((ERROR_SUCCESS != lrc) || (type != REG_DWORD)) {
+ return JK_FALSE;
+ }
+
+ *val = (int)data;
+
+ return JK_TRUE;
+}
+
+static int init_ws_service(isapi_private_data_t * private_data,
+ jk_ws_service_t *s, char **worker_name)
+{
+ char *huge_buf = NULL; /* should be enough for all */
+ int worker_index = -1;
+ rule_extension_t *e;
+ char temp_buf[64];
+ DWORD huge_buf_sz;
+ BOOL unknown_content_length = FALSE;
+
+ JK_TRACE_ENTER(logger);
+
+ s->start_response = start_response;
+ s->read = iis_read;
+ s->write = iis_write;
+ s->done = iis_done;
+
+ if (!(huge_buf = jk_pool_alloc(&private_data->p, MAX_PACKET_SIZE))) {
+ JK_TRACE_EXIT(logger);
+ return JK_FALSE;
+ }
+ huge_buf_sz = MAX_PACKET_SIZE;
+ GET_SERVER_VARIABLE_VALUE(HTTP_WORKER_HEADER_NAME, (*worker_name));
+ GET_SERVER_VARIABLE_VALUE(HTTP_URI_HEADER_NAME, s->req_uri);
+ GET_SERVER_VARIABLE_VALUE(HTTP_QUERY_HEADER_NAME, s->query_string);
+ GET_SERVER_VARIABLE_VALUE_INT(HTTP_WORKER_HEADER_INDEX, worker_index, -1);
+
+ if (JK_IS_DEBUG_LEVEL(logger)) {
+ jk_log(logger, JK_LOG_DEBUG, "Reading extension header %s: %s", HTTP_WORKER_HEADER_NAME, (*worker_name));
+ jk_log(logger, JK_LOG_DEBUG, "Reading extension header %s: %d", HTTP_WORKER_HEADER_INDEX, worker_index);
+ jk_log(logger, JK_LOG_DEBUG, "Reading extension header %s: %s", HTTP_URI_HEADER_NAME, s->req_uri);
+ jk_log(logger, JK_LOG_DEBUG, "Reading extension header %s: %s", HTTP_QUERY_HEADER_NAME, s->query_string);
+ }
+
+ if (s->req_uri == NULL) {
+ if (JK_IS_DEBUG_LEVEL(logger))
+ jk_log(logger, JK_LOG_DEBUG, "No URI header value provided. Defaulting to old behaviour" );
+ s->query_string = private_data->lpEcb->lpszQueryString;
+ *worker_name = DEFAULT_WORKER_NAME;
+ GET_SERVER_VARIABLE_VALUE("URL", s->req_uri);
+ if (unescape_url(s->req_uri) < 0) {
+ JK_TRACE_EXIT(logger);
+ return JK_FALSE;
+ }
+ getparents(s->req_uri);
+ }
+
+ GET_SERVER_VARIABLE_VALUE("AUTH_TYPE", s->auth_type);
+ GET_SERVER_VARIABLE_VALUE("REMOTE_USER", s->remote_user);
+ GET_SERVER_VARIABLE_VALUE("SERVER_PROTOCOL", s->protocol);
+ GET_SERVER_VARIABLE_VALUE("REMOTE_HOST", s->remote_host);
+ GET_SERVER_VARIABLE_VALUE("REMOTE_ADDR", s->remote_addr);
+ GET_SERVER_VARIABLE_VALUE("REMOTE_PORT", s->remote_port);
+ GET_SERVER_VARIABLE_VALUE(SERVER_NAME, s->server_name);
+ GET_SERVER_VARIABLE_VALUE_INT("SERVER_PORT", s->server_port, 80);
+ GET_SERVER_VARIABLE_VALUE(SERVER_SOFTWARE, s->server_software);
+ GET_SERVER_VARIABLE_VALUE_INT("SERVER_PORT_SECURE", s->is_ssl, 0);
+
+ s->method = private_data->lpEcb->lpszMethod;
+ /* Check for Transfer Encoding */
+ if (get_server_value(private_data->lpEcb,
+ "HTTP_TRANSFER_ENCODING",
+ temp_buf,
+ (DWORD)sizeof(temp_buf))) {
+ if (strcasecmp(temp_buf, TRANSFER_ENCODING_CHUNKED_VALUE) == 0) {
+ s->is_chunked = JK_TRUE;
+ if (JK_IS_DEBUG_LEVEL(logger)) {
+ jk_log(logger, JK_LOG_DEBUG, "Request is Transfer-Encoding: chunked");
+ }
+ }
+ else {
+ /* XXX: What to do with non chunked T-E ?
+ */
+ if (JK_IS_DEBUG_LEVEL(logger))
+ jk_log(logger, JK_LOG_DEBUG, "Unsupported Transfer-Encoding: %s",
+ temp_buf);
+ }
+ }
+ if (private_data->lpEcb->cbTotalBytes == 0xFFFFFFFF) {
+ /* We have size larger then 4Gb or Transfer-Encoding: chunked
+ * ReadClient should be called until no more data is returned
+ */
+ unknown_content_length = TRUE;
+ }
+ else {
+ /* Use the IIS provided content length */
+ s->content_length = (jk_uint64_t)private_data->lpEcb->cbTotalBytes;
+ }
+ e = get_uri_to_worker_ext(uw_map, worker_index);
+ if (e) {
+ if (JK_IS_DEBUG_LEVEL(logger))
+ jk_log(logger, JK_LOG_DEBUG, "Applying service extensions" );
+ s->extension.reply_timeout = e->reply_timeout;
+ s->extension.use_server_error_pages = e->use_server_error_pages;
+ if (e->activation) {
+ s->extension.activation = jk_pool_alloc(s->pool, e->activation_size * sizeof(int));
+ memcpy(s->extension.activation, e->activation, e->activation_size * sizeof(int));
+ }
+ if (e->fail_on_status_size > 0) {
+ s->extension.fail_on_status_size = e->fail_on_status_size;
+ s->extension.fail_on_status = jk_pool_alloc(s->pool, e->fail_on_status_size * sizeof(int));
+ memcpy(s->extension.fail_on_status, e->fail_on_status, e->fail_on_status_size * sizeof(int));
+ }
+ }
+
+ s->uw_map = uw_map;
+ /*
+ * Add SSL IIS environment
+ */
+ if (s->is_ssl) {
+ char *ssl_env_names[9] = {
+ "CERT_ISSUER",
+ "CERT_SUBJECT",
+ "CERT_COOKIE",
+ "HTTPS_SERVER_SUBJECT",
+ "CERT_FLAGS",
+ "HTTPS_SECRETKEYSIZE",
+ "CERT_SERIALNUMBER",
+ "HTTPS_SERVER_ISSUER",
+ "HTTPS_KEYSIZE"
+ };
+ char *ssl_env_values[9] = {
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+ };
+ unsigned int i;
+ unsigned int num_of_vars = 0;
+
+ for (i = 0; i < 9; i++) {
+ GET_SERVER_VARIABLE_VALUE(ssl_env_names[i], ssl_env_values[i]);
+ if (ssl_env_values[i]) {
+ num_of_vars++;
+ }
+ }
+ /* XXX: To make the isapi plugin more consistent with the other web servers */
+ /* we should also set s->ssl_cipher, s->ssl_session, and s->ssl_key_size. */
+ if (num_of_vars) {
+ unsigned int j;
+
+ s->attributes_names =
+ jk_pool_alloc(&private_data->p, num_of_vars * sizeof(char *));
+ s->attributes_values =
+ jk_pool_alloc(&private_data->p, num_of_vars * sizeof(char *));
+
+ j = 0;
+ for (i = 0; i < 9; i++) {
+ if (ssl_env_values[i]) {
+ s->attributes_names[j] = ssl_env_names[i];
+ s->attributes_values[j] = ssl_env_values[i];
+ j++;
+ }
+ }
+ s->num_attributes = num_of_vars;
+ if (ssl_env_values[4] && ssl_env_values[4][0] == '1') {
+ CERT_CONTEXT_EX cc;
+ cc.cbAllocated = MAX_PACKET_SIZE;
+ cc.CertContext.pbCertEncoded = (BYTE *) huge_buf;
+ cc.CertContext.cbCertEncoded = 0;
+
+ if (private_data->lpEcb->
+ ServerSupportFunction(private_data->lpEcb->ConnID,
+ (DWORD) HSE_REQ_GET_CERT_INFO_EX,
+ (LPVOID) & cc, NULL,
+ NULL) != FALSE) {
+ jk_log(logger, JK_LOG_DEBUG,
+ "Client Certificate encoding:%d sz:%d flags:%ld",
+ cc.CertContext.
+ dwCertEncodingType & X509_ASN_ENCODING,
+ cc.CertContext.cbCertEncoded,
+ cc.dwCertificateFlags);
+ s->ssl_cert =
+ jk_pool_alloc(&private_data->p,
+ base64_encode_cert_len(cc.CertContext.
+ cbCertEncoded));
+
+ s->ssl_cert_len = base64_encode_cert(s->ssl_cert,
+ huge_buf,
+ cc.CertContext.
+ cbCertEncoded) - 1;
+ }
+ }
+ }
+ }
+
+ huge_buf_sz = MAX_PACKET_SIZE;
+ if (get_server_value(private_data->lpEcb,
+#ifndef USE_CGI_HEADERS
+ "ALL_RAW", huge_buf, huge_buf_sz)) {
+#else
+ "ALL_HTTP", huge_buf, huge_buf_sz)) {
+#endif
+ unsigned int cnt = 0;
+ char *tmp;
+
+ for (tmp = huge_buf; *tmp; tmp++) {
+ if (*tmp == '\n') {
+ cnt++;
+ }
+ }
+
+ if (cnt) {
+ char *headers_buf = huge_buf;
+ unsigned int i;
+ BOOL need_content_length_header = FALSE;
+
+ if (s->content_length == 0 && unknown_content_length == FALSE) {
+ /* Add content-length=0 only if really zero
+ */
+ need_content_length_header = TRUE;
+ }
+
+ /* allocate an extra header slot in case we need to add a content-length header */
+ s->headers_names =
+ jk_pool_alloc(&private_data->p, (cnt + 1) * sizeof(char *));
+ s->headers_values =
+ jk_pool_alloc(&private_data->p, (cnt + 1) * sizeof(char *));
+
+ if (!s->headers_names || !s->headers_values || !headers_buf) {
+ JK_TRACE_EXIT(logger);
+ return JK_FALSE;
+ }
+
+ for (i = 0, tmp = headers_buf; *tmp && i < cnt;) {
+ int real_header = JK_TRUE;
+
+#ifdef USE_CGI_HEADERS
+ /* Skip the HTTP_ prefix to the beginning of the header name */
+ tmp += HTTP_HEADER_PREFIX_LEN;
+#endif
+
+ if (!strnicmp(tmp, URI_HEADER_NAME, strlen(URI_HEADER_NAME))
+ || !strnicmp(tmp, WORKER_HEADER_NAME, strlen(WORKER_HEADER_NAME))
+ || !strnicmp(tmp, WORKER_HEADER_INDEX, strlen(WORKER_HEADER_INDEX))
+ || !strnicmp(tmp, QUERY_HEADER_NAME, strlen(QUERY_HEADER_NAME))) {
+ /* Skip redirector headers */
+ cnt--;
+ real_header = JK_FALSE;
+ }
+ else if (!strnicmp(tmp, CONTENT_LENGTH,
+ sizeof(CONTENT_LENGTH) - 1)) {
+ need_content_length_header = FALSE;
+
+ /* If the content-length is unknown
+ * or larger then 4Gb do not send it.
+ * IIS can also create a synthetic Content-Length header to make
+ * lpcbTotalBytes and the CONTENT_LENGTH server variable agree
+ * on small requests where the entire chunk encoded message is
+ * read into the available buffer.
+ */
+ if (unknown_content_length || s->is_chunked) {
+ if (JK_IS_DEBUG_LEVEL(logger)) {
+ jk_log(logger, JK_LOG_DEBUG,
+ "Disregarding Content-Length in request - content is %s",
+ s->is_chunked ? "chunked" : "unknown length");
+ }
+ cnt--;
+ real_header = JK_FALSE;
+ }
+ else {
+ s->headers_names[i] = tmp;
+ }
+ }
+ else if (!strnicmp(tmp, TOMCAT_TRANSLATE_HEADER_NAME,
+ strlen(TOMCAT_TRANSLATE_HEADER_NAME))) {
+ s->headers_names[i] = TRANSLATE_HEADER_NAME_LC;
+ }
+ else {
+ s->headers_names[i] = tmp;
+ }
+
+ while (':' != *tmp && *tmp) {
+#ifdef USE_CGI_HEADERS
+ if (real_header) {
+ if ('_' == *tmp) {
+ *tmp = '-';
+ }
+ else {
+ *tmp = JK_TOLOWER(*tmp);
+ }
+ }
+#endif
+ tmp++;
+ }
+ *tmp = '\0';
+ tmp++;
+
+ /* Skip all the WS chars after the ':' to the beginning of the header value */
+ while (' ' == *tmp || '\t' == *tmp || '\v' == *tmp) {
+ tmp++;
+ }
+
+ if (real_header) {
+ s->headers_values[i] = tmp;
+ }
+
+ while (*tmp && *tmp != '\n' && *tmp != '\r') {
+ tmp++;
+ }
+ *tmp = '\0';
+ tmp++;
+
+ /* skip CR LF */
+ while (*tmp == '\n' || *tmp == '\r') {
+ tmp++;
+ }
+
+ if (real_header) {
+ if (JK_IS_DEBUG_LEVEL(logger)) {
+ jk_log(logger, JK_LOG_DEBUG, "Forwarding request header %s : %s",
+ s->headers_names[i], s->headers_values[i]);
+ }
+ i++;
+ }
+ }
+ /* Add a content-length = 0 header if needed.
+ * Ajp13 assumes an absent content-length header means an unknown,
+ * but non-zero length body.
+ */
+ if (need_content_length_header) {
+ if (JK_IS_DEBUG_LEVEL(logger)) {
+ jk_log(logger, JK_LOG_DEBUG, "Incoming request needs explicit Content-Length: 0 in AJP13");
+ }
+ s->headers_names[cnt] = "Content-Length";
+ s->headers_values[cnt] = "0";
+ cnt++;
+ }
+ s->num_headers = cnt;
+ }
+ else {
+ /* We must have our two headers */
+ JK_TRACE_EXIT(logger);
+ return JK_FALSE;
+ }
+ }
+ else {
+ JK_TRACE_EXIT(logger);
+ return JK_FALSE;
+ }
+
+ /* Dump all connection param so we can trace what's going to
+ * the remote tomcat
+ */
+ if (JK_IS_DEBUG_LEVEL(logger)) {
+ jk_log(logger, JK_LOG_DEBUG,
+ "Service protocol=%s method=%s host=%s addr=%s name=%s port=%d "
+ "auth=%s user=%s uri=%s",
+ STRNULL_FOR_NULL(s->protocol),
+ STRNULL_FOR_NULL(s->method),
+ STRNULL_FOR_NULL(s->remote_host),
+ STRNULL_FOR_NULL(s->remote_addr),
+ STRNULL_FOR_NULL(s->server_name),
+ s->server_port,
+ STRNULL_FOR_NULL(s->auth_type),
+ STRNULL_FOR_NULL(s->remote_user),
+ STRNULL_FOR_NULL(s->req_uri));
+ jk_log(logger, JK_LOG_DEBUG,
+ "Service request headers=%d attributes=%d "
+ "chunked=%s content-length=%" JK_UINT64_T_FMT " available=%u",
+ s->num_headers,
+ s->num_attributes,
+ (s->is_chunked == JK_TRUE) ? "yes" : "no",
+ s->content_length,
+ private_data->lpEcb->cbTotalBytes);
+ }
+
+ JK_TRACE_EXIT(logger);
+ return JK_TRUE;
+}
+
+static int get_server_value(LPEXTENSION_CONTROL_BLOCK lpEcb,
+ char *name, char *buf, DWORD bufsz)
+{
+ DWORD sz = bufsz;
+ buf[0] = '\0';
+ if (!lpEcb->GetServerVariable(lpEcb->ConnID, name,
+ buf, (LPDWORD) &sz))
+ return JK_FALSE;
+
+ if (sz <= bufsz)
+ buf[sz-1] = '\0';
+ return JK_TRUE;
+}
+
+static const char begin_cert[] = "-----BEGIN CERTIFICATE-----\r\n";
+
+static const char end_cert[] = "-----END CERTIFICATE-----\r\n";
+
+static const char basis_64[] =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+static int base64_encode_cert_len(int len)
+{
+ int n = ((len + 2) / 3 * 4) + 1; /* base64 encoded size */
+ n += (n + 63 / 64) * 2; /* add CRLF's */
+ n += sizeof(begin_cert) + sizeof(end_cert) - 2; /* add enclosing strings. */
+ return n;
+}
+
+static int base64_encode_cert(char *encoded,
+ const char *string, int len)
+{
+ int i, c;
+ char *p;
+ const char *t;
+
+ p = encoded;
+
+ t = begin_cert;
+ while (*t != '\0')
+ *p++ = *t++;
+
+ c = 0;
+ for (i = 0; i < len - 2; i += 3) {
+ *p++ = basis_64[(string[i] >> 2) & 0x3F];
+ *p++ = basis_64[((string[i] & 0x3) << 4) |
+ ((int)(string[i + 1] & 0xF0) >> 4)];
+ *p++ = basis_64[((string[i + 1] & 0xF) << 2) |
+ ((int)(string[i + 2] & 0xC0) >> 6)];
+ *p++ = basis_64[string[i + 2] & 0x3F];
+ c += 4;
+ if (c >= 64) {
+ *p++ = '\r';
+ *p++ = '\n';
+ c = 0;
+ }
+ }
+ if (i < len) {
+ *p++ = basis_64[(string[i] >> 2) & 0x3F];
+ if (i == (len - 1)) {
+ *p++ = basis_64[((string[i] & 0x3) << 4)];
+ *p++ = '=';
+ }
+ else {
+ *p++ = basis_64[((string[i] & 0x3) << 4) |
+ ((int)(string[i + 1] & 0xF0) >> 4)];
+ *p++ = basis_64[((string[i + 1] & 0xF) << 2)];
+ }
+ *p++ = '=';
+ c++;
+ }
+ if (c != 0) {
+ *p++ = '\r';
+ *p++ = '\n';
+ }
+
+ t = end_cert;
+ while (*t != '\0')
+ *p++ = *t++;
+
+ *p++ = '\0';
+ return (int)(p - encoded);
+}
+
+/**
+* Determine version info and the primary notification event
+*/
+static int get_iis_info(iis_info_t* iis_info)
+{
+ HKEY hkey;
+ long rc;
+ int rv = JK_FALSE;
+
+ iis_info->major = 0;
+ iis_info->minor = 0;
+ iis_info->filter_notify_event = SF_NOTIFY_PREPROC_HEADERS;
+
+ /* Retrieve the IIS version Major/Minor */
+ rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+ W3SVC_REGISTRY_KEY, (DWORD) 0, KEY_READ, &hkey);
+ if (ERROR_SUCCESS == rc) {
+ if (get_registry_config_number(hkey, "MajorVersion", &iis_info->major) == JK_TRUE) {
+#ifdef AUTOMATIC_AUTH_NOTIFICATION
+ if (iis_info->major > 4)
+#else
+ if (use_auth_notification_flags && iis_info->major > 4)
+#endif
+ iis_info->filter_notify_event = SF_NOTIFY_AUTH_COMPLETE;
+ if (get_registry_config_number(hkey, "MinorVersion", &iis_info->minor) == JK_TRUE) {
+
+#ifdef AUTOMATIC_AUTH_NOTIFICATION
+ /* SF_NOTIFY_AUTH_COMPLETE causes redirect failures
+ * (ERROR_INVALID_PARAMETER) on IIS 5.1 with OPTIONS/PUT
+ * and is only available from IIS 5+
+ */
+ if (iis_info->major == 5 && iis_info->minor == 1) {
+ iis_info->filter_notify_event = SF_NOTIFY_PREPROC_HEADERS;
+ }
+#endif
+ rv = JK_TRUE;
+ }
+ }
+ }
+ CloseHandle(hkey);
+ return rv;
+}
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/AUTHORS b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/AUTHORS
new file mode 100644
index 00000000..00bd1d06
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/AUTHORS
@@ -0,0 +1,6 @@
+Written by: Philip Hazel <ph10@cam.ac.uk>
+
+University of Cambridge Computing Service,
+Cambridge, England. Phone: +44 1223 334714.
+
+Copyright (c) 1997-2004 University of Cambridge
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/COPYING b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/COPYING
new file mode 100644
index 00000000..1573583b
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/COPYING
@@ -0,0 +1,45 @@
+PCRE LICENCE
+------------
+
+PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+Release 5 of PCRE is distributed under the terms of the "BSD" licence, as
+specified below. The documentation for PCRE, supplied in the "doc"
+directory, is distributed under the same terms as the software itself.
+
+Written by: Philip Hazel <ph10@cam.ac.uk>
+
+University of Cambridge Computing Service,
+Cambridge, England. Phone: +44 1223 334714.
+
+Copyright (c) 1997-2004 University of Cambridge
+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.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+
+End
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/ChangeLog b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/ChangeLog
new file mode 100644
index 00000000..266cb18c
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/ChangeLog
@@ -0,0 +1,1650 @@
+ChangeLog for PCRE
+------------------
+
+Version 5.0 13-Sep-04
+---------------------
+
+ 1. Internal change: literal characters are no longer packed up into items
+ containing multiple characters in a single byte-string. Each character
+ is now matched using a separate opcode. However, there may be more than one
+ byte in the character in UTF-8 mode.
+
+ 2. The pcre_callout_block structure has two new fields: pattern_position and
+ next_item_length. These contain the offset in the pattern to the next match
+ item, and its length, respectively.
+
+ 3. The PCRE_AUTO_CALLOUT option for pcre_compile() requests the automatic
+ insertion of callouts before each pattern item. Added the /C option to
+ pcretest to make use of this.
+
+ 4. On the advice of a Windows user, the lines
+
+ #if defined(_WIN32) || defined(WIN32)
+ _setmode( _fileno( stdout ), 0x8000 );
+ #endif /* defined(_WIN32) || defined(WIN32) */
+
+ have been added to the source of pcretest. This apparently does useful
+ magic in relation to line terminators.
+
+ 5. Changed "r" and "w" in the calls to fopen() in pcretest to "rb" and "wb"
+ for the benefit of those environments where the "b" makes a difference.
+
+ 6. The icc compiler has the same options as gcc, but "configure" doesn't seem
+ to know about it. I have put a hack into configure.in that adds in code
+ to set GCC=yes if CC=icc. This seems to end up at a point in the
+ generated configure script that is early enough to affect the setting of
+ compiler options, which is what is needed, but I have no means of testing
+ whether it really works. (The user who reported this had patched the
+ generated configure script, which of course I cannot do.)
+
+ LATER: After change 22 below (new libtool files), the configure script
+ seems to know about icc (and also ecc). Therefore, I have commented out
+ this hack in configure.in.
+
+ 7. Added support for pkg-config (2 patches were sent in).
+
+ 8. Negated POSIX character classes that used a combination of internal tables
+ were completely broken. These were [[:^alpha:]], [[:^alnum:]], and
+ [[:^ascii]]. Typically, they would match almost any characters. The other
+ POSIX classes were not broken in this way.
+
+ 9. Matching the pattern "\b.*?" against "ab cd", starting at offset 1, failed
+ to find the match, as PCRE was deluded into thinking that the match had to
+ start at the start point or following a newline. The same bug applied to
+ patterns with negative forward assertions or any backward assertions
+ preceding ".*" at the start, unless the pattern required a fixed first
+ character. This was a failing pattern: "(?!.bcd).*". The bug is now fixed.
+
+10. In UTF-8 mode, when moving forwards in the subject after a failed match
+ starting at the last subject character, bytes beyond the end of the subject
+ string were read.
+
+11. Renamed the variable "class" as "classbits" to make life easier for C++
+ users. (Previously there was a macro definition, but it apparently wasn't
+ enough.)
+
+12. Added the new field "tables" to the extra data so that tables can be passed
+ in at exec time, or the internal tables can be re-selected. This allows
+ a compiled regex to be saved and re-used at a later time by a different
+ program that might have everything at different addresses.
+
+13. Modified the pcre-config script so that, when run on Solaris, it shows a
+ -R library as well as a -L library.
+
+14. The debugging options of pcretest (-d on the command line or D on a
+ pattern) showed incorrect output for anything following an extended class
+ that contained multibyte characters and which was followed by a quantifier.
+
+15. Added optional support for general category Unicode character properties
+ via the \p, \P, and \X escapes. Unicode property support implies UTF-8
+ support. It adds about 90K to the size of the library. The meanings of the
+ inbuilt class escapes such as \d and \s have NOT been changed.
+
+16. Updated pcredemo.c to include calls to free() to release the memory for the
+ compiled pattern.
+
+17. The generated file chartables.c was being created in the source directory
+ instead of in the building directory. This caused the build to fail if the
+ source directory was different from the building directory, and was
+ read-only.
+
+18. Added some sample Win commands from Mark Tetrode into the NON-UNIX-USE
+ file. No doubt somebody will tell me if they don't make sense... Also added
+ Dan Mooney's comments about building on OpenVMS.
+
+19. Added support for partial matching via the PCRE_PARTIAL option for
+ pcre_exec() and the \P data escape in pcretest.
+
+20. Extended pcretest with 3 new pattern features:
+
+ (i) A pattern option of the form ">rest-of-line" causes pcretest to
+ write the compiled pattern to the file whose name is "rest-of-line".
+ This is a straight binary dump of the data, with the saved pointer to
+ the character tables forced to be NULL. The study data, if any, is
+ written too. After writing, pcretest reads a new pattern.
+
+ (ii) If, instead of a pattern, "<rest-of-line" is given, pcretest reads a
+ compiled pattern from the given file. There must not be any
+ occurrences of "<" in the file name (pretty unlikely); if there are,
+ pcretest will instead treat the initial "<" as a pattern delimiter.
+ After reading in the pattern, pcretest goes on to read data lines as
+ usual.
+
+ (iii) The F pattern option causes pcretest to flip the bytes in the 32-bit
+ and 16-bit fields in a compiled pattern, to simulate a pattern that
+ was compiled on a host of opposite endianness.
+
+21. The pcre-exec() function can now cope with patterns that were compiled on
+ hosts of opposite endianness, with this restriction:
+
+ As for any compiled expression that is saved and used later, the tables
+ pointer field cannot be preserved; the extra_data field in the arguments
+ to pcre_exec() should be used to pass in a tables address if a value
+ other than the default internal tables were used at compile time.
+
+22. Calling pcre_exec() with a negative value of the "ovecsize" parameter is
+ now diagnosed as an error. Previously, most of the time, a negative number
+ would have been treated as zero, but if in addition "ovector" was passed as
+ NULL, a crash could occur.
+
+23. Updated the files ltmain.sh, config.sub, config.guess, and aclocal.m4 with
+ new versions from the libtool 1.5 distribution (the last one is a copy of
+ a file called libtool.m4). This seems to have fixed the need to patch
+ "configure" to support Darwin 1.3 (which I used to do). However, I still
+ had to patch ltmain.sh to ensure that ${SED} is set (it isn't on my
+ workstation).
+
+24. Changed the PCRE licence to be the more standard "BSD" licence.
+
+
+Version 4.5 01-Dec-03
+---------------------
+
+ 1. There has been some re-arrangement of the code for the match() function so
+ that it can be compiled in a version that does not call itself recursively.
+ Instead, it keeps those local variables that need separate instances for
+ each "recursion" in a frame on the heap, and gets/frees frames whenever it
+ needs to "recurse". Keeping track of where control must go is done by means
+ of setjmp/longjmp. The whole thing is implemented by a set of macros that
+ hide most of the details from the main code, and operates only if
+ NO_RECURSE is defined while compiling pcre.c. If PCRE is built using the
+ "configure" mechanism, "--disable-stack-for-recursion" turns on this way of
+ operating.
+
+ To make it easier for callers to provide specially tailored get/free
+ functions for this usage, two new functions, pcre_stack_malloc, and
+ pcre_stack_free, are used. They are always called in strict stacking order,
+ and the size of block requested is always the same.
+
+ The PCRE_CONFIG_STACKRECURSE info parameter can be used to find out whether
+ PCRE has been compiled to use the stack or the heap for recursion. The
+ -C option of pcretest uses this to show which version is compiled.
+
+ A new data escape \S, is added to pcretest; it causes the amounts of store
+ obtained and freed by both kinds of malloc/free at match time to be added
+ to the output.
+
+ 2. Changed the locale test to use "fr_FR" instead of "fr" because that's
+ what's available on my current Linux desktop machine.
+
+ 3. When matching a UTF-8 string, the test for a valid string at the start has
+ been extended. If start_offset is not zero, PCRE now checks that it points
+ to a byte that is the start of a UTF-8 character. If not, it returns
+ PCRE_ERROR_BADUTF8_OFFSET (-11). Note: the whole string is still checked;
+ this is necessary because there may be backward assertions in the pattern.
+ When matching the same subject several times, it may save resources to use
+ PCRE_NO_UTF8_CHECK on all but the first call if the string is long.
+
+ 4. The code for checking the validity of UTF-8 strings has been tightened so
+ that it rejects (a) strings containing 0xfe or 0xff bytes and (b) strings
+ containing "overlong sequences".
+
+ 5. Fixed a bug (appearing twice) that I could not find any way of exploiting!
+ I had written "if ((digitab[*p++] && chtab_digit) == 0)" where the "&&"
+ should have been "&", but it just so happened that all the cases this let
+ through by mistake were picked up later in the function.
+
+ 6. I had used a variable called "isblank" - this is a C99 function, causing
+ some compilers to warn. To avoid this, I renamed it (as "blankclass").
+
+ 7. Cosmetic: (a) only output another newline at the end of pcretest if it is
+ prompting; (b) run "./pcretest /dev/null" at the start of the test script
+ so the version is shown; (c) stop "make test" echoing "./RunTest".
+
+ 8. Added patches from David Burgess to enable PCRE to run on EBCDIC systems.
+
+ 9. The prototype for memmove() for systems that don't have it was using
+ size_t, but the inclusion of the header that defines size_t was later. I've
+ moved the #includes for the C headers earlier to avoid this.
+
+10. Added some adjustments to the code to make it easier to compiler on certain
+ special systems:
+
+ (a) Some "const" qualifiers were missing.
+ (b) Added the macro EXPORT before all exported functions; by default this
+ is defined to be empty.
+ (c) Changed the dftables auxiliary program (that builds chartables.c) so
+ that it reads its output file name as an argument instead of writing
+ to the standard output and assuming this can be redirected.
+
+11. In UTF-8 mode, if a recursive reference (e.g. (?1)) followed a character
+ class containing characters with values greater than 255, PCRE compilation
+ went into a loop.
+
+12. A recursive reference to a subpattern that was within another subpattern
+ that had a minimum quantifier of zero caused PCRE to crash. For example,
+ (x(y(?2))z)? provoked this bug with a subject that got as far as the
+ recursion. If the recursively-called subpattern itself had a zero repeat,
+ that was OK.
+
+13. In pcretest, the buffer for reading a data line was set at 30K, but the
+ buffer into which it was copied (for escape processing) was still set at
+ 1024, so long lines caused crashes.
+
+14. A pattern such as /[ab]{1,3}+/ failed to compile, giving the error
+ "internal error: code overflow...". This applied to any character class
+ that was followed by a possessive quantifier.
+
+15. Modified the Makefile to add libpcre.la as a prerequisite for
+ libpcreposix.la because I was told this is needed for a parallel build to
+ work.
+
+16. If a pattern that contained .* following optional items at the start was
+ studied, the wrong optimizing data was generated, leading to matching
+ errors. For example, studying /[ab]*.*c/ concluded, erroneously, that any
+ matching string must start with a or b or c. The correct conclusion for
+ this pattern is that a match can start with any character.
+
+
+Version 4.4 13-Aug-03
+---------------------
+
+ 1. In UTF-8 mode, a character class containing characters with values between
+ 127 and 255 was not handled correctly if the compiled pattern was studied.
+ In fixing this, I have also improved the studying algorithm for such
+ classes (slightly).
+
+ 2. Three internal functions had redundant arguments passed to them. Removal
+ might give a very teeny performance improvement.
+
+ 3. Documentation bug: the value of the capture_top field in a callout is *one
+ more than* the number of the hightest numbered captured substring.
+
+ 4. The Makefile linked pcretest and pcregrep with -lpcre, which could result
+ in incorrectly linking with a previously installed version. They now link
+ explicitly with libpcre.la.
+
+ 5. configure.in no longer needs to recognize Cygwin specially.
+
+ 6. A problem in pcre.in for Windows platforms is fixed.
+
+ 7. If a pattern was successfully studied, and the -d (or /D) flag was given to
+ pcretest, it used to include the size of the study block as part of its
+ output. Unfortunately, the structure contains a field that has a different
+ size on different hardware architectures. This meant that the tests that
+ showed this size failed. As the block is currently always of a fixed size,
+ this information isn't actually particularly useful in pcretest output, so
+ I have just removed it.
+
+ 8. Three pre-processor statements accidentally did not start in column 1.
+ Sadly, there are *still* compilers around that complain, even though
+ standard C has not required this for well over a decade. Sigh.
+
+ 9. In pcretest, the code for checking callouts passed small integers in the
+ callout_data field, which is a void * field. However, some picky compilers
+ complained about the casts involved for this on 64-bit systems. Now
+ pcretest passes the address of the small integer instead, which should get
+ rid of the warnings.
+
+10. By default, when in UTF-8 mode, PCRE now checks for valid UTF-8 strings at
+ both compile and run time, and gives an error if an invalid UTF-8 sequence
+ is found. There is a option for disabling this check in cases where the
+ string is known to be correct and/or the maximum performance is wanted.
+
+11. In response to a bug report, I changed one line in Makefile.in from
+
+ -Wl,--out-implib,.libs/lib@WIN_PREFIX@pcreposix.dll.a \
+ to
+ -Wl,--out-implib,.libs/@WIN_PREFIX@libpcreposix.dll.a \
+
+ to look similar to other lines, but I have no way of telling whether this
+ is the right thing to do, as I do not use Windows. No doubt I'll get told
+ if it's wrong...
+
+
+Version 4.3 21-May-03
+---------------------
+
+1. Two instances of @WIN_PREFIX@ omitted from the Windows targets in the
+ Makefile.
+
+2. Some refactoring to improve the quality of the code:
+
+ (i) The utf8_table... variables are now declared "const".
+
+ (ii) The code for \cx, which used the "case flipping" table to upper case
+ lower case letters, now just substracts 32. This is ASCII-specific,
+ but the whole concept of \cx is ASCII-specific, so it seems
+ reasonable.
+
+ (iii) PCRE was using its character types table to recognize decimal and
+ hexadecimal digits in the pattern. This is silly, because it handles
+ only 0-9, a-f, and A-F, but the character types table is locale-
+ specific, which means strange things might happen. A private
+ table is now used for this - though it costs 256 bytes, a table is
+ much faster than multiple explicit tests. Of course, the standard
+ character types table is still used for matching digits in subject
+ strings against \d.
+
+ (iv) Strictly, the identifier ESC_t is reserved by POSIX (all identifiers
+ ending in _t are). So I've renamed it as ESC_tee.
+
+3. The first argument for regexec() in the POSIX wrapper should have been
+ defined as "const".
+
+4. Changed pcretest to use malloc() for its buffers so that they can be
+ Electric Fenced for debugging.
+
+5. There were several places in the code where, in UTF-8 mode, PCRE would try
+ to read one or more bytes before the start of the subject string. Often this
+ had no effect on PCRE's behaviour, but in some circumstances it could
+ provoke a segmentation fault.
+
+6. A lookbehind at the start of a pattern in UTF-8 mode could also cause PCRE
+ to try to read one or more bytes before the start of the subject string.
+
+7. A lookbehind in a pattern matched in non-UTF-8 mode on a PCRE compiled with
+ UTF-8 support could misbehave in various ways if the subject string
+ contained bytes with the 0x80 bit set and the 0x40 bit unset in a lookbehind
+ area. (PCRE was not checking for the UTF-8 mode flag, and trying to move
+ back over UTF-8 characters.)
+
+
+Version 4.2 14-Apr-03
+---------------------
+
+1. Typo "#if SUPPORT_UTF8" instead of "#ifdef SUPPORT_UTF8" fixed.
+
+2. Changes to the building process, supplied by Ronald Landheer-Cieslak
+ [ON_WINDOWS]: new variable, "#" on non-Windows platforms
+ [NOT_ON_WINDOWS]: new variable, "#" on Windows platforms
+ [WIN_PREFIX]: new variable, "cyg" for Cygwin
+ * Makefile.in: use autoconf substitution for OBJEXT, EXEEXT, BUILD_OBJEXT
+ and BUILD_EXEEXT
+ Note: automatic setting of the BUILD variables is not yet working
+ set CPPFLAGS and BUILD_CPPFLAGS (but don't use yet) - should be used at
+ compile-time but not at link-time
+ [LINK]: use for linking executables only
+ make different versions for Windows and non-Windows
+ [LINKLIB]: new variable, copy of UNIX-style LINK, used for linking
+ libraries
+ [LINK_FOR_BUILD]: new variable
+ [OBJEXT]: use throughout
+ [EXEEXT]: use throughout
+ <winshared>: new target
+ <wininstall>: new target
+ <dftables.o>: use native compiler
+ <dftables>: use native linker
+ <install>: handle Windows platform correctly
+ <clean>: ditto
+ <check>: ditto
+ copy DLL to top builddir before testing
+
+ As part of these changes, -no-undefined was removed again. This was reported
+ to give trouble on HP-UX 11.0, so getting rid of it seems like a good idea
+ in any case.
+
+3. Some tidies to get rid of compiler warnings:
+
+ . In the match_data structure, match_limit was an unsigned long int, whereas
+ match_call_count was an int. I've made them both unsigned long ints.
+
+ . In pcretest the fact that a const uschar * doesn't automatically cast to
+ a void * provoked a warning.
+
+ . Turning on some more compiler warnings threw up some "shadow" variables
+ and a few more missing casts.
+
+4. If PCRE was complied with UTF-8 support, but called without the PCRE_UTF8
+ option, a class that contained a single character with a value between 128
+ and 255 (e.g. /[\xFF]/) caused PCRE to crash.
+
+5. If PCRE was compiled with UTF-8 support, but called without the PCRE_UTF8
+ option, a class that contained several characters, but with at least one
+ whose value was between 128 and 255 caused PCRE to crash.
+
+
+Version 4.1 12-Mar-03
+---------------------
+
+1. Compiling with gcc -pedantic found a couple of places where casts were
+needed, and a string in dftables.c that was longer than standard compilers are
+required to support.
+
+2. Compiling with Sun's compiler found a few more places where the code could
+be tidied up in order to avoid warnings.
+
+3. The variables for cross-compiling were called HOST_CC and HOST_CFLAGS; the
+first of these names is deprecated in the latest Autoconf in favour of the name
+CC_FOR_BUILD, because "host" is typically used to mean the system on which the
+compiled code will be run. I can't find a reference for HOST_CFLAGS, but by
+analogy I have changed it to CFLAGS_FOR_BUILD.
+
+4. Added -no-undefined to the linking command in the Makefile, because this is
+apparently helpful for Windows. To make it work, also added "-L. -lpcre" to the
+linking step for the pcreposix library.
+
+5. PCRE was failing to diagnose the case of two named groups with the same
+name.
+
+6. A problem with one of PCRE's optimizations was discovered. PCRE remembers a
+literal character that is needed in the subject for a match, and scans along to
+ensure that it is present before embarking on the full matching process. This
+saves time in cases of nested unlimited repeats that are never going to match.
+Problem: the scan can take a lot of time if the subject is very long (e.g.
+megabytes), thus penalizing straightforward matches. It is now done only if the
+amount of subject to be scanned is less than 1000 bytes.
+
+7. A lesser problem with the same optimization is that it was recording the
+first character of an anchored pattern as "needed", thus provoking a search
+right along the subject, even when the first match of the pattern was going to
+fail. The "needed" character is now not set for anchored patterns, unless it
+follows something in the pattern that is of non-fixed length. Thus, it still
+fulfils its original purpose of finding quick non-matches in cases of nested
+unlimited repeats, but isn't used for simple anchored patterns such as /^abc/.
+
+
+Version 4.0 17-Feb-03
+---------------------
+
+1. If a comment in an extended regex that started immediately after a meta-item
+extended to the end of string, PCRE compiled incorrect data. This could lead to
+all kinds of weird effects. Example: /#/ was bad; /()#/ was bad; /a#/ was not.
+
+2. Moved to autoconf 2.53 and libtool 1.4.2.
+
+3. Perl 5.8 no longer needs "use utf8" for doing UTF-8 things. Consequently,
+the special perltest8 script is no longer needed - all the tests can be run
+from a single perltest script.
+
+4. From 5.004, Perl has not included the VT character (0x0b) in the set defined
+by \s. It has now been removed in PCRE. This means it isn't recognized as
+whitespace in /x regexes too, which is the same as Perl. Note that the POSIX
+class [:space:] *does* include VT, thereby creating a mess.
+
+5. Added the class [:blank:] (a GNU extension from Perl 5.8) to match only
+space and tab.
+
+6. Perl 5.005 was a long time ago. It's time to amalgamate the tests that use
+its new features into the main test script, reducing the number of scripts.
+
+7. Perl 5.8 has changed the meaning of patterns like /a(?i)b/. Earlier versions
+were backward compatible, and made the (?i) apply to the whole pattern, as if
+/i were given. Now it behaves more logically, and applies the option setting
+only to what follows. PCRE has been changed to follow suit. However, if it
+finds options settings right at the start of the pattern, it extracts them into
+the global options, as before. Thus, they show up in the info data.
+
+8. Added support for the \Q...\E escape sequence. Characters in between are
+treated as literals. This is slightly different from Perl in that $ and @ are
+also handled as literals inside the quotes. In Perl, they will cause variable
+interpolation. Note the following examples:
+
+ Pattern PCRE matches Perl matches
+
+ \Qabc$xyz\E abc$xyz abc followed by the contents of $xyz
+ \Qabc\$xyz\E abc\$xyz abc\$xyz
+ \Qabc\E\$\Qxyz\E abc$xyz abc$xyz
+
+For compatibility with Perl, \Q...\E sequences are recognized inside character
+classes as well as outside them.
+
+9. Re-organized 3 code statements in pcretest to avoid "overflow in
+floating-point constant arithmetic" warnings from a Microsoft compiler. Added a
+(size_t) cast to one statement in pcretest and one in pcreposix to avoid
+signed/unsigned warnings.
+
+10. SunOS4 doesn't have strtoul(). This was used only for unpicking the -o
+option for pcretest, so I've replaced it by a simple function that does just
+that job.
+
+11. pcregrep was ending with code 0 instead of 2 for the commands "pcregrep" or
+"pcregrep -".
+
+12. Added "possessive quantifiers" ?+, *+, ++, and {,}+ which come from Sun's
+Java package. This provides some syntactic sugar for simple cases of what my
+documentation calls "once-only subpatterns". A pattern such as x*+ is the same
+as (?>x*). In other words, if what is inside (?>...) is just a single repeated
+item, you can use this simplified notation. Note that only makes sense with
+greedy quantifiers. Consequently, the use of the possessive quantifier forces
+greediness, whatever the setting of the PCRE_UNGREEDY option.
+
+13. A change of greediness default within a pattern was not taking effect at
+the current level for patterns like /(b+(?U)a+)/. It did apply to parenthesized
+subpatterns that followed. Patterns like /b+(?U)a+/ worked because the option
+was abstracted outside.
+
+14. PCRE now supports the \G assertion. It is true when the current matching
+position is at the start point of the match. This differs from \A when the
+starting offset is non-zero. Used with the /g option of pcretest (or similar
+code), it works in the same way as it does for Perl's /g option. If all
+alternatives of a regex begin with \G, the expression is anchored to the start
+match position, and the "anchored" flag is set in the compiled expression.
+
+15. Some bugs concerning the handling of certain option changes within patterns
+have been fixed. These applied to options other than (?ims). For example,
+"a(?x: b c )d" did not match "XabcdY" but did match "Xa b c dY". It should have
+been the other way round. Some of this was related to change 7 above.
+
+16. PCRE now gives errors for /[.x.]/ and /[=x=]/ as unsupported POSIX
+features, as Perl does. Previously, PCRE gave the warnings only for /[[.x.]]/
+and /[[=x=]]/. PCRE now also gives an error for /[:name:]/ because it supports
+POSIX classes only within a class (e.g. /[[:alpha:]]/).
+
+17. Added support for Perl's \C escape. This matches one byte, even in UTF8
+mode. Unlike ".", it always matches newline, whatever the setting of
+PCRE_DOTALL. However, PCRE does not permit \C to appear in lookbehind
+assertions. Perl allows it, but it doesn't (in general) work because it can't
+calculate the length of the lookbehind. At least, that's the case for Perl
+5.8.0 - I've been told they are going to document that it doesn't work in
+future.
+
+18. Added an error diagnosis for escapes that PCRE does not support: these are
+\L, \l, \N, \P, \p, \U, \u, and \X.
+
+19. Although correctly diagnosing a missing ']' in a character class, PCRE was
+reading past the end of the pattern in cases such as /[abcd/.
+
+20. PCRE was getting more memory than necessary for patterns with classes that
+contained both POSIX named classes and other characters, e.g. /[[:space:]abc/.
+
+21. Added some code, conditional on #ifdef VPCOMPAT, to make life easier for
+compiling PCRE for use with Virtual Pascal.
+
+22. Small fix to the Makefile to make it work properly if the build is done
+outside the source tree.
+
+23. Added a new extension: a condition to go with recursion. If a conditional
+subpattern starts with (?(R) the "true" branch is used if recursion has
+happened, whereas the "false" branch is used only at the top level.
+
+24. When there was a very long string of literal characters (over 255 bytes
+without UTF support, over 250 bytes with UTF support), the computation of how
+much memory was required could be incorrect, leading to segfaults or other
+strange effects.
+
+25. PCRE was incorrectly assuming anchoring (either to start of subject or to
+start of line for a non-DOTALL pattern) when a pattern started with (.*) and
+there was a subsequent back reference to those brackets. This meant that, for
+example, /(.*)\d+\1/ failed to match "abc123bc". Unfortunately, it isn't
+possible to check for precisely this case. All we can do is abandon the
+optimization if .* occurs inside capturing brackets when there are any back
+references whatsoever. (See below for a better fix that came later.)
+
+26. The handling of the optimization for finding the first character of a
+non-anchored pattern, and for finding a character that is required later in the
+match were failing in some cases. This didn't break the matching; it just
+failed to optimize when it could. The way this is done has been re-implemented.
+
+27. Fixed typo in error message for invalid (?R item (it said "(?p").
+
+28. Added a new feature that provides some of the functionality that Perl
+provides with (?{...}). The facility is termed a "callout". The way it is done
+in PCRE is for the caller to provide an optional function, by setting
+pcre_callout to its entry point. Like pcre_malloc and pcre_free, this is a
+global variable. By default it is unset, which disables all calling out. To get
+the function called, the regex must include (?C) at appropriate points. This
+is, in fact, equivalent to (?C0), and any number <= 255 may be given with (?C).
+This provides a means of identifying different callout points. When PCRE
+reaches such a point in the regex, if pcre_callout has been set, the external
+function is called. It is provided with data in a structure called
+pcre_callout_block, which is defined in pcre.h. If the function returns 0,
+matching continues; if it returns a non-zero value, the match at the current
+point fails. However, backtracking will occur if possible. [This was changed
+later and other features added - see item 49 below.]
+
+29. pcretest is upgraded to test the callout functionality. It provides a
+callout function that displays information. By default, it shows the start of
+the match and the current position in the text. There are some new data escapes
+to vary what happens:
+
+ \C+ in addition, show current contents of captured substrings
+ \C- do not supply a callout function
+ \C!n return 1 when callout number n is reached
+ \C!n!m return 1 when callout number n is reached for the mth time
+
+30. If pcregrep was called with the -l option and just a single file name, it
+output "<stdin>" if a match was found, instead of the file name.
+
+31. Improve the efficiency of the POSIX API to PCRE. If the number of capturing
+slots is less than POSIX_MALLOC_THRESHOLD, use a block on the stack to pass to
+pcre_exec(). This saves a malloc/free per call. The default value of
+POSIX_MALLOC_THRESHOLD is 10; it can be changed by --with-posix-malloc-threshold
+when configuring.
+
+32. The default maximum size of a compiled pattern is 64K. There have been a
+few cases of people hitting this limit. The code now uses macros to handle the
+storing of links as offsets within the compiled pattern. It defaults to 2-byte
+links, but this can be changed to 3 or 4 bytes by --with-link-size when
+configuring. Tests 2 and 5 work only with 2-byte links because they output
+debugging information about compiled patterns.
+
+33. Internal code re-arrangements:
+
+(a) Moved the debugging function for printing out a compiled regex into
+ its own source file (printint.c) and used #include to pull it into
+ pcretest.c and, when DEBUG is defined, into pcre.c, instead of having two
+ separate copies.
+
+(b) Defined the list of op-code names for debugging as a macro in
+ internal.h so that it is next to the definition of the opcodes.
+
+(c) Defined a table of op-code lengths for simpler skipping along compiled
+ code. This is again a macro in internal.h so that it is next to the
+ definition of the opcodes.
+
+34. Added support for recursive calls to individual subpatterns, along the
+lines of Robin Houston's patch (but implemented somewhat differently).
+
+35. Further mods to the Makefile to help Win32. Also, added code to pcregrep to
+allow it to read and process whole directories in Win32. This code was
+contributed by Lionel Fourquaux; it has not been tested by me.
+
+36. Added support for named subpatterns. The Python syntax (?P<name>...) is
+used to name a group. Names consist of alphanumerics and underscores, and must
+be unique. Back references use the syntax (?P=name) and recursive calls use
+(?P>name) which is a PCRE extension to the Python extension. Groups still have
+numbers. The function pcre_fullinfo() can be used after compilation to extract
+a name/number map. There are three relevant calls:
+
+ PCRE_INFO_NAMEENTRYSIZE yields the size of each entry in the map
+ PCRE_INFO_NAMECOUNT yields the number of entries
+ PCRE_INFO_NAMETABLE yields a pointer to the map.
+
+The map is a vector of fixed-size entries. The size of each entry depends on
+the length of the longest name used. The first two bytes of each entry are the
+group number, most significant byte first. There follows the corresponding
+name, zero terminated. The names are in alphabetical order.
+
+37. Make the maximum literal string in the compiled code 250 for the non-UTF-8
+case instead of 255. Making it the same both with and without UTF-8 support
+means that the same test output works with both.
+
+38. There was a case of malloc(0) in the POSIX testing code in pcretest. Avoid
+calling malloc() with a zero argument.
+
+39. Change 25 above had to resort to a heavy-handed test for the .* anchoring
+optimization. I've improved things by keeping a bitmap of backreferences with
+numbers 1-31 so that if .* occurs inside capturing brackets that are not in
+fact referenced, the optimization can be applied. It is unlikely that a
+relevant occurrence of .* (i.e. one which might indicate anchoring or forcing
+the match to follow \n) will appear inside brackets with a number greater than
+31, but if it does, any back reference > 31 suppresses the optimization.
+
+40. Added a new compile-time option PCRE_NO_AUTO_CAPTURE. This has the effect
+of disabling numbered capturing parentheses. Any opening parenthesis that is
+not followed by ? behaves as if it were followed by ?: but named parentheses
+can still be used for capturing (and they will acquire numbers in the usual
+way).
+
+41. Redesigned the return codes from the match() function into yes/no/error so
+that errors can be passed back from deep inside the nested calls. A malloc
+failure while inside a recursive subpattern call now causes the
+PCRE_ERROR_NOMEMORY return instead of quietly going wrong.
+
+42. It is now possible to set a limit on the number of times the match()
+function is called in a call to pcre_exec(). This facility makes it possible to
+limit the amount of recursion and backtracking, though not in a directly
+obvious way, because the match() function is used in a number of different
+circumstances. The count starts from zero for each position in the subject
+string (for non-anchored patterns). The default limit is, for compatibility, a
+large number, namely 10 000 000. You can change this in two ways:
+
+(a) When configuring PCRE before making, you can use --with-match-limit=n
+ to set a default value for the compiled library.
+
+(b) For each call to pcre_exec(), you can pass a pcre_extra block in which
+ a different value is set. See 45 below.
+
+If the limit is exceeded, pcre_exec() returns PCRE_ERROR_MATCHLIMIT.
+
+43. Added a new function pcre_config(int, void *) to enable run-time extraction
+of things that can be changed at compile time. The first argument specifies
+what is wanted and the second points to where the information is to be placed.
+The current list of available information is:
+
+ PCRE_CONFIG_UTF8
+
+The output is an integer that is set to one if UTF-8 support is available;
+otherwise it is set to zero.
+
+ PCRE_CONFIG_NEWLINE
+
+The output is an integer that it set to the value of the code that is used for
+newline. It is either LF (10) or CR (13).
+
+ PCRE_CONFIG_LINK_SIZE
+
+The output is an integer that contains the number of bytes used for internal
+linkage in compiled expressions. The value is 2, 3, or 4. See item 32 above.
+
+ PCRE_CONFIG_POSIX_MALLOC_THRESHOLD
+
+The output is an integer that contains the threshold above which the POSIX
+interface uses malloc() for output vectors. See item 31 above.
+
+ PCRE_CONFIG_MATCH_LIMIT
+
+The output is an unsigned integer that contains the default limit of the number
+of match() calls in a pcre_exec() execution. See 42 above.
+
+44. pcretest has been upgraded by the addition of the -C option. This causes it
+to extract all the available output from the new pcre_config() function, and to
+output it. The program then exits immediately.
+
+45. A need has arisen to pass over additional data with calls to pcre_exec() in
+order to support additional features. One way would have been to define
+pcre_exec2() (for example) with extra arguments, but this would not have been
+extensible, and would also have required all calls to the original function to
+be mapped to the new one. Instead, I have chosen to extend the mechanism that
+is used for passing in "extra" data from pcre_study().
+
+The pcre_extra structure is now exposed and defined in pcre.h. It currently
+contains the following fields:
+
+ flags a bitmap indicating which of the following fields are set
+ study_data opaque data from pcre_study()
+ match_limit a way of specifying a limit on match() calls for a specific
+ call to pcre_exec()
+ callout_data data for callouts (see 49 below)
+
+The flag bits are also defined in pcre.h, and are
+
+ PCRE_EXTRA_STUDY_DATA
+ PCRE_EXTRA_MATCH_LIMIT
+ PCRE_EXTRA_CALLOUT_DATA
+
+The pcre_study() function now returns one of these new pcre_extra blocks, with
+the actual study data pointed to by the study_data field, and the
+PCRE_EXTRA_STUDY_DATA flag set. This can be passed directly to pcre_exec() as
+before. That is, this change is entirely upwards-compatible and requires no
+change to existing code.
+
+If you want to pass in additional data to pcre_exec(), you can either place it
+in a pcre_extra block provided by pcre_study(), or create your own pcre_extra
+block.
+
+46. pcretest has been extended to test the PCRE_EXTRA_MATCH_LIMIT feature. If a
+data string contains the escape sequence \M, pcretest calls pcre_exec() several
+times with different match limits, until it finds the minimum value needed for
+pcre_exec() to complete. The value is then output. This can be instructive; for
+most simple matches the number is quite small, but for pathological cases it
+gets very large very quickly.
+
+47. There's a new option for pcre_fullinfo() called PCRE_INFO_STUDYSIZE. It
+returns the size of the data block pointed to by the study_data field in a
+pcre_extra block, that is, the value that was passed as the argument to
+pcre_malloc() when PCRE was getting memory in which to place the information
+created by pcre_study(). The fourth argument should point to a size_t variable.
+pcretest has been extended so that this information is shown after a successful
+pcre_study() call when information about the compiled regex is being displayed.
+
+48. Cosmetic change to Makefile: there's no need to have / after $(DESTDIR)
+because what follows is always an absolute path. (Later: it turns out that this
+is more than cosmetic for MinGW, because it doesn't like empty path
+components.)
+
+49. Some changes have been made to the callout feature (see 28 above):
+
+(i) A callout function now has three choices for what it returns:
+
+ 0 => success, carry on matching
+ > 0 => failure at this point, but backtrack if possible
+ < 0 => serious error, return this value from pcre_exec()
+
+ Negative values should normally be chosen from the set of PCRE_ERROR_xxx
+ values. In particular, returning PCRE_ERROR_NOMATCH forces a standard
+ "match failed" error. The error number PCRE_ERROR_CALLOUT is reserved for
+ use by callout functions. It will never be used by PCRE itself.
+
+(ii) The pcre_extra structure (see 45 above) has a void * field called
+ callout_data, with corresponding flag bit PCRE_EXTRA_CALLOUT_DATA. The
+ pcre_callout_block structure has a field of the same name. The contents of
+ the field passed in the pcre_extra structure are passed to the callout
+ function in the corresponding field in the callout block. This makes it
+ easier to use the same callout-containing regex from multiple threads. For
+ testing, the pcretest program has a new data escape
+
+ \C*n pass the number n (may be negative) as callout_data
+
+ If the callout function in pcretest receives a non-zero value as
+ callout_data, it returns that value.
+
+50. Makefile wasn't handling CFLAGS properly when compiling dftables. Also,
+there were some redundant $(CFLAGS) in commands that are now specified as
+$(LINK), which already includes $(CFLAGS).
+
+51. Extensions to UTF-8 support are listed below. These all apply when (a) PCRE
+has been compiled with UTF-8 support *and* pcre_compile() has been compiled
+with the PCRE_UTF8 flag. Patterns that are compiled without that flag assume
+one-byte characters throughout. Note that case-insensitive matching applies
+only to characters whose values are less than 256. PCRE doesn't support the
+notion of cases for higher-valued characters.
+
+(i) A character class whose characters are all within 0-255 is handled as
+ a bit map, and the map is inverted for negative classes. Previously, a
+ character > 255 always failed to match such a class; however it should
+ match if the class was a negative one (e.g. [^ab]). This has been fixed.
+
+(ii) A negated character class with a single character < 255 is coded as
+ "not this character" (OP_NOT). This wasn't working properly when the test
+ character was multibyte, either singly or repeated.
+
+(iii) Repeats of multibyte characters are now handled correctly in UTF-8
+ mode, for example: \x{100}{2,3}.
+
+(iv) The character escapes \b, \B, \d, \D, \s, \S, \w, and \W (either
+ singly or repeated) now correctly test multibyte characters. However,
+ PCRE doesn't recognize any characters with values greater than 255 as
+ digits, spaces, or word characters. Such characters always match \D, \S,
+ and \W, and never match \d, \s, or \w.
+
+(v) Classes may now contain characters and character ranges with values
+ greater than 255. For example: [ab\x{100}-\x{400}].
+
+(vi) pcregrep now has a --utf-8 option (synonym -u) which makes it call
+ PCRE in UTF-8 mode.
+
+52. The info request value PCRE_INFO_FIRSTCHAR has been renamed
+PCRE_INFO_FIRSTBYTE because it is a byte value. However, the old name is
+retained for backwards compatibility. (Note that LASTLITERAL is also a byte
+value.)
+
+53. The single man page has become too large. I have therefore split it up into
+a number of separate man pages. These also give rise to individual HTML pages;
+these are now put in a separate directory, and there is an index.html page that
+lists them all. Some hyperlinking between the pages has been installed.
+
+54. Added convenience functions for handling named capturing parentheses.
+
+55. Unknown escapes inside character classes (e.g. [\M]) and escapes that
+aren't interpreted therein (e.g. [\C]) are literals in Perl. This is now also
+true in PCRE, except when the PCRE_EXTENDED option is set, in which case they
+are faulted.
+
+56. Introduced HOST_CC and HOST_CFLAGS which can be set in the environment when
+calling configure. These values are used when compiling the dftables.c program
+which is run to generate the source of the default character tables. They
+default to the values of CC and CFLAGS. If you are cross-compiling PCRE,
+you will need to set these values.
+
+57. Updated the building process for Windows DLL, as provided by Fred Cox.
+
+
+Version 3.9 02-Jan-02
+---------------------
+
+1. A bit of extraneous text had somehow crept into the pcregrep documentation.
+
+2. If --disable-static was given, the building process failed when trying to
+build pcretest and pcregrep. (For some reason it was using libtool to compile
+them, which is not right, as they aren't part of the library.)
+
+
+Version 3.8 18-Dec-01
+---------------------
+
+1. The experimental UTF-8 code was completely screwed up. It was packing the
+bytes in the wrong order. How dumb can you get?
+
+
+Version 3.7 29-Oct-01
+---------------------
+
+1. In updating pcretest to check change 1 of version 3.6, I screwed up.
+This caused pcretest, when used on the test data, to segfault. Unfortunately,
+this didn't happen under Solaris 8, where I normally test things.
+
+2. The Makefile had to be changed to make it work on BSD systems, where 'make'
+doesn't seem to recognize that ./xxx and xxx are the same file. (This entry
+isn't in ChangeLog distributed with 3.7 because I forgot when I hastily made
+this fix an hour or so after the initial 3.7 release.)
+
+
+Version 3.6 23-Oct-01
+---------------------
+
+1. Crashed with /(sens|respons)e and \1ibility/ and "sense and sensibility" if
+offsets passed as NULL with zero offset count.
+
+2. The config.guess and config.sub files had not been updated when I moved to
+the latest autoconf.
+
+
+Version 3.5 15-Aug-01
+---------------------
+
+1. Added some missing #if !defined NOPOSIX conditionals in pcretest.c that
+had been forgotten.
+
+2. By using declared but undefined structures, we can avoid using "void"
+definitions in pcre.h while keeping the internal definitions of the structures
+private.
+
+3. The distribution is now built using autoconf 2.50 and libtool 1.4. From a
+user point of view, this means that both static and shared libraries are built
+by default, but this can be individually controlled. More of the work of
+handling this static/shared cases is now inside libtool instead of PCRE's make
+file.
+
+4. The pcretest utility is now installed along with pcregrep because it is
+useful for users (to test regexs) and by doing this, it automatically gets
+relinked by libtool. The documentation has been turned into a man page, so
+there are now .1, .txt, and .html versions in /doc.
+
+5. Upgrades to pcregrep:
+ (i) Added long-form option names like gnu grep.
+ (ii) Added --help to list all options with an explanatory phrase.
+ (iii) Added -r, --recursive to recurse into sub-directories.
+ (iv) Added -f, --file to read patterns from a file.
+
+6. pcre_exec() was referring to its "code" argument before testing that
+argument for NULL (and giving an error if it was NULL).
+
+7. Upgraded Makefile.in to allow for compiling in a different directory from
+the source directory.
+
+8. Tiny buglet in pcretest: when pcre_fullinfo() was called to retrieve the
+options bits, the pointer it was passed was to an int instead of to an unsigned
+long int. This mattered only on 64-bit systems.
+
+9. Fixed typo (3.4/1) in pcre.h again. Sigh. I had changed pcre.h (which is
+generated) instead of pcre.in, which it its source. Also made the same change
+in several of the .c files.
+
+10. A new release of gcc defines printf() as a macro, which broke pcretest
+because it had an ifdef in the middle of a string argument for printf(). Fixed
+by using separate calls to printf().
+
+11. Added --enable-newline-is-cr and --enable-newline-is-lf to the configure
+script, to force use of CR or LF instead of \n in the source. On non-Unix
+systems, the value can be set in config.h.
+
+12. The limit of 200 on non-capturing parentheses is a _nesting_ limit, not an
+absolute limit. Changed the text of the error message to make this clear, and
+likewise updated the man page.
+
+13. The limit of 99 on the number of capturing subpatterns has been removed.
+The new limit is 65535, which I hope will not be a "real" limit.
+
+
+Version 3.4 22-Aug-00
+---------------------
+
+1. Fixed typo in pcre.h: unsigned const char * changed to const unsigned char *.
+
+2. Diagnose condition (?(0) as an error instead of crashing on matching.
+
+
+Version 3.3 01-Aug-00
+---------------------
+
+1. If an octal character was given, but the value was greater than \377, it
+was not getting masked to the least significant bits, as documented. This could
+lead to crashes in some systems.
+
+2. Perl 5.6 (if not earlier versions) accepts classes like [a-\d] and treats
+the hyphen as a literal. PCRE used to give an error; it now behaves like Perl.
+
+3. Added the functions pcre_free_substring() and pcre_free_substring_list().
+These just pass their arguments on to (pcre_free)(), but they are provided
+because some uses of PCRE bind it to non-C systems that can call its functions,
+but cannot call free() or pcre_free() directly.
+
+4. Add "make test" as a synonym for "make check". Corrected some comments in
+the Makefile.
+
+5. Add $(DESTDIR)/ in front of all the paths in the "install" target in the
+Makefile.
+
+6. Changed the name of pgrep to pcregrep, because Solaris has introduced a
+command called pgrep for grepping around the active processes.
+
+7. Added the beginnings of support for UTF-8 character strings.
+
+8. Arranged for the Makefile to pass over the settings of CC, CFLAGS, and
+RANLIB to ./ltconfig so that they are used by libtool. I think these are all
+the relevant ones. (AR is not passed because ./ltconfig does its own figuring
+out for the ar command.)
+
+
+Version 3.2 12-May-00
+---------------------
+
+This is purely a bug fixing release.
+
+1. If the pattern /((Z)+|A)*/ was matched agained ZABCDEFG it matched Z instead
+of ZA. This was just one example of several cases that could provoke this bug,
+which was introduced by change 9 of version 2.00. The code for breaking
+infinite loops after an iteration that matches an empty string was't working
+correctly.
+
+2. The pcretest program was not imitating Perl correctly for the pattern /a*/g
+when matched against abbab (for example). After matching an empty string, it
+wasn't forcing anchoring when setting PCRE_NOTEMPTY for the next attempt; this
+caused it to match further down the string than it should.
+
+3. The code contained an inclusion of sys/types.h. It isn't clear why this
+was there because it doesn't seem to be needed, and it causes trouble on some
+systems, as it is not a Standard C header. It has been removed.
+
+4. Made 4 silly changes to the source to avoid stupid compiler warnings that
+were reported on the Macintosh. The changes were from
+
+ while ((c = *(++ptr)) != 0 && c != '\n');
+to
+ while ((c = *(++ptr)) != 0 && c != '\n') ;
+
+Totally extraordinary, but if that's what it takes...
+
+5. PCRE is being used in one environment where neither memmove() nor bcopy() is
+available. Added HAVE_BCOPY and an autoconf test for it; if neither
+HAVE_MEMMOVE nor HAVE_BCOPY is set, use a built-in emulation function which
+assumes the way PCRE uses memmove() (always moving upwards).
+
+6. PCRE is being used in one environment where strchr() is not available. There
+was only one use in pcre.c, and writing it out to avoid strchr() probably gives
+faster code anyway.
+
+
+Version 3.2 12-May-00
+---------------------
+
+This is purely a bug fixing release.
+
+1. If the pattern /((Z)+|A)*/ was matched agained ZABCDEFG it matched Z instead
+of ZA. This was just one example of several cases that could provoke this bug,
+which was introduced by change 9 of version 2.00. The code for breaking
+infinite loops after an iteration that matches an empty string was't working
+correctly.
+
+2. The pcretest program was not imitating Perl correctly for the pattern /a*/g
+when matched against abbab (for example). After matching an empty string, it
+wasn't forcing anchoring when setting PCRE_NOTEMPTY for the next attempt; this
+caused it to match further down the string than it should.
+
+3. The code contained an inclusion of sys/types.h. It isn't clear why this
+was there because it doesn't seem to be needed, and it causes trouble on some
+systems, as it is not a Standard C header. It has been removed.
+
+4. Made 4 silly changes to the source to avoid stupid compiler warnings that
+were reported on the Macintosh. The changes were from
+
+ while ((c = *(++ptr)) != 0 && c != '\n');
+to
+ while ((c = *(++ptr)) != 0 && c != '\n') ;
+
+Totally extraordinary, but if that's what it takes...
+
+5. PCRE is being used in one environment where neither memmove() nor bcopy() is
+available. Added HAVE_BCOPY and an autoconf test for it; if neither
+HAVE_MEMMOVE nor HAVE_BCOPY is set, use a built-in emulation function which
+assumes the way PCRE uses memmove() (always moving upwards).
+
+6. PCRE is being used in one environment where strchr() is not available. There
+was only one use in pcre.c, and writing it out to avoid strchr() probably gives
+faster code anyway.
+
+
+Version 3.1 09-Feb-00
+---------------------
+
+The only change in this release is the fixing of some bugs in Makefile.in for
+the "install" target:
+
+(1) It was failing to install pcreposix.h.
+
+(2) It was overwriting the pcre.3 man page with the pcreposix.3 man page.
+
+
+Version 3.0 01-Feb-00
+---------------------
+
+1. Add support for the /+ modifier to perltest (to output $` like it does in
+pcretest).
+
+2. Add support for the /g modifier to perltest.
+
+3. Fix pcretest so that it behaves even more like Perl for /g when the pattern
+matches null strings.
+
+4. Fix perltest so that it doesn't do unwanted things when fed an empty
+pattern. Perl treats empty patterns specially - it reuses the most recent
+pattern, which is not what we want. Replace // by /(?#)/ in order to avoid this
+effect.
+
+5. The POSIX interface was broken in that it was just handing over the POSIX
+captured string vector to pcre_exec(), but (since release 2.00) PCRE has
+required a bigger vector, with some working space on the end. This means that
+the POSIX wrapper now has to get and free some memory, and copy the results.
+
+6. Added some simple autoconf support, placing the test data and the
+documentation in separate directories, re-organizing some of the
+information files, and making it build pcre-config (a GNU standard). Also added
+libtool support for building PCRE as a shared library, which is now the
+default.
+
+7. Got rid of the leading zero in the definition of PCRE_MINOR because 08 and
+09 are not valid octal constants. Single digits will be used for minor values
+less than 10.
+
+8. Defined REG_EXTENDED and REG_NOSUB as zero in the POSIX header, so that
+existing programs that set these in the POSIX interface can use PCRE without
+modification.
+
+9. Added a new function, pcre_fullinfo() with an extensible interface. It can
+return all that pcre_info() returns, plus additional data. The pcre_info()
+function is retained for compatibility, but is considered to be obsolete.
+
+10. Added experimental recursion feature (?R) to handle one common case that
+Perl 5.6 will be able to do with (?p{...}).
+
+11. Added support for POSIX character classes like [:alpha:], which Perl is
+adopting.
+
+
+Version 2.08 31-Aug-99
+----------------------
+
+1. When startoffset was not zero and the pattern began with ".*", PCRE was not
+trying to match at the startoffset position, but instead was moving forward to
+the next newline as if a previous match had failed.
+
+2. pcretest was not making use of PCRE_NOTEMPTY when repeating for /g and /G,
+and could get into a loop if a null string was matched other than at the start
+of the subject.
+
+3. Added definitions of PCRE_MAJOR and PCRE_MINOR to pcre.h so the version can
+be distinguished at compile time, and for completeness also added PCRE_DATE.
+
+5. Added Paul Sokolovsky's minor changes to make it easy to compile a Win32 DLL
+in GnuWin32 environments.
+
+
+Version 2.07 29-Jul-99
+----------------------
+
+1. The documentation is now supplied in plain text form and HTML as well as in
+the form of man page sources.
+
+2. C++ compilers don't like assigning (void *) values to other pointer types.
+In particular this affects malloc(). Although there is no problem in Standard
+C, I've put in casts to keep C++ compilers happy.
+
+3. Typo on pcretest.c; a cast of (unsigned char *) in the POSIX regexec() call
+should be (const char *).
+
+4. If NOPOSIX is defined, pcretest.c compiles without POSIX support. This may
+be useful for non-Unix systems who don't want to bother with the POSIX stuff.
+However, I haven't made this a standard facility. The documentation doesn't
+mention it, and the Makefile doesn't support it.
+
+5. The Makefile now contains an "install" target, with editable destinations at
+the top of the file. The pcretest program is not installed.
+
+6. pgrep -V now gives the PCRE version number and date.
+
+7. Fixed bug: a zero repetition after a literal string (e.g. /abcde{0}/) was
+causing the entire string to be ignored, instead of just the last character.
+
+8. If a pattern like /"([^\\"]+|\\.)*"/ is applied in the normal way to a
+non-matching string, it can take a very, very long time, even for strings of
+quite modest length, because of the nested recursion. PCRE now does better in
+some of these cases. It does this by remembering the last required literal
+character in the pattern, and pre-searching the subject to ensure it is present
+before running the real match. In other words, it applies a heuristic to detect
+some types of certain failure quickly, and in the above example, if presented
+with a string that has no trailing " it gives "no match" very quickly.
+
+9. A new runtime option PCRE_NOTEMPTY causes null string matches to be ignored;
+other alternatives are tried instead.
+
+
+Version 2.06 09-Jun-99
+----------------------
+
+1. Change pcretest's output for amount of store used to show just the code
+space, because the remainder (the data block) varies in size between 32-bit and
+64-bit systems.
+
+2. Added an extra argument to pcre_exec() to supply an offset in the subject to
+start matching at. This allows lookbehinds to work when searching for multiple
+occurrences in a string.
+
+3. Added additional options to pcretest for testing multiple occurrences:
+
+ /+ outputs the rest of the string that follows a match
+ /g loops for multiple occurrences, using the new startoffset argument
+ /G loops for multiple occurrences by passing an incremented pointer
+
+4. PCRE wasn't doing the "first character" optimization for patterns starting
+with \b or \B, though it was doing it for other lookbehind assertions. That is,
+it wasn't noticing that a match for a pattern such as /\bxyz/ has to start with
+the letter 'x'. On long subject strings, this gives a significant speed-up.
+
+
+Version 2.05 21-Apr-99
+----------------------
+
+1. Changed the type of magic_number from int to long int so that it works
+properly on 16-bit systems.
+
+2. Fixed a bug which caused patterns starting with .* not to work correctly
+when the subject string contained newline characters. PCRE was assuming
+anchoring for such patterns in all cases, which is not correct because .* will
+not pass a newline unless PCRE_DOTALL is set. It now assumes anchoring only if
+DOTALL is set at top level; otherwise it knows that patterns starting with .*
+must be retried after every newline in the subject.
+
+
+Version 2.04 18-Feb-99
+----------------------
+
+1. For parenthesized subpatterns with repeats whose minimum was zero, the
+computation of the store needed to hold the pattern was incorrect (too large).
+If such patterns were nested a few deep, this could multiply and become a real
+problem.
+
+2. Added /M option to pcretest to show the memory requirement of a specific
+pattern. Made -m a synonym of -s (which does this globally) for compatibility.
+
+3. Subpatterns of the form (regex){n,m} (i.e. limited maximum) were being
+compiled in such a way that the backtracking after subsequent failure was
+pessimal. Something like (a){0,3} was compiled as (a)?(a)?(a)? instead of
+((a)((a)(a)?)?)? with disastrous performance if the maximum was of any size.
+
+
+Version 2.03 02-Feb-99
+----------------------
+
+1. Fixed typo and small mistake in man page.
+
+2. Added 4th condition (GPL supersedes if conflict) and created separate
+LICENCE file containing the conditions.
+
+3. Updated pcretest so that patterns such as /abc\/def/ work like they do in
+Perl, that is the internal \ allows the delimiter to be included in the
+pattern. Locked out the use of \ as a delimiter. If \ immediately follows
+the final delimiter, add \ to the end of the pattern (to test the error).
+
+4. Added the convenience functions for extracting substrings after a successful
+match. Updated pcretest to make it able to test these functions.
+
+
+Version 2.02 14-Jan-99
+----------------------
+
+1. Initialized the working variables associated with each extraction so that
+their saving and restoring doesn't refer to uninitialized store.
+
+2. Put dummy code into study.c in order to trick the optimizer of the IBM C
+compiler for OS/2 into generating correct code. Apparently IBM isn't going to
+fix the problem.
+
+3. Pcretest: the timing code wasn't using LOOPREPEAT for timing execution
+calls, and wasn't printing the correct value for compiling calls. Increased the
+default value of LOOPREPEAT, and the number of significant figures in the
+times.
+
+4. Changed "/bin/rm" in the Makefile to "-rm" so it works on Windows NT.
+
+5. Renamed "deftables" as "dftables" to get it down to 8 characters, to avoid
+a building problem on Windows NT with a FAT file system.
+
+
+Version 2.01 21-Oct-98
+----------------------
+
+1. Changed the API for pcre_compile() to allow for the provision of a pointer
+to character tables built by pcre_maketables() in the current locale. If NULL
+is passed, the default tables are used.
+
+
+Version 2.00 24-Sep-98
+----------------------
+
+1. Since the (>?) facility is in Perl 5.005, don't require PCRE_EXTRA to enable
+it any more.
+
+2. Allow quantification of (?>) groups, and make it work correctly.
+
+3. The first character computation wasn't working for (?>) groups.
+
+4. Correct the implementation of \Z (it is permitted to match on the \n at the
+end of the subject) and add 5.005's \z, which really does match only at the
+very end of the subject.
+
+5. Remove the \X "cut" facility; Perl doesn't have it, and (?> is neater.
+
+6. Remove the ability to specify CASELESS, MULTILINE, DOTALL, and
+DOLLAR_END_ONLY at runtime, to make it possible to implement the Perl 5.005
+localized options. All options to pcre_study() were also removed.
+
+7. Add other new features from 5.005:
+
+ $(?<= positive lookbehind
+ $(?<! negative lookbehind
+ (?imsx-imsx) added the unsetting capability
+ such a setting is global if at outer level; local otherwise
+ (?imsx-imsx:) non-capturing groups with option setting
+ (?(cond)re|re) conditional pattern matching
+
+ A backreference to itself in a repeated group matches the previous
+ captured string.
+
+8. General tidying up of studying (both automatic and via "study")
+consequential on the addition of new assertions.
+
+9. As in 5.005, unlimited repeated groups that could match an empty substring
+are no longer faulted at compile time. Instead, the loop is forcibly broken at
+runtime if any iteration does actually match an empty substring.
+
+10. Include the RunTest script in the distribution.
+
+11. Added tests from the Perl 5.005_02 distribution. This showed up a few
+discrepancies, some of which were old and were also with respect to 5.004. They
+have now been fixed.
+
+
+Version 1.09 28-Apr-98
+----------------------
+
+1. A negated single character class followed by a quantifier with a minimum
+value of one (e.g. [^x]{1,6} ) was not compiled correctly. This could lead to
+program crashes, or just wrong answers. This did not apply to negated classes
+containing more than one character, or to minima other than one.
+
+
+Version 1.08 27-Mar-98
+----------------------
+
+1. Add PCRE_UNGREEDY to invert the greediness of quantifiers.
+
+2. Add (?U) and (?X) to set PCRE_UNGREEDY and PCRE_EXTRA respectively. The
+latter must appear before anything that relies on it in the pattern.
+
+
+Version 1.07 16-Feb-98
+----------------------
+
+1. A pattern such as /((a)*)*/ was not being diagnosed as in error (unlimited
+repeat of a potentially empty string).
+
+
+Version 1.06 23-Jan-98
+----------------------
+
+1. Added Markus Oberhumer's little patches for C++.
+
+2. Literal strings longer than 255 characters were broken.
+
+
+Version 1.05 23-Dec-97
+----------------------
+
+1. Negated character classes containing more than one character were failing if
+PCRE_CASELESS was set at run time.
+
+
+Version 1.04 19-Dec-97
+----------------------
+
+1. Corrected the man page, where some "const" qualifiers had been omitted.
+
+2. Made debugging output print "{0,xxx}" instead of just "{,xxx}" to agree with
+input syntax.
+
+3. Fixed memory leak which occurred when a regex with back references was
+matched with an offsets vector that wasn't big enough. The temporary memory
+that is used in this case wasn't being freed if the match failed.
+
+4. Tidied pcretest to ensure it frees memory that it gets.
+
+5. Temporary memory was being obtained in the case where the passed offsets
+vector was exactly big enough.
+
+6. Corrected definition of offsetof() from change 5 below.
+
+7. I had screwed up change 6 below and broken the rules for the use of
+setjmp(). Now fixed.
+
+
+Version 1.03 18-Dec-97
+----------------------
+
+1. A erroneous regex with a missing opening parenthesis was correctly
+diagnosed, but PCRE attempted to access brastack[-1], which could cause crashes
+on some systems.
+
+2. Replaced offsetof(real_pcre, code) by offsetof(real_pcre, code[0]) because
+it was reported that one broken compiler failed on the former because "code" is
+also an independent variable.
+
+3. The erroneous regex a[]b caused an array overrun reference.
+
+4. A regex ending with a one-character negative class (e.g. /[^k]$/) did not
+fail on data ending with that character. (It was going on too far, and checking
+the next character, typically a binary zero.) This was specific to the
+optimized code for single-character negative classes.
+
+5. Added a contributed patch from the TIN world which does the following:
+
+ + Add an undef for memmove, in case the the system defines a macro for it.
+
+ + Add a definition of offsetof(), in case there isn't one. (I don't know
+ the reason behind this - offsetof() is part of the ANSI standard - but
+ it does no harm).
+
+ + Reduce the ifdef's in pcre.c using macro DPRINTF, thereby eliminating
+ most of the places where whitespace preceded '#'. I have given up and
+ allowed the remaining 2 cases to be at the margin.
+
+ + Rename some variables in pcre to eliminate shadowing. This seems very
+ pedantic, but does no harm, of course.
+
+6. Moved the call to setjmp() into its own function, to get rid of warnings
+from gcc -Wall, and avoided calling it at all unless PCRE_EXTRA is used.
+
+7. Constructs such as \d{8,} were compiling into the equivalent of
+\d{8}\d{0,65527} instead of \d{8}\d* which didn't make much difference to the
+outcome, but in this particular case used more store than had been allocated,
+which caused the bug to be discovered because it threw up an internal error.
+
+8. The debugging code in both pcre and pcretest for outputting the compiled
+form of a regex was going wrong in the case of back references followed by
+curly-bracketed repeats.
+
+
+Version 1.02 12-Dec-97
+----------------------
+
+1. Typos in pcre.3 and comments in the source fixed.
+
+2. Applied a contributed patch to get rid of places where it used to remove
+'const' from variables, and fixed some signed/unsigned and uninitialized
+variable warnings.
+
+3. Added the "runtest" target to Makefile.
+
+4. Set default compiler flag to -O2 rather than just -O.
+
+
+Version 1.01 19-Nov-97
+----------------------
+
+1. PCRE was failing to diagnose unlimited repeat of empty string for patterns
+like /([ab]*)*/, that is, for classes with more than one character in them.
+
+2. Likewise, it wasn't diagnosing patterns with "once-only" subpatterns, such
+as /((?>a*))*/ (a PCRE_EXTRA facility).
+
+
+Version 1.00 18-Nov-97
+----------------------
+
+1. Added compile-time macros to support systems such as SunOS4 which don't have
+memmove() or strerror() but have other things that can be used instead.
+
+2. Arranged that "make clean" removes the executables.
+
+
+Version 0.99 27-Oct-97
+----------------------
+
+1. Fixed bug in code for optimizing classes with only one character. It was
+initializing a 32-byte map regardless, which could cause it to run off the end
+of the memory it had got.
+
+2. Added, conditional on PCRE_EXTRA, the proposed (?>REGEX) construction.
+
+
+Version 0.98 22-Oct-97
+----------------------
+
+1. Fixed bug in code for handling temporary memory usage when there are more
+back references than supplied space in the ovector. This could cause segfaults.
+
+
+Version 0.97 21-Oct-97
+----------------------
+
+1. Added the \X "cut" facility, conditional on PCRE_EXTRA.
+
+2. Optimized negated single characters not to use a bit map.
+
+3. Brought error texts together as macro definitions; clarified some of them;
+fixed one that was wrong - it said "range out of order" when it meant "invalid
+escape sequence".
+
+4. Changed some char * arguments to const char *.
+
+5. Added PCRE_NOTBOL and PCRE_NOTEOL (from POSIX).
+
+6. Added the POSIX-style API wrapper in pcreposix.a and testing facilities in
+pcretest.
+
+
+Version 0.96 16-Oct-97
+----------------------
+
+1. Added a simple "pgrep" utility to the distribution.
+
+2. Fixed an incompatibility with Perl: "{" is now treated as a normal character
+unless it appears in one of the precise forms "{ddd}", "{ddd,}", or "{ddd,ddd}"
+where "ddd" means "one or more decimal digits".
+
+3. Fixed serious bug. If a pattern had a back reference, but the call to
+pcre_exec() didn't supply a large enough ovector to record the related
+identifying subpattern, the match always failed. PCRE now remembers the number
+of the largest back reference, and gets some temporary memory in which to save
+the offsets during matching if necessary, in order to ensure that
+backreferences always work.
+
+4. Increased the compatibility with Perl in a number of ways:
+
+ (a) . no longer matches \n by default; an option PCRE_DOTALL is provided
+ to request this handling. The option can be set at compile or exec time.
+
+ (b) $ matches before a terminating newline by default; an option
+ PCRE_DOLLAR_ENDONLY is provided to override this (but not in multiline
+ mode). The option can be set at compile or exec time.
+
+ (c) The handling of \ followed by a digit other than 0 is now supposed to be
+ the same as Perl's. If the decimal number it represents is less than 10
+ or there aren't that many previous left capturing parentheses, an octal
+ escape is read. Inside a character class, it's always an octal escape,
+ even if it is a single digit.
+
+ (d) An escaped but undefined alphabetic character is taken as a literal,
+ unless PCRE_EXTRA is set. Currently this just reserves the remaining
+ escapes.
+
+ (e) {0} is now permitted. (The previous item is removed from the compiled
+ pattern).
+
+5. Changed all the names of code files so that the basic parts are no longer
+than 10 characters, and abolished the teeny "globals.c" file.
+
+6. Changed the handling of character classes; they are now done with a 32-byte
+bit map always.
+
+7. Added the -d and /D options to pcretest to make it possible to look at the
+internals of compilation without having to recompile pcre.
+
+
+Version 0.95 23-Sep-97
+----------------------
+
+1. Fixed bug in pre-pass concerning escaped "normal" characters such as \x5c or
+\x20 at the start of a run of normal characters. These were being treated as
+real characters, instead of the source characters being re-checked.
+
+
+Version 0.94 18-Sep-97
+----------------------
+
+1. The functions are now thread-safe, with the caveat that the global variables
+containing pointers to malloc() and free() or alternative functions are the
+same for all threads.
+
+2. Get pcre_study() to generate a bitmap of initial characters for non-
+anchored patterns when this is possible, and use it if passed to pcre_exec().
+
+
+Version 0.93 15-Sep-97
+----------------------
+
+1. /(b)|(:+)/ was computing an incorrect first character.
+
+2. Add pcre_study() to the API and the passing of pcre_extra to pcre_exec(),
+but not actually doing anything yet.
+
+3. Treat "-" characters in classes that cannot be part of ranges as literals,
+as Perl does (e.g. [-az] or [az-]).
+
+4. Set the anchored flag if a branch starts with .* or .*? because that tests
+all possible positions.
+
+5. Split up into different modules to avoid including unneeded functions in a
+compiled binary. However, compile and exec are still in one module. The "study"
+function is split off.
+
+6. The character tables are now in a separate module whose source is generated
+by an auxiliary program - but can then be edited by hand if required. There are
+now no calls to isalnum(), isspace(), isdigit(), isxdigit(), tolower() or
+toupper() in the code.
+
+7. Turn the malloc/free funtions variables into pcre_malloc and pcre_free and
+make them global. Abolish the function for setting them, as the caller can now
+set them directly.
+
+
+Version 0.92 11-Sep-97
+----------------------
+
+1. A repeat with a fixed maximum and a minimum of 1 for an ordinary character
+(e.g. /a{1,3}/) was broken (I mis-optimized it).
+
+2. Caseless matching was not working in character classes if the characters in
+the pattern were in upper case.
+
+3. Make ranges like [W-c] work in the same way as Perl for caseless matching.
+
+4. Make PCRE_ANCHORED public and accept as a compile option.
+
+5. Add an options word to pcre_exec() and accept PCRE_ANCHORED and
+PCRE_CASELESS at run time. Add escapes \A and \I to pcretest to cause it to
+pass them.
+
+6. Give an error if bad option bits passed at compile or run time.
+
+7. Add PCRE_MULTILINE at compile and exec time, and (?m) as well. Add \M to
+pcretest to cause it to pass that flag.
+
+8. Add pcre_info(), to get the number of identifying subpatterns, the stored
+options, and the first character, if set.
+
+9. Recognize C+ or C{n,m} where n >= 1 as providing a fixed starting character.
+
+
+Version 0.91 10-Sep-97
+----------------------
+
+1. PCRE was failing to diagnose unlimited repeats of subpatterns that could
+match the empty string as in /(a*)*/. It was looping and ultimately crashing.
+
+2. PCRE was looping on encountering an indefinitely repeated back reference to
+a subpattern that had matched an empty string, e.g. /(a|)\1*/. It now does what
+Perl does - treats the match as successful.
+
+****
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/INSTALL b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/INSTALL
new file mode 100644
index 00000000..08802812
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/INSTALL
@@ -0,0 +1,185 @@
+Basic Installation
+==================
+
+ These are generic installation instructions that apply to systems that
+can run the `configure' shell script - Unix systems and any that imitate
+it. They are not specific to PCRE. There are PCRE-specific instructions
+for non-Unix systems in the file NON-UNIX-USE.
+
+ The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions. Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, a file
+`config.cache' that saves the results of its tests to speed up
+reconfiguring, and a file `config.log' containing compiler output
+(useful mainly for debugging `configure').
+
+ If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release. If at some point `config.cache'
+contains results you don't want to keep, you may remove or edit it.
+
+ The file `configure.in' is used to create `configure' by a program
+called `autoconf'. You only need `configure.in' if you want to change
+it or regenerate `configure' using a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+ 1. `cd' to the directory containing the package's source code and type
+ `./configure' to configure the package for your system. If you're
+ using `csh' on an old version of System V, you might need to type
+ `sh ./configure' instead to prevent `csh' from trying to execute
+ `configure' itself.
+
+ Running `configure' takes awhile. While running, it prints some
+ messages telling which features it is checking for.
+
+ 2. Type `make' to compile the package.
+
+ 3. Optionally, type `make check' to run any self-tests that come with
+ the package.
+
+ 4. Type `make install' to install the programs and any data files and
+ documentation.
+
+ 5. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'. To also remove the
+ files that `configure' created (so you can compile the package for
+ a different kind of computer), type `make distclean'. There is
+ also a `make maintainer-clean' target, but that is intended mainly
+ for the package's developers. If you use it, you may have to get
+ all sorts of other programs in order to regenerate files that came
+ with the distribution.
+
+Compilers and Options
+=====================
+
+ Some systems require unusual options for compilation or linking that
+the `configure' script does not know about. You can give `configure'
+initial values for variables by setting them in the environment. Using
+a Bourne-compatible shell, you can do that on the command line like
+this:
+ CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
+
+Or on systems that have the `env' program, you can do it like this:
+ env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+
+Compiling For Multiple Architectures
+====================================
+
+ You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'. `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script. `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+ If you have to use a `make' that does not supports the `VPATH'
+variable, you have to compile the package for one architecture at a time
+in the source code directory. After you have installed the package for
+one architecture, use `make distclean' before reconfiguring for another
+architecture.
+
+Installation Names
+==================
+
+ By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc. You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+ In addition, if you use an unusual directory layout you can give
+options like `--bindir=PATH' to specify different values for particular
+kinds of files. Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+ Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+ There may be some features `configure' can not figure out
+automatically, but needs to determine by the type of host the package
+will run on. Usually `configure' can figure that out, but if it prints
+a message saying it can not guess the host type, give it the
+`--host=TYPE' option. TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name with three fields:
+ CPU-COMPANY-SYSTEM
+
+See the file `config.sub' for the possible values of each field. If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the host type.
+
+ If you are building compiler tools for cross-compiling, you can also
+use the `--target=TYPE' option to select the type of system they will
+produce code for and the `--build=TYPE' option to select the type of
+system on which you are compiling the package.
+
+Sharing Defaults
+================
+
+ If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists. Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Operation Controls
+==================
+
+ `configure' recognizes the following options to control how it
+operates.
+
+`--cache-file=FILE'
+ Use and save the results of the tests in FILE instead of
+ `./config.cache'. Set FILE to `/dev/null' to disable caching, for
+ debugging `configure'.
+
+`--help'
+ Print a summary of the options to `configure', and exit.
+
+`--quiet'
+`--silent'
+`-q'
+ Do not print messages saying which checks are being made. To
+ suppress all normal output, redirect it to `/dev/null' (any error
+ messages will still be shown).
+
+`--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ `configure' can determine that directory automatically.
+
+`--version'
+ Print the version of Autoconf used to generate the `configure'
+ script, and exit.
+
+`configure' also accepts some other, not widely useful, options.
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/LICENCE b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/LICENCE
new file mode 100644
index 00000000..1573583b
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/LICENCE
@@ -0,0 +1,45 @@
+PCRE LICENCE
+------------
+
+PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+Release 5 of PCRE is distributed under the terms of the "BSD" licence, as
+specified below. The documentation for PCRE, supplied in the "doc"
+directory, is distributed under the same terms as the software itself.
+
+Written by: Philip Hazel <ph10@cam.ac.uk>
+
+University of Cambridge Computing Service,
+Cambridge, England. Phone: +44 1223 334714.
+
+Copyright (c) 1997-2004 University of Cambridge
+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.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+
+End
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/Makefile.in b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/Makefile.in
new file mode 100644
index 00000000..22eeee7b
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/Makefile.in
@@ -0,0 +1,20 @@
+LTLIBRARY_NAME = libpcre.la
+LTLIBRARY_SOURCES = maketables.c get.c study.c pcre.c
+
+CLEAN_TARGETS = dftables chartables.c
+DISTCLEAN_TARGETS = pcre.h pcre-config config.h config.log config.status $(CLEAN_TARGETS)
+
+include $(top_srcdir)/build/ltlib.mk
+
+config.h:
+ touch $@
+
+$(LTLIBRARY_OBJECTS) dftables.lo: config.h
+
+dftables: dftables.lo
+ $(LINK) $(EXTRA_LDFLAGS) dftables.lo $(EXTRA_LIBS)
+
+$(srcdir)/chartables.c: dftables
+ ./dftables $@
+
+pcre.lo: $(srcdir)/chartables.c
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/NEWS b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/NEWS
new file mode 100644
index 00000000..e9a5cf25
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/NEWS
@@ -0,0 +1,201 @@
+News about PCRE releases
+------------------------
+
+Release 5.0 13-Sep-04
+---------------------
+
+The licence under which PCRE is released has been changed to the more
+conventional "BSD" licence.
+
+In the code, some bugs have been fixed, and there are also some major changes
+in this release (which is why I've increased the number to 5.0). Some changes
+are internal rearrangements, and some provide a number of new facilities. The
+new features are:
+
+1. There's an "automatic callout" feature that inserts callouts before every
+ item in the regex, and there's a new callout field that gives the position
+ in the pattern - useful for debugging and tracing.
+
+2. The extra_data structure can now be used to pass in a set of character
+ tables at exec time. This is useful if compiled regex are saved and re-used
+ at a later time when the tables may not be at the same address. If the
+ default internal tables are used, the pointer saved with the compiled
+ pattern is now set to NULL, which means that you don't need to do anything
+ special unless you are using custom tables.
+
+3. It is possible, with some restrictions on the content of the regex, to
+ request "partial" matching. A special return code is given if all of the
+ subject string matched part of the regex. This could be useful for testing
+ an input field as it is being typed.
+
+4. There is now some optional support for Unicode character properties, which
+ means that the patterns items such as \p{Lu} and \X can now be used. Only
+ the general category properties are supported. If PCRE is compiled with this
+ support, an additional 90K data structure is include, which increases the
+ size of the library dramatically.
+
+5. There is support for saving compiled patterns and re-using them later.
+
+6. There is support for running regular expressions that were compiled on a
+ different host with the opposite endianness.
+
+7. The pcretest program has been extended to accommodate the new features.
+
+The main internal rearrangement is that sequences of literal characters are no
+longer handled as strings. Instead, each character is handled on its own. This
+makes some UTF-8 handling easier, and makes the support of partial matching
+possible. Compiled patterns containing long literal strings will be larger as a
+result of this change; I hope that performance will not be much affected.
+
+
+Release 4.5 01-Dec-03
+---------------------
+
+Again mainly a bug-fix and tidying release, with only a couple of new features:
+
+1. It's possible now to compile PCRE so that it does not use recursive
+function calls when matching. Instead it gets memory from the heap. This slows
+things down, but may be necessary on systems with limited stacks.
+
+2. UTF-8 string checking has been tightened to reject overlong sequences and to
+check that a starting offset points to the start of a character. Failure of the
+latter returns a new error code: PCRE_ERROR_BADUTF8_OFFSET.
+
+3. PCRE can now be compiled for systems that use EBCDIC code.
+
+
+Release 4.4 21-Aug-03
+---------------------
+
+This is mainly a bug-fix and tidying release. The only new feature is that PCRE
+checks UTF-8 strings for validity by default. There is an option to suppress
+this, just in case anybody wants that teeny extra bit of performance.
+
+
+Releases 4.1 - 4.3
+------------------
+
+Sorry, I forgot about updating the NEWS file for these releases. Please take a
+look at ChangeLog.
+
+
+Release 4.0 17-Feb-03
+---------------------
+
+There have been a lot of changes for the 4.0 release, adding additional
+functionality and mending bugs. Below is a list of the highlights of the new
+functionality. For full details of these features, please consult the
+documentation. For a complete list of changes, see the ChangeLog file.
+
+1. Support for Perl's \Q...\E escapes.
+
+2. "Possessive quantifiers" ?+, *+, ++, and {,}+ which come from Sun's Java
+package. They provide some syntactic sugar for simple cases of "atomic
+grouping".
+
+3. Support for the \G assertion. It is true when the current matching position
+is at the start point of the match.
+
+4. A new feature that provides some of the functionality that Perl provides
+with (?{...}). The facility is termed a "callout". The way it is done in PCRE
+is for the caller to provide an optional function, by setting pcre_callout to
+its entry point. To get the function called, the regex must include (?C) at
+appropriate points.
+
+5. Support for recursive calls to individual subpatterns. This makes it really
+easy to get totally confused.
+
+6. Support for named subpatterns. The Python syntax (?P<name>...) is used to
+name a group.
+
+7. Several extensions to UTF-8 support; it is now fairly complete. There is an
+option for pcregrep to make it operate in UTF-8 mode.
+
+8. The single man page has been split into a number of separate man pages.
+These also give rise to individual HTML pages which are put in a separate
+directory. There is an index.html page that lists them all. Some hyperlinking
+between the pages has been installed.
+
+
+Release 3.5 15-Aug-01
+---------------------
+
+1. The configuring system has been upgraded to use later versions of autoconf
+and libtool. By default it builds both a shared and a static library if the OS
+supports it. You can use --disable-shared or --disable-static on the configure
+command if you want only one of them.
+
+2. The pcretest utility is now installed along with pcregrep because it is
+useful for users (to test regexs) and by doing this, it automatically gets
+relinked by libtool. The documentation has been turned into a man page, so
+there are now .1, .txt, and .html versions in /doc.
+
+3. Upgrades to pcregrep:
+ (i) Added long-form option names like gnu grep.
+ (ii) Added --help to list all options with an explanatory phrase.
+ (iii) Added -r, --recursive to recurse into sub-directories.
+ (iv) Added -f, --file to read patterns from a file.
+
+4. Added --enable-newline-is-cr and --enable-newline-is-lf to the configure
+script, to force use of CR or LF instead of \n in the source. On non-Unix
+systems, the value can be set in config.h.
+
+5. The limit of 200 on non-capturing parentheses is a _nesting_ limit, not an
+absolute limit. Changed the text of the error message to make this clear, and
+likewise updated the man page.
+
+6. The limit of 99 on the number of capturing subpatterns has been removed.
+The new limit is 65535, which I hope will not be a "real" limit.
+
+
+Release 3.3 01-Aug-00
+---------------------
+
+There is some support for UTF-8 character strings. This is incomplete and
+experimental. The documentation describes what is and what is not implemented.
+Otherwise, this is just a bug-fixing release.
+
+
+Release 3.0 01-Feb-00
+---------------------
+
+1. A "configure" script is now used to configure PCRE for Unix systems. It
+builds a Makefile, a config.h file, and the pcre-config script.
+
+2. PCRE is built as a shared library by default.
+
+3. There is support for POSIX classes such as [:alpha:].
+
+5. There is an experimental recursion feature.
+
+----------------------------------------------------------------------------
+ IMPORTANT FOR THOSE UPGRADING FROM VERSIONS BEFORE 2.00
+
+Please note that there has been a change in the API such that a larger
+ovector is required at matching time, to provide some additional workspace.
+The new man page has details. This change was necessary in order to support
+some of the new functionality in Perl 5.005.
+
+ IMPORTANT FOR THOSE UPGRADING FROM VERSION 2.00
+
+Another (I hope this is the last!) change has been made to the API for the
+pcre_compile() function. An additional argument has been added to make it
+possible to pass over a pointer to character tables built in the current
+locale by pcre_maketables(). To use the default tables, this new arguement
+should be passed as NULL.
+
+ IMPORTANT FOR THOSE UPGRADING FROM VERSION 2.05
+
+Yet another (and again I hope this really is the last) change has been made
+to the API for the pcre_exec() function. An additional argument has been
+added to make it possible to start the match other than at the start of the
+subject string. This is important if there are lookbehinds. The new man
+page has the details, but you just want to convert existing programs, all
+you need to do is to stick in a new fifth argument to pcre_exec(), with a
+value of zero. For example, change
+
+ pcre_exec(pattern, extra, subject, length, options, ovec, ovecsize)
+to
+ pcre_exec(pattern, extra, subject, length, 0, options, ovec, ovecsize)
+
+****
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/NON-UNIX-USE b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/NON-UNIX-USE
new file mode 100644
index 00000000..f6280af6
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/NON-UNIX-USE
@@ -0,0 +1,244 @@
+Compiling PCRE on non-Unix systems
+----------------------------------
+
+See below for comments on Cygwin or MinGW and OpenVMS usage. I (Philip Hazel)
+have no knowledge of Windows or VMS sytems and how their libraries work. The
+items in the PCRE Makefile that relate to anything other than Unix-like systems
+have been contributed by PCRE users. There are some other comments and files in
+the Contrib directory on the ftp site that you may find useful. See
+
+ ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/Contrib
+
+If you want to compile PCRE for a non-Unix system (or perhaps, more strictly,
+for a system that does not support "configure" and "make" files), note that
+PCRE consists entirely of code written in Standard C, and so should compile
+successfully on any system that has a Standard C compiler and library.
+
+
+GENERIC INSTRUCTIONS
+
+The following are generic comments about building PCRE. The interspersed
+indented commands are suggestions from Mark Tetrode as to which commands you
+might use on a Windows system to build a static library.
+
+(1) Copy or rename the file config.in as config.h, and change the macros that
+define HAVE_STRERROR and HAVE_MEMMOVE to define them as 1 rather than 0.
+Unfortunately, because of the way Unix autoconf works, the default setting has
+to be 0. You may also want to make changes to other macros in config.h. In
+particular, if you want to force a specific value for newline, you can define
+the NEWLINE macro. The default is to use '\n', thereby using whatever value
+your compiler gives to '\n'.
+
+ rem Mark Tetrode's commands
+ copy config.in config.h
+ rem Use write, because notepad cannot handle UNIX files. Change values.
+ write config.h
+
+(2) Copy or rename the file pcre.in as pcre.h, and change the macro definitions
+for PCRE_MAJOR, PCRE_MINOR, and PCRE_DATE near its start to the values set in
+configure.in.
+
+ rem Mark Tetrode's commands
+ copy pcre.in pcre.h
+ rem Read values from configure.in
+ write configure.in
+ rem Change values
+ write pcre.h
+
+(3) Compile dftables.c as a stand-alone program, and then run it with
+the single argument "chartables.c". This generates a set of standard
+character tables and writes them to that file.
+
+ rem Mark Tetrode's commands
+ rem Compile & run
+ cl -DSUPPORT_UTF8 dftables.c
+ dftables.exe > chartables.c
+
+(4) Compile maketables.c, get.c, study.c and pcre.c and link them all
+together into an object library in whichever form your system keeps such
+libraries. This is the pcre library (chartables.c is included by means of an
+#include directive). If your system has static and shared libraries, you may
+have to do this once for each type.
+
+ rem Mark Tetrode's commands, for a static library
+ rem Compile & lib
+ cl -DSUPPORT_UTF8 -DPOSIX_MALLOC_THRESHOLD=10 /c maketables.c get.c study.c pcre.c
+ lib /OUT:pcre.lib maketables.obj get.obj study.obj pcre.obj
+
+(5) Similarly, compile pcreposix.c and link it (on its own) as the pcreposix
+library.
+
+ rem Mark Tetrode's commands, for a static library
+ rem Compile & lib
+ cl -DSUPPORT_UTF8 -DPOSIX_MALLOC_THRESHOLD=10 /c pcreposix.c
+ lib /OUT:pcreposix.lib pcreposix.obj
+
+(6) Compile the test program pcretest.c. This needs the functions in the
+pcre and pcreposix libraries when linking.
+
+ rem Mark Tetrode's commands
+ rem compile & link
+ cl pcretest.c pcre.lib pcreposix.lib
+
+(7) Run pcretest on the testinput files in the testdata directory, and check
+that the output matches the corresponding testoutput files. You must use the
+-i option when checking testinput2. Note that the supplied files are in Unix
+format, with just LF characters as line terminators. You may need to edit them
+to change this if your system uses a different convention.
+
+ rem Mark Tetrode's commands
+ rem Make a change, i.e. space, backspace, and save again - do this for all
+ rem to change UNIX to Win, \n to \n\r
+ write testoutput1
+ write testoutput2
+ write testoutput3
+ write testoutput4
+ write testoutput5
+ pcretest testdata\testinput1 testdata\myoutput1
+ windiff testdata\testoutput1 testdata\myoutput1
+ pcretest -i testdata\testinput2 testdata\myoutput2
+ windiff testdata\testoutput2 testdata\myoutput2
+ pcretest testdata\testinput3 testdata\myoutput3
+ windiff testdata\testoutput3 testdata\myoutput3
+ pcretest testdata\testinput4 testdata\myoutput4
+ windiff testdata\testoutput4 testdata\myoutput4
+ pcretest testdata\testinput5 testdata\myoutput5
+ windiff testdata\testoutput5 testdata\myoutput5
+
+
+FURTHER REMARKS
+
+If you have a system without "configure" but where you can use a Makefile, edit
+Makefile.in to create Makefile, substituting suitable values for the variables
+at the head of the file.
+
+Some help in building a Win32 DLL of PCRE in GnuWin32 environments was
+contributed by Paul Sokolovsky. These environments are Mingw32
+(http://www.xraylith.wisc.edu/~khan/software/gnu-win32/) and CygWin
+(http://sourceware.cygnus.com/cygwin/). Paul comments:
+
+ For CygWin, set CFLAGS=-mno-cygwin, and do 'make dll'. You'll get
+ pcre.dll (containing pcreposix also), libpcre.dll.a, and dynamically
+ linked pgrep and pcretest. If you have /bin/sh, run RunTest (three
+ main test go ok, locale not supported).
+
+Changes to do MinGW with autoconf 2.50 were supplied by Fred Cox
+<sailorFred@yahoo.com>, who comments as follows:
+
+ If you are using the PCRE DLL, the normal Unix style configure && make &&
+ make check && make install should just work[*]. If you want to statically
+ link against the .a file, you must define PCRE_STATIC before including
+ pcre.h, otherwise the pcre_malloc and pcre_free exported functions will be
+ declared __declspec(dllimport), with hilarious results. See the configure.in
+ and pcretest.c for how it is done for the static test.
+
+ Also, there will only be a libpcre.la, not a libpcreposix.la, as you
+ would expect from the Unix version. The single DLL includes the pcreposix
+ interface.
+
+[*] But note that the supplied test files are in Unix format, with just LF
+characters as line terminators. You will have to edit them to change to CR LF
+terminators.
+
+A script for building PCRE using Borland's C++ compiler for use with VPASCAL
+was contributed by Alexander Tokarev. It is called makevp.bat.
+
+These are some further comments about Win32 builds from Mark Evans. They
+were contributed before Fred Cox's changes were made, so it is possible that
+they may no longer be relevant.
+
+"The documentation for Win32 builds is a bit shy. Under MSVC6 I
+followed their instructions to the letter, but there were still
+some things missing.
+
+(1) Must #define STATIC for entire project if linking statically.
+ (I see no reason to use DLLs for code this compact.) This of
+ course is a project setting in MSVC under Preprocessor.
+
+(2) Missing some #ifdefs relating to the function pointers
+ pcre_malloc and pcre_free. See my solution below. (The stubs
+ may not be mandatory but they made me feel better.)"
+
+=========================
+#ifdef _WIN32
+#include <malloc.h>
+
+void* malloc_stub(size_t N)
+{ return malloc(N); }
+void free_stub(void* p)
+{ free(p); }
+void *(*pcre_malloc)(size_t) = &malloc_stub;
+void (*pcre_free)(void *) = &free_stub;
+
+#else
+
+void *(*pcre_malloc)(size_t) = malloc;
+void (*pcre_free)(void *) = free;
+
+#endif
+=========================
+
+
+BUILDING PCRE ON OPENVMS
+
+Dan Mooney sent the following comments about building PCRE on OpenVMS:
+
+"It was quite easy to compile and link the library. I don't have a formal
+make file but the attached file [reproduced below] contains the OpenVMS DCL
+commands I used to build the library. I had to add #define
+POSIX_MALLOC_THRESHOLD 10 to pcre.h since it was not defined anywhere.
+
+The library was built on:
+O/S: HP OpenVMS v7.3-1
+Compiler: Compaq C v6.5-001-48BCD
+Linker: vA13-01
+
+The test results did not match 100% due to the issues you mention in your
+documentation regarding isprint(), iscntrl(), isgraph() and ispunct(). I
+modified some of the character tables temporarily and was able to get the
+results to match. Tests using the fr locale did not match since I don't have
+that locale loaded. The study size was always reported to be 3 less than the
+value in the standard test output files."
+
+=========================
+$! This DCL procedure builds PCRE on OpenVMS
+$!
+$! I followed the instructions in the non-unix-use file in the distribution.
+$!
+$ COMPILE == "CC/LIST/NOMEMBER_ALIGNMENT/PREFIX_LIBRARY_ENTRIES=ALL_ENTRIES
+$ COMPILE DFTABLES.C
+$ LINK/EXE=DFTABLES.EXE DFTABLES.OBJ
+$ RUN DFTABLES.EXE/OUTPUT=CHARTABLES.C
+$ COMPILE MAKETABLES.C
+$ COMPILE GET.C
+$ COMPILE STUDY.C
+$! I had to set POSIX_MALLOC_THRESHOLD to 10 in PCRE.H since the symbol
+$! did not seem to be defined anywhere.
+$! I edited pcre.h and added #DEFINE SUPPORT_UTF8 to enable UTF8 support.
+$ COMPILE PCRE.C
+$ LIB/CREATE PCRE MAKETABLES.OBJ, GET.OBJ, STUDY.OBJ, PCRE.OBJ
+$! I had to set POSIX_MALLOC_THRESHOLD to 10 in PCRE.H since the symbol
+$! did not seem to be defined anywhere.
+$ COMPILE PCREPOSIX.C
+$ LIB/CREATE PCREPOSIX PCREPOSIX.OBJ
+$ COMPILE PCRETEST.C
+$ LINK/EXE=PCRETEST.EXE PCRETEST.OBJ, PCRE/LIB, PCREPOSIX/LIB
+$! C programs that want access to command line arguments must be
+$! defined as a symbol
+$ PCRETEST :== "$ SYS$ROADSUSERS:[DMOONEY.REGEXP]PCRETEST.EXE"
+$! Arguments must be enclosed in quotes.
+$ PCRETEST "-C"
+$! Test results:
+$!
+$! The test results did not match 100%. The functions isprint(), iscntrl(),
+$! isgraph() and ispunct() on OpenVMS must not produce the same results
+$! as the system that built the test output files provided with the
+$! distribution.
+$!
+$! The study size did not match and was always 3 less on OpenVMS.
+$!
+$! Locale could not be set to fr
+$!
+=========================
+
+****
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/NWGNUmakefile b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/NWGNUmakefile
new file mode 100644
index 00000000..a40897c6
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/NWGNUmakefile
@@ -0,0 +1,267 @@
+#
+# NWGNUmakefile for DfTables.nlm (Apache2)
+# Declare the sub-directories to be built here
+#
+
+SUBDIRS = \
+ $(EOLIST)
+
+#
+# Get the 'head' of the build environment. This includes default targets and
+# paths to tools
+#
+
+include $(APR_WORK)\build\NWGNUhead.inc
+
+PCRE = $(AP_WORK)/srclib/pcre
+
+#
+# build this level's files
+
+FILES_prebuild_headers = \
+ $(PCRE)/config.h \
+ $(PCRE)/pcre.h \
+ $(EOLIST)
+
+$(PCRE)/%.h: $(subst /,\,$(PCRE))\%.hw
+ @echo Creating $(subst /,\,$@)
+ copy $< $(subst /,\,$(PCRE))\$(@F)
+
+#
+# Make sure all needed macro's are defined
+#
+
+#
+# These directories will be at the beginning of the include list, followed by
+# INCDIRS
+#
+XINCDIRS += \
+ $(AP_WORK)/os/netware \
+ $(APR)/include/arch/netware \
+ $(EOLIST)
+
+#
+# These flags will come after CFLAGS
+#
+XCFLAGS += \
+ $(EOLIST)
+
+#
+# These defines will come after DEFINES
+#
+XDEFINES += \
+ $(EOLIST)
+
+#
+# These flags will be added to the link.opt file
+#
+XLFLAGS += \
+ $(EOLIST)
+
+#
+# These values will be appended to the correct variables based on the value of
+# RELEASE
+#
+ifeq "$(RELEASE)" "debug"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+ifeq "$(RELEASE)" "noopt"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+ifeq "$(RELEASE)" "release"
+XINCDIRS += \
+ $(EOLIST)
+
+XCFLAGS += \
+ $(EOLIST)
+
+XDEFINES += \
+ $(EOLIST)
+
+XLFLAGS += \
+ $(EOLIST)
+endif
+
+#
+# These are used by the link target if an NLM is being generated
+# This is used by the link 'name' directive to name the nlm. If left blank
+# TARGET_nlm (see below) will be used.
+#
+NLM_NAME = dftables
+
+#
+# This is used by the link '-desc ' directive.
+# If left blank, NLM_NAME will be used.
+#
+NLM_DESCRIPTION = Generate character tables
+
+#$(FILES_prebuild_headers)
+# This is used by the '-threadname' directive. If left blank,
+# NLM_NAME Thread will be used.
+#
+NLM_THREAD_NAME = dftables
+
+#
+# If this is specified, it will override VERSION value in
+# $(APR_WORK)\build\NWGNUenvironment.inc
+#
+NLM_VERSION = 1,0,0
+
+#
+# If this is specified, it will override the default of 64K
+#
+NLM_STACK_SIZE = 8192
+
+#
+# If this is specified it will be used by the link '-entry' directive
+#
+NLM_ENTRY_SYM =_LibCPrelude
+
+#
+# If this is specified it will be used by the link '-exit' directive
+#
+NLM_EXIT_SYM =_LibCPostlude
+
+#
+# If this is specified it will be used by the link '-check' directive
+#
+NLM_CHECK_SYM =
+
+#
+# If this is specified it will be used by the link '-flags' directive
+#
+NLM_FLAGS = PSEUDOPREEMPTION
+
+#
+# If this is specified it will be linked in with the XDCData option in the def
+# file instead of the default of $(APR)/misc/netware/apr.xdc. XDCData can
+# be disabled by setting APACHE_UNIPROC in the environment
+#
+XDCDATA =
+
+#
+# Declare all target files (you must add your files here)
+#
+
+#
+# If there is an NLM target, put it here
+#
+TARGET_nlm = \
+$(OBJDIR)/dftables.nlm \
+ $(EOLIST)
+
+#
+# If there is an LIB target, put it here
+#
+TARGET_lib = \
+ $(EOLIST)
+
+#
+# These are the OBJ files needed to create the NLM target above.
+# Paths must all use the '/' character
+#
+FILES_nlm_objs = \
+ $(FILES_prebuild_headers) \
+ $(OBJDIR)/dftables.o \
+ $(EOLIST)
+
+#
+# These are the LIB files needed to create the NLM target above.
+# These will be added as a library command in the link.opt file.
+#
+FILES_nlm_libs = \
+ libcpre.o \
+ $(EOLIST)
+
+#
+# These are the modules that the above NLM target depends on to load.
+# These will be added as a module command in the link.opt file.
+#
+FILES_nlm_modules = \
+ Libc \
+ $(EOLIST)
+
+#
+# If the nlm has a msg file, put it's path here
+#
+FILE_nlm_msg =
+
+#
+# If the nlm has a hlp file put it's path here
+#
+FILE_nlm_hlp =
+
+#
+# If this is specified, it will override $(NWOS)\copyright.txt.
+#
+FILE_nlm_copyright =
+
+#
+# Any additional imports go here
+#
+FILES_nlm_Ximports = \
+ @libc.imp \
+ $(EOLIST)
+
+#
+# Any symbols exported to here
+#
+FILES_nlm_exports = \
+ $(EOLIST)
+
+#
+# These are the OBJ files needed to create the LIB target above.
+# Paths must all use the '/' character
+#
+FILES_lib_objs = \
+ $(EOLIST)
+
+#
+# implement targets and dependancies (leave this section alone)
+#
+
+libs :: $(OBJDIR) $(TARGET_lib)
+
+nlms :: libs $(TARGET_nlm)
+
+#
+# Updated this target to create necessary directories and copy files to the
+# correct place. (See $(APR_WORK)\build\NWGNUhead.inc for examples)
+#
+install :: nlms FORCE
+
+#
+# Any specialized rules here
+#
+
+
+#
+# Include the 'tail' makefile that has targets that depend on variables defined
+# in this makefile
+#
+
+include $(APR_WORK)\build\NWGNUtail.inc
+
+# End of NWGNUmakefile for DfTables.nlm (Apache2)
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/README b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/README
new file mode 100644
index 00000000..fc5397ec
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/README
@@ -0,0 +1,427 @@
+README file for PCRE (Perl-compatible regular expression library)
+-----------------------------------------------------------------
+
+The latest release of PCRE is always available from
+
+ ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.gz
+
+Please read the NEWS file if you are upgrading from a previous release.
+
+PCRE has its own native API, but a set of "wrapper" functions that are based on
+the POSIX API are also supplied in the library libpcreposix. Note that this
+just provides a POSIX calling interface to PCRE: the regular expressions
+themselves still follow Perl syntax and semantics. The header file
+for the POSIX-style functions is called pcreposix.h. The official POSIX name is
+regex.h, but I didn't want to risk possible problems with existing files of
+that name by distributing it that way. To use it with an existing program that
+uses the POSIX API, it will have to be renamed or pointed at by a link.
+
+If you are using the POSIX interface to PCRE and there is already a POSIX regex
+library installed on your system, you must take care when linking programs to
+ensure that they link with PCRE's libpcreposix library. Otherwise they may pick
+up the "real" POSIX functions of the same name.
+
+
+Documentation for PCRE
+----------------------
+
+If you install PCRE in the normal way, you will end up with an installed set of
+man pages whose names all start with "pcre". The one that is called "pcre"
+lists all the others. In addition to these man pages, the PCRE documentation is
+supplied in two other forms; however, as there is no standard place to install
+them, they are left in the doc directory of the unpacked source distribution.
+These forms are:
+
+ 1. Files called doc/pcre.txt, doc/pcregrep.txt, and doc/pcretest.txt. The
+ first of these is a concatenation of the text forms of all the section 3
+ man pages except those that summarize individual functions. The other two
+ are the text forms of the section 1 man pages for the pcregrep and
+ pcretest commands. Text forms are provided for ease of scanning with text
+ editors or similar tools.
+
+ 2. A subdirectory called doc/html contains all the documentation in HTML
+ form, hyperlinked in various ways, and rooted in a file called
+ doc/index.html.
+
+
+Contributions by users of PCRE
+------------------------------
+
+You can find contributions from PCRE users in the directory
+
+ ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/Contrib
+
+where there is also a README file giving brief descriptions of what they are.
+Several of them provide support for compiling PCRE on various flavours of
+Windows systems (I myself do not use Windows). Some are complete in themselves;
+others are pointers to URLs containing relevant files.
+
+
+Building PCRE on a Unix-like system
+-----------------------------------
+
+To build PCRE on a Unix-like system, first run the "configure" command from the
+PCRE distribution directory, with your current directory set to the directory
+where you want the files to be created. This command is a standard GNU
+"autoconf" configuration script, for which generic instructions are supplied in
+INSTALL.
+
+Most commonly, people build PCRE within its own distribution directory, and in
+this case, on many systems, just running "./configure" is sufficient, but the
+usual methods of changing standard defaults are available. For example:
+
+CFLAGS='-O2 -Wall' ./configure --prefix=/opt/local
+
+specifies that the C compiler should be run with the flags '-O2 -Wall' instead
+of the default, and that "make install" should install PCRE under /opt/local
+instead of the default /usr/local.
+
+If you want to build in a different directory, just run "configure" with that
+directory as current. For example, suppose you have unpacked the PCRE source
+into /source/pcre/pcre-xxx, but you want to build it in /build/pcre/pcre-xxx:
+
+cd /build/pcre/pcre-xxx
+/source/pcre/pcre-xxx/configure
+
+There are some optional features that can be included or omitted from the PCRE
+library. You can read more about them in the pcrebuild man page.
+
+. If you want to make use of the support for UTF-8 character strings in PCRE,
+ you must add --enable-utf8 to the "configure" command. Without it, the code
+ for handling UTF-8 is not included in the library. (Even when included, it
+ still has to be enabled by an option at run time.)
+
+. If, in addition to support for UTF-8 character strings, you want to include
+ support for the \P, \p, and \X sequences that recognize Unicode character
+ properties, you must add --enable-unicode-properties to the "configure"
+ command. This adds about 90K to the size of the library (in the form of a
+ property table); only the basic two-letter properties such as Lu are
+ supported.
+
+. You can build PCRE to recognized CR or NL as the newline character, instead
+ of whatever your compiler uses for "\n", by adding --newline-is-cr or
+ --newline-is-nl to the "configure" command, respectively. Only do this if you
+ really understand what you are doing. On traditional Unix-like systems, the
+ newline character is NL.
+
+. When called via the POSIX interface, PCRE uses malloc() to get additional
+ storage for processing capturing parentheses if there are more than 10 of
+ them. You can increase this threshold by setting, for example,
+
+ --with-posix-malloc-threshold=20
+
+ on the "configure" command.
+
+. PCRE has a counter which can be set to limit the amount of resources it uses.
+ If the limit is exceeded during a match, the match fails. The default is ten
+ million. You can change the default by setting, for example,
+
+ --with-match-limit=500000
+
+ on the "configure" command. This is just the default; individual calls to
+ pcre_exec() can supply their own value. There is discussion on the pcreapi
+ man page.
+
+. The default maximum compiled pattern size is around 64K. You can increase
+ this by adding --with-link-size=3 to the "configure" command. You can
+ increase it even more by setting --with-link-size=4, but this is unlikely
+ ever to be necessary. If you build PCRE with an increased link size, test 2
+ (and 5 if you are using UTF-8) will fail. Part of the output of these tests
+ is a representation of the compiled pattern, and this changes with the link
+ size.
+
+. You can build PCRE so that its match() function does not call itself
+ recursively. Instead, it uses blocks of data from the heap via special
+ functions pcre_stack_malloc() and pcre_stack_free() to save data that would
+ otherwise be saved on the stack. To build PCRE like this, use
+
+ --disable-stack-for-recursion
+
+ on the "configure" command. PCRE runs more slowly in this mode, but it may be
+ necessary in environments with limited stack sizes.
+
+The "configure" script builds seven files:
+
+. pcre.h is build by copying pcre.in and making substitutions
+. Makefile is built by copying Makefile.in and making substitutions.
+. config.h is built by copying config.in and making substitutions.
+. pcre-config is built by copying pcre-config.in and making substitutions.
+. libpcre.pc is data for the pkg-config command, built from libpcre.pc.in
+. libtool is a script that builds shared and/or static libraries
+. RunTest is a script for running tests
+
+Once "configure" has run, you can run "make". It builds two libraries called
+libpcre and libpcreposix, a test program called pcretest, and the pcregrep
+command. You can use "make install" to copy these, the public header files
+pcre.h and pcreposix.h, and the man pages to appropriate live directories on
+your system, in the normal way.
+
+
+Retrieving configuration information on Unix-like systems
+---------------------------------------------------------
+
+Running "make install" also installs the command pcre-config, which can be used
+to recall information about the PCRE configuration and installation. For
+example:
+
+ pcre-config --version
+
+prints the version number, and
+
+ pcre-config --libs
+
+outputs information about where the library is installed. This command can be
+included in makefiles for programs that use PCRE, saving the programmer from
+having to remember too many details.
+
+The pkg-config command is another system for saving and retrieving information
+about installed libraries. Instead of separate commands for each library, a
+single command is used. For example:
+
+ pkg-config --cflags pcre
+
+The data is held in *.pc files that are installed in a directory called
+pkgconfig.
+
+
+Shared libraries on Unix-like systems
+-------------------------------------
+
+The default distribution builds PCRE as two shared libraries and two static
+libraries, as long as the operating system supports shared libraries. Shared
+library support relies on the "libtool" script which is built as part of the
+"configure" process.
+
+The libtool script is used to compile and link both shared and static
+libraries. They are placed in a subdirectory called .libs when they are newly
+built. The programs pcretest and pcregrep are built to use these uninstalled
+libraries (by means of wrapper scripts in the case of shared libraries). When
+you use "make install" to install shared libraries, pcregrep and pcretest are
+automatically re-built to use the newly installed shared libraries before being
+installed themselves. However, the versions left in the source directory still
+use the uninstalled libraries.
+
+To build PCRE using static libraries only you must use --disable-shared when
+configuring it. For example:
+
+./configure --prefix=/usr/gnu --disable-shared
+
+Then run "make" in the usual way. Similarly, you can use --disable-static to
+build only shared libraries.
+
+
+Cross-compiling on a Unix-like system
+-------------------------------------
+
+You can specify CC and CFLAGS in the normal way to the "configure" command, in
+order to cross-compile PCRE for some other host. However, during the building
+process, the dftables.c source file is compiled *and run* on the local host, in
+order to generate the default character tables (the chartables.c file). It
+therefore needs to be compiled with the local compiler, not the cross compiler.
+You can do this by specifying CC_FOR_BUILD (and if necessary CFLAGS_FOR_BUILD)
+when calling the "configure" command. If they are not specified, they default
+to the values of CC and CFLAGS.
+
+
+Building on non-Unix systems
+----------------------------
+
+For a non-Unix system, read the comments in the file NON-UNIX-USE, though if
+the system supports the use of "configure" and "make" you may be able to build
+PCRE in the same way as for Unix systems.
+
+PCRE has been compiled on Windows systems and on Macintoshes, but I don't know
+the details because I don't use those systems. It should be straightforward to
+build PCRE on any system that has a Standard C compiler, because it uses only
+Standard C functions.
+
+
+Testing PCRE
+------------
+
+To test PCRE on a Unix system, run the RunTest script that is created by the
+configuring process. (This can also be run by "make runtest", "make check", or
+"make test".) For other systems, see the instructions in NON-UNIX-USE.
+
+The script runs the pcretest test program (which is documented in its own man
+page) on each of the testinput files (in the testdata directory) in turn,
+and compares the output with the contents of the corresponding testoutput file.
+A file called testtry is used to hold the main output from pcretest
+(testsavedregex is also used as a working file). To run pcretest on just one of
+the test files, give its number as an argument to RunTest, for example:
+
+ RunTest 2
+
+The first file can also be fed directly into the perltest script to check that
+Perl gives the same results. The only difference you should see is in the first
+few lines, where the Perl version is given instead of the PCRE version.
+
+The second set of tests check pcre_fullinfo(), pcre_info(), pcre_study(),
+pcre_copy_substring(), pcre_get_substring(), pcre_get_substring_list(), error
+detection, and run-time flags that are specific to PCRE, as well as the POSIX
+wrapper API. It also uses the debugging flag to check some of the internals of
+pcre_compile().
+
+If you build PCRE with a locale setting that is not the standard C locale, the
+character tables may be different (see next paragraph). In some cases, this may
+cause failures in the second set of tests. For example, in a locale where the
+isprint() function yields TRUE for characters in the range 128-255, the use of
+[:isascii:] inside a character class defines a different set of characters, and
+this shows up in this test as a difference in the compiled code, which is being
+listed for checking. Where the comparison test output contains [\x00-\x7f] the
+test will contain [\x00-\xff], and similarly in some other cases. This is not a
+bug in PCRE.
+
+The third set of tests checks pcre_maketables(), the facility for building a
+set of character tables for a specific locale and using them instead of the
+default tables. The tests make use of the "fr_FR" (French) locale. Before
+running the test, the script checks for the presence of this locale by running
+the "locale" command. If that command fails, or if it doesn't include "fr_FR"
+in the list of available locales, the third test cannot be run, and a comment
+is output to say why. If running this test produces instances of the error
+
+ ** Failed to set locale "fr_FR"
+
+in the comparison output, it means that locale is not available on your system,
+despite being listed by "locale". This does not mean that PCRE is broken.
+
+The fourth test checks the UTF-8 support. It is not run automatically unless
+PCRE is built with UTF-8 support. To do this you must set --enable-utf8 when
+running "configure". This file can be also fed directly to the perltest script,
+provided you are running Perl 5.8 or higher. (For Perl 5.6, a small patch,
+commented in the script, can be be used.)
+
+The fifth test checks error handling with UTF-8 encoding, and internal UTF-8
+features of PCRE that are not relevant to Perl.
+
+The sixth and final test checks the support for Unicode character properties.
+It it not run automatically unless PCRE is built with Unicode property support.
+To to this you must set --enable-unicode-properties when running "configure".
+
+
+Character tables
+----------------
+
+PCRE uses four tables for manipulating and identifying characters whose values
+are less than 256. The final argument of the pcre_compile() function is a
+pointer to a block of memory containing the concatenated tables. A call to
+pcre_maketables() can be used to generate a set of tables in the current
+locale. If the final argument for pcre_compile() is passed as NULL, a set of
+default tables that is built into the binary is used.
+
+The source file called chartables.c contains the default set of tables. This is
+not supplied in the distribution, but is built by the program dftables
+(compiled from dftables.c), which uses the ANSI C character handling functions
+such as isalnum(), isalpha(), isupper(), islower(), etc. to build the table
+sources. This means that the default C locale which is set for your system will
+control the contents of these default tables. You can change the default tables
+by editing chartables.c and then re-building PCRE. If you do this, you should
+probably also edit Makefile to ensure that the file doesn't ever get
+re-generated.
+
+The first two 256-byte tables provide lower casing and case flipping functions,
+respectively. The next table consists of three 32-byte bit maps which identify
+digits, "word" characters, and white space, respectively. These are used when
+building 32-byte bit maps that represent character classes.
+
+The final 256-byte table has bits indicating various character types, as
+follows:
+
+ 1 white space character
+ 2 letter
+ 4 decimal digit
+ 8 hexadecimal digit
+ 16 alphanumeric or '_'
+ 128 regular expression metacharacter or binary zero
+
+You should not alter the set of characters that contain the 128 bit, as that
+will cause PCRE to malfunction.
+
+
+Manifest
+--------
+
+The distribution should contain the following files:
+
+(A) The actual source files of the PCRE library functions and their
+ headers:
+
+ dftables.c auxiliary program for building chartables.c
+
+ get.c )
+ maketables.c )
+ study.c ) source of the functions
+ pcre.c ) in the library
+ pcreposix.c )
+ printint.c )
+
+ ucp.c )
+ ucp.h ) source for the code that is used for
+ ucpinternal.h ) Unicode property handling
+ ucptable.c )
+ ucptypetable.c )
+
+ pcre.in "source" for the header for the external API; pcre.h
+ is built from this by "configure"
+ pcreposix.h header for the external POSIX wrapper API
+ internal.h header for internal use
+ config.in template for config.h, which is built by configure
+
+(B) Auxiliary files:
+
+ AUTHORS information about the author of PCRE
+ ChangeLog log of changes to the code
+ INSTALL generic installation instructions
+ LICENCE conditions for the use of PCRE
+ COPYING the same, using GNU's standard name
+ Makefile.in template for Unix Makefile, which is built by configure
+ NEWS important changes in this release
+ NON-UNIX-USE notes on building PCRE on non-Unix systems
+ README this file
+ RunTest.in template for a Unix shell script for running tests
+ config.guess ) files used by libtool,
+ config.sub ) used only when building a shared library
+ configure a configuring shell script (built by autoconf)
+ configure.in the autoconf input used to build configure
+ doc/Tech.Notes notes on the encoding
+ doc/*.3 man page sources for the PCRE functions
+ doc/*.1 man page sources for pcregrep and pcretest
+ doc/html/* HTML documentation
+ doc/pcre.txt plain text version of the man pages
+ doc/pcretest.txt plain text documentation of test program
+ doc/perltest.txt plain text documentation of Perl test program
+ install-sh a shell script for installing files
+ libpcre.pc.in "source" for libpcre.pc for pkg-config
+ ltmain.sh file used to build a libtool script
+ mkinstalldirs script for making install directories
+ pcretest.c comprehensive test program
+ pcredemo.c simple demonstration of coding calls to PCRE
+ perltest Perl test program
+ pcregrep.c source of a grep utility that uses PCRE
+ pcre-config.in source of script which retains PCRE information
+ testdata/testinput1 test data, compatible with Perl
+ testdata/testinput2 test data for error messages and non-Perl things
+ testdata/testinput3 test data for locale-specific tests
+ testdata/testinput4 test data for UTF-8 tests compatible with Perl
+ testdata/testinput5 test data for other UTF-8 tests
+ testdata/testinput6 test data for Unicode property support tests
+ testdata/testoutput1 test results corresponding to testinput1
+ testdata/testoutput2 test results corresponding to testinput2
+ testdata/testoutput3 test results corresponding to testinput3
+ testdata/testoutput4 test results corresponding to testinput4
+ testdata/testoutput5 test results corresponding to testinput5
+ testdata/testoutput6 test results corresponding to testinput6
+
+(C) Auxiliary files for Win32 DLL
+
+ dll.mk
+ libpcre.def
+ libpcreposix.def
+ pcre.def
+
+(D) Auxiliary file for VPASCAL
+
+ makevp.bat
+
+Philip Hazel <ph10@cam.ac.uk>
+September 2004
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/RunTest.in b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/RunTest.in
new file mode 100644
index 00000000..5e945e1b
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/RunTest.in
@@ -0,0 +1,192 @@
+#! /bin/sh
+
+# This file is generated by configure from RunTest.in. Make any changes
+# to that file.
+
+# Run PCRE tests
+
+cf=diff
+testdata=@top_srcdir@/testdata
+
+# Select which tests to run; if no selection, run all
+
+do1=no
+do2=no
+do3=no
+do4=no
+do5=no
+do6=no
+
+while [ $# -gt 0 ] ; do
+ case $1 in
+ 1) do1=yes;;
+ 2) do2=yes;;
+ 3) do3=yes;;
+ 4) do4=yes;;
+ 5) do5=yes;;
+ 6) do6=yes;;
+ *) echo "Unknown test number $1"; exit 1;;
+ esac
+ shift
+done
+
+if [ "@LINK_SIZE@" != "" -a "@LINK_SIZE@" != "-DLINK_SIZE=2" ] ; then
+ if [ $do2 = yes ] ; then
+ echo "Can't run test 2 with an internal link size other than 2"
+ exit 1
+ fi
+ if [ $do5 = yes ] ; then
+ echo "Can't run test 5 with an internal link size other than 2"
+ exit 1
+ fi
+ if [ $do6 = yes ] ; then
+ echo "Can't run test 6 with an internal link size other than 2"
+ exit 1
+ fi
+fi
+
+if [ "@UTF8@" = "" ] ; then
+ if [ $do4 = yes ] ; then
+ echo "Can't run test 4 because UTF-8 support is not configured"
+ exit 1
+ fi
+ if [ $do5 = yes ] ; then
+ echo "Can't run test 5 because UTF-8 support is not configured"
+ exit 1
+ fi
+ if [ $do6 = yes ] ; then
+ echo "Can't run test 6 because UTF-8 support is not configured"
+ exit 1
+ fi
+fi
+
+if [ "@UCP@" = "" ] ; then
+ if [ $do6 = yes ] ; then
+ echo "Can't run test 6 because Unicode property support is not configured"
+ exit 1
+ fi
+fi
+
+if [ $do1 = no -a $do2 = no -a $do3 = no -a $do4 = no -a \
+ $do5 = no -a $do6 = no ] ; then
+ do1=yes
+ do2=yes
+ do3=yes
+ if [ "@UTF8@" != "" ] ; then do4=yes; fi
+ if [ "@UTF8@" != "" ] ; then do5=yes; fi
+ if [ "@UTF8@" != "" -a "@UCP@" != "" ] ; then do6=yes; fi
+fi
+
+# Show which release
+
+./pcretest /dev/null
+
+# Primary test, Perl-compatible
+
+if [ $do1 = yes ] ; then
+ echo "Test 1: main functionality (Perl compatible)"
+ ./pcretest $testdata/testinput1 testtry
+ if [ $? = 0 ] ; then
+ $cf testtry $testdata/testoutput1
+ if [ $? != 0 ] ; then exit 1; fi
+ echo " "
+ else exit 1
+ fi
+fi
+
+# PCRE tests that are not Perl-compatible - API & error tests, mostly
+
+if [ $do2 = yes ] ; then
+ if [ "@LINK_SIZE@" = "" -o "@LINK_SIZE@" = "-DLINK_SIZE=2" ] ; then
+ echo "Test 2: API and error handling (not Perl compatible)"
+ ./pcretest -i $testdata/testinput2 testtry
+ if [ $? = 0 ] ; then
+ $cf testtry $testdata/testoutput2
+ if [ $? != 0 ] ; then exit 1; fi
+ else exit 1
+ fi
+ else
+ echo Test 2 skipped for link size other than 2 \(@LINK_SIZE@\)
+ fi
+fi
+
+if [ $do1 = yes -a $do2 = yes ] ; then
+ echo " "
+ echo "The two main tests ran OK"
+ echo " "
+fi
+
+# Locale-specific tests, provided the "fr_FR" locale is available
+
+if [ $do3 = yes ] ; then
+ locale -a | grep '^fr_FR$' >/dev/null
+ if [ $? -eq 0 ] ; then
+ echo "Test 3: locale-specific features (using 'fr_FR' locale)"
+ ./pcretest $testdata/testinput3 testtry
+ if [ $? = 0 ] ; then
+ $cf testtry $testdata/testoutput3
+ if [ $? != 0 ] ; then
+ echo " "
+ echo "Locale test did not run entirely successfully."
+ echo "This usually means that there is a problem with the locale"
+ echo "settings rather than a bug in PCRE."
+ else
+ echo "Locale test ran OK"
+ fi
+ echo " "
+ else exit 1
+ fi
+ else
+ echo "Cannot test locale-specific features - 'fr_FR' locale not found,"
+ echo "or the \"locale\" command is not available to check for it."
+ echo " "
+ fi
+fi
+
+# Additional tests for UTF8 support
+
+if [ $do4 = yes ] ; then
+ echo "Test 4: UTF-8 support (Perl compatible)"
+ ./pcretest $testdata/testinput4 testtry
+ if [ $? = 0 ] ; then
+ $cf testtry $testdata/testoutput4
+ if [ $? != 0 ] ; then exit 1; fi
+ else exit 1
+ fi
+ echo "UTF8 test ran OK"
+ echo " "
+fi
+
+if [ $do5 = yes ] ; then
+ if [ "@LINK_SIZE@" = "" -o "@LINK_SIZE@" = "-DLINK_SIZE=2" ] ; then
+ echo "Test 5: API and internals for UTF-8 support (not Perl compatible)"
+ ./pcretest $testdata/testinput5 testtry
+ if [ $? = 0 ] ; then
+ $cf testtry $testdata/testoutput5
+ if [ $? != 0 ] ; then exit 1; fi
+ else exit 1
+ fi
+ echo "UTF8 internals test ran OK"
+ echo " "
+ else
+ echo Test 5 skipped for link size other than 2 \(@LINK_SIZE@\)
+ fi
+fi
+
+if [ $do6 = yes ] ; then
+ if [ "@LINK_SIZE@" = "" -o "@LINK_SIZE@" = "-DLINK_SIZE=2" ] ; then
+ echo "Test 6: Unicode property support"
+ ./pcretest $testdata/testinput6 testtry
+ if [ $? = 0 ] ; then
+ $cf testtry $testdata/testoutput6
+ if [ $? != 0 ] ; then exit 1; fi
+ else exit 1
+ fi
+ echo "Unicode properties test ran OK"
+ echo " "
+ else
+ echo Test 6 skipped for link size other than 2 \(@LINK_SIZE@\)
+ fi
+fi
+
+# End
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/config.hw b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/config.hw
new file mode 100644
index 00000000..5427366f
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/config.hw
@@ -0,0 +1,107 @@
+
+/* On Unix systems config.in is converted by configure into config.h. PCRE is
+written in Standard C, but there are a few non-standard things it can cope
+with, allowing it to run on SunOS4 and other "close to standard" systems.
+
+On a non-Unix system you should just copy this file into config.h, and set up
+the macros the way you need them. You should normally change the definitions of
+HAVE_STRERROR and HAVE_MEMMOVE to 1. Unfortunately, because of the way autoconf
+works, these cannot be made the defaults. If your system has bcopy() and not
+memmove(), change the definition of HAVE_BCOPY instead of HAVE_MEMMOVE. If your
+system has neither bcopy() nor memmove(), leave them both as 0; an emulation
+function will be used. */
+
+/* If you are compiling for a system that uses EBCDIC instead of ASCII
+character codes, define this macro as 1. On systems that can use "configure",
+this can be done via --enable-ebcdic. */
+
+#ifndef EBCDIC
+#define EBCDIC 0
+#endif
+
+/* If you are compiling for a system that needs some magic to be inserted
+before the definition of an exported function, define this macro to contain the
+relevant magic. It apears at the start of every exported function. */
+
+#define EXPORT
+
+/* Define to empty if the "const" keyword does not work. */
+
+#undef const
+
+/* Define to "unsigned" if <stddef.h> doesn't define size_t. */
+
+#undef size_t
+
+/* The following two definitions are mainly for the benefit of SunOS4, which
+doesn't have the strerror() or memmove() functions that should be present in
+all Standard C libraries. The macros HAVE_STRERROR and HAVE_MEMMOVE should
+normally be defined with the value 1 for other systems, but unfortunately we
+can't make this the default because "configure" files generated by autoconf
+will only change 0 to 1; they won't change 1 to 0 if the functions are not
+found. */
+
+#define HAVE_STRERROR 1
+#define HAVE_MEMMOVE 1
+
+/* There are some non-Unix systems that don't even have bcopy(). If this macro
+is false, an emulation is used. If HAVE_MEMMOVE is set to 1, the value of
+HAVE_BCOPY is not relevant. */
+
+#define HAVE_BCOPY 0
+
+/* The value of NEWLINE determines the newline character. The default is to
+leave it up to the compiler, but some sites want to force a particular value.
+On Unix systems, "configure" can be used to override this default. */
+
+#ifndef NEWLINE
+#define NEWLINE '\n'
+#endif
+
+/* The value of LINK_SIZE determines the number of bytes used to store
+links as offsets within the compiled regex. The default is 2, which allows for
+compiled patterns up to 64K long. This covers the vast majority of cases.
+However, PCRE can also be compiled to use 3 or 4 bytes instead. This allows for
+longer patterns in extreme cases. On Unix systems, "configure" can be used to
+override this default. */
+
+#ifndef LINK_SIZE
+#define LINK_SIZE 2
+#endif
+
+/* The value of MATCH_LIMIT determines the default number of times the match()
+function can be called during a single execution of pcre_exec(). (There is a
+runtime method of setting a different limit.) The limit exists in order to
+catch runaway regular expressions that take for ever to determine that they do
+not match. The default is set very large so that it does not accidentally catch
+legitimate cases. On Unix systems, "configure" can be used to override this
+default default. */
+
+#ifndef MATCH_LIMIT
+#define MATCH_LIMIT 10000000
+#endif
+
+/* When calling PCRE via the POSIX interface, additional working storage is
+required for holding the pointers to capturing substrings because PCRE requires
+three integers per substring, whereas the POSIX interface provides only two. If
+the number of expected substrings is small, the wrapper function uses space on
+the stack, because this is faster than using malloc() for each call. The
+threshold above which the stack is no longer use is defined by POSIX_MALLOC_
+THRESHOLD. On Unix systems, "configure" can be used to override this default.
+*/
+
+#ifndef POSIX_MALLOC_THRESHOLD
+#define POSIX_MALLOC_THRESHOLD 10
+#endif
+
+/* PCRE uses recursive function calls to handle backtracking while matching.
+This can sometimes be a problem on systems that have stacks of limited size.
+Define NO_RECURSE to get a version that doesn't use recursion in the match()
+function; instead it creates its own stack by steam using pcre_recurse_malloc
+to get memory. For more detail, see comments and other stuff just above the
+match() function. On Unix systems, "configure" can be used to set this in the
+Makefile (use --disable-stack-for-recursion). */
+
+/* #define NO_RECURSE */
+
+/* End */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/config.in b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/config.in
new file mode 100644
index 00000000..fc17ddd1
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/config.in
@@ -0,0 +1,107 @@
+
+/* On Unix systems config.in is converted by configure into config.h. PCRE is
+written in Standard C, but there are a few non-standard things it can cope
+with, allowing it to run on SunOS4 and other "close to standard" systems.
+
+On a non-Unix system you should just copy this file into config.h, and set up
+the macros the way you need them. You should normally change the definitions of
+HAVE_STRERROR and HAVE_MEMMOVE to 1. Unfortunately, because of the way autoconf
+works, these cannot be made the defaults. If your system has bcopy() and not
+memmove(), change the definition of HAVE_BCOPY instead of HAVE_MEMMOVE. If your
+system has neither bcopy() nor memmove(), leave them both as 0; an emulation
+function will be used. */
+
+/* If you are compiling for a system that uses EBCDIC instead of ASCII
+character codes, define this macro as 1. On systems that can use "configure",
+this can be done via --enable-ebcdic. */
+
+#ifndef EBCDIC
+#define EBCDIC 0
+#endif
+
+/* If you are compiling for a system that needs some magic to be inserted
+before the definition of an exported function, define this macro to contain the
+relevant magic. It apears at the start of every exported function. */
+
+#define EXPORT
+
+/* Define to empty if the "const" keyword does not work. */
+
+#undef const
+
+/* Define to "unsigned" if <stddef.h> doesn't define size_t. */
+
+#undef size_t
+
+/* The following two definitions are mainly for the benefit of SunOS4, which
+doesn't have the strerror() or memmove() functions that should be present in
+all Standard C libraries. The macros HAVE_STRERROR and HAVE_MEMMOVE should
+normally be defined with the value 1 for other systems, but unfortunately we
+can't make this the default because "configure" files generated by autoconf
+will only change 0 to 1; they won't change 1 to 0 if the functions are not
+found. */
+
+#define HAVE_STRERROR 0
+#define HAVE_MEMMOVE 0
+
+/* There are some non-Unix systems that don't even have bcopy(). If this macro
+is false, an emulation is used. If HAVE_MEMMOVE is set to 1, the value of
+HAVE_BCOPY is not relevant. */
+
+#define HAVE_BCOPY 0
+
+/* The value of NEWLINE determines the newline character. The default is to
+leave it up to the compiler, but some sites want to force a particular value.
+On Unix systems, "configure" can be used to override this default. */
+
+#ifndef NEWLINE
+#define NEWLINE '\n'
+#endif
+
+/* The value of LINK_SIZE determines the number of bytes used to store
+links as offsets within the compiled regex. The default is 2, which allows for
+compiled patterns up to 64K long. This covers the vast majority of cases.
+However, PCRE can also be compiled to use 3 or 4 bytes instead. This allows for
+longer patterns in extreme cases. On Unix systems, "configure" can be used to
+override this default. */
+
+#ifndef LINK_SIZE
+#define LINK_SIZE 2
+#endif
+
+/* The value of MATCH_LIMIT determines the default number of times the match()
+function can be called during a single execution of pcre_exec(). (There is a
+runtime method of setting a different limit.) The limit exists in order to
+catch runaway regular expressions that take for ever to determine that they do
+not match. The default is set very large so that it does not accidentally catch
+legitimate cases. On Unix systems, "configure" can be used to override this
+default default. */
+
+#ifndef MATCH_LIMIT
+#define MATCH_LIMIT 10000000
+#endif
+
+/* When calling PCRE via the POSIX interface, additional working storage is
+required for holding the pointers to capturing substrings because PCRE requires
+three integers per substring, whereas the POSIX interface provides only two. If
+the number of expected substrings is small, the wrapper function uses space on
+the stack, because this is faster than using malloc() for each call. The
+threshold above which the stack is no longer use is defined by POSIX_MALLOC_
+THRESHOLD. On Unix systems, "configure" can be used to override this default.
+*/
+
+#ifndef POSIX_MALLOC_THRESHOLD
+#define POSIX_MALLOC_THRESHOLD 10
+#endif
+
+/* PCRE uses recursive function calls to handle backtracking while matching.
+This can sometimes be a problem on systems that have stacks of limited size.
+Define NO_RECURSE to get a version that doesn't use recursion in the match()
+function; instead it creates its own stack by steam using pcre_recurse_malloc
+to get memory. For more detail, see comments and other stuff just above the
+match() function. On Unix systems, "configure" can be used to set this in the
+Makefile (use --disable-stack-for-recursion). */
+
+/* #define NO_RECURSE */
+
+/* End */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/configure.in b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/configure.in
new file mode 100644
index 00000000..4f8d031a
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/configure.in
@@ -0,0 +1,185 @@
+dnl Process this file with autoconf to produce a configure script.
+
+dnl This is required at the start; the name is the name of a file
+dnl it should be seeing, to verify it is in the same directory.
+
+AC_INIT(dftables.c)
+
+dnl A safety precaution
+
+AC_PREREQ(2.57)
+
+dnl Arrange to build config.h from config.in. Note that pcre.h is
+dnl built differently, as it is just a "substitution" file.
+dnl Manual says this macro should come right after AC_INIT.
+AC_CONFIG_HEADER(config.h:config.in)
+
+dnl Provide the current PCRE version information. Do not use numbers
+dnl with leading zeros for the minor version, as they end up in a C
+dnl macro, and may be treated as octal constants. Stick to single
+dnl digits for minor numbers less than 10. There are unlikely to be
+dnl that many releases anyway.
+
+PCRE_MAJOR=5
+PCRE_MINOR=0
+PCRE_DATE=13-Sep-2004
+PCRE_VERSION=${PCRE_MAJOR}.${PCRE_MINOR}
+
+dnl Default values for miscellaneous macros
+
+POSIX_MALLOC_THRESHOLD=-DPOSIX_MALLOC_THRESHOLD=10
+
+dnl Provide versioning information for libtool shared libraries that
+dnl are built by default on Unix systems.
+
+PCRE_LIB_VERSION=0:1:0
+PCRE_POSIXLIB_VERSION=0:0:0
+
+dnl Checks for programs.
+
+AC_PROG_CC
+
+dnl Checks for header files.
+
+AC_HEADER_STDC
+AC_CHECK_HEADERS(limits.h)
+
+dnl Checks for typedefs, structures, and compiler characteristics.
+
+AC_C_CONST
+AC_TYPE_SIZE_T
+
+dnl Checks for library functions.
+
+AC_CHECK_FUNCS(bcopy memmove strerror)
+
+dnl Handle --enable-shared-libraries
+
+LIBTOOL=./libtool
+LIBSUFFIX=la
+AC_ARG_ENABLE(shared,
+[ --disable-shared build PCRE as a static library],
+if test "$enableval" = "no"; then
+ LIBTOOL=
+ LIBSUFFIX=a
+fi
+)
+
+dnl Handle --enable-utf8
+
+AC_ARG_ENABLE(utf8,
+[ --enable-utf8 enable UTF8 support],
+if test "$enableval" = "yes"; then
+ UTF8=-DSUPPORT_UTF8
+fi
+)
+
+dnl Handle --enable-unicode-properties
+
+AC_ARG_ENABLE(unicode-properties,
+[ --enable-unicode-properties enable Unicode properties support],
+if test "$enableval" = "yes"; then
+ UCP=-DSUPPORT_UCP
+fi
+)
+
+dnl Handle --enable-newline-is-cr
+
+AC_ARG_ENABLE(newline-is-cr,
+[ --enable-newline-is-cr use CR as the newline character],
+if test "$enableval" = "yes"; then
+ NEWLINE=-DNEWLINE=13
+fi
+)
+
+dnl Handle --enable-newline-is-lf
+
+AC_ARG_ENABLE(newline-is-lf,
+[ --enable-newline-is-lf use LF as the newline character],
+if test "$enableval" = "yes"; then
+ NEWLINE=-DNEWLINE=10
+fi
+)
+
+dnl Handle --enable-ebcdic
+
+AC_ARG_ENABLE(ebcdic,
+[ --enable-ebcdic assume EBCDIC coding rather than ASCII],
+if test "$enableval" == "yes"; then
+ EBCDIC=-DEBCDIC=1
+fi
+)
+
+dnl Handle --disable-stack-for-recursion
+
+AC_ARG_ENABLE(stack-for-recursion,
+[ --disable-stack-for-recursion disable use of stack recursion when matching],
+if test "$enableval" = "no"; then
+ NO_RECURSE=-DNO_RECURSE
+fi
+)
+
+dnl There doesn't seem to be a straightforward way of having parameters
+dnl that set values, other than fudging the --with thing. So that's what
+dnl I've done.
+
+dnl Handle --with-posix-malloc-threshold=n
+
+AC_ARG_WITH(posix-malloc-threshold,
+[ --with-posix-malloc-threshold=5 threshold for POSIX malloc usage],
+ POSIX_MALLOC_THRESHOLD=-DPOSIX_MALLOC_THRESHOLD=$withval
+)
+
+dnl Handle --with-link-size=n
+
+AC_ARG_WITH(link-size,
+[ --with-link-size=2 internal link size (2, 3, or 4 allowed)],
+ LINK_SIZE=-DLINK_SIZE=$withval
+)
+
+dnl Handle --with-match_limit=n
+
+AC_ARG_WITH(match-limit,
+[ --with-match-limit=10000000 default limit on internal looping)],
+ MATCH_LIMIT=-DMATCH_LIMIT=$withval
+)
+
+dnl Unicode character property support implies UTF-8 support
+
+if test "$UCP" != "" ; then
+ UTF8=-DSUPPORT_UTF8
+fi
+
+dnl "Export" these variables
+
+AC_SUBST(BUILD_EXEEXT)
+AC_SUBST(BUILD_OBJEXT)
+AC_SUBST(CC_FOR_BUILD)
+AC_SUBST(CFLAGS_FOR_BUILD)
+AC_SUBST(EBCDIC)
+AC_SUBST(HAVE_MEMMOVE)
+AC_SUBST(HAVE_STRERROR)
+AC_SUBST(LIBTOOL)
+AC_SUBST(LIBSUFFIX)
+AC_SUBST(LINK_SIZE)
+AC_SUBST(MATCH_LIMIT)
+AC_SUBST(NEWLINE)
+AC_SUBST(NO_RECURSE)
+AC_SUBST(PCRE_MAJOR)
+AC_SUBST(PCRE_MINOR)
+AC_SUBST(PCRE_DATE)
+AC_SUBST(PCRE_VERSION)
+AC_SUBST(PCRE_LIB_VERSION)
+AC_SUBST(PCRE_POSIXLIB_VERSION)
+AC_SUBST(POSIX_MALLOC_THRESHOLD)
+AC_SUBST(UCP)
+AC_SUBST(UTF8)
+
+
+if test "x$enable_shared" = "xno" ; then
+ AC_DEFINE([PCRE_STATIC],[1],[to link statically])
+fi
+
+dnl This must be last; it determines what files are written as well as config.h
+AC_OUTPUT(Makefile pcre.h:pcre.in pcre-config,[chmod a+x pcre-config])
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/dftables.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/dftables.c
new file mode 100644
index 00000000..8458c60f
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/dftables.c
@@ -0,0 +1,173 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/*
+PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+Written by: Philip Hazel <ph10@cam.ac.uk>
+
+ Copyright (c) 1997-2004 University of Cambridge
+
+-----------------------------------------------------------------------------
+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.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This is a support program to generate the file chartables.c, containing
+character tables of various kinds. They are built according to the default C
+locale and used as the default tables by PCRE. Now that pcre_maketables is
+a function visible to the outside world, we make use of its code from here in
+order to be consistent. */
+
+#include <ctype.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "internal.h"
+
+#define DFTABLES /* maketables.c notices this */
+#include "maketables.c"
+
+
+int main(int argc, char **argv)
+{
+int i;
+FILE *f;
+const unsigned char *tables = pcre_maketables();
+
+if (argc != 2)
+ {
+ fprintf(stderr, "dftables: one filename argument is required\n");
+ return 1;
+ }
+
+f = fopen(argv[1], "w");
+if (f == NULL)
+ {
+ fprintf(stderr, "dftables: failed to open %s for writing\n", argv[1]);
+ return 1;
+ }
+
+/* There are two fprintf() calls here, because gcc in pedantic mode complains
+about the very long string otherwise. */
+
+fprintf(f,
+ "/*************************************************\n"
+ "* Perl-Compatible Regular Expressions *\n"
+ "*************************************************/\n\n"
+ "/* This file is automatically written by the dftables auxiliary \n"
+ "program. If you edit it by hand, you might like to edit the Makefile to \n"
+ "prevent its ever being regenerated.\n\n");
+fprintf(f,
+ "This file is #included in the compilation of pcre.c to build the default\n"
+ "character tables which are used when no tables are passed to the compile\n"
+ "function. */\n\n"
+ "static unsigned char pcre_default_tables[] = {\n\n"
+ "/* This table is a lower casing table. */\n\n");
+
+fprintf(f, " ");
+for (i = 0; i < 256; i++)
+ {
+ if ((i & 7) == 0 && i != 0) fprintf(f, "\n ");
+ fprintf(f, "%3d", *tables++);
+ if (i != 255) fprintf(f, ",");
+ }
+fprintf(f, ",\n\n");
+
+fprintf(f, "/* This table is a case flipping table. */\n\n");
+
+fprintf(f, " ");
+for (i = 0; i < 256; i++)
+ {
+ if ((i & 7) == 0 && i != 0) fprintf(f, "\n ");
+ fprintf(f, "%3d", *tables++);
+ if (i != 255) fprintf(f, ",");
+ }
+fprintf(f, ",\n\n");
+
+fprintf(f,
+ "/* This table contains bit maps for various character classes.\n"
+ "Each map is 32 bytes long and the bits run from the least\n"
+ "significant end of each byte. The classes that have their own\n"
+ "maps are: space, xdigit, digit, upper, lower, word, graph\n"
+ "print, punct, and cntrl. Other classes are built from combinations. */\n\n");
+
+fprintf(f, " ");
+for (i = 0; i < cbit_length; i++)
+ {
+ if ((i & 7) == 0 && i != 0)
+ {
+ if ((i & 31) == 0) fprintf(f, "\n");
+ fprintf(f, "\n ");
+ }
+ fprintf(f, "0x%02x", *tables++);
+ if (i != cbit_length - 1) fprintf(f, ",");
+ }
+fprintf(f, ",\n\n");
+
+fprintf(f,
+ "/* This table identifies various classes of character by individual bits:\n"
+ " 0x%02x white space character\n"
+ " 0x%02x letter\n"
+ " 0x%02x decimal digit\n"
+ " 0x%02x hexadecimal digit\n"
+ " 0x%02x alphanumeric or '_'\n"
+ " 0x%02x regular expression metacharacter or binary zero\n*/\n\n",
+ ctype_space, ctype_letter, ctype_digit, ctype_xdigit, ctype_word,
+ ctype_meta);
+
+fprintf(f, " ");
+for (i = 0; i < 256; i++)
+ {
+ if ((i & 7) == 0 && i != 0)
+ {
+ fprintf(f, " /* ");
+ if (isprint(i-8)) fprintf(f, " %c -", i-8);
+ else fprintf(f, "%3d-", i-8);
+ if (isprint(i-1)) fprintf(f, " %c ", i-1);
+ else fprintf(f, "%3d", i-1);
+ fprintf(f, " */\n ");
+ }
+ fprintf(f, "0x%02x", *tables++);
+ if (i != 255) fprintf(f, ",");
+ }
+
+fprintf(f, "};/* ");
+if (isprint(i-8)) fprintf(f, " %c -", i-8);
+ else fprintf(f, "%3d-", i-8);
+if (isprint(i-1)) fprintf(f, " %c ", i-1);
+ else fprintf(f, "%3d", i-1);
+fprintf(f, " */\n\n/* End of chartables.c */\n");
+
+fclose(f);
+return 0;
+}
+
+/* End of dftables.c */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/dftables.dsp b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/dftables.dsp
new file mode 100644
index 00000000..4a67c156
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/dftables.dsp
@@ -0,0 +1,165 @@
+# Microsoft Developer Studio Project File - Name="dftables" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=dftables - 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 "dftables.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 "dftables.mak" CFG="dftables - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "dftables - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "dftables - 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)" == "dftables - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir ""
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir ""
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MD /W3 /O2 /D "_WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Fd"Release\dftables" /FD /c
+# ADD CPP /nologo /MD /W3 /wd4996 /O2 /D "_WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Fd"Release\dftables" /FD /c
+# ADD BASE RSC /l 0x809 /d "NDEBUG"
+# ADD RSC /l 0x809 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib /nologo /subsystem:console /pdb:"Release\dftables.pdb"
+# SUBTRACT BASE LINK32 /pdb:none
+# ADD LINK32 kernel32.lib /nologo /subsystem:console /pdb:"Release\dftables.pdb" /opt:ref
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "dftables - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir ""
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir ""
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "_WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Fd"Debug\dftables" /FD /c
+# ADD CPP /nologo /MDd /W3 /wd4996 /EHsc /Zi /Od /D "_WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Fd"Debug\dftables" /FD /c
+# ADD BASE RSC /l 0x809 /d "_DEBUG"
+# ADD RSC /l 0x809 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib /nologo /subsystem:console /incremental:no /pdb:"Debug\dftables.pdb" /debug /pdbtype:sept
+# SUBTRACT BASE LINK32 /pdb:none
+# ADD LINK32 kernel32.lib /nologo /subsystem:console /incremental:no /pdb:"Debug\dftables.pdb" /debug
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "dftables - Win32 Release"
+# Name "dftables - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=.\dftables.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hw"
+# Begin Source File
+
+SOURCE=.\config.hw
+
+!IF "$(CFG)" == "dftables - Win32 Release"
+
+# Begin Custom Build - Creating pcre config.h from config.hw
+InputPath=.\config.hw
+
+".\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ type .\config.hw > .\config.h
+
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "dftables - Win32 Debug"
+
+# Begin Custom Build - Creating pcre config.h from config.hw
+InputPath=.\config.hw
+
+".\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ type .\config.hw > .\config.h
+
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\internal.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\maketables.c
+# PROP Exclude_From_Build 1
+# End Source File
+# Begin Source File
+
+SOURCE=.\pcre.hw
+
+!IF "$(CFG)" == "dftables - Win32 Release"
+
+# Begin Custom Build - Creating pcre.h from pcre.hw
+InputPath=.\pcre.hw
+
+".\pcre.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ type .\pcre.hw > .\pcre.h
+
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "dftables - Win32 Debug"
+
+# Begin Custom Build - Creating pcre.h from pcre.hw
+InputPath=.\pcre.hw
+
+".\pcre.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ type .\pcre.hw > .\pcre.h
+
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# End Group
+# End Target
+# End Project
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/dftables.x86 b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/dftables.x86
new file mode 100644
index 00000000..d9fd51b7
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/dftables.x86
@@ -0,0 +1,109 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+CPP=cl.exe
+RSC=rc.exe
+OUTDIR=.
+INTDIR=.\Release_x86
+# Begin Custom Macros
+OutDir=.
+# End Custom Macros
+
+ALL : "$(OUTDIR)\dftables.exe"
+
+
+CLEAN :
+ -@erase "$(INTDIR)\dftables.idb"
+ -@erase "$(INTDIR)\dftables.obj"
+ -@erase "$(OUTDIR)\dftables.exe"
+
+"$(INTDIR)" :
+ if not exist "$(INTDIR)/$(NULL)" mkdir "$(INTDIR)"
+
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\dftables.bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+LINK32_FLAGS=kernel32.lib $(EXTRA_LIBS) /nologo /subsystem:console /incremental:no /pdb:"$(OUTDIR)\Release\dftables.pdb" /machine:I386 /out:"$(OUTDIR)\dftables.exe" /opt:ref
+LINK32_OBJS= \
+ "$(INTDIR)\dftables.obj"
+
+"$(OUTDIR)\dftables.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+CPP_PROJ=-nologo -MD -W3 -O2 -Ob2 -Oy- -Zi -EHsc /D "_WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\dftables" /FD /wd4996 /c
+
+.c{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+
+!IF "$(CFG)" == "dftables_x86"
+SOURCE=.\dftables.c
+
+"$(INTDIR)\dftables.obj" : $(SOURCE) "$(INTDIR)" ".\config.h" ".\pcre.h"
+
+
+SOURCE=.\config.hw
+InputPath=.\config.hw
+
+".\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ <<tempfile.bat
+ @echo off
+ type .\config.hw > .\config.h
+<<
+
+SOURCE=.\maketables.c
+SOURCE=.\pcre.hw
+InputPath=.\pcre.hw
+
+".\pcre.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ <<tempfile.bat
+ @echo off
+ type .\pcre.hw > .\pcre.h
+<<
+
+
+!ENDIF
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/dll.mk b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/dll.mk
new file mode 100644
index 00000000..d8b728e5
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/dll.mk
@@ -0,0 +1,60 @@
+# dll.mk - auxilary Makefile to easy build dll's for mingw32 target
+# ver. 0.6 of 1999-03-25
+#
+# Homepage of this makefile - http://www.is.lg.ua/~paul/devel/
+# Homepage of original mingw32 project -
+# http://www.fu.is.saga-u.ac.jp/~colin/gcc.html
+#
+# How to use:
+# This makefile can:
+# 1. Create automatical .def file from list of objects
+# 2. Create .dll from objects and .def file, either automatical, or your
+# hand-written (maybe) file, which must have same basename as dll
+# WARNING! There MUST be object, which name match dll's name. Make sux.
+# 3. Create import library from .def (as for .dll, only its name required,
+# not dll itself)
+# By convention implibs for dll have .dll.a suffix, e.g. libstuff.dll.a
+# Why not just libstuff.a? 'Cos that's name for static lib, ok?
+# Process divided into 3 phases because:
+# 1. Pre-existent .def possible
+# 2. Generating implib is enough time-consuming
+#
+# Variables:
+# DLL_LDLIBS - libs for linking dll
+# DLL_LDFLAGS - flags for linking dll
+#
+# By using $(DLL_SUFFIX) instead of 'dll', e.g. stuff.$(DLL_SUFFIX)
+# you may help porting makefiles to other platforms
+#
+# Put this file in your make's include path (e.g. main include dir, for
+# more information see include section in make doc). Put in the beginning
+# of your own Makefile line "include dll.mk". Specify dependences, e.g.:
+#
+# Do all stuff in one step
+# libstuff.dll.a: $(OBJECTS) stuff.def
+# stuff.def: $(OBJECTS)
+#
+# Steps separated, pre-provided .def, link with user32
+#
+# DLL_LDLIBS=-luser32
+# stuff.dll: $(OBJECTS)
+# libstuff.dll.a: $(OBJECTS)
+
+
+DLLWRAP=dllwrap
+DLLTOOL=dlltool
+
+DLL_SUFFIX=dll
+
+.SUFFIXES: .o .$(DLL_SUFFIX)
+
+_%.def: %.o
+ $(DLLTOOL) --export-all --output-def $@ $^
+
+%.$(DLL_SUFFIX): %.o
+ $(DLLWRAP) --dllname $(notdir $@) --driver-name $(CC) --def $*.def -o $@ $(filter %.o,$^) $(DLL_LDFLAGS) $(DLL_LDLIBS)
+
+lib%.$(DLL_SUFFIX).a:%.def
+ $(DLLTOOL) --dllname $(notdir $*.dll) --def $< --output-lib $@
+
+# End
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/doc/README_httpd b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/doc/README_httpd
new file mode 100644
index 00000000..322c39c4
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/doc/README_httpd
@@ -0,0 +1,6 @@
+The documentation directory has been omitted from this copy of PCRE
+inside the httpd codebase because it's huge--over a megabyte of PCRE docs.
+
+The PCRE documentation directory is available in unmodified form in the
+vendor branch. You can access it via web browser or Subversion checkout at
+http://svn.apache.org/repos/asf/httpd/httpd/vendor/pcre/current/doc/
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/get.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/get.c
new file mode 100644
index 00000000..225843e2
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/get.c
@@ -0,0 +1,357 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/*
+This is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language. See
+the file Tech.Notes for some information on the internals.
+
+Written by: Philip Hazel <ph10@cam.ac.uk>
+
+ Copyright (c) 1997-2003 University of Cambridge
+
+-----------------------------------------------------------------------------
+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.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+-----------------------------------------------------------------------------
+*/
+
+/* This module contains some convenience functions for extracting substrings
+from the subject string after a regex match has succeeded. The original idea
+for these functions came from Scott Wimer. */
+
+
+/* Include the internals header, which itself includes Standard C headers plus
+the external pcre header. */
+
+#include "internal.h"
+
+
+/*************************************************
+* Find number for named string *
+*************************************************/
+
+/* This function is used by the two extraction functions below, as well
+as being generally available.
+
+Arguments:
+ code the compiled regex
+ stringname the name whose number is required
+
+Returns: the number of the named parentheses, or a negative number
+ (PCRE_ERROR_NOSUBSTRING) if not found
+*/
+
+int
+pcre_get_stringnumber(const pcre *code, const char *stringname)
+{
+int rc;
+int entrysize;
+int top, bot;
+uschar *nametable;
+
+if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0)
+ return rc;
+if (top <= 0) return PCRE_ERROR_NOSUBSTRING;
+
+if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0)
+ return rc;
+if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0)
+ return rc;
+
+bot = 0;
+while (top > bot)
+ {
+ int mid = (top + bot) / 2;
+ uschar *entry = nametable + entrysize*mid;
+ int c = strcmp(stringname, (char *)(entry + 2));
+ if (c == 0) return (entry[0] << 8) + entry[1];
+ if (c > 0) bot = mid + 1; else top = mid;
+ }
+
+return PCRE_ERROR_NOSUBSTRING;
+}
+
+
+
+/*************************************************
+* Copy captured string to given buffer *
+*************************************************/
+
+/* This function copies a single captured substring into a given buffer.
+Note that we use memcpy() rather than strncpy() in case there are binary zeros
+in the string.
+
+Arguments:
+ subject the subject string that was matched
+ ovector pointer to the offsets table
+ stringcount the number of substrings that were captured
+ (i.e. the yield of the pcre_exec call, unless
+ that was zero, in which case it should be 1/3
+ of the offset table size)
+ stringnumber the number of the required substring
+ buffer where to put the substring
+ size the size of the buffer
+
+Returns: if successful:
+ the length of the copied string, not including the zero
+ that is put on the end; can be zero
+ if not successful:
+ PCRE_ERROR_NOMEMORY (-6) buffer too small
+ PCRE_ERROR_NOSUBSTRING (-7) no such captured substring
+*/
+
+int
+pcre_copy_substring(const char *subject, int *ovector, int stringcount,
+ int stringnumber, char *buffer, int size)
+{
+int yield;
+if (stringnumber < 0 || stringnumber >= stringcount)
+ return PCRE_ERROR_NOSUBSTRING;
+stringnumber *= 2;
+yield = ovector[stringnumber+1] - ovector[stringnumber];
+if (size < yield + 1) return PCRE_ERROR_NOMEMORY;
+memcpy(buffer, subject + ovector[stringnumber], yield);
+buffer[yield] = 0;
+return yield;
+}
+
+
+
+/*************************************************
+* Copy named captured string to given buffer *
+*************************************************/
+
+/* This function copies a single captured substring into a given buffer,
+identifying it by name.
+
+Arguments:
+ code the compiled regex
+ subject the subject string that was matched
+ ovector pointer to the offsets table
+ stringcount the number of substrings that were captured
+ (i.e. the yield of the pcre_exec call, unless
+ that was zero, in which case it should be 1/3
+ of the offset table size)
+ stringname the name of the required substring
+ buffer where to put the substring
+ size the size of the buffer
+
+Returns: if successful:
+ the length of the copied string, not including the zero
+ that is put on the end; can be zero
+ if not successful:
+ PCRE_ERROR_NOMEMORY (-6) buffer too small
+ PCRE_ERROR_NOSUBSTRING (-7) no such captured substring
+*/
+
+int
+pcre_copy_named_substring(const pcre *code, const char *subject, int *ovector,
+ int stringcount, const char *stringname, char *buffer, int size)
+{
+int n = pcre_get_stringnumber(code, stringname);
+if (n <= 0) return n;
+return pcre_copy_substring(subject, ovector, stringcount, n, buffer, size);
+}
+
+
+
+/*************************************************
+* Copy all captured strings to new store *
+*************************************************/
+
+/* This function gets one chunk of store and builds a list of pointers and all
+of the captured substrings in it. A NULL pointer is put on the end of the list.
+
+Arguments:
+ subject the subject string that was matched
+ ovector pointer to the offsets table
+ stringcount the number of substrings that were captured
+ (i.e. the yield of the pcre_exec call, unless
+ that was zero, in which case it should be 1/3
+ of the offset table size)
+ listptr set to point to the list of pointers
+
+Returns: if successful: 0
+ if not successful:
+ PCRE_ERROR_NOMEMORY (-6) failed to get store
+*/
+
+int
+pcre_get_substring_list(const char *subject, int *ovector, int stringcount,
+ const char ***listptr)
+{
+int i;
+int size = sizeof(char *);
+int double_count = stringcount * 2;
+char **stringlist;
+char *p;
+
+for (i = 0; i < double_count; i += 2)
+ size += sizeof(char *) + ovector[i+1] - ovector[i] + 1;
+
+stringlist = (char **)(pcre_malloc)(size);
+if (stringlist == NULL) return PCRE_ERROR_NOMEMORY;
+
+*listptr = (const char **)stringlist;
+p = (char *)(stringlist + stringcount + 1);
+
+for (i = 0; i < double_count; i += 2)
+ {
+ int len = ovector[i+1] - ovector[i];
+ memcpy(p, subject + ovector[i], len);
+ *stringlist++ = p;
+ p += len;
+ *p++ = 0;
+ }
+
+*stringlist = NULL;
+return 0;
+}
+
+
+
+/*************************************************
+* Free store obtained by get_substring_list *
+*************************************************/
+
+/* This function exists for the benefit of people calling PCRE from non-C
+programs that can call its functions, but not free() or (pcre_free)() directly.
+
+Argument: the result of a previous pcre_get_substring_list()
+Returns: nothing
+*/
+
+void
+pcre_free_substring_list(const char **pointer)
+{
+(pcre_free)((void *)pointer);
+}
+
+
+
+/*************************************************
+* Copy captured string to new store *
+*************************************************/
+
+/* This function copies a single captured substring into a piece of new
+store
+
+Arguments:
+ subject the subject string that was matched
+ ovector pointer to the offsets table
+ stringcount the number of substrings that were captured
+ (i.e. the yield of the pcre_exec call, unless
+ that was zero, in which case it should be 1/3
+ of the offset table size)
+ stringnumber the number of the required substring
+ stringptr where to put a pointer to the substring
+
+Returns: if successful:
+ the length of the string, not including the zero that
+ is put on the end; can be zero
+ if not successful:
+ PCRE_ERROR_NOMEMORY (-6) failed to get store
+ PCRE_ERROR_NOSUBSTRING (-7) substring not present
+*/
+
+int
+pcre_get_substring(const char *subject, int *ovector, int stringcount,
+ int stringnumber, const char **stringptr)
+{
+int yield;
+char *substring;
+if (stringnumber < 0 || stringnumber >= stringcount)
+ return PCRE_ERROR_NOSUBSTRING;
+stringnumber *= 2;
+yield = ovector[stringnumber+1] - ovector[stringnumber];
+substring = (char *)(pcre_malloc)(yield + 1);
+if (substring == NULL) return PCRE_ERROR_NOMEMORY;
+memcpy(substring, subject + ovector[stringnumber], yield);
+substring[yield] = 0;
+*stringptr = substring;
+return yield;
+}
+
+
+
+/*************************************************
+* Copy named captured string to new store *
+*************************************************/
+
+/* This function copies a single captured substring, identified by name, into
+new store.
+
+Arguments:
+ code the compiled regex
+ subject the subject string that was matched
+ ovector pointer to the offsets table
+ stringcount the number of substrings that were captured
+ (i.e. the yield of the pcre_exec call, unless
+ that was zero, in which case it should be 1/3
+ of the offset table size)
+ stringname the name of the required substring
+ stringptr where to put the pointer
+
+Returns: if successful:
+ the length of the copied string, not including the zero
+ that is put on the end; can be zero
+ if not successful:
+ PCRE_ERROR_NOMEMORY (-6) couldn't get memory
+ PCRE_ERROR_NOSUBSTRING (-7) no such captured substring
+*/
+
+int
+pcre_get_named_substring(const pcre *code, const char *subject, int *ovector,
+ int stringcount, const char *stringname, const char **stringptr)
+{
+int n = pcre_get_stringnumber(code, stringname);
+if (n <= 0) return n;
+return pcre_get_substring(subject, ovector, stringcount, n, stringptr);
+}
+
+
+
+
+/*************************************************
+* Free store obtained by get_substring *
+*************************************************/
+
+/* This function exists for the benefit of people calling PCRE from non-C
+programs that can call its functions, but not free() or (pcre_free)() directly.
+
+Argument: the result of a previous pcre_get_substring()
+Returns: nothing
+*/
+
+void
+pcre_free_substring(const char *pointer)
+{
+(pcre_free)((void *)pointer);
+}
+
+/* End of get.c */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/install-sh b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/install-sh
new file mode 100755
index 00000000..e9de2384
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/install-sh
@@ -0,0 +1,251 @@
+#!/bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5 (mit/util/scripts/install.sh).
+#
+# Copyright 1991 by the Massachusetts Institute of Technology
+#
+# 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, and that the name of M.I.T. not be used in advertising or
+# publicity pertaining to distribution of the software without specific,
+# written prior permission. M.I.T. makes no representations about the
+# suitability of this software for any purpose. It is provided "as is"
+# without express or implied warranty.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch. It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+ case $1 in
+ -c) instcmd="$cpprog"
+ shift
+ continue;;
+
+ -d) dir_arg=true
+ shift
+ continue;;
+
+ -m) chmodcmd="$chmodprog $2"
+ shift
+ shift
+ continue;;
+
+ -o) chowncmd="$chownprog $2"
+ shift
+ shift
+ continue;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift
+ shift
+ continue;;
+
+ -s) stripcmd="$stripprog"
+ shift
+ continue;;
+
+ -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+ shift
+ continue;;
+
+ -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+ shift
+ continue;;
+
+ *) if [ x"$src" = x ]
+ then
+ src=$1
+ else
+ # this colon is to work around a 386BSD /bin/sh bug
+ :
+ dst=$1
+ fi
+ shift
+ continue;;
+ esac
+done
+
+if [ x"$src" = x ]
+then
+ echo "install: no input file specified"
+ exit 1
+else
+ true
+fi
+
+if [ x"$dir_arg" != x ]; then
+ dst=$src
+ src=""
+
+ if [ -d $dst ]; then
+ instcmd=:
+ chmodcmd=""
+ else
+ instcmd=mkdir
+ fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad
+# if $src (and thus $dsttmp) contains '*'.
+
+ if [ -f $src -o -d $src ]
+ then
+ true
+ else
+ echo "install: $src does not exist"
+ exit 1
+ fi
+
+ if [ x"$dst" = x ]
+ then
+ echo "install: no destination specified"
+ exit 1
+ else
+ true
+ fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+ if [ -d $dst ]
+ then
+ dst="$dst"/`basename $src`
+ else
+ true
+ fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+# this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+ pathcomp="${pathcomp}${1}"
+ shift
+
+ if [ ! -d "${pathcomp}" ] ;
+ then
+ $mkdirprog "${pathcomp}"
+ else
+ true
+ fi
+
+ pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+ $doit $instcmd $dst &&
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+ if [ x"$transformarg" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ dstfile=`basename $dst $transformbasename |
+ sed $transformarg`$transformbasename
+ fi
+
+# don't allow the sed command to completely eliminate the filename
+
+ if [ x"$dstfile" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ true
+ fi
+
+# Make a temp file name in the proper directory.
+
+ dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+ $doit $instcmd $src $dsttmp &&
+
+ trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing. If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+ $doit $rmcmd -f $dstdir/$dstfile &&
+ $doit $mvcmd $dsttmp $dstdir/$dstfile
+
+fi &&
+
+
+exit 0
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/internal.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/internal.h
new file mode 100644
index 00000000..5d143317
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/internal.h
@@ -0,0 +1,752 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+
+/* This is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language. See
+the file doc/Tech.Notes for some information on the internals.
+
+Written by: Philip Hazel <ph10@cam.ac.uk>
+
+ Copyright (c) 1997-2004 University of Cambridge
+
+-----------------------------------------------------------------------------
+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.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+-----------------------------------------------------------------------------
+*/
+
+/* This header contains definitions that are shared between the different
+modules, but which are not relevant to the outside. */
+
+/* Get the definitions provided by running "configure" */
+
+#include "config.h"
+
+/* Standard C headers plus the external interface definition. The only time
+setjmp and stdarg are used is when NO_RECURSE is set. */
+
+#include <ctype.h>
+#include <limits.h>
+#include <setjmp.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifndef PCRE_SPY
+#define PCRE_DEFINITION /* Win32 __declspec(export) trigger for .dll */
+#endif
+
+/* We need to have types that specify unsigned 16-bit and 32-bit integers. We
+cannot determine these outside the compilation (e.g. by running a program as
+part of "configure") because PCRE is often cross-compiled for use on other
+systems. Instead we make use of the maximum sizes that are available at
+preprocessor time in standard C environments. */
+
+#if USHRT_MAX == 65535
+ typedef unsigned short pcre_uint16;
+#elif UINT_MAX == 65535
+ typedef unsigned int pcre_uint16;
+#else
+ #error Cannot determine a type for 16-bit unsigned integers
+#endif
+
+#if UINT_MAX == 4294967295
+ typedef unsigned int pcre_uint32;
+#elif ULONG_MAX == 4294967295
+ typedef unsigned long int pcre_uint32;
+#else
+ #error Cannot determine a type for 32-bit unsigned integers
+#endif
+
+/* All character handling must be done as unsigned characters. Otherwise there
+are problems with top-bit-set characters and functions such as isspace().
+However, we leave the interface to the outside world as char *, because that
+should make things easier for callers. We define a short type for unsigned char
+to save lots of typing. I tried "uchar", but it causes problems on Digital
+Unix, where it is defined in sys/types, so use "uschar" instead. */
+
+typedef unsigned char uschar;
+
+/* Include the public PCRE header */
+
+#include "pcre.h"
+
+/* When compiling for use with the Virtual Pascal compiler, these functions
+need to have their names changed. PCRE must be compiled with the -DVPCOMPAT
+option on the command line. */
+
+#ifdef VPCOMPAT
+#define strncmp(s1,s2,m) _strncmp(s1,s2,m)
+#define memcpy(d,s,n) _memcpy(d,s,n)
+#define memmove(d,s,n) _memmove(d,s,n)
+#define memset(s,c,n) _memset(s,c,n)
+#else /* VPCOMPAT */
+
+/* To cope with SunOS4 and other systems that lack memmove() but have bcopy(),
+define a macro for memmove() if HAVE_MEMMOVE is false, provided that HAVE_BCOPY
+is set. Otherwise, include an emulating function for those systems that have
+neither (there some non-Unix environments where this is the case). This assumes
+that all calls to memmove are moving strings upwards in store, which is the
+case in PCRE. */
+
+#if ! HAVE_MEMMOVE
+#undef memmove /* some systems may have a macro */
+#if HAVE_BCOPY
+#define memmove(a, b, c) bcopy(b, a, c)
+#else /* HAVE_BCOPY */
+void *
+pcre_memmove(unsigned char *dest, const unsigned char *src, size_t n)
+{
+int i;
+dest += n;
+src += n;
+for (i = 0; i < n; ++i) *(--dest) = *(--src);
+}
+#define memmove(a, b, c) pcre_memmove(a, b, c)
+#endif /* not HAVE_BCOPY */
+#endif /* not HAVE_MEMMOVE */
+#endif /* not VPCOMPAT */
+
+
+/* PCRE keeps offsets in its compiled code as 2-byte quantities (always stored
+in big-endian order) by default. These are used, for example, to link from the
+start of a subpattern to its alternatives and its end. The use of 2 bytes per
+offset limits the size of the compiled regex to around 64K, which is big enough
+for almost everybody. However, I received a request for an even bigger limit.
+For this reason, and also to make the code easier to maintain, the storing and
+loading of offsets from the byte string is now handled by the macros that are
+defined here.
+
+The macros are controlled by the value of LINK_SIZE. This defaults to 2 in
+the config.h file, but can be overridden by using -D on the command line. This
+is automated on Unix systems via the "configure" command. */
+
+#if LINK_SIZE == 2
+
+#define PUT(a,n,d) \
+ (a[n] = (d) >> 8), \
+ (a[(n)+1] = (d) & 255)
+
+#define GET(a,n) \
+ (((a)[n] << 8) | (a)[(n)+1])
+
+#define MAX_PATTERN_SIZE (1 << 16)
+
+
+#elif LINK_SIZE == 3
+
+#define PUT(a,n,d) \
+ (a[n] = (d) >> 16), \
+ (a[(n)+1] = (d) >> 8), \
+ (a[(n)+2] = (d) & 255)
+
+#define GET(a,n) \
+ (((a)[n] << 16) | ((a)[(n)+1] << 8) | (a)[(n)+2])
+
+#define MAX_PATTERN_SIZE (1 << 24)
+
+
+#elif LINK_SIZE == 4
+
+#define PUT(a,n,d) \
+ (a[n] = (d) >> 24), \
+ (a[(n)+1] = (d) >> 16), \
+ (a[(n)+2] = (d) >> 8), \
+ (a[(n)+3] = (d) & 255)
+
+#define GET(a,n) \
+ (((a)[n] << 24) | ((a)[(n)+1] << 16) | ((a)[(n)+2] << 8) | (a)[(n)+3])
+
+#define MAX_PATTERN_SIZE (1 << 30) /* Keep it positive */
+
+
+#else
+#error LINK_SIZE must be either 2, 3, or 4
+#endif
+
+
+/* Convenience macro defined in terms of the others */
+
+#define PUTINC(a,n,d) PUT(a,n,d), a += LINK_SIZE
+
+
+/* PCRE uses some other 2-byte quantities that do not change when the size of
+offsets changes. There are used for repeat counts and for other things such as
+capturing parenthesis numbers in back references. */
+
+#define PUT2(a,n,d) \
+ a[n] = (d) >> 8; \
+ a[(n)+1] = (d) & 255
+
+#define GET2(a,n) \
+ (((a)[n] << 8) | (a)[(n)+1])
+
+#define PUT2INC(a,n,d) PUT2(a,n,d), a += 2
+
+
+/* In case there is no definition of offsetof() provided - though any proper
+Standard C system should have one. */
+
+#ifndef offsetof
+#define offsetof(p_type,field) ((size_t)&(((p_type *)0)->field))
+#endif
+
+
+/* These are the public options that can change during matching. */
+
+#define PCRE_IMS (PCRE_CASELESS|PCRE_MULTILINE|PCRE_DOTALL)
+
+/* Private options flags start at the most significant end of the four bytes,
+but skip the top bit so we can use ints for convenience without getting tangled
+with negative values. The public options defined in pcre.h start at the least
+significant end. Make sure they don't overlap, though now that we have expanded
+to four bytes, there is plenty of space. */
+
+#define PCRE_FIRSTSET 0x40000000 /* first_byte is set */
+#define PCRE_REQCHSET 0x20000000 /* req_byte is set */
+#define PCRE_STARTLINE 0x10000000 /* start after \n for multiline */
+#define PCRE_ICHANGED 0x08000000 /* i option changes within regex */
+#define PCRE_NOPARTIAL 0x04000000 /* can't use partial with this regex */
+
+/* Options for the "extra" block produced by pcre_study(). */
+
+#define PCRE_STUDY_MAPPED 0x01 /* a map of starting chars exists */
+
+/* Masks for identifying the public options which are permitted at compile
+time, run time or study time, respectively. */
+
+#define PUBLIC_OPTIONS \
+ (PCRE_CASELESS|PCRE_EXTENDED|PCRE_ANCHORED|PCRE_MULTILINE| \
+ PCRE_DOTALL|PCRE_DOLLAR_ENDONLY|PCRE_EXTRA|PCRE_UNGREEDY|PCRE_UTF8| \
+ PCRE_NO_AUTO_CAPTURE|PCRE_NO_UTF8_CHECK|PCRE_AUTO_CALLOUT)
+
+#define PUBLIC_EXEC_OPTIONS \
+ (PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY|PCRE_NO_UTF8_CHECK| \
+ PCRE_PARTIAL)
+
+#define PUBLIC_STUDY_OPTIONS 0 /* None defined */
+
+/* Magic number to provide a small check against being handed junk. */
+
+#define MAGIC_NUMBER 0x50435245UL /* 'PCRE' */
+
+/* Negative values for the firstchar and reqchar variables */
+
+#define REQ_UNSET (-2)
+#define REQ_NONE (-1)
+
+/* Flags added to firstbyte or reqbyte; a "non-literal" item is either a
+variable-length repeat, or a anything other than literal characters. */
+
+#define REQ_CASELESS 0x0100 /* indicates caselessness */
+#define REQ_VARY 0x0200 /* reqbyte followed non-literal item */
+
+/* Miscellaneous definitions */
+
+typedef int BOOL;
+
+#define FALSE 0
+#define TRUE 1
+
+/* Escape items that are just an encoding of a particular data value. Note that
+ESC_n is defined as yet another macro, which is set in config.h to either \n
+(the default) or \r (which some people want). */
+
+#ifndef ESC_e
+#define ESC_e 27
+#endif
+
+#ifndef ESC_f
+#define ESC_f '\f'
+#endif
+
+#ifndef ESC_n
+#define ESC_n NEWLINE
+#endif
+
+#ifndef ESC_r
+#define ESC_r '\r'
+#endif
+
+/* We can't officially use ESC_t because it is a POSIX reserved identifier
+(presumably because of all the others like size_t). */
+
+#ifndef ESC_tee
+#define ESC_tee '\t'
+#endif
+
+/* These are escaped items that aren't just an encoding of a particular data
+value such as \n. They must have non-zero values, as check_escape() returns
+their negation. Also, they must appear in the same order as in the opcode
+definitions below, up to ESC_z. There's a dummy for OP_ANY because it
+corresponds to "." rather than an escape sequence. The final one must be
+ESC_REF as subsequent values are used for \1, \2, \3, etc. There is are two
+tests in the code for an escape greater than ESC_b and less than ESC_Z to
+detect the types that may be repeated. These are the types that consume
+characters. If any new escapes are put in between that don't consume a
+character, that code will have to change. */
+
+enum { ESC_A = 1, ESC_G, ESC_B, ESC_b, ESC_D, ESC_d, ESC_S, ESC_s, ESC_W,
+ ESC_w, ESC_dum1, ESC_C, ESC_P, ESC_p, ESC_X, ESC_Z, ESC_z, ESC_E,
+ ESC_Q, ESC_REF };
+
+/* Flag bits and data types for the extended class (OP_XCLASS) for classes that
+contain UTF-8 characters with values greater than 255. */
+
+#define XCL_NOT 0x01 /* Flag: this is a negative class */
+#define XCL_MAP 0x02 /* Flag: a 32-byte map is present */
+
+#define XCL_END 0 /* Marks end of individual items */
+#define XCL_SINGLE 1 /* Single item (one multibyte char) follows */
+#define XCL_RANGE 2 /* A range (two multibyte chars) follows */
+#define XCL_PROP 3 /* Unicode property (one property code) follows */
+#define XCL_NOTPROP 4 /* Unicode inverted property (ditto) */
+
+
+/* Opcode table: OP_BRA must be last, as all values >= it are used for brackets
+that extract substrings. Starting from 1 (i.e. after OP_END), the values up to
+OP_EOD must correspond in order to the list of escapes immediately above.
+Note that whenever this list is updated, the two macro definitions that follow
+must also be updated to match. */
+
+enum {
+ OP_END, /* 0 End of pattern */
+
+ /* Values corresponding to backslashed metacharacters */
+
+ OP_SOD, /* 1 Start of data: \A */
+ OP_SOM, /* 2 Start of match (subject + offset): \G */
+ OP_NOT_WORD_BOUNDARY, /* 3 \B */
+ OP_WORD_BOUNDARY, /* 4 \b */
+ OP_NOT_DIGIT, /* 5 \D */
+ OP_DIGIT, /* 6 \d */
+ OP_NOT_WHITESPACE, /* 7 \S */
+ OP_WHITESPACE, /* 8 \s */
+ OP_NOT_WORDCHAR, /* 9 \W */
+ OP_WORDCHAR, /* 10 \w */
+ OP_ANY, /* 11 Match any character */
+ OP_ANYBYTE, /* 12 Match any byte (\C); different to OP_ANY for UTF-8 */
+ OP_NOTPROP, /* 13 \P (not Unicode property) */
+ OP_PROP, /* 14 \p (Unicode property) */
+ OP_EXTUNI, /* 15 \X (extended Unicode sequence */
+ OP_EODN, /* 16 End of data or \n at end of data: \Z. */
+ OP_EOD, /* 17 End of data: \z */
+
+ OP_OPT, /* 18 Set runtime options */
+ OP_CIRC, /* 19 Start of line - varies with multiline switch */
+ OP_DOLL, /* 20 End of line - varies with multiline switch */
+ OP_CHAR, /* 21 Match one character, casefully */
+ OP_CHARNC, /* 22 Match one character, caselessly */
+ OP_NOT, /* 23 Match anything but the following char */
+
+ OP_STAR, /* 24 The maximizing and minimizing versions of */
+ OP_MINSTAR, /* 25 all these opcodes must come in pairs, with */
+ OP_PLUS, /* 26 the minimizing one second. */
+ OP_MINPLUS, /* 27 This first set applies to single characters */
+ OP_QUERY, /* 28 */
+ OP_MINQUERY, /* 29 */
+ OP_UPTO, /* 30 From 0 to n matches */
+ OP_MINUPTO, /* 31 */
+ OP_EXACT, /* 32 Exactly n matches */
+
+ OP_NOTSTAR, /* 33 The maximizing and minimizing versions of */
+ OP_NOTMINSTAR, /* 34 all these opcodes must come in pairs, with */
+ OP_NOTPLUS, /* 35 the minimizing one second. */
+ OP_NOTMINPLUS, /* 36 This set applies to "not" single characters */
+ OP_NOTQUERY, /* 37 */
+ OP_NOTMINQUERY, /* 38 */
+ OP_NOTUPTO, /* 39 From 0 to n matches */
+ OP_NOTMINUPTO, /* 40 */
+ OP_NOTEXACT, /* 41 Exactly n matches */
+
+ OP_TYPESTAR, /* 42 The maximizing and minimizing versions of */
+ OP_TYPEMINSTAR, /* 43 all these opcodes must come in pairs, with */
+ OP_TYPEPLUS, /* 44 the minimizing one second. These codes must */
+ OP_TYPEMINPLUS, /* 45 be in exactly the same order as those above. */
+ OP_TYPEQUERY, /* 46 This set applies to character types such as \d */
+ OP_TYPEMINQUERY, /* 47 */
+ OP_TYPEUPTO, /* 48 From 0 to n matches */
+ OP_TYPEMINUPTO, /* 49 */
+ OP_TYPEEXACT, /* 50 Exactly n matches */
+
+ OP_CRSTAR, /* 51 The maximizing and minimizing versions of */
+ OP_CRMINSTAR, /* 52 all these opcodes must come in pairs, with */
+ OP_CRPLUS, /* 53 the minimizing one second. These codes must */
+ OP_CRMINPLUS, /* 54 be in exactly the same order as those above. */
+ OP_CRQUERY, /* 55 These are for character classes and back refs */
+ OP_CRMINQUERY, /* 56 */
+ OP_CRRANGE, /* 57 These are different to the three sets above. */
+ OP_CRMINRANGE, /* 58 */
+
+ OP_CLASS, /* 59 Match a character class, chars < 256 only */
+ OP_NCLASS, /* 60 Same, but the bitmap was created from a negative
+ class - the difference is relevant only when a UTF-8
+ character > 255 is encountered. */
+
+ OP_XCLASS, /* 61 Extended class for handling UTF-8 chars within the
+ class. This does both positive and negative. */
+
+ OP_REF, /* 62 Match a back reference */
+ OP_RECURSE, /* 63 Match a numbered subpattern (possibly recursive) */
+ OP_CALLOUT, /* 64 Call out to external function if provided */
+
+ OP_ALT, /* 65 Start of alternation */
+ OP_KET, /* 66 End of group that doesn't have an unbounded repeat */
+ OP_KETRMAX, /* 67 These two must remain together and in this */
+ OP_KETRMIN, /* 68 order. They are for groups the repeat for ever. */
+
+ /* The assertions must come before ONCE and COND */
+
+ OP_ASSERT, /* 69 Positive lookahead */
+ OP_ASSERT_NOT, /* 70 Negative lookahead */
+ OP_ASSERTBACK, /* 71 Positive lookbehind */
+ OP_ASSERTBACK_NOT, /* 72 Negative lookbehind */
+ OP_REVERSE, /* 73 Move pointer back - used in lookbehind assertions */
+
+ /* ONCE and COND must come after the assertions, with ONCE first, as there's
+ a test for >= ONCE for a subpattern that isn't an assertion. */
+
+ OP_ONCE, /* 74 Once matched, don't back up into the subpattern */
+ OP_COND, /* 75 Conditional group */
+ OP_CREF, /* 76 Used to hold an extraction string number (cond ref) */
+
+ OP_BRAZERO, /* 77 These two must remain together and in this */
+ OP_BRAMINZERO, /* 78 order. */
+
+ OP_BRANUMBER, /* 79 Used for extracting brackets whose number is greater
+ than can fit into an opcode. */
+
+ OP_BRA /* 80 This and greater values are used for brackets that
+ extract substrings up to EXTRACT_BASIC_MAX. After
+ that, use is made of OP_BRANUMBER. */
+};
+
+/* WARNING WARNING WARNING: There is an implicit assumption in pcre.c and
+study.c that all opcodes are less than 128 in value. This makes handling UTF-8
+character sequences easier. */
+
+/* The highest extraction number before we have to start using additional
+bytes. (Originally PCRE didn't have support for extraction counts highter than
+this number.) The value is limited by the number of opcodes left after OP_BRA,
+i.e. 255 - OP_BRA. We actually set it a bit lower to leave room for additional
+opcodes. */
+
+#define EXTRACT_BASIC_MAX 100
+
+
+/* This macro defines textual names for all the opcodes. There are used only
+for debugging, in pcre.c when DEBUG is defined, and also in pcretest.c. The
+macro is referenced only in printint.c. */
+
+#define OP_NAME_LIST \
+ "End", "\\A", "\\G", "\\B", "\\b", "\\D", "\\d", \
+ "\\S", "\\s", "\\W", "\\w", "Any", "Anybyte", \
+ "notprop", "prop", "extuni", \
+ "\\Z", "\\z", \
+ "Opt", "^", "$", "char", "charnc", "not", \
+ "*", "*?", "+", "+?", "?", "??", "{", "{", "{", \
+ "*", "*?", "+", "+?", "?", "??", "{", "{", "{", \
+ "*", "*?", "+", "+?", "?", "??", "{", "{", "{", \
+ "*", "*?", "+", "+?", "?", "??", "{", "{", \
+ "class", "nclass", "xclass", "Ref", "Recurse", "Callout", \
+ "Alt", "Ket", "KetRmax", "KetRmin", "Assert", "Assert not", \
+ "AssertB", "AssertB not", "Reverse", "Once", "Cond", "Cond ref",\
+ "Brazero", "Braminzero", "Branumber", "Bra"
+
+
+/* This macro defines the length of fixed length operations in the compiled
+regex. The lengths are used when searching for specific things, and also in the
+debugging printing of a compiled regex. We use a macro so that it can be
+incorporated both into pcre.c and pcretest.c without being publicly exposed.
+
+As things have been extended, some of these are no longer fixed lenths, but are
+minima instead. For example, the length of a single-character repeat may vary
+in UTF-8 mode. The code that uses this table must know about such things. */
+
+#define OP_LENGTHS \
+ 1, /* End */ \
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* \A, \G, \B, \B, \D, \d, \S, \s, \W, \w */ \
+ 1, 1, /* Any, Anybyte */ \
+ 2, 2, 1, /* NOTPROP, PROP, EXTUNI */ \
+ 1, 1, 2, 1, 1, /* \Z, \z, Opt, ^, $ */ \
+ 2, /* Char - the minimum length */ \
+ 2, /* Charnc - the minimum length */ \
+ 2, /* not */ \
+ /* Positive single-char repeats ** These are */ \
+ 2, 2, 2, 2, 2, 2, /* *, *?, +, +?, ?, ?? ** minima in */ \
+ 4, 4, 4, /* upto, minupto, exact ** UTF-8 mode */ \
+ /* Negative single-char repeats - only for chars < 256 */ \
+ 2, 2, 2, 2, 2, 2, /* NOT *, *?, +, +?, ?, ?? */ \
+ 4, 4, 4, /* NOT upto, minupto, exact */ \
+ /* Positive type repeats */ \
+ 2, 2, 2, 2, 2, 2, /* Type *, *?, +, +?, ?, ?? */ \
+ 4, 4, 4, /* Type upto, minupto, exact */ \
+ /* Character class & ref repeats */ \
+ 1, 1, 1, 1, 1, 1, /* *, *?, +, +?, ?, ?? */ \
+ 5, 5, /* CRRANGE, CRMINRANGE */ \
+ 33, /* CLASS */ \
+ 33, /* NCLASS */ \
+ 0, /* XCLASS - variable length */ \
+ 3, /* REF */ \
+ 1+LINK_SIZE, /* RECURSE */ \
+ 2+2*LINK_SIZE, /* CALLOUT */ \
+ 1+LINK_SIZE, /* Alt */ \
+ 1+LINK_SIZE, /* Ket */ \
+ 1+LINK_SIZE, /* KetRmax */ \
+ 1+LINK_SIZE, /* KetRmin */ \
+ 1+LINK_SIZE, /* Assert */ \
+ 1+LINK_SIZE, /* Assert not */ \
+ 1+LINK_SIZE, /* Assert behind */ \
+ 1+LINK_SIZE, /* Assert behind not */ \
+ 1+LINK_SIZE, /* Reverse */ \
+ 1+LINK_SIZE, /* Once */ \
+ 1+LINK_SIZE, /* COND */ \
+ 3, /* CREF */ \
+ 1, 1, /* BRAZERO, BRAMINZERO */ \
+ 3, /* BRANUMBER */ \
+ 1+LINK_SIZE /* BRA */ \
+
+
+/* A magic value for OP_CREF to indicate the "in recursion" condition. */
+
+#define CREF_RECURSE 0xffff
+
+/* The texts of compile-time error messages are defined as macros here so that
+they can be accessed by the POSIX wrapper and converted into error codes. Yes,
+I could have used error codes in the first place, but didn't feel like changing
+just to accommodate the POSIX wrapper. */
+
+#define ERR1 "\\ at end of pattern"
+#define ERR2 "\\c at end of pattern"
+#define ERR3 "unrecognized character follows \\"
+#define ERR4 "numbers out of order in {} quantifier"
+#define ERR5 "number too big in {} quantifier"
+#define ERR6 "missing terminating ] for character class"
+#define ERR7 "invalid escape sequence in character class"
+#define ERR8 "range out of order in character class"
+#define ERR9 "nothing to repeat"
+#define ERR10 "operand of unlimited repeat could match the empty string"
+#define ERR11 "internal error: unexpected repeat"
+#define ERR12 "unrecognized character after (?"
+#define ERR13 "POSIX named classes are supported only within a class"
+#define ERR14 "missing )"
+#define ERR15 "reference to non-existent subpattern"
+#define ERR16 "erroffset passed as NULL"
+#define ERR17 "unknown option bit(s) set"
+#define ERR18 "missing ) after comment"
+#define ERR19 "parentheses nested too deeply"
+#define ERR20 "regular expression too large"
+#define ERR21 "failed to get memory"
+#define ERR22 "unmatched parentheses"
+#define ERR23 "internal error: code overflow"
+#define ERR24 "unrecognized character after (?<"
+#define ERR25 "lookbehind assertion is not fixed length"
+#define ERR26 "malformed number after (?("
+#define ERR27 "conditional group contains more than two branches"
+#define ERR28 "assertion expected after (?("
+#define ERR29 "(?R or (?digits must be followed by )"
+#define ERR30 "unknown POSIX class name"
+#define ERR31 "POSIX collating elements are not supported"
+#define ERR32 "this version of PCRE is not compiled with PCRE_UTF8 support"
+#define ERR33 "spare error"
+#define ERR34 "character value in \\x{...} sequence is too large"
+#define ERR35 "invalid condition (?(0)"
+#define ERR36 "\\C not allowed in lookbehind assertion"
+#define ERR37 "PCRE does not support \\L, \\l, \\N, \\U, or \\u"
+#define ERR38 "number after (?C is > 255"
+#define ERR39 "closing ) for (?C expected"
+#define ERR40 "recursive call could loop indefinitely"
+#define ERR41 "unrecognized character after (?P"
+#define ERR42 "syntax error after (?P"
+#define ERR43 "two named groups have the same name"
+#define ERR44 "invalid UTF-8 string"
+#define ERR45 "support for \\P, \\p, and \\X has not been compiled"
+#define ERR46 "malformed \\P or \\p sequence"
+#define ERR47 "unknown property name after \\P or \\p"
+
+/* The real format of the start of the pcre block; the index of names and the
+code vector run on as long as necessary after the end. We store an explicit
+offset to the name table so that if a regex is compiled on one host, saved, and
+then run on another where the size of pointers is different, all might still
+be well. For the case of compiled-on-4 and run-on-8, we include an extra
+pointer that is always NULL. For future-proofing, we also include a few dummy
+fields - even though you can never get this planning right!
+
+NOTE NOTE NOTE:
+Because people can now save and re-use compiled patterns, any additions to this
+structure should be made at the end, and something earlier (e.g. a new
+flag in the options or one of the dummy fields) should indicate that the new
+fields are present. Currently PCRE always sets the dummy fields to zero.
+NOTE NOTE NOTE:
+*/
+
+typedef struct real_pcre {
+ pcre_uint32 magic_number;
+ pcre_uint32 size; /* Total that was malloced */
+ pcre_uint32 options;
+ pcre_uint32 dummy1; /* For future use, maybe */
+
+ pcre_uint16 top_bracket;
+ pcre_uint16 top_backref;
+ pcre_uint16 first_byte;
+ pcre_uint16 req_byte;
+ pcre_uint16 name_table_offset; /* Offset to name table that follows */
+ pcre_uint16 name_entry_size; /* Size of any name items */
+ pcre_uint16 name_count; /* Number of name items */
+ pcre_uint16 dummy2; /* For future use, maybe */
+
+ const unsigned char *tables; /* Pointer to tables or NULL for std */
+ const unsigned char *nullpad; /* NULL padding */
+} real_pcre;
+
+/* The format of the block used to store data from pcre_study(). The same
+remark (see NOTE above) about extending this structure applies. */
+
+typedef struct pcre_study_data {
+ pcre_uint32 size; /* Total that was malloced */
+ pcre_uint32 options;
+ uschar start_bits[32];
+} pcre_study_data;
+
+/* Structure for passing "static" information around between the functions
+doing the compiling, so that they are thread-safe. */
+
+typedef struct compile_data {
+ const uschar *lcc; /* Points to lower casing table */
+ const uschar *fcc; /* Points to case-flipping table */
+ const uschar *cbits; /* Points to character type table */
+ const uschar *ctypes; /* Points to table of type maps */
+ const uschar *start_code; /* The start of the compiled code */
+ const uschar *start_pattern; /* The start of the pattern */
+ uschar *name_table; /* The name/number table */
+ int names_found; /* Number of entries so far */
+ int name_entry_size; /* Size of each entry */
+ int top_backref; /* Maximum back reference */
+ unsigned int backref_map; /* Bitmap of low back refs */
+ int req_varyopt; /* "After variable item" flag for reqbyte */
+ BOOL nopartial; /* Set TRUE if partial won't work */
+} compile_data;
+
+/* Structure for maintaining a chain of pointers to the currently incomplete
+branches, for testing for left recursion. */
+
+typedef struct branch_chain {
+ struct branch_chain *outer;
+ uschar *current;
+} branch_chain;
+
+/* Structure for items in a linked list that represents an explicit recursive
+call within the pattern. */
+
+typedef struct recursion_info {
+ struct recursion_info *prevrec; /* Previous recursion record (or NULL) */
+ int group_num; /* Number of group that was called */
+ const uschar *after_call; /* "Return value": points after the call in the expr */
+ const uschar *save_start; /* Old value of md->start_match */
+ int *offset_save; /* Pointer to start of saved offsets */
+ int saved_max; /* Number of saved offsets */
+} recursion_info;
+
+/* When compiling in a mode that doesn't use recursive calls to match(),
+a structure is used to remember local variables on the heap. It is defined in
+pcre.c, close to the match() function, so that it is easy to keep it in step
+with any changes of local variable. However, the pointer to the current frame
+must be saved in some "static" place over a longjmp(). We declare the
+structure here so that we can put a pointer in the match_data structure.
+NOTE: This isn't used for a "normal" compilation of pcre. */
+
+struct heapframe;
+
+/* Structure for passing "static" information around between the functions
+doing the matching, so that they are thread-safe. */
+
+typedef struct match_data {
+ unsigned long int match_call_count; /* As it says */
+ unsigned long int match_limit;/* As it says */
+ int *offset_vector; /* Offset vector */
+ int offset_end; /* One past the end */
+ int offset_max; /* The maximum usable for return data */
+ const uschar *lcc; /* Points to lower casing table */
+ const uschar *ctypes; /* Points to table of type maps */
+ BOOL offset_overflow; /* Set if too many extractions */
+ BOOL notbol; /* NOTBOL flag */
+ BOOL noteol; /* NOTEOL flag */
+ BOOL utf8; /* UTF8 flag */
+ BOOL endonly; /* Dollar not before final \n */
+ BOOL notempty; /* Empty string match not wanted */
+ BOOL partial; /* PARTIAL flag */
+ BOOL hitend; /* Hit the end of the subject at some point */
+ const uschar *start_code; /* For use when recursing */
+ const uschar *start_subject; /* Start of the subject string */
+ const uschar *end_subject; /* End of the subject string */
+ const uschar *start_match; /* Start of this match attempt */
+ const uschar *end_match_ptr; /* Subject position at end match */
+ int end_offset_top; /* Highwater mark at end of match */
+ int capture_last; /* Most recent capture number */
+ int start_offset; /* The start offset value */
+ recursion_info *recursive; /* Linked list of recursion data */
+ void *callout_data; /* To pass back to callouts */
+ struct heapframe *thisframe; /* Used only when compiling for no recursion */
+} match_data;
+
+/* Bit definitions for entries in the pcre_ctypes table. */
+
+#define ctype_space 0x01
+#define ctype_letter 0x02
+#define ctype_digit 0x04
+#define ctype_xdigit 0x08
+#define ctype_word 0x10 /* alphameric or '_' */
+#define ctype_meta 0x80 /* regexp meta char or zero (end pattern) */
+
+/* Offsets for the bitmap tables in pcre_cbits. Each table contains a set
+of bits for a class map. Some classes are built by combining these tables. */
+
+#define cbit_space 0 /* [:space:] or \s */
+#define cbit_xdigit 32 /* [:xdigit:] */
+#define cbit_digit 64 /* [:digit:] or \d */
+#define cbit_upper 96 /* [:upper:] */
+#define cbit_lower 128 /* [:lower:] */
+#define cbit_word 160 /* [:word:] or \w */
+#define cbit_graph 192 /* [:graph:] */
+#define cbit_print 224 /* [:print:] */
+#define cbit_punct 256 /* [:punct:] */
+#define cbit_cntrl 288 /* [:cntrl:] */
+#define cbit_length 320 /* Length of the cbits table */
+
+/* Offsets of the various tables from the base tables pointer, and
+total length. */
+
+#define lcc_offset 0
+#define fcc_offset 256
+#define cbits_offset 512
+#define ctypes_offset (cbits_offset + cbit_length)
+#define tables_length (ctypes_offset + 256)
+
+/* End of internal.h */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/libpcre.def b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/libpcre.def
new file mode 100644
index 00000000..b1c6894f
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/libpcre.def
@@ -0,0 +1,34 @@
+; Licensed to the Apache Software Foundation (ASF) under one or more
+; contributor license agreements. See the NOTICE file distributed with
+; this work for additional information regarding copyright ownership.
+; The ASF licenses this file to You under the Apache License, Version 2.0
+; (the "License"); you may not use this file except in compliance with
+; the License. You may obtain a copy of the License at
+;
+; http://www.apache.org/licenses/LICENSE-2.0
+;
+; Unless required by applicable law or agreed to in writing, software
+; distributed under the License is distributed on an "AS IS" BASIS,
+; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+; See the License for the specific language governing permissions and
+; limitations under the License.
+;
+LIBRARY libpcre
+EXPORTS
+pcre_malloc
+pcre_free
+pcre_config
+pcre_callout
+pcre_compile
+pcre_copy_substring
+pcre_exec
+pcre_get_substring
+pcre_get_stringnumber
+pcre_get_substring_list
+pcre_free_substring
+pcre_free_substring_list
+pcre_info
+pcre_fullinfo
+pcre_maketables
+pcre_study
+pcre_version
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/libpcre.pc.in b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/libpcre.pc.in
new file mode 100644
index 00000000..4784401c
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/libpcre.pc.in
@@ -0,0 +1,12 @@
+# Package Information for pkg-config
+
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: libpcre
+Description: PCRE - Perl compatible regular expressions C library
+Version: @PCRE_VERSION@
+Libs: -L${libdir} -lpcre
+Cflags: -I${includedir}
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/libpcreposix.def b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/libpcreposix.def
new file mode 100644
index 00000000..aa2cc48a
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/libpcreposix.def
@@ -0,0 +1,39 @@
+; Licensed to the Apache Software Foundation (ASF) under one or more
+; contributor license agreements. See the NOTICE file distributed with
+; this work for additional information regarding copyright ownership.
+; The ASF licenses this file to You under the Apache License, Version 2.0
+; (the "License"); you may not use this file except in compliance with
+; the License. You may obtain a copy of the License at
+;
+; http://www.apache.org/licenses/LICENSE-2.0
+;
+; Unless required by applicable law or agreed to in writing, software
+; distributed under the License is distributed on an "AS IS" BASIS,
+; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+; See the License for the specific language governing permissions and
+; limitations under the License.
+;
+LIBRARY libpcreposix
+EXPORTS
+pcre_malloc
+pcre_free
+pcre_config
+pcre_callout
+pcre_compile
+pcre_copy_substring
+pcre_exec
+pcre_get_substring
+pcre_get_stringnumber
+pcre_get_substring_list
+pcre_free_substring
+pcre_free_substring_list
+pcre_info
+pcre_fullinfo
+pcre_maketables
+pcre_study
+pcre_version
+
+regcomp
+regexec
+regerror
+regfree
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/maketables.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/maketables.c
new file mode 100644
index 00000000..f1c7b9a5
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/maketables.c
@@ -0,0 +1,146 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/*
+PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+Written by: Philip Hazel <ph10@cam.ac.uk>
+
+ Copyright (c) 1997-2003 University of Cambridge
+
+-----------------------------------------------------------------------------
+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.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This file is compiled on its own as part of the PCRE library. However,
+it is also included in the compilation of dftables.c, in which case the macro
+DFTABLES is defined. */
+
+#ifndef DFTABLES
+#include "internal.h"
+#endif
+
+
+
+/*************************************************
+* Create PCRE character tables *
+*************************************************/
+
+/* This function builds a set of character tables for use by PCRE and returns
+a pointer to them. They are build using the ctype functions, and consequently
+their contents will depend upon the current locale setting. When compiled as
+part of the library, the store is obtained via pcre_malloc(), but when compiled
+inside dftables, use malloc().
+
+Arguments: none
+Returns: pointer to the contiguous block of data
+*/
+
+const unsigned char *
+pcre_maketables(void)
+{
+unsigned char *yield, *p;
+int i;
+
+#ifndef DFTABLES
+yield = (unsigned char*)(pcre_malloc)(tables_length);
+#else
+yield = (unsigned char*)malloc(tables_length);
+#endif
+
+if (yield == NULL) return NULL;
+p = yield;
+
+/* First comes the lower casing table */
+
+for (i = 0; i < 256; i++) *p++ = tolower(i);
+
+/* Next the case-flipping table */
+
+for (i = 0; i < 256; i++) *p++ = islower(i)? toupper(i) : tolower(i);
+
+/* Then the character class tables. Don't try to be clever and save effort
+on exclusive ones - in some locales things may be different. Note that the
+table for "space" includes everything "isspace" gives, including VT in the
+default locale. This makes it work for the POSIX class [:space:]. */
+
+memset(p, 0, cbit_length);
+for (i = 0; i < 256; i++)
+ {
+ if (isdigit(i))
+ {
+ p[cbit_digit + i/8] |= 1 << (i&7);
+ p[cbit_word + i/8] |= 1 << (i&7);
+ }
+ if (isupper(i))
+ {
+ p[cbit_upper + i/8] |= 1 << (i&7);
+ p[cbit_word + i/8] |= 1 << (i&7);
+ }
+ if (islower(i))
+ {
+ p[cbit_lower + i/8] |= 1 << (i&7);
+ p[cbit_word + i/8] |= 1 << (i&7);
+ }
+ if (i == '_') p[cbit_word + i/8] |= 1 << (i&7);
+ if (isspace(i)) p[cbit_space + i/8] |= 1 << (i&7);
+ if (isxdigit(i))p[cbit_xdigit + i/8] |= 1 << (i&7);
+ if (isgraph(i)) p[cbit_graph + i/8] |= 1 << (i&7);
+ if (isprint(i)) p[cbit_print + i/8] |= 1 << (i&7);
+ if (ispunct(i)) p[cbit_punct + i/8] |= 1 << (i&7);
+ if (iscntrl(i)) p[cbit_cntrl + i/8] |= 1 << (i&7);
+ }
+p += cbit_length;
+
+/* Finally, the character type table. In this, we exclude VT from the white
+space chars, because Perl doesn't recognize it as such for \s and for comments
+within regexes. */
+
+for (i = 0; i < 256; i++)
+ {
+ int x = 0;
+ if (i != 0x0b && isspace(i)) x += ctype_space;
+ if (isalpha(i)) x += ctype_letter;
+ if (isdigit(i)) x += ctype_digit;
+ if (isxdigit(i)) x += ctype_xdigit;
+ if (isalnum(i) || i == '_') x += ctype_word;
+
+ /* Note: strchr includes the terminating zero in the characters it considers.
+ In this instance, that is ok because we want binary zero to be flagged as a
+ meta-character, which in this sense is any character that terminates a run
+ of data characters. */
+
+ if (strchr("*+?{^.$|()[", i) != 0) x += ctype_meta; *p++ = x; }
+
+return yield;
+}
+
+/* End of maketables.c */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/makevp.bat b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/makevp.bat
new file mode 100644
index 00000000..10bd2487
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/makevp.bat
@@ -0,0 +1,25 @@
+@echo off
+
+REM This file was contributed by Alexander Tokarev for building PCRE for use
+REM with Virtual Pascal. It has not been tested with the latest PCRE release.
+
+REM CHANGE THIS FOR YOUR BORLAND C++ COMPILER PATH
+
+SET BORLAND=c:\usr\apps\bcc55
+
+sh configure
+
+bcc32 -DDFTABLES -DSTATIC -DVPCOMPAT -I%BORLAND%\include -L%BORLAND%\lib dftables.c
+
+dftables > chartables.c
+
+bcc32 -c -RT- -y- -v- -u- -P- -O2 -5 -DSTATIC -DVPCOMPAT -UDFTABLES -I%BORLAND%\include get.c maketables.c pcre.c study.c
+
+tlib %BORLAND%\lib\cw32.lib *calloc *del *strncmp *memcpy *memmove *memset
+tlib pcre.lib +get.obj +maketables.obj +pcre.obj +study.obj +calloc.obj +del.obj +strncmp.obj +memcpy.obj +memmove.obj +memset.obj
+
+del *.obj *.exe *.tds *.bak >nul 2>nul
+
+echo ---
+echo Now the library should be complete. Please check all messages above.
+echo Don't care for warnings, it's OK.
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/mkinstalldirs b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/mkinstalldirs
new file mode 100755
index 00000000..b948dd0a
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/mkinstalldirs
@@ -0,0 +1,40 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain
+
+# $Id: mkinstalldirs 467206 2006-10-24 02:45:46Z markt $
+
+errstatus=0
+
+for file
+do
+ set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+ shift
+
+ pathcomp=
+ for d
+ do
+ pathcomp="$pathcomp$d"
+ case "$pathcomp" in
+ -* ) pathcomp=./$pathcomp ;;
+ esac
+
+ if test ! -d "$pathcomp"; then
+ echo "mkdir $pathcomp"
+
+ mkdir "$pathcomp" || lasterr=$?
+
+ if test ! -d "$pathcomp"; then
+ errstatus=$lasterr
+ fi
+ fi
+
+ pathcomp="$pathcomp/"
+ done
+done
+
+exit $errstatus
+
+# mkinstalldirs ends here
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcre-config.in b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcre-config.in
new file mode 100644
index 00000000..30d66ced
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcre-config.in
@@ -0,0 +1,66 @@
+#!/bin/sh
+
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+exec_prefix_set=no
+
+usage="\
+Usage: pcre-config [--prefix] [--exec-prefix] [--version] [--libs] [--libs-posix] [--cflags] [--cflags-posix]"
+
+if test $# -eq 0; then
+ echo "${usage}" 1>&2
+ exit 1
+fi
+
+libR=
+case `uname -s` in
+ *SunOS*)
+ libR=" -R@libdir@"
+ ;;
+esac
+
+while test $# -gt 0; do
+ case "$1" in
+ -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) optarg= ;;
+ esac
+
+ case $1 in
+ --prefix=*)
+ prefix=$optarg
+ if test $exec_prefix_set = no ; then
+ exec_prefix=$optarg
+ fi
+ ;;
+ --prefix)
+ echo $prefix
+ ;;
+ --exec-prefix=*)
+ exec_prefix=$optarg
+ exec_prefix_set=yes
+ ;;
+ --exec-prefix)
+ echo $exec_prefix
+ ;;
+ --version)
+ echo @PCRE_VERSION@
+ ;;
+ --cflags | --cflags-posix)
+ if test @includedir@ != /usr/include ; then
+ includes=-I@includedir@
+ fi
+ echo $includes
+ ;;
+ --libs-posix)
+ echo -L@libdir@$libR -lpcreposix -lpcre
+ ;;
+ --libs)
+ echo -L@libdir@$libR -lpcre
+ ;;
+ *)
+ echo "${usage}" 1>&2
+ exit 1
+ ;;
+ esac
+ shift
+done
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcre.amd64 b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcre.amd64
new file mode 100644
index 00000000..fc21ce50
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcre.amd64
@@ -0,0 +1,146 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Microsoft Developer Studio Generated NMAKE File, Based on pcre.dsp
+# Use Platform SDK:
+# SetEnv.cmd /X64 /RETAIL
+# nmake -f pcre.amd64
+#
+
+CPP=cl.exe
+RSC=rc.exe
+OUTDIR=.\Release_amd64
+INTDIR=.\Release_amd64
+# Begin Custom Macros
+OutDir=.\Release_amd64
+# End Custom Macros
+
+!IF "$(RECURSE)" == "0"
+
+ALL : "$(OUTDIR)\pcre.lib"
+
+!ELSE
+
+ALL : "$(OUTDIR)\pcre.lib"
+
+!ENDIF
+
+CLEAN :
+ -@erase "$(INTDIR)\get.obj"
+ -@erase "$(INTDIR)\maketables.obj"
+ -@erase "$(INTDIR)\pcre.obj"
+ -@erase "$(INTDIR)\pcre_src.idb"
+ -@erase "$(INTDIR)\pcre_src.pdb"
+ -@erase "$(INTDIR)\study.obj"
+ -@erase "$(OUTDIR)\pcre.lib"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\pcre.bsc"
+BSC32_SBRS= \
+
+LIB32=link.exe -lib
+LIB32_FLAGS=kernel32.lib /nologo /out:"$(OUTDIR)\pcre.lib"
+LIB32_OBJS= \
+ "$(INTDIR)\get.obj" \
+ "$(INTDIR)\maketables.obj" \
+ "$(INTDIR)\pcre.obj" \
+ "$(INTDIR)\study.obj"
+
+"$(OUTDIR)\pcre.lib" : "$(OUTDIR)" $(DEF_FILE) $(LIB32_OBJS)
+ $(LIB32) @<<
+ $(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS)
+<<
+
+CPP_PROJ=-nologo -MD -W3 -O2 -Ob2 -Oy- -Zi -EHsc /D "_WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_AMD64_=1" -DWIN64 /D "_WIN64" /Wp64 /FIPRE64PRA.H /D "PCRE_STATIC" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\pcre_src" /FD /c
+
+.c{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+SOURCE=.\dftables.exe
+InputPath=.\dftables.exe
+
+".\chartables.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ <<tempfile.bat
+ @echo off
+ .\dftables.exe chartables.c
+<<
+
+SOURCE=.\get.c
+
+"$(INTDIR)\get.obj" : $(SOURCE) "$(INTDIR)" ".\config.h" ".\pcre.h"
+
+
+SOURCE=.\maketables.c
+
+"$(INTDIR)\maketables.obj" : $(SOURCE) "$(INTDIR)" ".\config.h" ".\pcre.h"
+
+
+SOURCE=.\pcre.c
+
+"$(INTDIR)\pcre.obj" : $(SOURCE) "$(INTDIR)" ".\chartables.c" ".\config.h" ".\pcre.h"
+
+
+SOURCE=.\study.c
+
+"$(INTDIR)\study.obj" : $(SOURCE) "$(INTDIR)" ".\config.h" ".\pcre.h"
+
+
+SOURCE=.\config.hw
+InputPath=.\config.hw
+
+".\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ <<tempfile.bat
+ @echo off
+ type .\config.hw > .\config.h
+<<
+
+SOURCE=.\pcre.hw
+InputPath=.\pcre.hw
+
+".\pcre.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ <<tempfile.bat
+ @echo off
+ type .\pcre.hw > .\pcre.h
+<<
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcre.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcre.c
new file mode 100644
index 00000000..4936323a
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcre.c
@@ -0,0 +1,9207 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/*
+This is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language. See
+the file Tech.Notes for some information on the internals.
+
+Written by: Philip Hazel <ph10@cam.ac.uk>
+
+ Copyright (c) 1997-2004 University of Cambridge
+
+-----------------------------------------------------------------------------
+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.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+-----------------------------------------------------------------------------
+*/
+
+
+/* Define DEBUG to get debugging output on stdout. */
+/* #define DEBUG */
+
+/* Use a macro for debugging printing, 'cause that eliminates the use of #ifdef
+inline, and there are *still* stupid compilers about that don't like indented
+pre-processor statements. I suppose it's only been 10 years... */
+
+#ifdef DEBUG
+#define DPRINTF(p) printf p
+#else
+#define DPRINTF(p) /*nothing*/
+#endif
+
+/* Include the internals header, which itself includes "config.h", the Standard
+C headers, and the external pcre header. */
+
+#include "internal.h"
+
+/* If Unicode Property support is wanted, include a private copy of the
+function that does it, and the table that translates names to numbers. */
+
+#ifdef SUPPORT_UCP
+#include "ucp.c"
+#include "ucptypetable.c"
+#endif
+
+/* Maximum number of items on the nested bracket stacks at compile time. This
+applies to the nesting of all kinds of parentheses. It does not limit
+un-nested, non-capturing parentheses. This number can be made bigger if
+necessary - it is used to dimension one int and one unsigned char vector at
+compile time. */
+
+#define BRASTACK_SIZE 200
+
+
+/* Maximum number of ints of offset to save on the stack for recursive calls.
+If the offset vector is bigger, malloc is used. This should be a multiple of 3,
+because the offset vector is always a multiple of 3 long. */
+
+#define REC_STACK_SAVE_MAX 30
+
+
+/* The maximum remaining length of subject we are prepared to search for a
+req_byte match. */
+
+#define REQ_BYTE_MAX 1000
+
+
+/* Table of sizes for the fixed-length opcodes. It's defined in a macro so that
+the definition is next to the definition of the opcodes in internal.h. */
+
+static const uschar OP_lengths[] = { OP_LENGTHS };
+
+/* Min and max values for the common repeats; for the maxima, 0 => infinity */
+
+static const char rep_min[] = { 0, 0, 1, 1, 0, 0 };
+static const char rep_max[] = { 0, 0, 0, 0, 1, 1 };
+
+/* Table for handling escaped characters in the range '0'-'z'. Positive returns
+are simple data values; negative values are for special things like \d and so
+on. Zero means further processing is needed (for things like \x), or the escape
+is invalid. */
+
+#if !EBCDIC /* This is the "normal" table for ASCII systems */
+static const short int escapes[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0 - 7 */
+ 0, 0, ':', ';', '<', '=', '>', '?', /* 8 - ? */
+ '@', -ESC_A, -ESC_B, -ESC_C, -ESC_D, -ESC_E, 0, -ESC_G, /* @ - G */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* H - O */
+-ESC_P, -ESC_Q, 0, -ESC_S, 0, 0, 0, -ESC_W, /* P - W */
+-ESC_X, 0, -ESC_Z, '[', '\\', ']', '^', '_', /* X - _ */
+ '`', 7, -ESC_b, 0, -ESC_d, ESC_e, ESC_f, 0, /* ` - g */
+ 0, 0, 0, 0, 0, 0, ESC_n, 0, /* h - o */
+-ESC_p, 0, ESC_r, -ESC_s, ESC_tee, 0, 0, -ESC_w, /* p - w */
+ 0, 0, -ESC_z /* x - z */
+};
+
+#else /* This is the "abnormal" table for EBCDIC systems */
+static const short int escapes[] = {
+/* 48 */ 0, 0, 0, '.', '<', '(', '+', '|',
+/* 50 */ '&', 0, 0, 0, 0, 0, 0, 0,
+/* 58 */ 0, 0, '!', '$', '*', ')', ';', '~',
+/* 60 */ '-', '/', 0, 0, 0, 0, 0, 0,
+/* 68 */ 0, 0, '|', ',', '%', '_', '>', '?',
+/* 70 */ 0, 0, 0, 0, 0, 0, 0, 0,
+/* 78 */ 0, '`', ':', '#', '@', '\'', '=', '"',
+/* 80 */ 0, 7, -ESC_b, 0, -ESC_d, ESC_e, ESC_f, 0,
+/* 88 */ 0, 0, 0, '{', 0, 0, 0, 0,
+/* 90 */ 0, 0, 0, 'l', 0, ESC_n, 0, -ESC_p,
+/* 98 */ 0, ESC_r, 0, '}', 0, 0, 0, 0,
+/* A0 */ 0, '~', -ESC_s, ESC_tee, 0, 0, -ESC_w, 0,
+/* A8 */ 0,-ESC_z, 0, 0, 0, '[', 0, 0,
+/* B0 */ 0, 0, 0, 0, 0, 0, 0, 0,
+/* B8 */ 0, 0, 0, 0, 0, ']', '=', '-',
+/* C0 */ '{',-ESC_A, -ESC_B, -ESC_C, -ESC_D,-ESC_E, 0, -ESC_G,
+/* C8 */ 0, 0, 0, 0, 0, 0, 0, 0,
+/* D0 */ '}', 0, 0, 0, 0, 0, 0, -ESC_P,
+/* D8 */-ESC_Q, 0, 0, 0, 0, 0, 0, 0,
+/* E0 */ '\\', 0, -ESC_S, 0, 0, 0, -ESC_W, -ESC_X,
+/* E8 */ 0,-ESC_Z, 0, 0, 0, 0, 0, 0,
+/* F0 */ 0, 0, 0, 0, 0, 0, 0, 0,
+/* F8 */ 0, 0, 0, 0, 0, 0, 0, 0
+};
+#endif
+
+
+/* Tables of names of POSIX character classes and their lengths. The list is
+terminated by a zero length entry. The first three must be alpha, upper, lower,
+as this is assumed for handling case independence. */
+
+static const char *const posix_names[] = {
+ "alpha", "lower", "upper",
+ "alnum", "ascii", "blank", "cntrl", "digit", "graph",
+ "print", "punct", "space", "word", "xdigit" };
+
+static const uschar posix_name_lengths[] = {
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 6, 0 };
+
+/* Table of class bit maps for each POSIX class; up to three may be combined
+to form the class. The table for [:blank:] is dynamically modified to remove
+the vertical space characters. */
+
+static const int posix_class_maps[] = {
+ cbit_lower, cbit_upper, -1, /* alpha */
+ cbit_lower, -1, -1, /* lower */
+ cbit_upper, -1, -1, /* upper */
+ cbit_digit, cbit_lower, cbit_upper, /* alnum */
+ cbit_print, cbit_cntrl, -1, /* ascii */
+ cbit_space, -1, -1, /* blank - a GNU extension */
+ cbit_cntrl, -1, -1, /* cntrl */
+ cbit_digit, -1, -1, /* digit */
+ cbit_graph, -1, -1, /* graph */
+ cbit_print, -1, -1, /* print */
+ cbit_punct, -1, -1, /* punct */
+ cbit_space, -1, -1, /* space */
+ cbit_word, -1, -1, /* word - a Perl extension */
+ cbit_xdigit,-1, -1 /* xdigit */
+};
+
+/* Table to identify digits and hex digits. This is used when compiling
+patterns. Note that the tables in chartables are dependent on the locale, and
+may mark arbitrary characters as digits - but the PCRE compiling code expects
+to handle only 0-9, a-z, and A-Z as digits when compiling. That is why we have
+a private table here. It costs 256 bytes, but it is a lot faster than doing
+character value tests (at least in some simple cases I timed), and in some
+applications one wants PCRE to compile efficiently as well as match
+efficiently.
+
+For convenience, we use the same bit definitions as in chartables:
+
+ 0x04 decimal digit
+ 0x08 hexadecimal digit
+
+Then we can use ctype_digit and ctype_xdigit in the code. */
+
+#if !EBCDIC /* This is the "normal" case, for ASCII systems */
+static const unsigned char digitab[] =
+ {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0- 7 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 8- 15 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 16- 23 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 24- 31 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - ' */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* ( - / */
+ 0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, /* 0 - 7 */
+ 0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00, /* 8 - ? */
+ 0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /* @ - G */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* H - O */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* P - W */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* X - _ */
+ 0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /* ` - g */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* h - o */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* p - w */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* x -127 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 128-135 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 136-143 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 144-151 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 152-159 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160-167 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 168-175 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 176-183 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 184-191 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 192-199 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 200-207 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 208-215 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 216-223 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 224-231 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 232-239 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 240-247 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/* 248-255 */
+
+#else /* This is the "abnormal" case, for EBCDIC systems */
+static const unsigned char digitab[] =
+ {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0- 7 0 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 8- 15 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 16- 23 10 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 24- 31 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 32- 39 20 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 40- 47 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 48- 55 30 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 56- 63 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - 71 40 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 72- | */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* & - 87 50 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 88- ¬ */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - -103 60 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 104- ? */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 112-119 70 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 120- " */
+ 0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /* 128- g 80 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* h -143 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 144- p 90 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* q -159 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160- x A0 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* y -175 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* ^ -183 B0 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 184-191 */
+ 0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /* { - G C0 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* H -207 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* } - P D0 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* Q -223 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* \ - X E0 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* Y -239 */
+ 0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, /* 0 - 7 F0 */
+ 0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00};/* 8 -255 */
+
+static const unsigned char ebcdic_chartab[] = { /* chartable partial dup */
+ 0x80,0x00,0x00,0x00,0x00,0x01,0x00,0x00, /* 0- 7 */
+ 0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00, /* 8- 15 */
+ 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, /* 16- 23 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 24- 31 */
+ 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, /* 32- 39 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 40- 47 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 48- 55 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 56- 63 */
+ 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - 71 */
+ 0x00,0x00,0x00,0x80,0x00,0x80,0x80,0x80, /* 72- | */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* & - 87 */
+ 0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00, /* 88- ¬ */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - -103 */
+ 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x80, /* 104- ? */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 112-119 */
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 120- " */
+ 0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* 128- g */
+ 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* h -143 */
+ 0x00,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* 144- p */
+ 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* q -159 */
+ 0x00,0x00,0x12,0x12,0x12,0x12,0x12,0x12, /* 160- x */
+ 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* y -175 */
+ 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* ^ -183 */
+ 0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00, /* 184-191 */
+ 0x80,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* { - G */
+ 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* H -207 */
+ 0x00,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* } - P */
+ 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* Q -223 */
+ 0x00,0x00,0x12,0x12,0x12,0x12,0x12,0x12, /* \ - X */
+ 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* Y -239 */
+ 0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, /* 0 - 7 */
+ 0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x00};/* 8 -255 */
+#endif
+
+
+/* Definition to allow mutual recursion */
+
+static BOOL
+ compile_regex(int, int, int *, uschar **, const uschar **, const char **,
+ BOOL, int, int *, int *, branch_chain *, compile_data *);
+
+/* Structure for building a chain of data that actually lives on the
+stack, for holding the values of the subject pointer at the start of each
+subpattern, so as to detect when an empty string has been matched by a
+subpattern - to break infinite loops. When NO_RECURSE is set, these blocks
+are on the heap, not on the stack. */
+
+typedef struct eptrblock {
+ struct eptrblock *epb_prev;
+ const uschar *epb_saved_eptr;
+} eptrblock;
+
+/* Flag bits for the match() function */
+
+#define match_condassert 0x01 /* Called to check a condition assertion */
+#define match_isgroup 0x02 /* Set if start of bracketed group */
+
+/* Non-error returns from the match() function. Error returns are externally
+defined PCRE_ERROR_xxx codes, which are all negative. */
+
+#define MATCH_MATCH 1
+#define MATCH_NOMATCH 0
+
+
+
+/*************************************************
+* Global variables *
+*************************************************/
+
+/* PCRE is thread-clean and doesn't use any global variables in the normal
+sense. However, it calls memory allocation and free functions via the four
+indirections below, and it can optionally do callouts. These values can be
+changed by the caller, but are shared between all threads. However, when
+compiling for Virtual Pascal, things are done differently (see pcre.in). */
+
+#ifndef VPCOMPAT
+#ifdef __cplusplus
+extern "C" void *(*pcre_malloc)(size_t) = malloc;
+extern "C" void (*pcre_free)(void *) = free;
+extern "C" void *(*pcre_stack_malloc)(size_t) = malloc;
+extern "C" void (*pcre_stack_free)(void *) = free;
+extern "C" int (*pcre_callout)(pcre_callout_block *) = NULL;
+#else
+void *(*pcre_malloc)(size_t) = malloc;
+void (*pcre_free)(void *) = free;
+void *(*pcre_stack_malloc)(size_t) = malloc;
+void (*pcre_stack_free)(void *) = free;
+int (*pcre_callout)(pcre_callout_block *) = NULL;
+#endif
+#endif
+
+
+/*************************************************
+* Macros and tables for character handling *
+*************************************************/
+
+/* When UTF-8 encoding is being used, a character is no longer just a single
+byte. The macros for character handling generate simple sequences when used in
+byte-mode, and more complicated ones for UTF-8 characters. */
+
+#ifndef SUPPORT_UTF8
+#define GETCHAR(c, eptr) c = *eptr;
+#define GETCHARINC(c, eptr) c = *eptr++;
+#define GETCHARINCTEST(c, eptr) c = *eptr++;
+#define GETCHARLEN(c, eptr, len) c = *eptr;
+#define BACKCHAR(eptr)
+
+#else /* SUPPORT_UTF8 */
+
+/* Get the next UTF-8 character, not advancing the pointer. This is called when
+we know we are in UTF-8 mode. */
+
+#define GETCHAR(c, eptr) \
+ c = *eptr; \
+ if ((c & 0xc0) == 0xc0) \
+ { \
+ int gcii; \
+ int gcaa = utf8_table4[c & 0x3f]; /* Number of additional bytes */ \
+ int gcss = 6*gcaa; \
+ c = (c & utf8_table3[gcaa]) << gcss; \
+ for (gcii = 1; gcii <= gcaa; gcii++) \
+ { \
+ gcss -= 6; \
+ c |= (eptr[gcii] & 0x3f) << gcss; \
+ } \
+ }
+
+/* Get the next UTF-8 character, advancing the pointer. This is called when we
+know we are in UTF-8 mode. */
+
+#define GETCHARINC(c, eptr) \
+ c = *eptr++; \
+ if ((c & 0xc0) == 0xc0) \
+ { \
+ int gcaa = utf8_table4[c & 0x3f]; /* Number of additional bytes */ \
+ int gcss = 6*gcaa; \
+ c = (c & utf8_table3[gcaa]) << gcss; \
+ while (gcaa-- > 0) \
+ { \
+ gcss -= 6; \
+ c |= (*eptr++ & 0x3f) << gcss; \
+ } \
+ }
+
+/* Get the next character, testing for UTF-8 mode, and advancing the pointer */
+
+#define GETCHARINCTEST(c, eptr) \
+ c = *eptr++; \
+ if (md->utf8 && (c & 0xc0) == 0xc0) \
+ { \
+ int gcaa = utf8_table4[c & 0x3f]; /* Number of additional bytes */ \
+ int gcss = 6*gcaa; \
+ c = (c & utf8_table3[gcaa]) << gcss; \
+ while (gcaa-- > 0) \
+ { \
+ gcss -= 6; \
+ c |= (*eptr++ & 0x3f) << gcss; \
+ } \
+ }
+
+/* Get the next UTF-8 character, not advancing the pointer, incrementing length
+if there are extra bytes. This is called when we know we are in UTF-8 mode. */
+
+#define GETCHARLEN(c, eptr, len) \
+ c = *eptr; \
+ if ((c & 0xc0) == 0xc0) \
+ { \
+ int gcii; \
+ int gcaa = utf8_table4[c & 0x3f]; /* Number of additional bytes */ \
+ int gcss = 6*gcaa; \
+ c = (c & utf8_table3[gcaa]) << gcss; \
+ for (gcii = 1; gcii <= gcaa; gcii++) \
+ { \
+ gcss -= 6; \
+ c |= (eptr[gcii] & 0x3f) << gcss; \
+ } \
+ len += gcaa; \
+ }
+
+/* If the pointer is not at the start of a character, move it back until
+it is. Called only in UTF-8 mode. */
+
+#define BACKCHAR(eptr) while((*eptr & 0xc0) == 0x80) eptr--;
+
+#endif
+
+
+
+/*************************************************
+* Default character tables *
+*************************************************/
+
+/* A default set of character tables is included in the PCRE binary. Its source
+is built by the maketables auxiliary program, which uses the default C ctypes
+functions, and put in the file chartables.c. These tables are used by PCRE
+whenever the caller of pcre_compile() does not provide an alternate set of
+tables. */
+
+#include "chartables.c"
+
+
+
+#ifdef SUPPORT_UTF8
+/*************************************************
+* Tables for UTF-8 support *
+*************************************************/
+
+/* These are the breakpoints for different numbers of bytes in a UTF-8
+character. */
+
+static const int utf8_table1[] =
+ { 0x7f, 0x7ff, 0xffff, 0x1fffff, 0x3ffffff, 0x7fffffff};
+
+/* These are the indicator bits and the mask for the data bits to set in the
+first byte of a character, indexed by the number of additional bytes. */
+
+static const int utf8_table2[] = { 0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc};
+static const int utf8_table3[] = { 0xff, 0x1f, 0x0f, 0x07, 0x03, 0x01};
+
+/* Table of the number of extra characters, indexed by the first character
+masked with 0x3f. The highest number for a valid UTF-8 character is in fact
+0x3d. */
+
+static const uschar utf8_table4[] = {
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 };
+
+
+/*************************************************
+* Convert character value to UTF-8 *
+*************************************************/
+
+/* This function takes an integer value in the range 0 - 0x7fffffff
+and encodes it as a UTF-8 character in 0 to 6 bytes.
+
+Arguments:
+ cvalue the character value
+ buffer pointer to buffer for result - at least 6 bytes long
+
+Returns: number of characters placed in the buffer
+*/
+
+static int
+ord2utf8(int cvalue, uschar *buffer)
+{
+register int i, j;
+for (i = 0; i < sizeof(utf8_table1)/sizeof(int); i++)
+ if (cvalue <= utf8_table1[i]) break;
+buffer += i;
+for (j = i; j > 0; j--)
+ {
+ *buffer-- = 0x80 | (cvalue & 0x3f);
+ cvalue >>= 6;
+ }
+*buffer = utf8_table2[i] | cvalue;
+return i + 1;
+}
+#endif
+
+
+
+/*************************************************
+* Print compiled regex *
+*************************************************/
+
+/* The code for doing this is held in a separate file that is also included in
+pcretest.c. It defines a function called print_internals(). */
+
+#ifdef DEBUG
+#include "printint.c"
+#endif
+
+
+
+/*************************************************
+* Return version string *
+*************************************************/
+
+#define STRING(a) # a
+#define XSTRING(s) STRING(s)
+
+EXPORT const char *
+pcre_version(void)
+{
+return XSTRING(PCRE_MAJOR) "." XSTRING(PCRE_MINOR) " " XSTRING(PCRE_DATE);
+}
+
+
+
+
+/*************************************************
+* Flip bytes in an integer *
+*************************************************/
+
+/* This function is called when the magic number in a regex doesn't match in
+order to flip its bytes to see if we are dealing with a pattern that was
+compiled on a host of different endianness. If so, this function is used to
+flip other byte values.
+
+Arguments:
+ value the number to flip
+ n the number of bytes to flip (assumed to be 2 or 4)
+
+Returns: the flipped value
+*/
+
+static pcre_uint16
+byteflip2(pcre_uint16 value)
+{
+return ((value & 0x00ff) << 8) |
+ ((value & 0xff00) >> 8);
+}
+
+static pcre_uint32
+byteflip4(pcre_uint32 value)
+{
+return ((value & 0x000000ff) << 24) |
+ ((value & 0x0000ff00) << 8) |
+ ((value & 0x00ff0000) >> 8) |
+ ((value & 0xff000000) >> 24);
+}
+
+/*************************************************
+* Test for a byte-flipped compiled regex *
+*************************************************/
+
+/* This function is called from pce_exec() and also from pcre_fullinfo(). Its
+job is to test whether the regex is byte-flipped - that is, it was compiled on
+a system of opposite endianness. The function is called only when the native
+MAGIC_NUMBER test fails. If the regex is indeed flipped, we flip all the
+relevant values into a different data block, and return it.
+
+Arguments:
+ re points to the regex
+ study points to study data, or NULL
+ internal_re points to a new regex block
+ internal_study points to a new study block
+
+Returns: the new block if is is indeed a byte-flipped regex
+ NULL if it is not
+*/
+
+static real_pcre *
+try_flipped(const real_pcre *re, real_pcre *internal_re,
+ const pcre_study_data *study, pcre_study_data *internal_study)
+{
+if (byteflip4(re->magic_number) != MAGIC_NUMBER)
+ return NULL;
+
+*internal_re = *re; /* To copy other fields */
+internal_re->size = byteflip4(re->size);
+internal_re->options = byteflip4(re->options);
+internal_re->top_bracket = byteflip2(re->top_bracket);
+internal_re->top_backref = byteflip2(re->top_backref);
+internal_re->first_byte = byteflip2(re->first_byte);
+internal_re->req_byte = byteflip2(re->req_byte);
+internal_re->name_table_offset = byteflip2(re->name_table_offset);
+internal_re->name_entry_size = byteflip2(re->name_entry_size);
+internal_re->name_count = byteflip2(re->name_count);
+
+if (study != NULL)
+ {
+ *internal_study = *study; /* To copy other fields */
+ internal_study->size = byteflip4(study->size);
+ internal_study->options = byteflip4(study->options);
+ }
+
+return internal_re;
+}
+
+
+
+/*************************************************
+* (Obsolete) Return info about compiled pattern *
+*************************************************/
+
+/* This is the original "info" function. It picks potentially useful data out
+of the private structure, but its interface was too rigid. It remains for
+backwards compatibility. The public options are passed back in an int - though
+the re->options field has been expanded to a long int, all the public options
+at the low end of it, and so even on 16-bit systems this will still be OK.
+Therefore, I haven't changed the API for pcre_info().
+
+Arguments:
+ argument_re points to compiled code
+ optptr where to pass back the options
+ first_byte where to pass back the first character,
+ or -1 if multiline and all branches start ^,
+ or -2 otherwise
+
+Returns: number of capturing subpatterns
+ or negative values on error
+*/
+
+EXPORT int
+pcre_info(const pcre *argument_re, int *optptr, int *first_byte)
+{
+real_pcre internal_re;
+const real_pcre *re = (const real_pcre *)argument_re;
+if (re == NULL) return PCRE_ERROR_NULL;
+if (re->magic_number != MAGIC_NUMBER)
+ {
+ re = try_flipped(re, &internal_re, NULL, NULL);
+ if (re == NULL) return PCRE_ERROR_BADMAGIC;
+ }
+if (optptr != NULL) *optptr = (int)(re->options & PUBLIC_OPTIONS);
+if (first_byte != NULL)
+ *first_byte = ((re->options & PCRE_FIRSTSET) != 0)? re->first_byte :
+ ((re->options & PCRE_STARTLINE) != 0)? -1 : -2;
+return re->top_bracket;
+}
+
+
+
+/*************************************************
+* Return info about compiled pattern *
+*************************************************/
+
+/* This is a newer "info" function which has an extensible interface so
+that additional items can be added compatibly.
+
+Arguments:
+ argument_re points to compiled code
+ extra_data points extra data, or NULL
+ what what information is required
+ where where to put the information
+
+Returns: 0 if data returned, negative on error
+*/
+
+EXPORT int
+pcre_fullinfo(const pcre *argument_re, const pcre_extra *extra_data, int what,
+ void *where)
+{
+real_pcre internal_re;
+pcre_study_data internal_study;
+const real_pcre *re = (const real_pcre *)argument_re;
+const pcre_study_data *study = NULL;
+
+if (re == NULL || where == NULL) return PCRE_ERROR_NULL;
+
+if (extra_data != NULL && (extra_data->flags & PCRE_EXTRA_STUDY_DATA) != 0)
+ study = (const pcre_study_data *)extra_data->study_data;
+
+if (re->magic_number != MAGIC_NUMBER)
+ {
+ re = try_flipped(re, &internal_re, study, &internal_study);
+ if (re == NULL) return PCRE_ERROR_BADMAGIC;
+ if (study != NULL) study = &internal_study;
+ }
+
+switch (what)
+ {
+ case PCRE_INFO_OPTIONS:
+ *((unsigned long int *)where) = re->options & PUBLIC_OPTIONS;
+ break;
+
+ case PCRE_INFO_SIZE:
+ *((size_t *)where) = re->size;
+ break;
+
+ case PCRE_INFO_STUDYSIZE:
+ *((size_t *)where) = (study == NULL)? 0 : study->size;
+ break;
+
+ case PCRE_INFO_CAPTURECOUNT:
+ *((int *)where) = re->top_bracket;
+ break;
+
+ case PCRE_INFO_BACKREFMAX:
+ *((int *)where) = re->top_backref;
+ break;
+
+ case PCRE_INFO_FIRSTBYTE:
+ *((int *)where) =
+ ((re->options & PCRE_FIRSTSET) != 0)? re->first_byte :
+ ((re->options & PCRE_STARTLINE) != 0)? -1 : -2;
+ break;
+
+ /* Make sure we pass back the pointer to the bit vector in the external
+ block, not the internal copy (with flipped integer fields). */
+
+ case PCRE_INFO_FIRSTTABLE:
+ *((const uschar **)where) =
+ (study != NULL && (study->options & PCRE_STUDY_MAPPED) != 0)?
+ ((const pcre_study_data *)extra_data->study_data)->start_bits : NULL;
+ break;
+
+ case PCRE_INFO_LASTLITERAL:
+ *((int *)where) =
+ ((re->options & PCRE_REQCHSET) != 0)? re->req_byte : -1;
+ break;
+
+ case PCRE_INFO_NAMEENTRYSIZE:
+ *((int *)where) = re->name_entry_size;
+ break;
+
+ case PCRE_INFO_NAMECOUNT:
+ *((int *)where) = re->name_count;
+ break;
+
+ case PCRE_INFO_NAMETABLE:
+ *((const uschar **)where) = (const uschar *)re + re->name_table_offset;
+ break;
+
+ case PCRE_INFO_DEFAULT_TABLES:
+ *((const uschar **)where) = (const uschar *)pcre_default_tables;
+ break;
+
+ default: return PCRE_ERROR_BADOPTION;
+ }
+
+return 0;
+}
+
+
+
+/*************************************************
+* Return info about what features are configured *
+*************************************************/
+
+/* This is function which has an extensible interface so that additional items
+can be added compatibly.
+
+Arguments:
+ what what information is required
+ where where to put the information
+
+Returns: 0 if data returned, negative on error
+*/
+
+EXPORT int
+pcre_config(int what, void *where)
+{
+switch (what)
+ {
+ case PCRE_CONFIG_UTF8:
+#ifdef SUPPORT_UTF8
+ *((int *)where) = 1;
+#else
+ *((int *)where) = 0;
+#endif
+ break;
+
+ case PCRE_CONFIG_UNICODE_PROPERTIES:
+#ifdef SUPPORT_UCP
+ *((int *)where) = 1;
+#else
+ *((int *)where) = 0;
+#endif
+ break;
+
+ case PCRE_CONFIG_NEWLINE:
+ *((int *)where) = NEWLINE;
+ break;
+
+ case PCRE_CONFIG_LINK_SIZE:
+ *((int *)where) = LINK_SIZE;
+ break;
+
+ case PCRE_CONFIG_POSIX_MALLOC_THRESHOLD:
+ *((int *)where) = POSIX_MALLOC_THRESHOLD;
+ break;
+
+ case PCRE_CONFIG_MATCH_LIMIT:
+ *((unsigned int *)where) = MATCH_LIMIT;
+ break;
+
+ case PCRE_CONFIG_STACKRECURSE:
+#ifdef NO_RECURSE
+ *((int *)where) = 0;
+#else
+ *((int *)where) = 1;
+#endif
+ break;
+
+ default: return PCRE_ERROR_BADOPTION;
+ }
+
+return 0;
+}
+
+
+
+#ifdef DEBUG
+/*************************************************
+* Debugging function to print chars *
+*************************************************/
+
+/* Print a sequence of chars in printable format, stopping at the end of the
+subject if the requested.
+
+Arguments:
+ p points to characters
+ length number to print
+ is_subject TRUE if printing from within md->start_subject
+ md pointer to matching data block, if is_subject is TRUE
+
+Returns: nothing
+*/
+
+static void
+pchars(const uschar *p, int length, BOOL is_subject, match_data *md)
+{
+int c;
+if (is_subject && length > md->end_subject - p) length = md->end_subject - p;
+while (length-- > 0)
+ if (isprint(c = *(p++))) printf("%c", c); else printf("\\x%02x", c);
+}
+#endif
+
+
+
+
+/*************************************************
+* Handle escapes *
+*************************************************/
+
+/* This function is called when a \ has been encountered. It either returns a
+positive value for a simple escape such as \n, or a negative value which
+encodes one of the more complicated things such as \d. When UTF-8 is enabled,
+a positive value greater than 255 may be returned. On entry, ptr is pointing at
+the \. On exit, it is on the final character of the escape sequence.
+
+Arguments:
+ ptrptr points to the pattern position pointer
+ errorptr points to the pointer to the error message
+ bracount number of previous extracting brackets
+ options the options bits
+ isclass TRUE if inside a character class
+
+Returns: zero or positive => a data character
+ negative => a special escape sequence
+ on error, errorptr is set
+*/
+
+static int
+check_escape(const uschar **ptrptr, const char **errorptr, int bracount,
+ int options, BOOL isclass)
+{
+const uschar *ptr = *ptrptr;
+int c, i;
+
+/* If backslash is at the end of the pattern, it's an error. */
+
+c = *(++ptr);
+if (c == 0) *errorptr = ERR1;
+
+/* Non-alphamerics are literals. For digits or letters, do an initial lookup in
+a table. A non-zero result is something that can be returned immediately.
+Otherwise further processing may be required. */
+
+#if !EBCDIC /* ASCII coding */
+else if (c < '0' || c > 'z') {} /* Not alphameric */
+else if ((i = escapes[c - '0']) != 0) c = i;
+
+#else /* EBCDIC coding */
+else if (c < 'a' || (ebcdic_chartab[c] & 0x0E) == 0) {} /* Not alphameric */
+else if ((i = escapes[c - 0x48]) != 0) c = i;
+#endif
+
+/* Escapes that need further processing, or are illegal. */
+
+else
+ {
+ const uschar *oldptr;
+ switch (c)
+ {
+ /* A number of Perl escapes are not handled by PCRE. We give an explicit
+ error. */
+
+ case 'l':
+ case 'L':
+ case 'N':
+ case 'u':
+ case 'U':
+ *errorptr = ERR37;
+ break;
+
+ /* The handling of escape sequences consisting of a string of digits
+ starting with one that is not zero is not straightforward. By experiment,
+ the way Perl works seems to be as follows:
+
+ Outside a character class, the digits are read as a decimal number. If the
+ number is less than 10, or if there are that many previous extracting
+ left brackets, then it is a back reference. Otherwise, up to three octal
+ digits are read to form an escaped byte. Thus \123 is likely to be octal
+ 123 (cf \0123, which is octal 012 followed by the literal 3). If the octal
+ value is greater than 377, the least significant 8 bits are taken. Inside a
+ character class, \ followed by a digit is always an octal number. */
+
+ case '1': case '2': case '3': case '4': case '5':
+ case '6': case '7': case '8': case '9':
+
+ if (!isclass)
+ {
+ oldptr = ptr;
+ c -= '0';
+ while ((digitab[ptr[1]] & ctype_digit) != 0)
+ c = c * 10 + *(++ptr) - '0';
+ if (c < 10 || c <= bracount)
+ {
+ c = -(ESC_REF + c);
+ break;
+ }
+ ptr = oldptr; /* Put the pointer back and fall through */
+ }
+
+ /* Handle an octal number following \. If the first digit is 8 or 9, Perl
+ generates a binary zero byte and treats the digit as a following literal.
+ Thus we have to pull back the pointer by one. */
+
+ if ((c = *ptr) >= '8')
+ {
+ ptr--;
+ c = 0;
+ break;
+ }
+
+ /* \0 always starts an octal number, but we may drop through to here with a
+ larger first octal digit. */
+
+ case '0':
+ c -= '0';
+ while(i++ < 2 && ptr[1] >= '0' && ptr[1] <= '7')
+ c = c * 8 + *(++ptr) - '0';
+ c &= 255; /* Take least significant 8 bits */
+ break;
+
+ /* \x is complicated when UTF-8 is enabled. \x{ddd} is a character number
+ which can be greater than 0xff, but only if the ddd are hex digits. */
+
+ case 'x':
+#ifdef SUPPORT_UTF8
+ if (ptr[1] == '{' && (options & PCRE_UTF8) != 0)
+ {
+ const uschar *pt = ptr + 2;
+ register int count = 0;
+ c = 0;
+ while ((digitab[*pt] & ctype_xdigit) != 0)
+ {
+ int cc = *pt++;
+ count++;
+#if !EBCDIC /* ASCII coding */
+ if (cc >= 'a') cc -= 32; /* Convert to upper case */
+ c = c * 16 + cc - ((cc < 'A')? '0' : ('A' - 10));
+#else /* EBCDIC coding */
+ if (cc >= 'a' && cc <= 'z') cc += 64; /* Convert to upper case */
+ c = c * 16 + cc - ((cc >= '0')? '0' : ('A' - 10));
+#endif
+ }
+ if (*pt == '}')
+ {
+ if (c < 0 || count > 8) *errorptr = ERR34;
+ ptr = pt;
+ break;
+ }
+ /* If the sequence of hex digits does not end with '}', then we don't
+ recognize this construct; fall through to the normal \x handling. */
+ }
+#endif
+
+ /* Read just a single hex char */
+
+ c = 0;
+ while (i++ < 2 && (digitab[ptr[1]] & ctype_xdigit) != 0)
+ {
+ int cc; /* Some compilers don't like ++ */
+ cc = *(++ptr); /* in initializers */
+#if !EBCDIC /* ASCII coding */
+ if (cc >= 'a') cc -= 32; /* Convert to upper case */
+ c = c * 16 + cc - ((cc < 'A')? '0' : ('A' - 10));
+#else /* EBCDIC coding */
+ if (cc <= 'z') cc += 64; /* Convert to upper case */
+ c = c * 16 + cc - ((cc >= '0')? '0' : ('A' - 10));
+#endif
+ }
+ break;
+
+ /* Other special escapes not starting with a digit are straightforward */
+
+ case 'c':
+ c = *(++ptr);
+ if (c == 0)
+ {
+ *errorptr = ERR2;
+ return 0;
+ }
+
+ /* A letter is upper-cased; then the 0x40 bit is flipped. This coding
+ is ASCII-specific, but then the whole concept of \cx is ASCII-specific.
+ (However, an EBCDIC equivalent has now been added.) */
+
+#if !EBCDIC /* ASCII coding */
+ if (c >= 'a' && c <= 'z') c -= 32;
+ c ^= 0x40;
+#else /* EBCDIC coding */
+ if (c >= 'a' && c <= 'z') c += 64;
+ c ^= 0xC0;
+#endif
+ break;
+
+ /* PCRE_EXTRA enables extensions to Perl in the matter of escapes. Any
+ other alphameric following \ is an error if PCRE_EXTRA was set; otherwise,
+ for Perl compatibility, it is a literal. This code looks a bit odd, but
+ there used to be some cases other than the default, and there may be again
+ in future, so I haven't "optimized" it. */
+
+ default:
+ if ((options & PCRE_EXTRA) != 0) switch(c)
+ {
+ default:
+ *errorptr = ERR3;
+ break;
+ }
+ break;
+ }
+ }
+
+*ptrptr = ptr;
+return c;
+}
+
+
+
+#ifdef SUPPORT_UCP
+/*************************************************
+* Handle \P and \p *
+*************************************************/
+
+/* This function is called after \P or \p has been encountered, provided that
+PCRE is compiled with support for Unicode properties. On entry, ptrptr is
+pointing at the P or p. On exit, it is pointing at the final character of the
+escape sequence.
+
+Argument:
+ ptrptr points to the pattern position pointer
+ negptr points to a boolean that is set TRUE for negation else FALSE
+ errorptr points to the pointer to the error message
+
+Returns: value from ucp_type_table, or -1 for an invalid type
+*/
+
+static int
+get_ucp(const uschar **ptrptr, BOOL *negptr, const char **errorptr)
+{
+int c, i, bot, top;
+const uschar *ptr = *ptrptr;
+char name[4];
+
+c = *(++ptr);
+if (c == 0) goto ERROR_RETURN;
+
+*negptr = FALSE;
+
+/* \P or \p can be followed by a one- or two-character name in {}, optionally
+preceded by ^ for negation. */
+
+if (c == '{')
+ {
+ if (ptr[1] == '^')
+ {
+ *negptr = TRUE;
+ ptr++;
+ }
+ for (i = 0; i <= 2; i++)
+ {
+ c = *(++ptr);
+ if (c == 0) goto ERROR_RETURN;
+ if (c == '}') break;
+ name[i] = c;
+ }
+ if (c !='}') /* Try to distinguish error cases */
+ {
+ while (*(++ptr) != 0 && *ptr != '}');
+ if (*ptr == '}') goto UNKNOWN_RETURN; else goto ERROR_RETURN;
+ }
+ name[i] = 0;
+ }
+
+/* Otherwise there is just one following character */
+
+else
+ {
+ name[0] = c;
+ name[1] = 0;
+ }
+
+*ptrptr = ptr;
+
+/* Search for a recognized property name using binary chop */
+
+bot = 0;
+top = sizeof(utt)/sizeof(ucp_type_table);
+
+while (bot < top)
+ {
+ i = (bot + top)/2;
+ c = strcmp(name, utt[i].name);
+ if (c == 0) return utt[i].value;
+ if (c > 0) bot = i + 1; else top = i;
+ }
+
+UNKNOWN_RETURN:
+*errorptr = ERR47;
+*ptrptr = ptr;
+return -1;
+
+ERROR_RETURN:
+*errorptr = ERR46;
+*ptrptr = ptr;
+return -1;
+}
+#endif
+
+
+
+
+/*************************************************
+* Check for counted repeat *
+*************************************************/
+
+/* This function is called when a '{' is encountered in a place where it might
+start a quantifier. It looks ahead to see if it really is a quantifier or not.
+It is only a quantifier if it is one of the forms {ddd} {ddd,} or {ddd,ddd}
+where the ddds are digits.
+
+Arguments:
+ p pointer to the first char after '{'
+
+Returns: TRUE or FALSE
+*/
+
+static BOOL
+is_counted_repeat(const uschar *p)
+{
+if ((digitab[*p++] & ctype_digit) == 0) return FALSE;
+while ((digitab[*p] & ctype_digit) != 0) p++;
+if (*p == '}') return TRUE;
+
+if (*p++ != ',') return FALSE;
+if (*p == '}') return TRUE;
+
+if ((digitab[*p++] & ctype_digit) == 0) return FALSE;
+while ((digitab[*p] & ctype_digit) != 0) p++;
+
+return (*p == '}');
+}
+
+
+
+/*************************************************
+* Read repeat counts *
+*************************************************/
+
+/* Read an item of the form {n,m} and return the values. This is called only
+after is_counted_repeat() has confirmed that a repeat-count quantifier exists,
+so the syntax is guaranteed to be correct, but we need to check the values.
+
+Arguments:
+ p pointer to first char after '{'
+ minp pointer to int for min
+ maxp pointer to int for max
+ returned as -1 if no max
+ errorptr points to pointer to error message
+
+Returns: pointer to '}' on success;
+ current ptr on error, with errorptr set
+*/
+
+static const uschar *
+read_repeat_counts(const uschar *p, int *minp, int *maxp, const char **errorptr)
+{
+int min = 0;
+int max = -1;
+
+/* Read the minimum value and do a paranoid check: a negative value indicates
+an integer overflow. */
+
+while ((digitab[*p] & ctype_digit) != 0) min = min * 10 + *p++ - '0';
+if (min < 0 || min > 65535)
+ {
+ *errorptr = ERR5;
+ return p;
+ }
+
+/* Read the maximum value if there is one, and again do a paranoid on its size.
+Also, max must not be less than min. */
+
+if (*p == '}') max = min; else
+ {
+ if (*(++p) != '}')
+ {
+ max = 0;
+ while((digitab[*p] & ctype_digit) != 0) max = max * 10 + *p++ - '0';
+ if (max < 0 || max > 65535)
+ {
+ *errorptr = ERR5;
+ return p;
+ }
+ if (max < min)
+ {
+ *errorptr = ERR4;
+ return p;
+ }
+ }
+ }
+
+/* Fill in the required variables, and pass back the pointer to the terminating
+'}'. */
+
+*minp = min;
+*maxp = max;
+return p;
+}
+
+
+
+/*************************************************
+* Find first significant op code *
+*************************************************/
+
+/* This is called by several functions that scan a compiled expression looking
+for a fixed first character, or an anchoring op code etc. It skips over things
+that do not influence this. For some calls, a change of option is important.
+For some calls, it makes sense to skip negative forward and all backward
+assertions, and also the \b assertion; for others it does not.
+
+Arguments:
+ code pointer to the start of the group
+ options pointer to external options
+ optbit the option bit whose changing is significant, or
+ zero if none are
+ skipassert TRUE if certain assertions are to be skipped
+
+Returns: pointer to the first significant opcode
+*/
+
+static const uschar*
+first_significant_code(const uschar *code, int *options, int optbit,
+ BOOL skipassert)
+{
+for (;;)
+ {
+ switch ((int)*code)
+ {
+ case OP_OPT:
+ if (optbit > 0 && ((int)code[1] & optbit) != (*options & optbit))
+ *options = (int)code[1];
+ code += 2;
+ break;
+
+ case OP_ASSERT_NOT:
+ case OP_ASSERTBACK:
+ case OP_ASSERTBACK_NOT:
+ if (!skipassert) return code;
+ do code += GET(code, 1); while (*code == OP_ALT);
+ code += OP_lengths[*code];
+ break;
+
+ case OP_WORD_BOUNDARY:
+ case OP_NOT_WORD_BOUNDARY:
+ if (!skipassert) return code;
+ /* Fall through */
+
+ case OP_CALLOUT:
+ case OP_CREF:
+ case OP_BRANUMBER:
+ code += OP_lengths[*code];
+ break;
+
+ default:
+ return code;
+ }
+ }
+/* Control never reaches here */
+}
+
+
+
+
+/*************************************************
+* Find the fixed length of a pattern *
+*************************************************/
+
+/* Scan a pattern and compute the fixed length of subject that will match it,
+if the length is fixed. This is needed for dealing with backward assertions.
+In UTF8 mode, the result is in characters rather than bytes.
+
+Arguments:
+ code points to the start of the pattern (the bracket)
+ options the compiling options
+
+Returns: the fixed length, or -1 if there is no fixed length,
+ or -2 if \C was encountered
+*/
+
+static int
+find_fixedlength(uschar *code, int options)
+{
+int length = -1;
+
+register int branchlength = 0;
+register uschar *cc = code + 1 + LINK_SIZE;
+
+/* Scan along the opcodes for this branch. If we get to the end of the
+branch, check the length against that of the other branches. */
+
+for (;;)
+ {
+ int d;
+ register int op = *cc;
+ if (op >= OP_BRA) op = OP_BRA;
+
+ switch (op)
+ {
+ case OP_BRA:
+ case OP_ONCE:
+ case OP_COND:
+ d = find_fixedlength(cc, options);
+ if (d < 0) return d;
+ branchlength += d;
+ do cc += GET(cc, 1); while (*cc == OP_ALT);
+ cc += 1 + LINK_SIZE;
+ break;
+
+ /* Reached end of a branch; if it's a ket it is the end of a nested
+ call. If it's ALT it is an alternation in a nested call. If it is
+ END it's the end of the outer call. All can be handled by the same code. */
+
+ case OP_ALT:
+ case OP_KET:
+ case OP_KETRMAX:
+ case OP_KETRMIN:
+ case OP_END:
+ if (length < 0) length = branchlength;
+ else if (length != branchlength) return -1;
+ if (*cc != OP_ALT) return length;
+ cc += 1 + LINK_SIZE;
+ branchlength = 0;
+ break;
+
+ /* Skip over assertive subpatterns */
+
+ case OP_ASSERT:
+ case OP_ASSERT_NOT:
+ case OP_ASSERTBACK:
+ case OP_ASSERTBACK_NOT:
+ do cc += GET(cc, 1); while (*cc == OP_ALT);
+ /* Fall through */
+
+ /* Skip over things that don't match chars */
+
+ case OP_REVERSE:
+ case OP_BRANUMBER:
+ case OP_CREF:
+ case OP_OPT:
+ case OP_CALLOUT:
+ case OP_SOD:
+ case OP_SOM:
+ case OP_EOD:
+ case OP_EODN:
+ case OP_CIRC:
+ case OP_DOLL:
+ case OP_NOT_WORD_BOUNDARY:
+ case OP_WORD_BOUNDARY:
+ cc += OP_lengths[*cc];
+ break;
+
+ /* Handle literal characters */
+
+ case OP_CHAR:
+ case OP_CHARNC:
+ branchlength++;
+ cc += 2;
+#ifdef SUPPORT_UTF8
+ if ((options & PCRE_UTF8) != 0)
+ {
+ while ((*cc & 0xc0) == 0x80) cc++;
+ }
+#endif
+ break;
+
+ /* Handle exact repetitions. The count is already in characters, but we
+ need to skip over a multibyte character in UTF8 mode. */
+
+ case OP_EXACT:
+ branchlength += GET2(cc,1);
+ cc += 4;
+#ifdef SUPPORT_UTF8
+ if ((options & PCRE_UTF8) != 0)
+ {
+ while((*cc & 0x80) == 0x80) cc++;
+ }
+#endif
+ break;
+
+ case OP_TYPEEXACT:
+ branchlength += GET2(cc,1);
+ cc += 4;
+ break;
+
+ /* Handle single-char matchers */
+
+ case OP_PROP:
+ case OP_NOTPROP:
+ cc++;
+ /* Fall through */
+
+ case OP_NOT_DIGIT:
+ case OP_DIGIT:
+ case OP_NOT_WHITESPACE:
+ case OP_WHITESPACE:
+ case OP_NOT_WORDCHAR:
+ case OP_WORDCHAR:
+ case OP_ANY:
+ branchlength++;
+ cc++;
+ break;
+
+ /* The single-byte matcher isn't allowed */
+
+ case OP_ANYBYTE:
+ return -2;
+
+ /* Check a class for variable quantification */
+
+#ifdef SUPPORT_UTF8
+ case OP_XCLASS:
+ cc += GET(cc, 1) - 33;
+ /* Fall through */
+#endif
+
+ case OP_CLASS:
+ case OP_NCLASS:
+ cc += 33;
+
+ switch (*cc)
+ {
+ case OP_CRSTAR:
+ case OP_CRMINSTAR:
+ case OP_CRQUERY:
+ case OP_CRMINQUERY:
+ return -1;
+
+ case OP_CRRANGE:
+ case OP_CRMINRANGE:
+ if (GET2(cc,1) != GET2(cc,3)) return -1;
+ branchlength += GET2(cc,1);
+ cc += 5;
+ break;
+
+ default:
+ branchlength++;
+ }
+ break;
+
+ /* Anything else is variable length */
+
+ default:
+ return -1;
+ }
+ }
+/* Control never gets here */
+}
+
+
+
+
+/*************************************************
+* Scan compiled regex for numbered bracket *
+*************************************************/
+
+/* This little function scans through a compiled pattern until it finds a
+capturing bracket with the given number.
+
+Arguments:
+ code points to start of expression
+ utf8 TRUE in UTF-8 mode
+ number the required bracket number
+
+Returns: pointer to the opcode for the bracket, or NULL if not found
+*/
+
+static const uschar *
+find_bracket(const uschar *code, BOOL utf8, int number)
+{
+#ifndef SUPPORT_UTF8
+utf8 = utf8; /* Stop pedantic compilers complaining */
+#endif
+
+for (;;)
+ {
+ register int c = *code;
+ if (c == OP_END) return NULL;
+ else if (c > OP_BRA)
+ {
+ int n = c - OP_BRA;
+ if (n > EXTRACT_BASIC_MAX) n = GET2(code, 2+LINK_SIZE);
+ if (n == number) return (uschar *)code;
+ code += OP_lengths[OP_BRA];
+ }
+ else
+ {
+ code += OP_lengths[c];
+
+#ifdef SUPPORT_UTF8
+
+ /* In UTF-8 mode, opcodes that are followed by a character may be followed
+ by a multi-byte character. The length in the table is a minimum, so we have
+ to scan along to skip the extra bytes. All opcodes are less than 128, so we
+ can use relatively efficient code. */
+
+ if (utf8) switch(c)
+ {
+ case OP_CHAR:
+ case OP_CHARNC:
+ case OP_EXACT:
+ case OP_UPTO:
+ case OP_MINUPTO:
+ case OP_STAR:
+ case OP_MINSTAR:
+ case OP_PLUS:
+ case OP_MINPLUS:
+ case OP_QUERY:
+ case OP_MINQUERY:
+ while ((*code & 0xc0) == 0x80) code++;
+ break;
+
+ /* XCLASS is used for classes that cannot be represented just by a bit
+ map. This includes negated single high-valued characters. The length in
+ the table is zero; the actual length is stored in the compiled code. */
+
+ case OP_XCLASS:
+ code += GET(code, 1) + 1;
+ break;
+ }
+#endif
+ }
+ }
+}
+
+
+
+/*************************************************
+* Scan compiled regex for recursion reference *
+*************************************************/
+
+/* This little function scans through a compiled pattern until it finds an
+instance of OP_RECURSE.
+
+Arguments:
+ code points to start of expression
+ utf8 TRUE in UTF-8 mode
+
+Returns: pointer to the opcode for OP_RECURSE, or NULL if not found
+*/
+
+static const uschar *
+find_recurse(const uschar *code, BOOL utf8)
+{
+#ifndef SUPPORT_UTF8
+utf8 = utf8; /* Stop pedantic compilers complaining */
+#endif
+
+for (;;)
+ {
+ register int c = *code;
+ if (c == OP_END) return NULL;
+ else if (c == OP_RECURSE) return code;
+ else if (c > OP_BRA)
+ {
+ code += OP_lengths[OP_BRA];
+ }
+ else
+ {
+ code += OP_lengths[c];
+
+#ifdef SUPPORT_UTF8
+
+ /* In UTF-8 mode, opcodes that are followed by a character may be followed
+ by a multi-byte character. The length in the table is a minimum, so we have
+ to scan along to skip the extra bytes. All opcodes are less than 128, so we
+ can use relatively efficient code. */
+
+ if (utf8) switch(c)
+ {
+ case OP_CHAR:
+ case OP_CHARNC:
+ case OP_EXACT:
+ case OP_UPTO:
+ case OP_MINUPTO:
+ case OP_STAR:
+ case OP_MINSTAR:
+ case OP_PLUS:
+ case OP_MINPLUS:
+ case OP_QUERY:
+ case OP_MINQUERY:
+ while ((*code & 0xc0) == 0x80) code++;
+ break;
+
+ /* XCLASS is used for classes that cannot be represented just by a bit
+ map. This includes negated single high-valued characters. The length in
+ the table is zero; the actual length is stored in the compiled code. */
+
+ case OP_XCLASS:
+ code += GET(code, 1) + 1;
+ break;
+ }
+#endif
+ }
+ }
+}
+
+
+
+/*************************************************
+* Scan compiled branch for non-emptiness *
+*************************************************/
+
+/* This function scans through a branch of a compiled pattern to see whether it
+can match the empty string or not. It is called only from could_be_empty()
+below. Note that first_significant_code() skips over assertions. If we hit an
+unclosed bracket, we return "empty" - this means we've struck an inner bracket
+whose current branch will already have been scanned.
+
+Arguments:
+ code points to start of search
+ endcode points to where to stop
+ utf8 TRUE if in UTF8 mode
+
+Returns: TRUE if what is matched could be empty
+*/
+
+static BOOL
+could_be_empty_branch(const uschar *code, const uschar *endcode, BOOL utf8)
+{
+register int c;
+for (code = first_significant_code(code + 1 + LINK_SIZE, NULL, 0, TRUE);
+ code < endcode;
+ code = first_significant_code(code + OP_lengths[c], NULL, 0, TRUE))
+ {
+ const uschar *ccode;
+
+ c = *code;
+
+ if (c >= OP_BRA)
+ {
+ BOOL empty_branch;
+ if (GET(code, 1) == 0) return TRUE; /* Hit unclosed bracket */
+
+ /* Scan a closed bracket */
+
+ empty_branch = FALSE;
+ do
+ {
+ if (!empty_branch && could_be_empty_branch(code, endcode, utf8))
+ empty_branch = TRUE;
+ code += GET(code, 1);
+ }
+ while (*code == OP_ALT);
+ if (!empty_branch) return FALSE; /* All branches are non-empty */
+ code += 1 + LINK_SIZE;
+ c = *code;
+ }
+
+ else switch (c)
+ {
+ /* Check for quantifiers after a class */
+
+#ifdef SUPPORT_UTF8
+ case OP_XCLASS:
+ ccode = code + GET(code, 1);
+ goto CHECK_CLASS_REPEAT;
+#endif
+
+ case OP_CLASS:
+ case OP_NCLASS:
+ ccode = code + 33;
+
+#ifdef SUPPORT_UTF8
+ CHECK_CLASS_REPEAT:
+#endif
+
+ switch (*ccode)
+ {
+ case OP_CRSTAR: /* These could be empty; continue */
+ case OP_CRMINSTAR:
+ case OP_CRQUERY:
+ case OP_CRMINQUERY:
+ break;
+
+ default: /* Non-repeat => class must match */
+ case OP_CRPLUS: /* These repeats aren't empty */
+ case OP_CRMINPLUS:
+ return FALSE;
+
+ case OP_CRRANGE:
+ case OP_CRMINRANGE:
+ if (GET2(ccode, 1) > 0) return FALSE; /* Minimum > 0 */
+ break;
+ }
+ break;
+
+ /* Opcodes that must match a character */
+
+ case OP_PROP:
+ case OP_NOTPROP:
+ case OP_EXTUNI:
+ case OP_NOT_DIGIT:
+ case OP_DIGIT:
+ case OP_NOT_WHITESPACE:
+ case OP_WHITESPACE:
+ case OP_NOT_WORDCHAR:
+ case OP_WORDCHAR:
+ case OP_ANY:
+ case OP_ANYBYTE:
+ case OP_CHAR:
+ case OP_CHARNC:
+ case OP_NOT:
+ case OP_PLUS:
+ case OP_MINPLUS:
+ case OP_EXACT:
+ case OP_NOTPLUS:
+ case OP_NOTMINPLUS:
+ case OP_NOTEXACT:
+ case OP_TYPEPLUS:
+ case OP_TYPEMINPLUS:
+ case OP_TYPEEXACT:
+ return FALSE;
+
+ /* End of branch */
+
+ case OP_KET:
+ case OP_KETRMAX:
+ case OP_KETRMIN:
+ case OP_ALT:
+ return TRUE;
+
+ /* In UTF-8 mode, STAR, MINSTAR, QUERY, MINQUERY, UPTO, and MINUPTO may be
+ followed by a multibyte character */
+
+#ifdef SUPPORT_UTF8
+ case OP_STAR:
+ case OP_MINSTAR:
+ case OP_QUERY:
+ case OP_MINQUERY:
+ case OP_UPTO:
+ case OP_MINUPTO:
+ if (utf8) while ((code[2] & 0xc0) == 0x80) code++;
+ break;
+#endif
+ }
+ }
+
+return TRUE;
+}
+
+
+
+/*************************************************
+* Scan compiled regex for non-emptiness *
+*************************************************/
+
+/* This function is called to check for left recursive calls. We want to check
+the current branch of the current pattern to see if it could match the empty
+string. If it could, we must look outwards for branches at other levels,
+stopping when we pass beyond the bracket which is the subject of the recursion.
+
+Arguments:
+ code points to start of the recursion
+ endcode points to where to stop (current RECURSE item)
+ bcptr points to the chain of current (unclosed) branch starts
+ utf8 TRUE if in UTF-8 mode
+
+Returns: TRUE if what is matched could be empty
+*/
+
+static BOOL
+could_be_empty(const uschar *code, const uschar *endcode, branch_chain *bcptr,
+ BOOL utf8)
+{
+while (bcptr != NULL && bcptr->current >= code)
+ {
+ if (!could_be_empty_branch(bcptr->current, endcode, utf8)) return FALSE;
+ bcptr = bcptr->outer;
+ }
+return TRUE;
+}
+
+
+
+/*************************************************
+* Check for POSIX class syntax *
+*************************************************/
+
+/* This function is called when the sequence "[:" or "[." or "[=" is
+encountered in a character class. It checks whether this is followed by an
+optional ^ and then a sequence of letters, terminated by a matching ":]" or
+".]" or "=]".
+
+Argument:
+ ptr pointer to the initial [
+ endptr where to return the end pointer
+ cd pointer to compile data
+
+Returns: TRUE or FALSE
+*/
+
+static BOOL
+check_posix_syntax(const uschar *ptr, const uschar **endptr, compile_data *cd)
+{
+int terminator; /* Don't combine these lines; the Solaris cc */
+terminator = *(++ptr); /* compiler warns about "non-constant" initializer. */
+if (*(++ptr) == '^') ptr++;
+while ((cd->ctypes[*ptr] & ctype_letter) != 0) ptr++;
+if (*ptr == terminator && ptr[1] == ']')
+ {
+ *endptr = ptr;
+ return TRUE;
+ }
+return FALSE;
+}
+
+
+
+
+/*************************************************
+* Check POSIX class name *
+*************************************************/
+
+/* This function is called to check the name given in a POSIX-style class entry
+such as [:alnum:].
+
+Arguments:
+ ptr points to the first letter
+ len the length of the name
+
+Returns: a value representing the name, or -1 if unknown
+*/
+
+static int
+check_posix_name(const uschar *ptr, int len)
+{
+register int yield = 0;
+while (posix_name_lengths[yield] != 0)
+ {
+ if (len == posix_name_lengths[yield] &&
+ strncmp((const char *)ptr, posix_names[yield], len) == 0) return yield;
+ yield++;
+ }
+return -1;
+}
+
+
+/*************************************************
+* Adjust OP_RECURSE items in repeated group *
+*************************************************/
+
+/* OP_RECURSE items contain an offset from the start of the regex to the group
+that is referenced. This means that groups can be replicated for fixed
+repetition simply by copying (because the recursion is allowed to refer to
+earlier groups that are outside the current group). However, when a group is
+optional (i.e. the minimum quantifier is zero), OP_BRAZERO is inserted before
+it, after it has been compiled. This means that any OP_RECURSE items within it
+that refer to the group itself or any contained groups have to have their
+offsets adjusted. That is the job of this function. Before it is called, the
+partially compiled regex must be temporarily terminated with OP_END.
+
+Arguments:
+ group points to the start of the group
+ adjust the amount by which the group is to be moved
+ utf8 TRUE in UTF-8 mode
+ cd contains pointers to tables etc.
+
+Returns: nothing
+*/
+
+static void
+adjust_recurse(uschar *group, int adjust, BOOL utf8, compile_data *cd)
+{
+uschar *ptr = group;
+while ((ptr = (uschar *)find_recurse(ptr, utf8)) != NULL)
+ {
+ int offset = GET(ptr, 1);
+ if (cd->start_code + offset >= group) PUT(ptr, 1, offset + adjust);
+ ptr += 1 + LINK_SIZE;
+ }
+}
+
+
+
+/*************************************************
+* Insert an automatic callout point *
+*************************************************/
+
+/* This function is called when the PCRE_AUTO_CALLOUT option is set, to insert
+callout points before each pattern item.
+
+Arguments:
+ code current code pointer
+ ptr current pattern pointer
+ cd pointers to tables etc
+
+Returns: new code pointer
+*/
+
+static uschar *
+auto_callout(uschar *code, const uschar *ptr, compile_data *cd)
+{
+*code++ = OP_CALLOUT;
+*code++ = 255;
+PUT(code, 0, ptr - cd->start_pattern); /* Pattern offset */
+PUT(code, LINK_SIZE, 0); /* Default length */
+return code + 2*LINK_SIZE;
+}
+
+
+
+/*************************************************
+* Complete a callout item *
+*************************************************/
+
+/* A callout item contains the length of the next item in the pattern, which
+we can't fill in till after we have reached the relevant point. This is used
+for both automatic and manual callouts.
+
+Arguments:
+ previous_callout points to previous callout item
+ ptr current pattern pointer
+ cd pointers to tables etc
+
+Returns: nothing
+*/
+
+static void
+complete_callout(uschar *previous_callout, const uschar *ptr, compile_data *cd)
+{
+int length = ptr - cd->start_pattern - GET(previous_callout, 2);
+PUT(previous_callout, 2 + LINK_SIZE, length);
+}
+
+
+
+#ifdef SUPPORT_UCP
+/*************************************************
+* Get othercase range *
+*************************************************/
+
+/* This function is passed the start and end of a class range, in UTF-8 mode
+with UCP support. It searches up the characters, looking for internal ranges of
+characters in the "other" case. Each call returns the next one, updating the
+start address.
+
+Arguments:
+ cptr points to starting character value; updated
+ d end value
+ ocptr where to put start of othercase range
+ odptr where to put end of othercase range
+
+Yield: TRUE when range returned; FALSE when no more
+*/
+
+static BOOL
+get_othercase_range(int *cptr, int d, int *ocptr, int *odptr)
+{
+int c, chartype, othercase, next;
+
+for (c = *cptr; c <= d; c++)
+ {
+ if (ucp_findchar(c, &chartype, &othercase) == ucp_L && othercase != 0) break;
+ }
+
+if (c > d) return FALSE;
+
+*ocptr = othercase;
+next = othercase + 1;
+
+for (++c; c <= d; c++)
+ {
+ if (ucp_findchar(c, &chartype, &othercase) != ucp_L || othercase != next)
+ break;
+ next++;
+ }
+
+*odptr = next - 1;
+*cptr = c;
+
+return TRUE;
+}
+#endif /* SUPPORT_UCP */
+
+
+/*************************************************
+* Compile one branch *
+*************************************************/
+
+/* Scan the pattern, compiling it into the code vector. If the options are
+changed during the branch, the pointer is used to change the external options
+bits.
+
+Arguments:
+ optionsptr pointer to the option bits
+ brackets points to number of extracting brackets used
+ codeptr points to the pointer to the current code point
+ ptrptr points to the current pattern pointer
+ errorptr points to pointer to error message
+ firstbyteptr set to initial literal character, or < 0 (REQ_UNSET, REQ_NONE)
+ reqbyteptr set to the last literal character required, else < 0
+ bcptr points to current branch chain
+ cd contains pointers to tables etc.
+
+Returns: TRUE on success
+ FALSE, with *errorptr set on error
+*/
+
+static BOOL
+compile_branch(int *optionsptr, int *brackets, uschar **codeptr,
+ const uschar **ptrptr, const char **errorptr, int *firstbyteptr,
+ int *reqbyteptr, branch_chain *bcptr, compile_data *cd)
+{
+int repeat_type, op_type;
+int repeat_min = 0, repeat_max = 0; /* To please picky compilers */
+int bravalue = 0;
+int greedy_default, greedy_non_default;
+int firstbyte, reqbyte;
+int zeroreqbyte, zerofirstbyte;
+int req_caseopt, reqvary, tempreqvary;
+int condcount = 0;
+int options = *optionsptr;
+int after_manual_callout = 0;
+register int c;
+register uschar *code = *codeptr;
+uschar *tempcode;
+BOOL inescq = FALSE;
+BOOL groupsetfirstbyte = FALSE;
+const uschar *ptr = *ptrptr;
+const uschar *tempptr;
+uschar *previous = NULL;
+uschar *previous_callout = NULL;
+uschar classbits[32];
+
+#ifdef SUPPORT_UTF8
+BOOL class_utf8;
+BOOL utf8 = (options & PCRE_UTF8) != 0;
+uschar *class_utf8data;
+uschar utf8_char[6];
+#else
+BOOL utf8 = FALSE;
+#endif
+
+/* Set up the default and non-default settings for greediness */
+
+greedy_default = ((options & PCRE_UNGREEDY) != 0);
+greedy_non_default = greedy_default ^ 1;
+
+/* Initialize no first byte, no required byte. REQ_UNSET means "no char
+matching encountered yet". It gets changed to REQ_NONE if we hit something that
+matches a non-fixed char first char; reqbyte just remains unset if we never
+find one.
+
+When we hit a repeat whose minimum is zero, we may have to adjust these values
+to take the zero repeat into account. This is implemented by setting them to
+zerofirstbyte and zeroreqbyte when such a repeat is encountered. The individual
+item types that can be repeated set these backoff variables appropriately. */
+
+firstbyte = reqbyte = zerofirstbyte = zeroreqbyte = REQ_UNSET;
+
+/* The variable req_caseopt contains either the REQ_CASELESS value or zero,
+according to the current setting of the caseless flag. REQ_CASELESS is a bit
+value > 255. It is added into the firstbyte or reqbyte variables to record the
+case status of the value. This is used only for ASCII characters. */
+
+req_caseopt = ((options & PCRE_CASELESS) != 0)? REQ_CASELESS : 0;
+
+/* Switch on next character until the end of the branch */
+
+for (;; ptr++)
+ {
+ BOOL negate_class;
+ BOOL possessive_quantifier;
+ BOOL is_quantifier;
+ int class_charcount;
+ int class_lastchar;
+ int newoptions;
+ int recno;
+ int skipbytes;
+ int subreqbyte;
+ int subfirstbyte;
+ int mclength;
+ uschar mcbuffer[8];
+
+ /* Next byte in the pattern */
+
+ c = *ptr;
+
+ /* If in \Q...\E, check for the end; if not, we have a literal */
+
+ if (inescq && c != 0)
+ {
+ if (c == '\\' && ptr[1] == 'E')
+ {
+ inescq = FALSE;
+ ptr++;
+ continue;
+ }
+ else
+ {
+ if (previous_callout != NULL)
+ {
+ complete_callout(previous_callout, ptr, cd);
+ previous_callout = NULL;
+ }
+ if ((options & PCRE_AUTO_CALLOUT) != 0)
+ {
+ previous_callout = code;
+ code = auto_callout(code, ptr, cd);
+ }
+ goto NORMAL_CHAR;
+ }
+ }
+
+ /* Fill in length of a previous callout, except when the next thing is
+ a quantifier. */
+
+ is_quantifier = c == '*' || c == '+' || c == '?' ||
+ (c == '{' && is_counted_repeat(ptr+1));
+
+ if (!is_quantifier && previous_callout != NULL &&
+ after_manual_callout-- <= 0)
+ {
+ complete_callout(previous_callout, ptr, cd);
+ previous_callout = NULL;
+ }
+
+ /* In extended mode, skip white space and comments */
+
+ if ((options & PCRE_EXTENDED) != 0)
+ {
+ if ((cd->ctypes[c] & ctype_space) != 0) continue;
+ if (c == '#')
+ {
+ /* The space before the ; is to avoid a warning on a silly compiler
+ on the Macintosh. */
+ while ((c = *(++ptr)) != 0 && c != NEWLINE) ;
+ if (c != 0) continue; /* Else fall through to handle end of string */
+ }
+ }
+
+ /* No auto callout for quantifiers. */
+
+ if ((options & PCRE_AUTO_CALLOUT) != 0 && !is_quantifier)
+ {
+ previous_callout = code;
+ code = auto_callout(code, ptr, cd);
+ }
+
+ switch(c)
+ {
+ /* The branch terminates at end of string, |, or ). */
+
+ case 0:
+ case '|':
+ case ')':
+ *firstbyteptr = firstbyte;
+ *reqbyteptr = reqbyte;
+ *codeptr = code;
+ *ptrptr = ptr;
+ return TRUE;
+
+ /* Handle single-character metacharacters. In multiline mode, ^ disables
+ the setting of any following char as a first character. */
+
+ case '^':
+ if ((options & PCRE_MULTILINE) != 0)
+ {
+ if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE;
+ }
+ previous = NULL;
+ *code++ = OP_CIRC;
+ break;
+
+ case '$':
+ previous = NULL;
+ *code++ = OP_DOLL;
+ break;
+
+ /* There can never be a first char if '.' is first, whatever happens about
+ repeats. The value of reqbyte doesn't change either. */
+
+ case '.':
+ if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE;
+ zerofirstbyte = firstbyte;
+ zeroreqbyte = reqbyte;
+ previous = code;
+ *code++ = OP_ANY;
+ break;
+
+ /* Character classes. If the included characters are all < 255 in value, we
+ build a 32-byte bitmap of the permitted characters, except in the special
+ case where there is only one such character. For negated classes, we build
+ the map as usual, then invert it at the end. However, we use a different
+ opcode so that data characters > 255 can be handled correctly.
+
+ If the class contains characters outside the 0-255 range, a different
+ opcode is compiled. It may optionally have a bit map for characters < 256,
+ but those above are are explicitly listed afterwards. A flag byte tells
+ whether the bitmap is present, and whether this is a negated class or not.
+ */
+
+ case '[':
+ previous = code;
+
+ /* PCRE supports POSIX class stuff inside a class. Perl gives an error if
+ they are encountered at the top level, so we'll do that too. */
+
+ if ((ptr[1] == ':' || ptr[1] == '.' || ptr[1] == '=') &&
+ check_posix_syntax(ptr, &tempptr, cd))
+ {
+ *errorptr = (ptr[1] == ':')? ERR13 : ERR31;
+ goto FAILED;
+ }
+
+ /* If the first character is '^', set the negation flag and skip it. */
+
+ if ((c = *(++ptr)) == '^')
+ {
+ negate_class = TRUE;
+ c = *(++ptr);
+ }
+ else
+ {
+ negate_class = FALSE;
+ }
+
+ /* Keep a count of chars with values < 256 so that we can optimize the case
+ of just a single character (as long as it's < 256). For higher valued UTF-8
+ characters, we don't yet do any optimization. */
+
+ class_charcount = 0;
+ class_lastchar = -1;
+
+#ifdef SUPPORT_UTF8
+ class_utf8 = FALSE; /* No chars >= 256 */
+ class_utf8data = code + LINK_SIZE + 34; /* For UTF-8 items */
+#endif
+
+ /* Initialize the 32-char bit map to all zeros. We have to build the
+ map in a temporary bit of store, in case the class contains only 1
+ character (< 256), because in that case the compiled code doesn't use the
+ bit map. */
+
+ memset(classbits, 0, 32 * sizeof(uschar));
+
+ /* Process characters until ] is reached. By writing this as a "do" it
+ means that an initial ] is taken as a data character. The first pass
+ through the regex checked the overall syntax, so we don't need to be very
+ strict here. At the start of the loop, c contains the first byte of the
+ character. */
+
+ do
+ {
+#ifdef SUPPORT_UTF8
+ if (utf8 && c > 127)
+ { /* Braces are required because the */
+ GETCHARLEN(c, ptr, ptr); /* macro generates multiple statements */
+ }
+#endif
+
+ /* Inside \Q...\E everything is literal except \E */
+
+ if (inescq)
+ {
+ if (c == '\\' && ptr[1] == 'E')
+ {
+ inescq = FALSE;
+ ptr++;
+ continue;
+ }
+ else goto LONE_SINGLE_CHARACTER;
+ }
+
+ /* Handle POSIX class names. Perl allows a negation extension of the
+ form [:^name:]. A square bracket that doesn't match the syntax is
+ treated as a literal. We also recognize the POSIX constructions
+ [.ch.] and [=ch=] ("collating elements") and fault them, as Perl
+ 5.6 and 5.8 do. */
+
+ if (c == '[' &&
+ (ptr[1] == ':' || ptr[1] == '.' || ptr[1] == '=') &&
+ check_posix_syntax(ptr, &tempptr, cd))
+ {
+ BOOL local_negate = FALSE;
+ int posix_class, i;
+ register const uschar *cbits = cd->cbits;
+
+ if (ptr[1] != ':')
+ {
+ *errorptr = ERR31;
+ goto FAILED;
+ }
+
+ ptr += 2;
+ if (*ptr == '^')
+ {
+ local_negate = TRUE;
+ ptr++;
+ }
+
+ posix_class = check_posix_name(ptr, tempptr - ptr);
+ if (posix_class < 0)
+ {
+ *errorptr = ERR30;
+ goto FAILED;
+ }
+
+ /* If matching is caseless, upper and lower are converted to
+ alpha. This relies on the fact that the class table starts with
+ alpha, lower, upper as the first 3 entries. */
+
+ if ((options & PCRE_CASELESS) != 0 && posix_class <= 2)
+ posix_class = 0;
+
+ /* Or into the map we are building up to 3 of the static class
+ tables, or their negations. The [:blank:] class sets up the same
+ chars as the [:space:] class (all white space). We remove the vertical
+ white space chars afterwards. */
+
+ posix_class *= 3;
+ for (i = 0; i < 3; i++)
+ {
+ BOOL blankclass = strncmp((char *)ptr, "blank", 5) == 0;
+ int taboffset = posix_class_maps[posix_class + i];
+ if (taboffset < 0) break;
+ if (local_negate)
+ {
+ if (i == 0)
+ for (c = 0; c < 32; c++) classbits[c] |= ~cbits[c+taboffset];
+ else
+ for (c = 0; c < 32; c++) classbits[c] &= ~cbits[c+taboffset];
+ if (blankclass) classbits[1] |= 0x3c;
+ }
+ else
+ {
+ for (c = 0; c < 32; c++) classbits[c] |= cbits[c+taboffset];
+ if (blankclass) classbits[1] &= ~0x3c;
+ }
+ }
+
+ ptr = tempptr + 1;
+ class_charcount = 10; /* Set > 1; assumes more than 1 per class */
+ continue; /* End of POSIX syntax handling */
+ }
+
+ /* Backslash may introduce a single character, or it may introduce one
+ of the specials, which just set a flag. Escaped items are checked for
+ validity in the pre-compiling pass. The sequence \b is a special case.
+ Inside a class (and only there) it is treated as backspace. Elsewhere
+ it marks a word boundary. Other escapes have preset maps ready to
+ or into the one we are building. We assume they have more than one
+ character in them, so set class_charcount bigger than one. */
+
+ if (c == '\\')
+ {
+ c = check_escape(&ptr, errorptr, *brackets, options, TRUE);
+
+ if (-c == ESC_b) c = '\b'; /* \b is backslash in a class */
+ else if (-c == ESC_X) c = 'X'; /* \X is literal X in a class */
+ else if (-c == ESC_Q) /* Handle start of quoted string */
+ {
+ if (ptr[1] == '\\' && ptr[2] == 'E')
+ {
+ ptr += 2; /* avoid empty string */
+ }
+ else inescq = TRUE;
+ continue;
+ }
+
+ if (c < 0)
+ {
+ register const uschar *cbits = cd->cbits;
+ class_charcount += 2; /* Greater than 1 is what matters */
+ switch (-c)
+ {
+ case ESC_d:
+ for (c = 0; c < 32; c++) classbits[c] |= cbits[c+cbit_digit];
+ continue;
+
+ case ESC_D:
+ for (c = 0; c < 32; c++) classbits[c] |= ~cbits[c+cbit_digit];
+ continue;
+
+ case ESC_w:
+ for (c = 0; c < 32; c++) classbits[c] |= cbits[c+cbit_word];
+ continue;
+
+ case ESC_W:
+ for (c = 0; c < 32; c++) classbits[c] |= ~cbits[c+cbit_word];
+ continue;
+
+ case ESC_s:
+ for (c = 0; c < 32; c++) classbits[c] |= cbits[c+cbit_space];
+ classbits[1] &= ~0x08; /* Perl 5.004 onwards omits VT from \s */
+ continue;
+
+ case ESC_S:
+ for (c = 0; c < 32; c++) classbits[c] |= ~cbits[c+cbit_space];
+ classbits[1] |= 0x08; /* Perl 5.004 onwards omits VT from \s */
+ continue;
+
+#ifdef SUPPORT_UCP
+ case ESC_p:
+ case ESC_P:
+ {
+ BOOL negated;
+ int property = get_ucp(&ptr, &negated, errorptr);
+ if (property < 0) goto FAILED;
+ class_utf8 = TRUE;
+ *class_utf8data++ = ((-c == ESC_p) != negated)?
+ XCL_PROP : XCL_NOTPROP;
+ *class_utf8data++ = property;
+ class_charcount -= 2; /* Not a < 256 character */
+ }
+ continue;
+#endif
+
+ /* Unrecognized escapes are faulted if PCRE is running in its
+ strict mode. By default, for compatibility with Perl, they are
+ treated as literals. */
+
+ default:
+ if ((options & PCRE_EXTRA) != 0)
+ {
+ *errorptr = ERR7;
+ goto FAILED;
+ }
+ c = *ptr; /* The final character */
+ class_charcount -= 2; /* Undo the default count from above */
+ }
+ }
+
+ /* Fall through if we have a single character (c >= 0). This may be
+ > 256 in UTF-8 mode. */
+
+ } /* End of backslash handling */
+
+ /* A single character may be followed by '-' to form a range. However,
+ Perl does not permit ']' to be the end of the range. A '-' character
+ here is treated as a literal. */
+
+ if (ptr[1] == '-' && ptr[2] != ']')
+ {
+ int d;
+ ptr += 2;
+
+#ifdef SUPPORT_UTF8
+ if (utf8)
+ { /* Braces are required because the */
+ GETCHARLEN(d, ptr, ptr); /* macro generates multiple statements */
+ }
+ else
+#endif
+ d = *ptr; /* Not UTF-8 mode */
+
+ /* The second part of a range can be a single-character escape, but
+ not any of the other escapes. Perl 5.6 treats a hyphen as a literal
+ in such circumstances. */
+
+ if (d == '\\')
+ {
+ const uschar *oldptr = ptr;
+ d = check_escape(&ptr, errorptr, *brackets, options, TRUE);
+
+ /* \b is backslash; \X is literal X; any other special means the '-'
+ was literal */
+
+ if (d < 0)
+ {
+ if (d == -ESC_b) d = '\b';
+ else if (d == -ESC_X) d = 'X'; else
+ {
+ ptr = oldptr - 2;
+ goto LONE_SINGLE_CHARACTER; /* A few lines below */
+ }
+ }
+ }
+
+ /* The check that the two values are in the correct order happens in
+ the pre-pass. Optimize one-character ranges */
+
+ if (d == c) goto LONE_SINGLE_CHARACTER; /* A few lines below */
+
+ /* In UTF-8 mode, if the upper limit is > 255, or > 127 for caseless
+ matching, we have to use an XCLASS with extra data items. Caseless
+ matching for characters > 127 is available only if UCP support is
+ available. */
+
+#ifdef SUPPORT_UTF8
+ if (utf8 && (d > 255 || ((options & PCRE_CASELESS) != 0 && d > 127)))
+ {
+ class_utf8 = TRUE;
+
+ /* With UCP support, we can find the other case equivalents of
+ the relevant characters. There may be several ranges. Optimize how
+ they fit with the basic range. */
+
+#ifdef SUPPORT_UCP
+ if ((options & PCRE_CASELESS) != 0)
+ {
+ int occ, ocd;
+ int cc = c;
+ int origd = d;
+ while (get_othercase_range(&cc, origd, &occ, &ocd))
+ {
+ if (occ >= c && ocd <= d) continue; /* Skip embedded ranges */
+
+ if (occ < c && ocd >= c - 1) /* Extend the basic range */
+ { /* if there is overlap, */
+ c = occ; /* noting that if occ < c */
+ continue; /* we can't have ocd > d */
+ } /* because a subrange is */
+ if (ocd > d && occ <= d + 1) /* always shorter than */
+ { /* the basic range. */
+ d = ocd;
+ continue;
+ }
+
+ if (occ == ocd)
+ {
+ *class_utf8data++ = XCL_SINGLE;
+ }
+ else
+ {
+ *class_utf8data++ = XCL_RANGE;
+ class_utf8data += ord2utf8(occ, class_utf8data);
+ }
+ class_utf8data += ord2utf8(ocd, class_utf8data);
+ }
+ }
+#endif /* SUPPORT_UCP */
+
+ /* Now record the original range, possibly modified for UCP caseless
+ overlapping ranges. */
+
+ *class_utf8data++ = XCL_RANGE;
+ class_utf8data += ord2utf8(c, class_utf8data);
+ class_utf8data += ord2utf8(d, class_utf8data);
+
+ /* With UCP support, we are done. Without UCP support, there is no
+ caseless matching for UTF-8 characters > 127; we can use the bit map
+ for the smaller ones. */
+
+#ifdef SUPPORT_UCP
+ continue; /* With next character in the class */
+#else
+ if ((options & PCRE_CASELESS) == 0 || c > 127) continue;
+
+ /* Adjust upper limit and fall through to set up the map */
+
+ d = 127;
+
+#endif /* SUPPORT_UCP */
+ }
+#endif /* SUPPORT_UTF8 */
+
+ /* We use the bit map for all cases when not in UTF-8 mode; else
+ ranges that lie entirely within 0-127 when there is UCP support; else
+ for partial ranges without UCP support. */
+
+ for (; c <= d; c++)
+ {
+ classbits[c/8] |= (1 << (c&7));
+ if ((options & PCRE_CASELESS) != 0)
+ {
+ int uc = cd->fcc[c]; /* flip case */
+ classbits[uc/8] |= (1 << (uc&7));
+ }
+ class_charcount++; /* in case a one-char range */
+ class_lastchar = c;
+ }
+
+ continue; /* Go get the next char in the class */
+ }
+
+ /* Handle a lone single character - we can get here for a normal
+ non-escape char, or after \ that introduces a single character or for an
+ apparent range that isn't. */
+
+ LONE_SINGLE_CHARACTER:
+
+ /* Handle a character that cannot go in the bit map */
+
+#ifdef SUPPORT_UTF8
+ if (utf8 && (c > 255 || ((options & PCRE_CASELESS) != 0 && c > 127)))
+ {
+ class_utf8 = TRUE;
+ *class_utf8data++ = XCL_SINGLE;
+ class_utf8data += ord2utf8(c, class_utf8data);
+
+#ifdef SUPPORT_UCP
+ if ((options & PCRE_CASELESS) != 0)
+ {
+ int chartype;
+ int othercase;
+ if (ucp_findchar(c, &chartype, &othercase) >= 0 && othercase > 0)
+ {
+ *class_utf8data++ = XCL_SINGLE;
+ class_utf8data += ord2utf8(othercase, class_utf8data);
+ }
+ }
+#endif /* SUPPORT_UCP */
+
+ }
+ else
+#endif /* SUPPORT_UTF8 */
+
+ /* Handle a single-byte character */
+ {
+ classbits[c/8] |= (1 << (c&7));
+ if ((options & PCRE_CASELESS) != 0)
+ {
+ c = cd->fcc[c]; /* flip case */
+ classbits[c/8] |= (1 << (c&7));
+ }
+ class_charcount++;
+ class_lastchar = c;
+ }
+ }
+
+ /* Loop until ']' reached; the check for end of string happens inside the
+ loop. This "while" is the end of the "do" above. */
+
+ while ((c = *(++ptr)) != ']' || inescq);
+
+ /* If class_charcount is 1, we saw precisely one character whose value is
+ less than 256. In non-UTF-8 mode we can always optimize. In UTF-8 mode, we
+ can optimize the negative case only if there were no characters >= 128
+ because OP_NOT and the related opcodes like OP_NOTSTAR operate on
+ single-bytes only. This is an historical hangover. Maybe one day we can
+ tidy these opcodes to handle multi-byte characters.
+
+ The optimization throws away the bit map. We turn the item into a
+ 1-character OP_CHAR[NC] if it's positive, or OP_NOT if it's negative. Note
+ that OP_NOT does not support multibyte characters. In the positive case, it
+ can cause firstbyte to be set. Otherwise, there can be no first char if
+ this item is first, whatever repeat count may follow. In the case of
+ reqbyte, save the previous value for reinstating. */
+
+#ifdef SUPPORT_UTF8
+ if (class_charcount == 1 &&
+ (!utf8 ||
+ (!class_utf8 && (!negate_class || class_lastchar < 128))))
+
+#else
+ if (class_charcount == 1)
+#endif
+ {
+ zeroreqbyte = reqbyte;
+
+ /* The OP_NOT opcode works on one-byte characters only. */
+
+ if (negate_class)
+ {
+ if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE;
+ zerofirstbyte = firstbyte;
+ *code++ = OP_NOT;
+ *code++ = class_lastchar;
+ break;
+ }
+
+ /* For a single, positive character, get the value into mcbuffer, and
+ then we can handle this with the normal one-character code. */
+
+#ifdef SUPPORT_UTF8
+ if (utf8 && class_lastchar > 127)
+ mclength = ord2utf8(class_lastchar, mcbuffer);
+ else
+#endif
+ {
+ mcbuffer[0] = class_lastchar;
+ mclength = 1;
+ }
+ goto ONE_CHAR;
+ } /* End of 1-char optimization */
+
+ /* The general case - not the one-char optimization. If this is the first
+ thing in the branch, there can be no first char setting, whatever the
+ repeat count. Any reqbyte setting must remain unchanged after any kind of
+ repeat. */
+
+ if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE;
+ zerofirstbyte = firstbyte;
+ zeroreqbyte = reqbyte;
+
+ /* If there are characters with values > 255, we have to compile an
+ extended class, with its own opcode. If there are no characters < 256,
+ we can omit the bitmap. */
+
+#ifdef SUPPORT_UTF8
+ if (class_utf8)
+ {
+ *class_utf8data++ = XCL_END; /* Marks the end of extra data */
+ *code++ = OP_XCLASS;
+ code += LINK_SIZE;
+ *code = negate_class? XCL_NOT : 0;
+
+ /* If the map is required, install it, and move on to the end of
+ the extra data */
+
+ if (class_charcount > 0)
+ {
+ *code++ |= XCL_MAP;
+ memcpy(code, classbits, 32);
+ code = class_utf8data;
+ }
+
+ /* If the map is not required, slide down the extra data. */
+
+ else
+ {
+ int len = class_utf8data - (code + 33);
+ memmove(code + 1, code + 33, len);
+ code += len + 1;
+ }
+
+ /* Now fill in the complete length of the item */
+
+ PUT(previous, 1, code - previous);
+ break; /* End of class handling */
+ }
+#endif
+
+ /* If there are no characters > 255, negate the 32-byte map if necessary,
+ and copy it into the code vector. If this is the first thing in the branch,
+ there can be no first char setting, whatever the repeat count. Any reqbyte
+ setting must remain unchanged after any kind of repeat. */
+
+ if (negate_class)
+ {
+ *code++ = OP_NCLASS;
+ for (c = 0; c < 32; c++) code[c] = ~classbits[c];
+ }
+ else
+ {
+ *code++ = OP_CLASS;
+ memcpy(code, classbits, 32);
+ }
+ code += 32;
+ break;
+
+ /* Various kinds of repeat; '{' is not necessarily a quantifier, but this
+ has been tested above. */
+
+ case '{':
+ if (!is_quantifier) goto NORMAL_CHAR;
+ ptr = read_repeat_counts(ptr+1, &repeat_min, &repeat_max, errorptr);
+ if (*errorptr != NULL) goto FAILED;
+ goto REPEAT;
+
+ case '*':
+ repeat_min = 0;
+ repeat_max = -1;
+ goto REPEAT;
+
+ case '+':
+ repeat_min = 1;
+ repeat_max = -1;
+ goto REPEAT;
+
+ case '?':
+ repeat_min = 0;
+ repeat_max = 1;
+
+ REPEAT:
+ if (previous == NULL)
+ {
+ *errorptr = ERR9;
+ goto FAILED;
+ }
+
+ if (repeat_min == 0)
+ {
+ firstbyte = zerofirstbyte; /* Adjust for zero repeat */
+ reqbyte = zeroreqbyte; /* Ditto */
+ }
+
+ /* Remember whether this is a variable length repeat */
+
+ reqvary = (repeat_min == repeat_max)? 0 : REQ_VARY;
+
+ op_type = 0; /* Default single-char op codes */
+ possessive_quantifier = FALSE; /* Default not possessive quantifier */
+
+ /* Save start of previous item, in case we have to move it up to make space
+ for an inserted OP_ONCE for the additional '+' extension. */
+
+ tempcode = previous;
+
+ /* If the next character is '+', we have a possessive quantifier. This
+ implies greediness, whatever the setting of the PCRE_UNGREEDY option.
+ If the next character is '?' this is a minimizing repeat, by default,
+ but if PCRE_UNGREEDY is set, it works the other way round. We change the
+ repeat type to the non-default. */
+
+ if (ptr[1] == '+')
+ {
+ repeat_type = 0; /* Force greedy */
+ possessive_quantifier = TRUE;
+ ptr++;
+ }
+ else if (ptr[1] == '?')
+ {
+ repeat_type = greedy_non_default;
+ ptr++;
+ }
+ else repeat_type = greedy_default;
+
+ /* If previous was a recursion, we need to wrap it inside brackets so that
+ it can be replicated if necessary. */
+
+ if (*previous == OP_RECURSE)
+ {
+ memmove(previous + 1 + LINK_SIZE, previous, 1 + LINK_SIZE);
+ code += 1 + LINK_SIZE;
+ *previous = OP_BRA;
+ PUT(previous, 1, code - previous);
+ *code = OP_KET;
+ PUT(code, 1, code - previous);
+ code += 1 + LINK_SIZE;
+ }
+
+ /* If previous was a character match, abolish the item and generate a
+ repeat item instead. If a char item has a minumum of more than one, ensure
+ that it is set in reqbyte - it might not be if a sequence such as x{3} is
+ the first thing in a branch because the x will have gone into firstbyte
+ instead. */
+
+ if (*previous == OP_CHAR || *previous == OP_CHARNC)
+ {
+ /* Deal with UTF-8 characters that take up more than one byte. It's
+ easier to write this out separately than try to macrify it. Use c to
+ hold the length of the character in bytes, plus 0x80 to flag that it's a
+ length rather than a small character. */
+
+#ifdef SUPPORT_UTF8
+ if (utf8 && (code[-1] & 0x80) != 0)
+ {
+ uschar *lastchar = code - 1;
+ while((*lastchar & 0xc0) == 0x80) lastchar--;
+ c = code - lastchar; /* Length of UTF-8 character */
+ memcpy(utf8_char, lastchar, c); /* Save the char */
+ c |= 0x80; /* Flag c as a length */
+ }
+ else
+#endif
+
+ /* Handle the case of a single byte - either with no UTF8 support, or
+ with UTF-8 disabled, or for a UTF-8 character < 128. */
+
+ {
+ c = code[-1];
+ if (repeat_min > 1) reqbyte = c | req_caseopt | cd->req_varyopt;
+ }
+
+ goto OUTPUT_SINGLE_REPEAT; /* Code shared with single character types */
+ }
+
+ /* If previous was a single negated character ([^a] or similar), we use
+ one of the special opcodes, replacing it. The code is shared with single-
+ character repeats by setting opt_type to add a suitable offset into
+ repeat_type. OP_NOT is currently used only for single-byte chars. */
+
+ else if (*previous == OP_NOT)
+ {
+ op_type = OP_NOTSTAR - OP_STAR; /* Use "not" opcodes */
+ c = previous[1];
+ goto OUTPUT_SINGLE_REPEAT;
+ }
+
+ /* If previous was a character type match (\d or similar), abolish it and
+ create a suitable repeat item. The code is shared with single-character
+ repeats by setting op_type to add a suitable offset into repeat_type. Note
+ the the Unicode property types will be present only when SUPPORT_UCP is
+ defined, but we don't wrap the little bits of code here because it just
+ makes it horribly messy. */
+
+ else if (*previous < OP_EODN)
+ {
+ uschar *oldcode;
+ int prop_type;
+ op_type = OP_TYPESTAR - OP_STAR; /* Use type opcodes */
+ c = *previous;
+
+ OUTPUT_SINGLE_REPEAT:
+ prop_type = (*previous == OP_PROP || *previous == OP_NOTPROP)?
+ previous[1] : -1;
+
+ oldcode = code;
+ code = previous; /* Usually overwrite previous item */
+
+ /* If the maximum is zero then the minimum must also be zero; Perl allows
+ this case, so we do too - by simply omitting the item altogether. */
+
+ if (repeat_max == 0) goto END_REPEAT;
+
+ /* All real repeats make it impossible to handle partial matching (maybe
+ one day we will be able to remove this restriction). */
+
+ if (repeat_max != 1) cd->nopartial = TRUE;
+
+ /* Combine the op_type with the repeat_type */
+
+ repeat_type += op_type;
+
+ /* A minimum of zero is handled either as the special case * or ?, or as
+ an UPTO, with the maximum given. */
+
+ if (repeat_min == 0)
+ {
+ if (repeat_max == -1) *code++ = OP_STAR + repeat_type;
+ else if (repeat_max == 1) *code++ = OP_QUERY + repeat_type;
+ else
+ {
+ *code++ = OP_UPTO + repeat_type;
+ PUT2INC(code, 0, repeat_max);
+ }
+ }
+
+ /* A repeat minimum of 1 is optimized into some special cases. If the
+ maximum is unlimited, we use OP_PLUS. Otherwise, the original item it
+ left in place and, if the maximum is greater than 1, we use OP_UPTO with
+ one less than the maximum. */
+
+ else if (repeat_min == 1)
+ {
+ if (repeat_max == -1)
+ *code++ = OP_PLUS + repeat_type;
+ else
+ {
+ code = oldcode; /* leave previous item in place */
+ if (repeat_max == 1) goto END_REPEAT;
+ *code++ = OP_UPTO + repeat_type;
+ PUT2INC(code, 0, repeat_max - 1);
+ }
+ }
+
+ /* The case {n,n} is just an EXACT, while the general case {n,m} is
+ handled as an EXACT followed by an UPTO. */
+
+ else
+ {
+ *code++ = OP_EXACT + op_type; /* NB EXACT doesn't have repeat_type */
+ PUT2INC(code, 0, repeat_min);
+
+ /* If the maximum is unlimited, insert an OP_STAR. Before doing so,
+ we have to insert the character for the previous code. For a repeated
+ Unicode property match, there is an extra byte that defines the
+ required property. In UTF-8 mode, long characters have their length in
+ c, with the 0x80 bit as a flag. */
+
+ if (repeat_max < 0)
+ {
+#ifdef SUPPORT_UTF8
+ if (utf8 && c >= 128)
+ {
+ memcpy(code, utf8_char, c & 7);
+ code += c & 7;
+ }
+ else
+#endif
+ {
+ *code++ = c;
+ if (prop_type >= 0) *code++ = prop_type;
+ }
+ *code++ = OP_STAR + repeat_type;
+ }
+
+ /* Else insert an UPTO if the max is greater than the min, again
+ preceded by the character, for the previously inserted code. */
+
+ else if (repeat_max != repeat_min)
+ {
+#ifdef SUPPORT_UTF8
+ if (utf8 && c >= 128)
+ {
+ memcpy(code, utf8_char, c & 7);
+ code += c & 7;
+ }
+ else
+#endif
+ *code++ = c;
+ if (prop_type >= 0) *code++ = prop_type;
+ repeat_max -= repeat_min;
+ *code++ = OP_UPTO + repeat_type;
+ PUT2INC(code, 0, repeat_max);
+ }
+ }
+
+ /* The character or character type itself comes last in all cases. */
+
+#ifdef SUPPORT_UTF8
+ if (utf8 && c >= 128)
+ {
+ memcpy(code, utf8_char, c & 7);
+ code += c & 7;
+ }
+ else
+#endif
+ *code++ = c;
+
+ /* For a repeated Unicode property match, there is an extra byte that
+ defines the required property. */
+
+#ifdef SUPPORT_UCP
+ if (prop_type >= 0) *code++ = prop_type;
+#endif
+ }
+
+ /* If previous was a character class or a back reference, we put the repeat
+ stuff after it, but just skip the item if the repeat was {0,0}. */
+
+ else if (*previous == OP_CLASS ||
+ *previous == OP_NCLASS ||
+#ifdef SUPPORT_UTF8
+ *previous == OP_XCLASS ||
+#endif
+ *previous == OP_REF)
+ {
+ if (repeat_max == 0)
+ {
+ code = previous;
+ goto END_REPEAT;
+ }
+
+ /* All real repeats make it impossible to handle partial matching (maybe
+ one day we will be able to remove this restriction). */
+
+ if (repeat_max != 1) cd->nopartial = TRUE;
+
+ if (repeat_min == 0 && repeat_max == -1)
+ *code++ = OP_CRSTAR + repeat_type;
+ else if (repeat_min == 1 && repeat_max == -1)
+ *code++ = OP_CRPLUS + repeat_type;
+ else if (repeat_min == 0 && repeat_max == 1)
+ *code++ = OP_CRQUERY + repeat_type;
+ else
+ {
+ *code++ = OP_CRRANGE + repeat_type;
+ PUT2INC(code, 0, repeat_min);
+ if (repeat_max == -1) repeat_max = 0; /* 2-byte encoding for max */
+ PUT2INC(code, 0, repeat_max);
+ }
+ }
+
+ /* If previous was a bracket group, we may have to replicate it in certain
+ cases. */
+
+ else if (*previous >= OP_BRA || *previous == OP_ONCE ||
+ *previous == OP_COND)
+ {
+ register int i;
+ int ketoffset = 0;
+ int len = code - previous;
+ uschar *bralink = NULL;
+
+ /* If the maximum repeat count is unlimited, find the end of the bracket
+ by scanning through from the start, and compute the offset back to it
+ from the current code pointer. There may be an OP_OPT setting following
+ the final KET, so we can't find the end just by going back from the code
+ pointer. */
+
+ if (repeat_max == -1)
+ {
+ register uschar *ket = previous;
+ do ket += GET(ket, 1); while (*ket != OP_KET);
+ ketoffset = code - ket;
+ }
+
+ /* The case of a zero minimum is special because of the need to stick
+ OP_BRAZERO in front of it, and because the group appears once in the
+ data, whereas in other cases it appears the minimum number of times. For
+ this reason, it is simplest to treat this case separately, as otherwise
+ the code gets far too messy. There are several special subcases when the
+ minimum is zero. */
+
+ if (repeat_min == 0)
+ {
+ /* If the maximum is also zero, we just omit the group from the output
+ altogether. */
+
+ if (repeat_max == 0)
+ {
+ code = previous;
+ goto END_REPEAT;
+ }
+
+ /* If the maximum is 1 or unlimited, we just have to stick in the
+ BRAZERO and do no more at this point. However, we do need to adjust
+ any OP_RECURSE calls inside the group that refer to the group itself or
+ any internal group, because the offset is from the start of the whole
+ regex. Temporarily terminate the pattern while doing this. */
+
+ if (repeat_max <= 1)
+ {
+ *code = OP_END;
+ adjust_recurse(previous, 1, utf8, cd);
+ memmove(previous+1, previous, len);
+ code++;
+ *previous++ = OP_BRAZERO + repeat_type;
+ }
+
+ /* If the maximum is greater than 1 and limited, we have to replicate
+ in a nested fashion, sticking OP_BRAZERO before each set of brackets.
+ The first one has to be handled carefully because it's the original
+ copy, which has to be moved up. The remainder can be handled by code
+ that is common with the non-zero minimum case below. We have to
+ adjust the value or repeat_max, since one less copy is required. Once
+ again, we may have to adjust any OP_RECURSE calls inside the group. */
+
+ else
+ {
+ int offset;
+ *code = OP_END;
+ adjust_recurse(previous, 2 + LINK_SIZE, utf8, cd);
+ memmove(previous + 2 + LINK_SIZE, previous, len);
+ code += 2 + LINK_SIZE;
+ *previous++ = OP_BRAZERO + repeat_type;
+ *previous++ = OP_BRA;
+
+ /* We chain together the bracket offset fields that have to be
+ filled in later when the ends of the brackets are reached. */
+
+ offset = (bralink == NULL)? 0 : previous - bralink;
+ bralink = previous;
+ PUTINC(previous, 0, offset);
+ }
+
+ repeat_max--;
+ }
+
+ /* If the minimum is greater than zero, replicate the group as many
+ times as necessary, and adjust the maximum to the number of subsequent
+ copies that we need. If we set a first char from the group, and didn't
+ set a required char, copy the latter from the former. */
+
+ else
+ {
+ if (repeat_min > 1)
+ {
+ if (groupsetfirstbyte && reqbyte < 0) reqbyte = firstbyte;
+ for (i = 1; i < repeat_min; i++)
+ {
+ memcpy(code, previous, len);
+ code += len;
+ }
+ }
+ if (repeat_max > 0) repeat_max -= repeat_min;
+ }
+
+ /* This code is common to both the zero and non-zero minimum cases. If
+ the maximum is limited, it replicates the group in a nested fashion,
+ remembering the bracket starts on a stack. In the case of a zero minimum,
+ the first one was set up above. In all cases the repeat_max now specifies
+ the number of additional copies needed. */
+
+ if (repeat_max >= 0)
+ {
+ for (i = repeat_max - 1; i >= 0; i--)
+ {
+ *code++ = OP_BRAZERO + repeat_type;
+
+ /* All but the final copy start a new nesting, maintaining the
+ chain of brackets outstanding. */
+
+ if (i != 0)
+ {
+ int offset;
+ *code++ = OP_BRA;
+ offset = (bralink == NULL)? 0 : code - bralink;
+ bralink = code;
+ PUTINC(code, 0, offset);
+ }
+
+ memcpy(code, previous, len);
+ code += len;
+ }
+
+ /* Now chain through the pending brackets, and fill in their length
+ fields (which are holding the chain links pro tem). */
+
+ while (bralink != NULL)
+ {
+ int oldlinkoffset;
+ int offset = code - bralink + 1;
+ uschar *bra = code - offset;
+ oldlinkoffset = GET(bra, 1);
+ bralink = (oldlinkoffset == 0)? NULL : bralink - oldlinkoffset;
+ *code++ = OP_KET;
+ PUTINC(code, 0, offset);
+ PUT(bra, 1, offset);
+ }
+ }
+
+ /* If the maximum is unlimited, set a repeater in the final copy. We
+ can't just offset backwards from the current code point, because we
+ don't know if there's been an options resetting after the ket. The
+ correct offset was computed above. */
+
+ else code[-ketoffset] = OP_KETRMAX + repeat_type;
+ }
+
+ /* Else there's some kind of shambles */
+
+ else
+ {
+ *errorptr = ERR11;
+ goto FAILED;
+ }
+
+ /* If the character following a repeat is '+', we wrap the entire repeated
+ item inside OP_ONCE brackets. This is just syntactic sugar, taken from
+ Sun's Java package. The repeated item starts at tempcode, not at previous,
+ which might be the first part of a string whose (former) last char we
+ repeated. However, we don't support '+' after a greediness '?'. */
+
+ if (possessive_quantifier)
+ {
+ int len = code - tempcode;
+ memmove(tempcode + 1+LINK_SIZE, tempcode, len);
+ code += 1 + LINK_SIZE;
+ len += 1 + LINK_SIZE;
+ tempcode[0] = OP_ONCE;
+ *code++ = OP_KET;
+ PUTINC(code, 0, len);
+ PUT(tempcode, 1, len);
+ }
+
+ /* In all case we no longer have a previous item. We also set the
+ "follows varying string" flag for subsequently encountered reqbytes if
+ it isn't already set and we have just passed a varying length item. */
+
+ END_REPEAT:
+ previous = NULL;
+ cd->req_varyopt |= reqvary;
+ break;
+
+
+ /* Start of nested bracket sub-expression, or comment or lookahead or
+ lookbehind or option setting or condition. First deal with special things
+ that can come after a bracket; all are introduced by ?, and the appearance
+ of any of them means that this is not a referencing group. They were
+ checked for validity in the first pass over the string, so we don't have to
+ check for syntax errors here. */
+
+ case '(':
+ newoptions = options;
+ skipbytes = 0;
+
+ if (*(++ptr) == '?')
+ {
+ int set, unset;
+ int *optset;
+
+ switch (*(++ptr))
+ {
+ case '#': /* Comment; skip to ket */
+ ptr++;
+ while (*ptr != ')') ptr++;
+ continue;
+
+ case ':': /* Non-extracting bracket */
+ bravalue = OP_BRA;
+ ptr++;
+ break;
+
+ case '(':
+ bravalue = OP_COND; /* Conditional group */
+
+ /* Condition to test for recursion */
+
+ if (ptr[1] == 'R')
+ {
+ code[1+LINK_SIZE] = OP_CREF;
+ PUT2(code, 2+LINK_SIZE, CREF_RECURSE);
+ skipbytes = 3;
+ ptr += 3;
+ }
+
+ /* Condition to test for a numbered subpattern match. We know that
+ if a digit follows ( then there will just be digits until ) because
+ the syntax was checked in the first pass. */
+
+ else if ((digitab[ptr[1]] && ctype_digit) != 0)
+ {
+ int condref; /* Don't amalgamate; some compilers */
+ condref = *(++ptr) - '0'; /* grumble at autoincrement in declaration */
+ while (*(++ptr) != ')') condref = condref*10 + *ptr - '0';
+ if (condref == 0)
+ {
+ *errorptr = ERR35;
+ goto FAILED;
+ }
+ ptr++;
+ code[1+LINK_SIZE] = OP_CREF;
+ PUT2(code, 2+LINK_SIZE, condref);
+ skipbytes = 3;
+ }
+ /* For conditions that are assertions, we just fall through, having
+ set bravalue above. */
+ break;
+
+ case '=': /* Positive lookahead */
+ bravalue = OP_ASSERT;
+ ptr++;
+ break;
+
+ case '!': /* Negative lookahead */
+ bravalue = OP_ASSERT_NOT;
+ ptr++;
+ break;
+
+ case '<': /* Lookbehinds */
+ switch (*(++ptr))
+ {
+ case '=': /* Positive lookbehind */
+ bravalue = OP_ASSERTBACK;
+ ptr++;
+ break;
+
+ case '!': /* Negative lookbehind */
+ bravalue = OP_ASSERTBACK_NOT;
+ ptr++;
+ break;
+ }
+ break;
+
+ case '>': /* One-time brackets */
+ bravalue = OP_ONCE;
+ ptr++;
+ break;
+
+ case 'C': /* Callout - may be followed by digits; */
+ previous_callout = code; /* Save for later completion */
+ after_manual_callout = 1; /* Skip one item before completing */
+ *code++ = OP_CALLOUT; /* Already checked that the terminating */
+ { /* closing parenthesis is present. */
+ int n = 0;
+ while ((digitab[*(++ptr)] & ctype_digit) != 0)
+ n = n * 10 + *ptr - '0';
+ if (n > 255)
+ {
+ *errorptr = ERR38;
+ goto FAILED;
+ }
+ *code++ = n;
+ PUT(code, 0, ptr - cd->start_pattern + 1); /* Pattern offset */
+ PUT(code, LINK_SIZE, 0); /* Default length */
+ code += 2 * LINK_SIZE;
+ }
+ previous = NULL;
+ continue;
+
+ case 'P': /* Named subpattern handling */
+ if (*(++ptr) == '<') /* Definition */
+ {
+ int i, namelen;
+ uschar *slot = cd->name_table;
+ const uschar *name; /* Don't amalgamate; some compilers */
+ name = ++ptr; /* grumble at autoincrement in declaration */
+
+ while (*ptr++ != '>');
+ namelen = ptr - name - 1;
+
+ for (i = 0; i < cd->names_found; i++)
+ {
+ int crc = memcmp(name, slot+2, namelen);
+ if (crc == 0)
+ {
+ if (slot[2+namelen] == 0)
+ {
+ *errorptr = ERR43;
+ goto FAILED;
+ }
+ crc = -1; /* Current name is substring */
+ }
+ if (crc < 0)
+ {
+ memmove(slot + cd->name_entry_size, slot,
+ (cd->names_found - i) * cd->name_entry_size);
+ break;
+ }
+ slot += cd->name_entry_size;
+ }
+
+ PUT2(slot, 0, *brackets + 1);
+ memcpy(slot + 2, name, namelen);
+ slot[2+namelen] = 0;
+ cd->names_found++;
+ goto NUMBERED_GROUP;
+ }
+
+ if (*ptr == '=' || *ptr == '>') /* Reference or recursion */
+ {
+ int i, namelen;
+ int type = *ptr++;
+ const uschar *name = ptr;
+ uschar *slot = cd->name_table;
+
+ while (*ptr != ')') ptr++;
+ namelen = ptr - name;
+
+ for (i = 0; i < cd->names_found; i++)
+ {
+ if (strncmp((char *)name, (char *)slot+2, namelen) == 0) break;
+ slot += cd->name_entry_size;
+ }
+ if (i >= cd->names_found)
+ {
+ *errorptr = ERR15;
+ goto FAILED;
+ }
+
+ recno = GET2(slot, 0);
+
+ if (type == '>') goto HANDLE_RECURSION; /* A few lines below */
+
+ /* Back reference */
+
+ previous = code;
+ *code++ = OP_REF;
+ PUT2INC(code, 0, recno);
+ cd->backref_map |= (recno < 32)? (1 << recno) : 1;
+ if (recno > cd->top_backref) cd->top_backref = recno;
+ continue;
+ }
+
+ /* Should never happen */
+ break;
+
+ case 'R': /* Pattern recursion */
+ ptr++; /* Same as (?0) */
+ /* Fall through */
+
+ /* Recursion or "subroutine" call */
+
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ {
+ const uschar *called;
+ recno = 0;
+ while((digitab[*ptr] & ctype_digit) != 0)
+ recno = recno * 10 + *ptr++ - '0';
+
+ /* Come here from code above that handles a named recursion */
+
+ HANDLE_RECURSION:
+
+ previous = code;
+
+ /* Find the bracket that is being referenced. Temporarily end the
+ regex in case it doesn't exist. */
+
+ *code = OP_END;
+ called = (recno == 0)?
+ cd->start_code : find_bracket(cd->start_code, utf8, recno);
+
+ if (called == NULL)
+ {
+ *errorptr = ERR15;
+ goto FAILED;
+ }
+
+ /* If the subpattern is still open, this is a recursive call. We
+ check to see if this is a left recursion that could loop for ever,
+ and diagnose that case. */
+
+ if (GET(called, 1) == 0 && could_be_empty(called, code, bcptr, utf8))
+ {
+ *errorptr = ERR40;
+ goto FAILED;
+ }
+
+ /* Insert the recursion/subroutine item */
+
+ *code = OP_RECURSE;
+ PUT(code, 1, called - cd->start_code);
+ code += 1 + LINK_SIZE;
+ }
+ continue;
+
+ /* Character after (? not specially recognized */
+
+ default: /* Option setting */
+ set = unset = 0;
+ optset = &set;
+
+ while (*ptr != ')' && *ptr != ':')
+ {
+ switch (*ptr++)
+ {
+ case '-': optset = &unset; break;
+
+ case 'i': *optset |= PCRE_CASELESS; break;
+ case 'm': *optset |= PCRE_MULTILINE; break;
+ case 's': *optset |= PCRE_DOTALL; break;
+ case 'x': *optset |= PCRE_EXTENDED; break;
+ case 'U': *optset |= PCRE_UNGREEDY; break;
+ case 'X': *optset |= PCRE_EXTRA; break;
+ }
+ }
+
+ /* Set up the changed option bits, but don't change anything yet. */
+
+ newoptions = (options | set) & (~unset);
+
+ /* If the options ended with ')' this is not the start of a nested
+ group with option changes, so the options change at this level. Compile
+ code to change the ims options if this setting actually changes any of
+ them. We also pass the new setting back so that it can be put at the
+ start of any following branches, and when this group ends (if we are in
+ a group), a resetting item can be compiled.
+
+ Note that if this item is right at the start of the pattern, the
+ options will have been abstracted and made global, so there will be no
+ change to compile. */
+
+ if (*ptr == ')')
+ {
+ if ((options & PCRE_IMS) != (newoptions & PCRE_IMS))
+ {
+ *code++ = OP_OPT;
+ *code++ = newoptions & PCRE_IMS;
+ }
+
+ /* Change options at this level, and pass them back for use
+ in subsequent branches. Reset the greedy defaults and the case
+ value for firstbyte and reqbyte. */
+
+ *optionsptr = options = newoptions;
+ greedy_default = ((newoptions & PCRE_UNGREEDY) != 0);
+ greedy_non_default = greedy_default ^ 1;
+ req_caseopt = ((options & PCRE_CASELESS) != 0)? REQ_CASELESS : 0;
+
+ previous = NULL; /* This item can't be repeated */
+ continue; /* It is complete */
+ }
+
+ /* If the options ended with ':' we are heading into a nested group
+ with possible change of options. Such groups are non-capturing and are
+ not assertions of any kind. All we need to do is skip over the ':';
+ the newoptions value is handled below. */
+
+ bravalue = OP_BRA;
+ ptr++;
+ }
+ }
+
+ /* If PCRE_NO_AUTO_CAPTURE is set, all unadorned brackets become
+ non-capturing and behave like (?:...) brackets */
+
+ else if ((options & PCRE_NO_AUTO_CAPTURE) != 0)
+ {
+ bravalue = OP_BRA;
+ }
+
+ /* Else we have a referencing group; adjust the opcode. If the bracket
+ number is greater than EXTRACT_BASIC_MAX, we set the opcode one higher, and
+ arrange for the true number to follow later, in an OP_BRANUMBER item. */
+
+ else
+ {
+ NUMBERED_GROUP:
+ if (++(*brackets) > EXTRACT_BASIC_MAX)
+ {
+ bravalue = OP_BRA + EXTRACT_BASIC_MAX + 1;
+ code[1+LINK_SIZE] = OP_BRANUMBER;
+ PUT2(code, 2+LINK_SIZE, *brackets);
+ skipbytes = 3;
+ }
+ else bravalue = OP_BRA + *brackets;
+ }
+
+ /* Process nested bracketed re. Assertions may not be repeated, but other
+ kinds can be. We copy code into a non-register variable in order to be able
+ to pass its address because some compilers complain otherwise. Pass in a
+ new setting for the ims options if they have changed. */
+
+ previous = (bravalue >= OP_ONCE)? code : NULL;
+ *code = bravalue;
+ tempcode = code;
+ tempreqvary = cd->req_varyopt; /* Save value before bracket */
+
+ if (!compile_regex(
+ newoptions, /* The complete new option state */
+ options & PCRE_IMS, /* The previous ims option state */
+ brackets, /* Extracting bracket count */
+ &tempcode, /* Where to put code (updated) */
+ &ptr, /* Input pointer (updated) */
+ errorptr, /* Where to put an error message */
+ (bravalue == OP_ASSERTBACK ||
+ bravalue == OP_ASSERTBACK_NOT), /* TRUE if back assert */
+ skipbytes, /* Skip over OP_COND/OP_BRANUMBER */
+ &subfirstbyte, /* For possible first char */
+ &subreqbyte, /* For possible last char */
+ bcptr, /* Current branch chain */
+ cd)) /* Tables block */
+ goto FAILED;
+
+ /* At the end of compiling, code is still pointing to the start of the
+ group, while tempcode has been updated to point past the end of the group
+ and any option resetting that may follow it. The pattern pointer (ptr)
+ is on the bracket. */
+
+ /* If this is a conditional bracket, check that there are no more than
+ two branches in the group. */
+
+ else if (bravalue == OP_COND)
+ {
+ uschar *tc = code;
+ condcount = 0;
+
+ do {
+ condcount++;
+ tc += GET(tc,1);
+ }
+ while (*tc != OP_KET);
+
+ if (condcount > 2)
+ {
+ *errorptr = ERR27;
+ goto FAILED;
+ }
+
+ /* If there is just one branch, we must not make use of its firstbyte or
+ reqbyte, because this is equivalent to an empty second branch. */
+
+ if (condcount == 1) subfirstbyte = subreqbyte = REQ_NONE;
+ }
+
+ /* Handle updating of the required and first characters. Update for normal
+ brackets of all kinds, and conditions with two branches (see code above).
+ If the bracket is followed by a quantifier with zero repeat, we have to
+ back off. Hence the definition of zeroreqbyte and zerofirstbyte outside the
+ main loop so that they can be accessed for the back off. */
+
+ zeroreqbyte = reqbyte;
+ zerofirstbyte = firstbyte;
+ groupsetfirstbyte = FALSE;
+
+ if (bravalue >= OP_BRA || bravalue == OP_ONCE || bravalue == OP_COND)
+ {
+ /* If we have not yet set a firstbyte in this branch, take it from the
+ subpattern, remembering that it was set here so that a repeat of more
+ than one can replicate it as reqbyte if necessary. If the subpattern has
+ no firstbyte, set "none" for the whole branch. In both cases, a zero
+ repeat forces firstbyte to "none". */
+
+ if (firstbyte == REQ_UNSET)
+ {
+ if (subfirstbyte >= 0)
+ {
+ firstbyte = subfirstbyte;
+ groupsetfirstbyte = TRUE;
+ }
+ else firstbyte = REQ_NONE;
+ zerofirstbyte = REQ_NONE;
+ }
+
+ /* If firstbyte was previously set, convert the subpattern's firstbyte
+ into reqbyte if there wasn't one, using the vary flag that was in
+ existence beforehand. */
+
+ else if (subfirstbyte >= 0 && subreqbyte < 0)
+ subreqbyte = subfirstbyte | tempreqvary;
+
+ /* If the subpattern set a required byte (or set a first byte that isn't
+ really the first byte - see above), set it. */
+
+ if (subreqbyte >= 0) reqbyte = subreqbyte;
+ }
+
+ /* For a forward assertion, we take the reqbyte, if set. This can be
+ helpful if the pattern that follows the assertion doesn't set a different
+ char. For example, it's useful for /(?=abcde).+/. We can't set firstbyte
+ for an assertion, however because it leads to incorrect effect for patterns
+ such as /(?=a)a.+/ when the "real" "a" would then become a reqbyte instead
+ of a firstbyte. This is overcome by a scan at the end if there's no
+ firstbyte, looking for an asserted first char. */
+
+ else if (bravalue == OP_ASSERT && subreqbyte >= 0) reqbyte = subreqbyte;
+
+ /* Now update the main code pointer to the end of the group. */
+
+ code = tempcode;
+
+ /* Error if hit end of pattern */
+
+ if (*ptr != ')')
+ {
+ *errorptr = ERR14;
+ goto FAILED;
+ }
+ break;
+
+ /* Check \ for being a real metacharacter; if not, fall through and handle
+ it as a data character at the start of a string. Escape items are checked
+ for validity in the pre-compiling pass. */
+
+ case '\\':
+ tempptr = ptr;
+ c = check_escape(&ptr, errorptr, *brackets, options, FALSE);
+
+ /* Handle metacharacters introduced by \. For ones like \d, the ESC_ values
+ are arranged to be the negation of the corresponding OP_values. For the
+ back references, the values are ESC_REF plus the reference number. Only
+ back references and those types that consume a character may be repeated.
+ We can test for values between ESC_b and ESC_Z for the latter; this may
+ have to change if any new ones are ever created. */
+
+ if (c < 0)
+ {
+ if (-c == ESC_Q) /* Handle start of quoted string */
+ {
+ if (ptr[1] == '\\' && ptr[2] == 'E') ptr += 2; /* avoid empty string */
+ else inescq = TRUE;
+ continue;
+ }
+
+ /* For metasequences that actually match a character, we disable the
+ setting of a first character if it hasn't already been set. */
+
+ if (firstbyte == REQ_UNSET && -c > ESC_b && -c < ESC_Z)
+ firstbyte = REQ_NONE;
+
+ /* Set values to reset to if this is followed by a zero repeat. */
+
+ zerofirstbyte = firstbyte;
+ zeroreqbyte = reqbyte;
+
+ /* Back references are handled specially */
+
+ if (-c >= ESC_REF)
+ {
+ int number = -c - ESC_REF;
+ previous = code;
+ *code++ = OP_REF;
+ PUT2INC(code, 0, number);
+ }
+
+ /* So are Unicode property matches, if supported. We know that get_ucp
+ won't fail because it was tested in the pre-pass. */
+
+#ifdef SUPPORT_UCP
+ else if (-c == ESC_P || -c == ESC_p)
+ {
+ BOOL negated;
+ int value = get_ucp(&ptr, &negated, errorptr);
+ previous = code;
+ *code++ = ((-c == ESC_p) != negated)? OP_PROP : OP_NOTPROP;
+ *code++ = value;
+ }
+#endif
+
+ /* For the rest, we can obtain the OP value by negating the escape
+ value */
+
+ else
+ {
+ previous = (-c > ESC_b && -c < ESC_Z)? code : NULL;
+ *code++ = -c;
+ }
+ continue;
+ }
+
+ /* We have a data character whose value is in c. In UTF-8 mode it may have
+ a value > 127. We set its representation in the length/buffer, and then
+ handle it as a data character. */
+
+#ifdef SUPPORT_UTF8
+ if (utf8 && c > 127)
+ mclength = ord2utf8(c, mcbuffer);
+ else
+#endif
+
+ {
+ mcbuffer[0] = c;
+ mclength = 1;
+ }
+
+ goto ONE_CHAR;
+
+ /* Handle a literal character. It is guaranteed not to be whitespace or #
+ when the extended flag is set. If we are in UTF-8 mode, it may be a
+ multi-byte literal character. */
+
+ default:
+ NORMAL_CHAR:
+ mclength = 1;
+ mcbuffer[0] = c;
+
+#ifdef SUPPORT_UTF8
+ if (utf8 && (c & 0xc0) == 0xc0)
+ {
+ while ((ptr[1] & 0xc0) == 0x80)
+ mcbuffer[mclength++] = *(++ptr);
+ }
+#endif
+
+ /* At this point we have the character's bytes in mcbuffer, and the length
+ in mclength. When not in UTF-8 mode, the length is always 1. */
+
+ ONE_CHAR:
+ previous = code;
+ *code++ = ((options & PCRE_CASELESS) != 0)? OP_CHARNC : OP_CHAR;
+ for (c = 0; c < mclength; c++) *code++ = mcbuffer[c];
+
+ /* Set the first and required bytes appropriately. If no previous first
+ byte, set it from this character, but revert to none on a zero repeat.
+ Otherwise, leave the firstbyte value alone, and don't change it on a zero
+ repeat. */
+
+ if (firstbyte == REQ_UNSET)
+ {
+ zerofirstbyte = REQ_NONE;
+ zeroreqbyte = reqbyte;
+
+ /* If the character is more than one byte long, we can set firstbyte
+ only if it is not to be matched caselessly. */
+
+ if (mclength == 1 || req_caseopt == 0)
+ {
+ firstbyte = mcbuffer[0] | req_caseopt;
+ if (mclength != 1) reqbyte = code[-1] | cd->req_varyopt;
+ }
+ else firstbyte = reqbyte = REQ_NONE;
+ }
+
+ /* firstbyte was previously set; we can set reqbyte only the length is
+ 1 or the matching is caseful. */
+
+ else
+ {
+ zerofirstbyte = firstbyte;
+ zeroreqbyte = reqbyte;
+ if (mclength == 1 || req_caseopt == 0)
+ reqbyte = code[-1] | req_caseopt | cd->req_varyopt;
+ }
+
+ break; /* End of literal character handling */
+ }
+ } /* end of big loop */
+
+/* Control never reaches here by falling through, only by a goto for all the
+error states. Pass back the position in the pattern so that it can be displayed
+to the user for diagnosing the error. */
+
+FAILED:
+*ptrptr = ptr;
+return FALSE;
+}
+
+
+
+
+/*************************************************
+* Compile sequence of alternatives *
+*************************************************/
+
+/* On entry, ptr is pointing past the bracket character, but on return
+it points to the closing bracket, or vertical bar, or end of string.
+The code variable is pointing at the byte into which the BRA operator has been
+stored. If the ims options are changed at the start (for a (?ims: group) or
+during any branch, we need to insert an OP_OPT item at the start of every
+following branch to ensure they get set correctly at run time, and also pass
+the new options into every subsequent branch compile.
+
+Argument:
+ options option bits, including any changes for this subpattern
+ oldims previous settings of ims option bits
+ brackets -> int containing the number of extracting brackets used
+ codeptr -> the address of the current code pointer
+ ptrptr -> the address of the current pattern pointer
+ errorptr -> pointer to error message
+ lookbehind TRUE if this is a lookbehind assertion
+ skipbytes skip this many bytes at start (for OP_COND, OP_BRANUMBER)
+ firstbyteptr place to put the first required character, or a negative number
+ reqbyteptr place to put the last required character, or a negative number
+ bcptr pointer to the chain of currently open branches
+ cd points to the data block with tables pointers etc.
+
+Returns: TRUE on success
+*/
+
+static BOOL
+compile_regex(int options, int oldims, int *brackets, uschar **codeptr,
+ const uschar **ptrptr, const char **errorptr, BOOL lookbehind, int skipbytes,
+ int *firstbyteptr, int *reqbyteptr, branch_chain *bcptr, compile_data *cd)
+{
+const uschar *ptr = *ptrptr;
+uschar *code = *codeptr;
+uschar *last_branch = code;
+uschar *start_bracket = code;
+uschar *reverse_count = NULL;
+int firstbyte, reqbyte;
+int branchfirstbyte, branchreqbyte;
+branch_chain bc;
+
+bc.outer = bcptr;
+bc.current = code;
+
+firstbyte = reqbyte = REQ_UNSET;
+
+/* Offset is set zero to mark that this bracket is still open */
+
+PUT(code, 1, 0);
+code += 1 + LINK_SIZE + skipbytes;
+
+/* Loop for each alternative branch */
+
+for (;;)
+ {
+ /* Handle a change of ims options at the start of the branch */
+
+ if ((options & PCRE_IMS) != oldims)
+ {
+ *code++ = OP_OPT;
+ *code++ = options & PCRE_IMS;
+ }
+
+ /* Set up dummy OP_REVERSE if lookbehind assertion */
+
+ if (lookbehind)
+ {
+ *code++ = OP_REVERSE;
+ reverse_count = code;
+ PUTINC(code, 0, 0);
+ }
+
+ /* Now compile the branch */
+
+ if (!compile_branch(&options, brackets, &code, &ptr, errorptr,
+ &branchfirstbyte, &branchreqbyte, &bc, cd))
+ {
+ *ptrptr = ptr;
+ return FALSE;
+ }
+
+ /* If this is the first branch, the firstbyte and reqbyte values for the
+ branch become the values for the regex. */
+
+ if (*last_branch != OP_ALT)
+ {
+ firstbyte = branchfirstbyte;
+ reqbyte = branchreqbyte;
+ }
+
+ /* If this is not the first branch, the first char and reqbyte have to
+ match the values from all the previous branches, except that if the previous
+ value for reqbyte didn't have REQ_VARY set, it can still match, and we set
+ REQ_VARY for the regex. */
+
+ else
+ {
+ /* If we previously had a firstbyte, but it doesn't match the new branch,
+ we have to abandon the firstbyte for the regex, but if there was previously
+ no reqbyte, it takes on the value of the old firstbyte. */
+
+ if (firstbyte >= 0 && firstbyte != branchfirstbyte)
+ {
+ if (reqbyte < 0) reqbyte = firstbyte;
+ firstbyte = REQ_NONE;
+ }
+
+ /* If we (now or from before) have no firstbyte, a firstbyte from the
+ branch becomes a reqbyte if there isn't a branch reqbyte. */
+
+ if (firstbyte < 0 && branchfirstbyte >= 0 && branchreqbyte < 0)
+ branchreqbyte = branchfirstbyte;
+
+ /* Now ensure that the reqbytes match */
+
+ if ((reqbyte & ~REQ_VARY) != (branchreqbyte & ~REQ_VARY))
+ reqbyte = REQ_NONE;
+ else reqbyte |= branchreqbyte; /* To "or" REQ_VARY */
+ }
+
+ /* If lookbehind, check that this branch matches a fixed-length string,
+ and put the length into the OP_REVERSE item. Temporarily mark the end of
+ the branch with OP_END. */
+
+ if (lookbehind)
+ {
+ int length;
+ *code = OP_END;
+ length = find_fixedlength(last_branch, options);
+ DPRINTF(("fixed length = %d\n", length));
+ if (length < 0)
+ {
+ *errorptr = (length == -2)? ERR36 : ERR25;
+ *ptrptr = ptr;
+ return FALSE;
+ }
+ PUT(reverse_count, 0, length);
+ }
+
+ /* Reached end of expression, either ')' or end of pattern. Go back through
+ the alternative branches and reverse the chain of offsets, with the field in
+ the BRA item now becoming an offset to the first alternative. If there are
+ no alternatives, it points to the end of the group. The length in the
+ terminating ket is always the length of the whole bracketed item. If any of
+ the ims options were changed inside the group, compile a resetting op-code
+ following, except at the very end of the pattern. Return leaving the pointer
+ at the terminating char. */
+
+ if (*ptr != '|')
+ {
+ int length = code - last_branch;
+ do
+ {
+ int prev_length = GET(last_branch, 1);
+ PUT(last_branch, 1, length);
+ length = prev_length;
+ last_branch -= length;
+ }
+ while (length > 0);
+
+ /* Fill in the ket */
+
+ *code = OP_KET;
+ PUT(code, 1, code - start_bracket);
+ code += 1 + LINK_SIZE;
+
+ /* Resetting option if needed */
+
+ if ((options & PCRE_IMS) != oldims && *ptr == ')')
+ {
+ *code++ = OP_OPT;
+ *code++ = oldims;
+ }
+
+ /* Set values to pass back */
+
+ *codeptr = code;
+ *ptrptr = ptr;
+ *firstbyteptr = firstbyte;
+ *reqbyteptr = reqbyte;
+ return TRUE;
+ }
+
+ /* Another branch follows; insert an "or" node. Its length field points back
+ to the previous branch while the bracket remains open. At the end the chain
+ is reversed. It's done like this so that the start of the bracket has a
+ zero offset until it is closed, making it possible to detect recursion. */
+
+ *code = OP_ALT;
+ PUT(code, 1, code - last_branch);
+ bc.current = last_branch = code;
+ code += 1 + LINK_SIZE;
+ ptr++;
+ }
+/* Control never reaches here */
+}
+
+
+
+
+/*************************************************
+* Check for anchored expression *
+*************************************************/
+
+/* Try to find out if this is an anchored regular expression. Consider each
+alternative branch. If they all start with OP_SOD or OP_CIRC, or with a bracket
+all of whose alternatives start with OP_SOD or OP_CIRC (recurse ad lib), then
+it's anchored. However, if this is a multiline pattern, then only OP_SOD
+counts, since OP_CIRC can match in the middle.
+
+We can also consider a regex to be anchored if OP_SOM starts all its branches.
+This is the code for \G, which means "match at start of match position, taking
+into account the match offset".
+
+A branch is also implicitly anchored if it starts with .* and DOTALL is set,
+because that will try the rest of the pattern at all possible matching points,
+so there is no point trying again.... er ....
+
+.... except when the .* appears inside capturing parentheses, and there is a
+subsequent back reference to those parentheses. We haven't enough information
+to catch that case precisely.
+
+At first, the best we could do was to detect when .* was in capturing brackets
+and the highest back reference was greater than or equal to that level.
+However, by keeping a bitmap of the first 31 back references, we can catch some
+of the more common cases more precisely.
+
+Arguments:
+ code points to start of expression (the bracket)
+ options points to the options setting
+ bracket_map a bitmap of which brackets we are inside while testing; this
+ handles up to substring 31; after that we just have to take
+ the less precise approach
+ backref_map the back reference bitmap
+
+Returns: TRUE or FALSE
+*/
+
+static BOOL
+is_anchored(register const uschar *code, int *options, unsigned int bracket_map,
+ unsigned int backref_map)
+{
+do {
+ const uschar *scode =
+ first_significant_code(code + 1+LINK_SIZE, options, PCRE_MULTILINE, FALSE);
+ register int op = *scode;
+
+ /* Capturing brackets */
+
+ if (op > OP_BRA)
+ {
+ int new_map;
+ op -= OP_BRA;
+ if (op > EXTRACT_BASIC_MAX) op = GET2(scode, 2+LINK_SIZE);
+ new_map = bracket_map | ((op < 32)? (1 << op) : 1);
+ if (!is_anchored(scode, options, new_map, backref_map)) return FALSE;
+ }
+
+ /* Other brackets */
+
+ else if (op == OP_BRA || op == OP_ASSERT || op == OP_ONCE || op == OP_COND)
+ {
+ if (!is_anchored(scode, options, bracket_map, backref_map)) return FALSE;
+ }
+
+ /* .* is not anchored unless DOTALL is set and it isn't in brackets that
+ are or may be referenced. */
+
+ else if ((op == OP_TYPESTAR || op == OP_TYPEMINSTAR) &&
+ (*options & PCRE_DOTALL) != 0)
+ {
+ if (scode[1] != OP_ANY || (bracket_map & backref_map) != 0) return FALSE;
+ }
+
+ /* Check for explicit anchoring */
+
+ else if (op != OP_SOD && op != OP_SOM &&
+ ((*options & PCRE_MULTILINE) != 0 || op != OP_CIRC))
+ return FALSE;
+ code += GET(code, 1);
+ }
+while (*code == OP_ALT); /* Loop for each alternative */
+return TRUE;
+}
+
+
+
+/*************************************************
+* Check for starting with ^ or .* *
+*************************************************/
+
+/* This is called to find out if every branch starts with ^ or .* so that
+"first char" processing can be done to speed things up in multiline
+matching and for non-DOTALL patterns that start with .* (which must start at
+the beginning or after \n). As in the case of is_anchored() (see above), we
+have to take account of back references to capturing brackets that contain .*
+because in that case we can't make the assumption.
+
+Arguments:
+ code points to start of expression (the bracket)
+ bracket_map a bitmap of which brackets we are inside while testing; this
+ handles up to substring 31; after that we just have to take
+ the less precise approach
+ backref_map the back reference bitmap
+
+Returns: TRUE or FALSE
+*/
+
+static BOOL
+is_startline(const uschar *code, unsigned int bracket_map,
+ unsigned int backref_map)
+{
+do {
+ const uschar *scode = first_significant_code(code + 1+LINK_SIZE, NULL, 0,
+ FALSE);
+ register int op = *scode;
+
+ /* Capturing brackets */
+
+ if (op > OP_BRA)
+ {
+ int new_map;
+ op -= OP_BRA;
+ if (op > EXTRACT_BASIC_MAX) op = GET2(scode, 2+LINK_SIZE);
+ new_map = bracket_map | ((op < 32)? (1 << op) : 1);
+ if (!is_startline(scode, new_map, backref_map)) return FALSE;
+ }
+
+ /* Other brackets */
+
+ else if (op == OP_BRA || op == OP_ASSERT || op == OP_ONCE || op == OP_COND)
+ { if (!is_startline(scode, bracket_map, backref_map)) return FALSE; }
+
+ /* .* means "start at start or after \n" if it isn't in brackets that
+ may be referenced. */
+
+ else if (op == OP_TYPESTAR || op == OP_TYPEMINSTAR)
+ {
+ if (scode[1] != OP_ANY || (bracket_map & backref_map) != 0) return FALSE;
+ }
+
+ /* Check for explicit circumflex */
+
+ else if (op != OP_CIRC) return FALSE;
+
+ /* Move on to the next alternative */
+
+ code += GET(code, 1);
+ }
+while (*code == OP_ALT); /* Loop for each alternative */
+return TRUE;
+}
+
+
+
+/*************************************************
+* Check for asserted fixed first char *
+*************************************************/
+
+/* During compilation, the "first char" settings from forward assertions are
+discarded, because they can cause conflicts with actual literals that follow.
+However, if we end up without a first char setting for an unanchored pattern,
+it is worth scanning the regex to see if there is an initial asserted first
+char. If all branches start with the same asserted char, or with a bracket all
+of whose alternatives start with the same asserted char (recurse ad lib), then
+we return that char, otherwise -1.
+
+Arguments:
+ code points to start of expression (the bracket)
+ options pointer to the options (used to check casing changes)
+ inassert TRUE if in an assertion
+
+Returns: -1 or the fixed first char
+*/
+
+static int
+find_firstassertedchar(const uschar *code, int *options, BOOL inassert)
+{
+register int c = -1;
+do {
+ int d;
+ const uschar *scode =
+ first_significant_code(code + 1+LINK_SIZE, options, PCRE_CASELESS, TRUE);
+ register int op = *scode;
+
+ if (op >= OP_BRA) op = OP_BRA;
+
+ switch(op)
+ {
+ default:
+ return -1;
+
+ case OP_BRA:
+ case OP_ASSERT:
+ case OP_ONCE:
+ case OP_COND:
+ if ((d = find_firstassertedchar(scode, options, op == OP_ASSERT)) < 0)
+ return -1;
+ if (c < 0) c = d; else if (c != d) return -1;
+ break;
+
+ case OP_EXACT: /* Fall through */
+ scode += 2;
+
+ case OP_CHAR:
+ case OP_CHARNC:
+ case OP_PLUS:
+ case OP_MINPLUS:
+ if (!inassert) return -1;
+ if (c < 0)
+ {
+ c = scode[1];
+ if ((*options & PCRE_CASELESS) != 0) c |= REQ_CASELESS;
+ }
+ else if (c != scode[1]) return -1;
+ break;
+ }
+
+ code += GET(code, 1);
+ }
+while (*code == OP_ALT);
+return c;
+}
+
+
+
+
+#ifdef SUPPORT_UTF8
+/*************************************************
+* Validate a UTF-8 string *
+*************************************************/
+
+/* This function is called (optionally) at the start of compile or match, to
+validate that a supposed UTF-8 string is actually valid. The early check means
+that subsequent code can assume it is dealing with a valid string. The check
+can be turned off for maximum performance, but then consequences of supplying
+an invalid string are then undefined.
+
+Arguments:
+ string points to the string
+ length length of string, or -1 if the string is zero-terminated
+
+Returns: < 0 if the string is a valid UTF-8 string
+ >= 0 otherwise; the value is the offset of the bad byte
+*/
+
+static int
+valid_utf8(const uschar *string, int length)
+{
+register const uschar *p;
+
+if (length < 0)
+ {
+ for (p = string; *p != 0; p++);
+ length = p - string;
+ }
+
+for (p = string; length-- > 0; p++)
+ {
+ register int ab;
+ register int c = *p;
+ if (c < 128) continue;
+ if ((c & 0xc0) != 0xc0) return p - string;
+ ab = utf8_table4[c & 0x3f]; /* Number of additional bytes */
+ if (length < ab) return p - string;
+ length -= ab;
+
+ /* Check top bits in the second byte */
+ if ((*(++p) & 0xc0) != 0x80) return p - string;
+
+ /* Check for overlong sequences for each different length */
+ switch (ab)
+ {
+ /* Check for xx00 000x */
+ case 1:
+ if ((c & 0x3e) == 0) return p - string;
+ continue; /* We know there aren't any more bytes to check */
+
+ /* Check for 1110 0000, xx0x xxxx */
+ case 2:
+ if (c == 0xe0 && (*p & 0x20) == 0) return p - string;
+ break;
+
+ /* Check for 1111 0000, xx00 xxxx */
+ case 3:
+ if (c == 0xf0 && (*p & 0x30) == 0) return p - string;
+ break;
+
+ /* Check for 1111 1000, xx00 0xxx */
+ case 4:
+ if (c == 0xf8 && (*p & 0x38) == 0) return p - string;
+ break;
+
+ /* Check for leading 0xfe or 0xff, and then for 1111 1100, xx00 00xx */
+ case 5:
+ if (c == 0xfe || c == 0xff ||
+ (c == 0xfc && (*p & 0x3c) == 0)) return p - string;
+ break;
+ }
+
+ /* Check for valid bytes after the 2nd, if any; all must start 10 */
+ while (--ab > 0)
+ {
+ if ((*(++p) & 0xc0) != 0x80) return p - string;
+ }
+ }
+
+return -1;
+}
+#endif
+
+
+
+/*************************************************
+* Compile a Regular Expression *
+*************************************************/
+
+/* This function takes a string and returns a pointer to a block of store
+holding a compiled version of the expression.
+
+Arguments:
+ pattern the regular expression
+ options various option bits
+ errorptr pointer to pointer to error text
+ erroroffset ptr offset in pattern where error was detected
+ tables pointer to character tables or NULL
+
+Returns: pointer to compiled data block, or NULL on error,
+ with errorptr and erroroffset set
+*/
+
+EXPORT pcre *
+pcre_compile(const char *pattern, int options, const char **errorptr,
+ int *erroroffset, const unsigned char *tables)
+{
+real_pcre *re;
+int length = 1 + LINK_SIZE; /* For initial BRA plus length */
+int c, firstbyte, reqbyte;
+int bracount = 0;
+int branch_extra = 0;
+int branch_newextra;
+int item_count = -1;
+int name_count = 0;
+int max_name_size = 0;
+int lastitemlength = 0;
+#ifdef SUPPORT_UTF8
+BOOL utf8;
+BOOL class_utf8;
+#endif
+BOOL inescq = FALSE;
+unsigned int brastackptr = 0;
+size_t size;
+uschar *code;
+const uschar *codestart;
+const uschar *ptr;
+compile_data compile_block;
+int brastack[BRASTACK_SIZE];
+uschar bralenstack[BRASTACK_SIZE];
+
+/* We can't pass back an error message if errorptr is NULL; I guess the best we
+can do is just return NULL. */
+
+if (errorptr == NULL) return NULL;
+*errorptr = NULL;
+
+/* However, we can give a message for this error */
+
+if (erroroffset == NULL)
+ {
+ *errorptr = ERR16;
+ return NULL;
+ }
+*erroroffset = 0;
+
+/* Can't support UTF8 unless PCRE has been compiled to include the code. */
+
+#ifdef SUPPORT_UTF8
+utf8 = (options & PCRE_UTF8) != 0;
+if (utf8 && (options & PCRE_NO_UTF8_CHECK) == 0 &&
+ (*erroroffset = valid_utf8((uschar *)pattern, -1)) >= 0)
+ {
+ *errorptr = ERR44;
+ return NULL;
+ }
+#else
+if ((options & PCRE_UTF8) != 0)
+ {
+ *errorptr = ERR32;
+ return NULL;
+ }
+#endif
+
+if ((options & ~PUBLIC_OPTIONS) != 0)
+ {
+ *errorptr = ERR17;
+ return NULL;
+ }
+
+/* Set up pointers to the individual character tables */
+
+if (tables == NULL) tables = pcre_default_tables;
+compile_block.lcc = tables + lcc_offset;
+compile_block.fcc = tables + fcc_offset;
+compile_block.cbits = tables + cbits_offset;
+compile_block.ctypes = tables + ctypes_offset;
+
+/* Maximum back reference and backref bitmap. This is updated for numeric
+references during the first pass, but for named references during the actual
+compile pass. The bitmap records up to 31 back references to help in deciding
+whether (.*) can be treated as anchored or not. */
+
+compile_block.top_backref = 0;
+compile_block.backref_map = 0;
+
+/* Reflect pattern for debugging output */
+
+DPRINTF(("------------------------------------------------------------------\n"));
+DPRINTF(("%s\n", pattern));
+
+/* The first thing to do is to make a pass over the pattern to compute the
+amount of store required to hold the compiled code. This does not have to be
+perfect as long as errors are overestimates. At the same time we can detect any
+flag settings right at the start, and extract them. Make an attempt to correct
+for any counted white space if an "extended" flag setting appears late in the
+pattern. We can't be so clever for #-comments. */
+
+ptr = (const uschar *)(pattern - 1);
+while ((c = *(++ptr)) != 0)
+ {
+ int min, max;
+ int class_optcount;
+ int bracket_length;
+ int duplength;
+
+ /* If we are inside a \Q...\E sequence, all chars are literal */
+
+ if (inescq)
+ {
+ if ((options & PCRE_AUTO_CALLOUT) != 0) length += 2 + 2*LINK_SIZE;
+ goto NORMAL_CHAR;
+ }
+
+ /* Otherwise, first check for ignored whitespace and comments */
+
+ if ((options & PCRE_EXTENDED) != 0)
+ {
+ if ((compile_block.ctypes[c] & ctype_space) != 0) continue;
+ if (c == '#')
+ {
+ /* The space before the ; is to avoid a warning on a silly compiler
+ on the Macintosh. */
+ while ((c = *(++ptr)) != 0 && c != NEWLINE) ;
+ if (c == 0) break;
+ continue;
+ }
+ }
+
+ item_count++; /* Is zero for the first non-comment item */
+
+ /* Allow space for auto callout before every item except quantifiers. */
+
+ if ((options & PCRE_AUTO_CALLOUT) != 0 &&
+ c != '*' && c != '+' && c != '?' &&
+ (c != '{' || !is_counted_repeat(ptr + 1)))
+ length += 2 + 2*LINK_SIZE;
+
+ switch(c)
+ {
+ /* A backslashed item may be an escaped data character or it may be a
+ character type. */
+
+ case '\\':
+ c = check_escape(&ptr, errorptr, bracount, options, FALSE);
+ if (*errorptr != NULL) goto PCRE_ERROR_RETURN;
+
+ lastitemlength = 1; /* Default length of last item for repeats */
+
+ if (c >= 0) /* Data character */
+ {
+ length += 2; /* For a one-byte character */
+
+#ifdef SUPPORT_UTF8
+ if (utf8 && c > 127)
+ {
+ int i;
+ for (i = 0; i < sizeof(utf8_table1)/sizeof(int); i++)
+ if (c <= utf8_table1[i]) break;
+ length += i;
+ lastitemlength += i;
+ }
+#endif
+
+ continue;
+ }
+
+ /* If \Q, enter "literal" mode */
+
+ if (-c == ESC_Q)
+ {
+ inescq = TRUE;
+ continue;
+ }
+
+ /* \X is supported only if Unicode property support is compiled */
+
+#ifndef SUPPORT_UCP
+ if (-c == ESC_X)
+ {
+ *errorptr = ERR45;
+ goto PCRE_ERROR_RETURN;
+ }
+#endif
+
+ /* \P and \p are for Unicode properties, but only when the support has
+ been compiled. Each item needs 2 bytes. */
+
+ else if (-c == ESC_P || -c == ESC_p)
+ {
+#ifdef SUPPORT_UCP
+ BOOL negated;
+ length += 2;
+ lastitemlength = 2;
+ if (get_ucp(&ptr, &negated, errorptr) < 0) goto PCRE_ERROR_RETURN;
+ continue;
+#else
+ *errorptr = ERR45;
+ goto PCRE_ERROR_RETURN;
+#endif
+ }
+
+ /* Other escapes need one byte */
+
+ length++;
+
+ /* A back reference needs an additional 2 bytes, plus either one or 5
+ bytes for a repeat. We also need to keep the value of the highest
+ back reference. */
+
+ if (c <= -ESC_REF)
+ {
+ int refnum = -c - ESC_REF;
+ compile_block.backref_map |= (refnum < 32)? (1 << refnum) : 1;
+ if (refnum > compile_block.top_backref)
+ compile_block.top_backref = refnum;
+ length += 2; /* For single back reference */
+ if (ptr[1] == '{' && is_counted_repeat(ptr+2))
+ {
+ ptr = read_repeat_counts(ptr+2, &min, &max, errorptr);
+ if (*errorptr != NULL) goto PCRE_ERROR_RETURN;
+ if ((min == 0 && (max == 1 || max == -1)) ||
+ (min == 1 && max == -1))
+ length++;
+ else length += 5;
+ if (ptr[1] == '?') ptr++;
+ }
+ }
+ continue;
+
+ case '^': /* Single-byte metacharacters */
+ case '.':
+ case '$':
+ length++;
+ lastitemlength = 1;
+ continue;
+
+ case '*': /* These repeats won't be after brackets; */
+ case '+': /* those are handled separately */
+ case '?':
+ length++;
+ goto POSESSIVE; /* A few lines below */
+
+ /* This covers the cases of braced repeats after a single char, metachar,
+ class, or back reference. */
+
+ case '{':
+ if (!is_counted_repeat(ptr+1)) goto NORMAL_CHAR;
+ ptr = read_repeat_counts(ptr+1, &min, &max, errorptr);
+ if (*errorptr != NULL) goto PCRE_ERROR_RETURN;
+
+ /* These special cases just insert one extra opcode */
+
+ if ((min == 0 && (max == 1 || max == -1)) ||
+ (min == 1 && max == -1))
+ length++;
+
+ /* These cases might insert additional copies of a preceding character. */
+
+ else
+ {
+ if (min != 1)
+ {
+ length -= lastitemlength; /* Uncount the original char or metachar */
+ if (min > 0) length += 3 + lastitemlength;
+ }
+ length += lastitemlength + ((max > 0)? 3 : 1);
+ }
+
+ if (ptr[1] == '?') ptr++; /* Needs no extra length */
+
+ POSESSIVE: /* Test for possessive quantifier */
+ if (ptr[1] == '+')
+ {
+ ptr++;
+ length += 2 + 2*LINK_SIZE; /* Allow for atomic brackets */
+ }
+ continue;
+
+ /* An alternation contains an offset to the next branch or ket. If any ims
+ options changed in the previous branch(es), and/or if we are in a
+ lookbehind assertion, extra space will be needed at the start of the
+ branch. This is handled by branch_extra. */
+
+ case '|':
+ length += 1 + LINK_SIZE + branch_extra;
+ continue;
+
+ /* A character class uses 33 characters provided that all the character
+ values are less than 256. Otherwise, it uses a bit map for low valued
+ characters, and individual items for others. Don't worry about character
+ types that aren't allowed in classes - they'll get picked up during the
+ compile. A character class that contains only one single-byte character
+ uses 2 or 3 bytes, depending on whether it is negated or not. Notice this
+ where we can. (In UTF-8 mode we can do this only for chars < 128.) */
+
+ case '[':
+ if (*(++ptr) == '^')
+ {
+ class_optcount = 10; /* Greater than one */
+ ptr++;
+ }
+ else class_optcount = 0;
+
+#ifdef SUPPORT_UTF8
+ class_utf8 = FALSE;
+#endif
+
+ /* Written as a "do" so that an initial ']' is taken as data */
+
+ if (*ptr != 0) do
+ {
+ /* Inside \Q...\E everything is literal except \E */
+
+ if (inescq)
+ {
+ if (*ptr != '\\' || ptr[1] != 'E') goto GET_ONE_CHARACTER;
+ inescq = FALSE;
+ ptr += 1;
+ continue;
+ }
+
+ /* Outside \Q...\E, check for escapes */
+
+ if (*ptr == '\\')
+ {
+ c = check_escape(&ptr, errorptr, bracount, options, TRUE);
+ if (*errorptr != NULL) goto PCRE_ERROR_RETURN;
+
+ /* \b is backspace inside a class; \X is literal */
+
+ if (-c == ESC_b) c = '\b';
+ else if (-c == ESC_X) c = 'X';
+
+ /* \Q enters quoting mode */
+
+ else if (-c == ESC_Q)
+ {
+ inescq = TRUE;
+ continue;
+ }
+
+ /* Handle escapes that turn into characters */
+
+ if (c >= 0) goto NON_SPECIAL_CHARACTER;
+
+ /* Escapes that are meta-things. The normal ones just affect the
+ bit map, but Unicode properties require an XCLASS extended item. */
+
+ else
+ {
+ class_optcount = 10; /* \d, \s etc; make sure > 1 */
+#ifdef SUPPORT_UTF8
+ if (-c == ESC_p || -c == ESC_P)
+ {
+ if (!class_utf8)
+ {
+ class_utf8 = TRUE;
+ length += LINK_SIZE + 2;
+ }
+ length += 2;
+ }
+#endif
+ }
+ }
+
+ /* Check the syntax for POSIX stuff. The bits we actually handle are
+ checked during the real compile phase. */
+
+ else if (*ptr == '[' && check_posix_syntax(ptr, &ptr, &compile_block))
+ {
+ ptr++;
+ class_optcount = 10; /* Make sure > 1 */
+ }
+
+ /* Anything else increments the possible optimization count. We have to
+ detect ranges here so that we can compute the number of extra ranges for
+ caseless wide characters when UCP support is available. If there are wide
+ characters, we are going to have to use an XCLASS, even for single
+ characters. */
+
+ else
+ {
+ int d;
+
+ GET_ONE_CHARACTER:
+
+#ifdef SUPPORT_UTF8
+ if (utf8)
+ {
+ int extra = 0;
+ GETCHARLEN(c, ptr, extra);
+ ptr += extra;
+ }
+ else c = *ptr;
+#else
+ c = *ptr;
+#endif
+
+ /* Come here from handling \ above when it escapes to a char value */
+
+ NON_SPECIAL_CHARACTER:
+ class_optcount++;
+
+ d = -1;
+ if (ptr[1] == '-')
+ {
+ uschar const *hyptr = ptr++;
+ if (ptr[1] == '\\')
+ {
+ ptr++;
+ d = check_escape(&ptr, errorptr, bracount, options, TRUE);
+ if (*errorptr != NULL) goto PCRE_ERROR_RETURN;
+ if (-d == ESC_b) d = '\b'; /* backspace */
+ else if (-d == ESC_X) d = 'X'; /* literal X in a class */
+ }
+ else if (ptr[1] != 0 && ptr[1] != ']')
+ {
+ ptr++;
+#ifdef SUPPORT_UTF8
+ if (utf8)
+ {
+ int extra = 0;
+ GETCHARLEN(d, ptr, extra);
+ ptr += extra;
+ }
+ else
+#endif
+ d = *ptr;
+ }
+ if (d < 0) ptr = hyptr; /* go back to hyphen as data */
+ }
+
+ /* If d >= 0 we have a range. In UTF-8 mode, if the end is > 255, or >
+ 127 for caseless matching, we will need to use an XCLASS. */
+
+ if (d >= 0)
+ {
+ class_optcount = 10; /* Ensure > 1 */
+ if (d < c)
+ {
+ *errorptr = ERR8;
+ goto PCRE_ERROR_RETURN;
+ }
+
+#ifdef SUPPORT_UTF8
+ if (utf8 && (d > 255 || ((options & PCRE_CASELESS) != 0 && d > 127)))
+ {
+ uschar buffer[6];
+ if (!class_utf8) /* Allow for XCLASS overhead */
+ {
+ class_utf8 = TRUE;
+ length += LINK_SIZE + 2;
+ }
+
+#ifdef SUPPORT_UCP
+ /* If we have UCP support, find out how many extra ranges are
+ needed to map the other case of characters within this range. We
+ have to mimic the range optimization here, because extending the
+ range upwards might push d over a boundary that makes is use
+ another byte in the UTF-8 representation. */
+
+ if ((options & PCRE_CASELESS) != 0)
+ {
+ int occ, ocd;
+ int cc = c;
+ int origd = d;
+ while (get_othercase_range(&cc, origd, &occ, &ocd))
+ {
+ if (occ >= c && ocd <= d) continue; /* Skip embedded */
+
+ if (occ < c && ocd >= c - 1) /* Extend the basic range */
+ { /* if there is overlap, */
+ c = occ; /* noting that if occ < c */
+ continue; /* we can't have ocd > d */
+ } /* because a subrange is */
+ if (ocd > d && occ <= d + 1) /* always shorter than */
+ { /* the basic range. */
+ d = ocd;
+ continue;
+ }
+
+ /* An extra item is needed */
+
+ length += 1 + ord2utf8(occ, buffer) +
+ ((occ == ocd)? 0 : ord2utf8(ocd, buffer));
+ }
+ }
+#endif /* SUPPORT_UCP */
+
+ /* The length of the (possibly extended) range */
+
+ length += 1 + ord2utf8(c, buffer) + ord2utf8(d, buffer);
+ }
+#endif /* SUPPORT_UTF8 */
+
+ }
+
+ /* We have a single character. There is nothing to be done unless we
+ are in UTF-8 mode. If the char is > 255, or 127 when caseless, we must
+ allow for an XCL_SINGLE item, doubled for caselessness if there is UCP
+ support. */
+
+ else
+ {
+#ifdef SUPPORT_UTF8
+ if (utf8 && (c > 255 || ((options & PCRE_CASELESS) != 0 && c > 127)))
+ {
+ uschar buffer[6];
+ class_optcount = 10; /* Ensure > 1 */
+ if (!class_utf8) /* Allow for XCLASS overhead */
+ {
+ class_utf8 = TRUE;
+ length += LINK_SIZE + 2;
+ }
+#ifdef SUPPORT_UCP
+ length += (((options & PCRE_CASELESS) != 0)? 2 : 1) *
+ (1 + ord2utf8(c, buffer));
+#else /* SUPPORT_UCP */
+ length += 1 + ord2utf8(c, buffer);
+#endif /* SUPPORT_UCP */
+ }
+#endif /* SUPPORT_UTF8 */
+ }
+ }
+ }
+ while (*(++ptr) != 0 && (inescq || *ptr != ']')); /* Concludes "do" above */
+
+ if (*ptr == 0) /* Missing terminating ']' */
+ {
+ *errorptr = ERR6;
+ goto PCRE_ERROR_RETURN;
+ }
+
+ /* We can optimize when there was only one optimizable character. Repeats
+ for positive and negated single one-byte chars are handled by the general
+ code. Here, we handle repeats for the class opcodes. */
+
+ if (class_optcount == 1) length += 3; else
+ {
+ length += 33;
+
+ /* A repeat needs either 1 or 5 bytes. If it is a possessive quantifier,
+ we also need extra for wrapping the whole thing in a sub-pattern. */
+
+ if (*ptr != 0 && ptr[1] == '{' && is_counted_repeat(ptr+2))
+ {
+ ptr = read_repeat_counts(ptr+2, &min, &max, errorptr);
+ if (*errorptr != NULL) goto PCRE_ERROR_RETURN;
+ if ((min == 0 && (max == 1 || max == -1)) ||
+ (min == 1 && max == -1))
+ length++;
+ else length += 5;
+ if (ptr[1] == '+')
+ {
+ ptr++;
+ length += 2 + 2*LINK_SIZE;
+ }
+ else if (ptr[1] == '?') ptr++;
+ }
+ }
+ continue;
+
+ /* Brackets may be genuine groups or special things */
+
+ case '(':
+ branch_newextra = 0;
+ bracket_length = 1 + LINK_SIZE;
+
+ /* Handle special forms of bracket, which all start (? */
+
+ if (ptr[1] == '?')
+ {
+ int set, unset;
+ int *optset;
+
+ switch (c = ptr[2])
+ {
+ /* Skip over comments entirely */
+ case '#':
+ ptr += 3;
+ while (*ptr != 0 && *ptr != ')') ptr++;
+ if (*ptr == 0)
+ {
+ *errorptr = ERR18;
+ goto PCRE_ERROR_RETURN;
+ }
+ continue;
+
+ /* Non-referencing groups and lookaheads just move the pointer on, and
+ then behave like a non-special bracket, except that they don't increment
+ the count of extracting brackets. Ditto for the "once only" bracket,
+ which is in Perl from version 5.005. */
+
+ case ':':
+ case '=':
+ case '!':
+ case '>':
+ ptr += 2;
+ break;
+
+ /* (?R) specifies a recursive call to the regex, which is an extension
+ to provide the facility which can be obtained by (?p{perl-code}) in
+ Perl 5.6. In Perl 5.8 this has become (??{perl-code}).
+
+ From PCRE 4.00, items such as (?3) specify subroutine-like "calls" to
+ the appropriate numbered brackets. This includes both recursive and
+ non-recursive calls. (?R) is now synonymous with (?0). */
+
+ case 'R':
+ ptr++;
+
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ ptr += 2;
+ if (c != 'R')
+ while ((digitab[*(++ptr)] & ctype_digit) != 0);
+ if (*ptr != ')')
+ {
+ *errorptr = ERR29;
+ goto PCRE_ERROR_RETURN;
+ }
+ length += 1 + LINK_SIZE;
+
+ /* If this item is quantified, it will get wrapped inside brackets so
+ as to use the code for quantified brackets. We jump down and use the
+ code that handles this for real brackets. */
+
+ if (ptr[1] == '+' || ptr[1] == '*' || ptr[1] == '?' || ptr[1] == '{')
+ {
+ length += 2 + 2 * LINK_SIZE; /* to make bracketed */
+ duplength = 5 + 3 * LINK_SIZE;
+ goto HANDLE_QUANTIFIED_BRACKETS;
+ }
+ continue;
+
+ /* (?C) is an extension which provides "callout" - to provide a bit of
+ the functionality of the Perl (?{...}) feature. An optional number may
+ follow (default is zero). */
+
+ case 'C':
+ ptr += 2;
+ while ((digitab[*(++ptr)] & ctype_digit) != 0);
+ if (*ptr != ')')
+ {
+ *errorptr = ERR39;
+ goto PCRE_ERROR_RETURN;
+ }
+ length += 2 + 2*LINK_SIZE;
+ continue;
+
+ /* Named subpatterns are an extension copied from Python */
+
+ case 'P':
+ ptr += 3;
+ if (*ptr == '<')
+ {
+ const uschar *p; /* Don't amalgamate; some compilers */
+ p = ++ptr; /* grumble at autoincrement in declaration */
+ while ((compile_block.ctypes[*ptr] & ctype_word) != 0) ptr++;
+ if (*ptr != '>')
+ {
+ *errorptr = ERR42;
+ goto PCRE_ERROR_RETURN;
+ }
+ name_count++;
+ if (ptr - p > max_name_size) max_name_size = (ptr - p);
+ break;
+ }
+
+ if (*ptr == '=' || *ptr == '>')
+ {
+ while ((compile_block.ctypes[*(++ptr)] & ctype_word) != 0);
+ if (*ptr != ')')
+ {
+ *errorptr = ERR42;
+ goto PCRE_ERROR_RETURN;
+ }
+ break;
+ }
+
+ /* Unknown character after (?P */
+
+ *errorptr = ERR41;
+ goto PCRE_ERROR_RETURN;
+
+ /* Lookbehinds are in Perl from version 5.005 */
+
+ case '<':
+ ptr += 3;
+ if (*ptr == '=' || *ptr == '!')
+ {
+ branch_newextra = 1 + LINK_SIZE;
+ length += 1 + LINK_SIZE; /* For the first branch */
+ break;
+ }
+ *errorptr = ERR24;
+ goto PCRE_ERROR_RETURN;
+
+ /* Conditionals are in Perl from version 5.005. The bracket must either
+ be followed by a number (for bracket reference) or by an assertion
+ group, or (a PCRE extension) by 'R' for a recursion test. */
+
+ case '(':
+ if (ptr[3] == 'R' && ptr[4] == ')')
+ {
+ ptr += 4;
+ length += 3;
+ }
+ else if ((digitab[ptr[3]] & ctype_digit) != 0)
+ {
+ ptr += 4;
+ length += 3;
+ while ((digitab[*ptr] & ctype_digit) != 0) ptr++;
+ if (*ptr != ')')
+ {
+ *errorptr = ERR26;
+ goto PCRE_ERROR_RETURN;
+ }
+ }
+ else /* An assertion must follow */
+ {
+ ptr++; /* Can treat like ':' as far as spacing is concerned */
+ if (ptr[2] != '?' ||
+ (ptr[3] != '=' && ptr[3] != '!' && ptr[3] != '<') )
+ {
+ ptr += 2; /* To get right offset in message */
+ *errorptr = ERR28;
+ goto PCRE_ERROR_RETURN;
+ }
+ }
+ break;
+
+ /* Else loop checking valid options until ) is met. Anything else is an
+ error. If we are without any brackets, i.e. at top level, the settings
+ act as if specified in the options, so massage the options immediately.
+ This is for backward compatibility with Perl 5.004. */
+
+ default:
+ set = unset = 0;
+ optset = &set;
+ ptr += 2;
+
+ for (;; ptr++)
+ {
+ c = *ptr;
+ switch (c)
+ {
+ case 'i':
+ *optset |= PCRE_CASELESS;
+ continue;
+
+ case 'm':
+ *optset |= PCRE_MULTILINE;
+ continue;
+
+ case 's':
+ *optset |= PCRE_DOTALL;
+ continue;
+
+ case 'x':
+ *optset |= PCRE_EXTENDED;
+ continue;
+
+ case 'X':
+ *optset |= PCRE_EXTRA;
+ continue;
+
+ case 'U':
+ *optset |= PCRE_UNGREEDY;
+ continue;
+
+ case '-':
+ optset = &unset;
+ continue;
+
+ /* A termination by ')' indicates an options-setting-only item; if
+ this is at the very start of the pattern (indicated by item_count
+ being zero), we use it to set the global options. This is helpful
+ when analyzing the pattern for first characters, etc. Otherwise
+ nothing is done here and it is handled during the compiling
+ process.
+
+ [Historical note: Up to Perl 5.8, options settings at top level
+ were always global settings, wherever they appeared in the pattern.
+ That is, they were equivalent to an external setting. From 5.8
+ onwards, they apply only to what follows (which is what you might
+ expect).] */
+
+ case ')':
+ if (item_count == 0)
+ {
+ options = (options | set) & (~unset);
+ set = unset = 0; /* To save length */
+ item_count--; /* To allow for several */
+ }
+
+ /* Fall through */
+
+ /* A termination by ':' indicates the start of a nested group with
+ the given options set. This is again handled at compile time, but
+ we must allow for compiled space if any of the ims options are
+ set. We also have to allow for resetting space at the end of
+ the group, which is why 4 is added to the length and not just 2.
+ If there are several changes of options within the same group, this
+ will lead to an over-estimate on the length, but this shouldn't
+ matter very much. We also have to allow for resetting options at
+ the start of any alternations, which we do by setting
+ branch_newextra to 2. Finally, we record whether the case-dependent
+ flag ever changes within the regex. This is used by the "required
+ character" code. */
+
+ case ':':
+ if (((set|unset) & PCRE_IMS) != 0)
+ {
+ length += 4;
+ branch_newextra = 2;
+ if (((set|unset) & PCRE_CASELESS) != 0) options |= PCRE_ICHANGED;
+ }
+ goto END_OPTIONS;
+
+ /* Unrecognized option character */
+
+ default:
+ *errorptr = ERR12;
+ goto PCRE_ERROR_RETURN;
+ }
+ }
+
+ /* If we hit a closing bracket, that's it - this is a freestanding
+ option-setting. We need to ensure that branch_extra is updated if
+ necessary. The only values branch_newextra can have here are 0 or 2.
+ If the value is 2, then branch_extra must either be 2 or 5, depending
+ on whether this is a lookbehind group or not. */
+
+ END_OPTIONS:
+ if (c == ')')
+ {
+ if (branch_newextra == 2 &&
+ (branch_extra == 0 || branch_extra == 1+LINK_SIZE))
+ branch_extra += branch_newextra;
+ continue;
+ }
+
+ /* If options were terminated by ':' control comes here. Fall through
+ to handle the group below. */
+ }
+ }
+
+ /* Extracting brackets must be counted so we can process escapes in a
+ Perlish way. If the number exceeds EXTRACT_BASIC_MAX we are going to
+ need an additional 3 bytes of store per extracting bracket. However, if
+ PCRE_NO_AUTO)CAPTURE is set, unadorned brackets become non-capturing, so we
+ must leave the count alone (it will aways be zero). */
+
+ else if ((options & PCRE_NO_AUTO_CAPTURE) == 0)
+ {
+ bracount++;
+ if (bracount > EXTRACT_BASIC_MAX) bracket_length += 3;
+ }
+
+ /* Save length for computing whole length at end if there's a repeat that
+ requires duplication of the group. Also save the current value of
+ branch_extra, and start the new group with the new value. If non-zero, this
+ will either be 2 for a (?imsx: group, or 3 for a lookbehind assertion. */
+
+ if (brastackptr >= sizeof(brastack)/sizeof(int))
+ {
+ *errorptr = ERR19;
+ goto PCRE_ERROR_RETURN;
+ }
+
+ bralenstack[brastackptr] = branch_extra;
+ branch_extra = branch_newextra;
+
+ brastack[brastackptr++] = length;
+ length += bracket_length;
+ continue;
+
+ /* Handle ket. Look for subsequent max/min; for certain sets of values we
+ have to replicate this bracket up to that many times. If brastackptr is
+ 0 this is an unmatched bracket which will generate an error, but take care
+ not to try to access brastack[-1] when computing the length and restoring
+ the branch_extra value. */
+
+ case ')':
+ length += 1 + LINK_SIZE;
+ if (brastackptr > 0)
+ {
+ duplength = length - brastack[--brastackptr];
+ branch_extra = bralenstack[brastackptr];
+ }
+ else duplength = 0;
+
+ /* The following code is also used when a recursion such as (?3) is
+ followed by a quantifier, because in that case, it has to be wrapped inside
+ brackets so that the quantifier works. The value of duplength must be
+ set before arrival. */
+
+ HANDLE_QUANTIFIED_BRACKETS:
+
+ /* Leave ptr at the final char; for read_repeat_counts this happens
+ automatically; for the others we need an increment. */
+
+ if ((c = ptr[1]) == '{' && is_counted_repeat(ptr+2))
+ {
+ ptr = read_repeat_counts(ptr+2, &min, &max, errorptr);
+ if (*errorptr != NULL) goto PCRE_ERROR_RETURN;
+ }
+ else if (c == '*') { min = 0; max = -1; ptr++; }
+ else if (c == '+') { min = 1; max = -1; ptr++; }
+ else if (c == '?') { min = 0; max = 1; ptr++; }
+ else { min = 1; max = 1; }
+
+ /* If the minimum is zero, we have to allow for an OP_BRAZERO before the
+ group, and if the maximum is greater than zero, we have to replicate
+ maxval-1 times; each replication acquires an OP_BRAZERO plus a nesting
+ bracket set. */
+
+ if (min == 0)
+ {
+ length++;
+ if (max > 0) length += (max - 1) * (duplength + 3 + 2*LINK_SIZE);
+ }
+
+ /* When the minimum is greater than zero, we have to replicate up to
+ minval-1 times, with no additions required in the copies. Then, if there
+ is a limited maximum we have to replicate up to maxval-1 times allowing
+ for a BRAZERO item before each optional copy and nesting brackets for all
+ but one of the optional copies. */
+
+ else
+ {
+ length += (min - 1) * duplength;
+ if (max > min) /* Need this test as max=-1 means no limit */
+ length += (max - min) * (duplength + 3 + 2*LINK_SIZE)
+ - (2 + 2*LINK_SIZE);
+ }
+
+ /* Allow space for once brackets for "possessive quantifier" */
+
+ if (ptr[1] == '+')
+ {
+ ptr++;
+ length += 2 + 2*LINK_SIZE;
+ }
+ continue;
+
+ /* Non-special character. It won't be space or # in extended mode, so it is
+ always a genuine character. If we are in a \Q...\E sequence, check for the
+ end; if not, we have a literal. */
+
+ default:
+ NORMAL_CHAR:
+
+ if (inescq && c == '\\' && ptr[1] == 'E')
+ {
+ inescq = FALSE;
+ ptr++;
+ continue;
+ }
+
+ length += 2; /* For a one-byte character */
+ lastitemlength = 1; /* Default length of last item for repeats */
+
+ /* In UTF-8 mode, check for additional bytes. */
+
+#ifdef SUPPORT_UTF8
+ if (utf8 && (c & 0xc0) == 0xc0)
+ {
+ while ((ptr[1] & 0xc0) == 0x80) /* Can't flow over the end */
+ { /* because the end is marked */
+ lastitemlength++; /* by a zero byte. */
+ length++;
+ ptr++;
+ }
+ }
+#endif
+
+ continue;
+ }
+ }
+
+length += 2 + LINK_SIZE; /* For final KET and END */
+
+if ((options & PCRE_AUTO_CALLOUT) != 0)
+ length += 2 + 2*LINK_SIZE; /* For final callout */
+
+if (length > MAX_PATTERN_SIZE)
+ {
+ *errorptr = ERR20;
+ return NULL;
+ }
+
+/* Compute the size of data block needed and get it, either from malloc or
+externally provided function. */
+
+size = length + sizeof(real_pcre) + name_count * (max_name_size + 3);
+re = (real_pcre *)(pcre_malloc)(size);
+
+if (re == NULL)
+ {
+ *errorptr = ERR21;
+ return NULL;
+ }
+
+/* Put in the magic number, and save the sizes, options, and character table
+pointer. NULL is used for the default character tables. The nullpad field is at
+the end; it's there to help in the case when a regex compiled on a system with
+4-byte pointers is run on another with 8-byte pointers. */
+
+re->magic_number = MAGIC_NUMBER;
+re->size = size;
+re->options = options;
+re->dummy1 = re->dummy2 = 0;
+re->name_table_offset = sizeof(real_pcre);
+re->name_entry_size = max_name_size + 3;
+re->name_count = name_count;
+re->tables = (tables == pcre_default_tables)? NULL : tables;
+re->nullpad = NULL;
+
+/* The starting points of the name/number translation table and of the code are
+passed around in the compile data block. */
+
+compile_block.names_found = 0;
+compile_block.name_entry_size = max_name_size + 3;
+compile_block.name_table = (uschar *)re + re->name_table_offset;
+codestart = compile_block.name_table + re->name_entry_size * re->name_count;
+compile_block.start_code = codestart;
+compile_block.start_pattern = (const uschar *)pattern;
+compile_block.req_varyopt = 0;
+compile_block.nopartial = FALSE;
+
+/* Set up a starting, non-extracting bracket, then compile the expression. On
+error, *errorptr will be set non-NULL, so we don't need to look at the result
+of the function here. */
+
+ptr = (const uschar *)pattern;
+code = (uschar *)codestart;
+*code = OP_BRA;
+bracount = 0;
+(void)compile_regex(options, options & PCRE_IMS, &bracount, &code, &ptr,
+ errorptr, FALSE, 0, &firstbyte, &reqbyte, NULL, &compile_block);
+re->top_bracket = bracount;
+re->top_backref = compile_block.top_backref;
+
+if (compile_block.nopartial) re->options |= PCRE_NOPARTIAL;
+
+/* If not reached end of pattern on success, there's an excess bracket. */
+
+if (*errorptr == NULL && *ptr != 0) *errorptr = ERR22;
+
+/* Fill in the terminating state and check for disastrous overflow, but
+if debugging, leave the test till after things are printed out. */
+
+*code++ = OP_END;
+
+#ifndef DEBUG
+if (code - codestart > length) *errorptr = ERR23;
+#endif
+
+/* Give an error if there's back reference to a non-existent capturing
+subpattern. */
+
+if (re->top_backref > re->top_bracket) *errorptr = ERR15;
+
+/* Failed to compile, or error while post-processing */
+
+if (*errorptr != NULL)
+ {
+ (pcre_free)(re);
+ PCRE_ERROR_RETURN:
+ *erroroffset = ptr - (const uschar *)pattern;
+ return NULL;
+ }
+
+/* If the anchored option was not passed, set the flag if we can determine that
+the pattern is anchored by virtue of ^ characters or \A or anything else (such
+as starting with .* when DOTALL is set).
+
+Otherwise, if we know what the first character has to be, save it, because that
+speeds up unanchored matches no end. If not, see if we can set the
+PCRE_STARTLINE flag. This is helpful for multiline matches when all branches
+start with ^. and also when all branches start with .* for non-DOTALL matches.
+*/
+
+if ((options & PCRE_ANCHORED) == 0)
+ {
+ int temp_options = options;
+ if (is_anchored(codestart, &temp_options, 0, compile_block.backref_map))
+ re->options |= PCRE_ANCHORED;
+ else
+ {
+ if (firstbyte < 0)
+ firstbyte = find_firstassertedchar(codestart, &temp_options, FALSE);
+ if (firstbyte >= 0) /* Remove caseless flag for non-caseable chars */
+ {
+ int ch = firstbyte & 255;
+ re->first_byte = ((firstbyte & REQ_CASELESS) != 0 &&
+ compile_block.fcc[ch] == ch)? ch : firstbyte;
+ re->options |= PCRE_FIRSTSET;
+ }
+ else if (is_startline(codestart, 0, compile_block.backref_map))
+ re->options |= PCRE_STARTLINE;
+ }
+ }
+
+/* For an anchored pattern, we use the "required byte" only if it follows a
+variable length item in the regex. Remove the caseless flag for non-caseable
+bytes. */
+
+if (reqbyte >= 0 &&
+ ((re->options & PCRE_ANCHORED) == 0 || (reqbyte & REQ_VARY) != 0))
+ {
+ int ch = reqbyte & 255;
+ re->req_byte = ((reqbyte & REQ_CASELESS) != 0 &&
+ compile_block.fcc[ch] == ch)? (reqbyte & ~REQ_CASELESS) : reqbyte;
+ re->options |= PCRE_REQCHSET;
+ }
+
+/* Print out the compiled data for debugging */
+
+#ifdef DEBUG
+
+printf("Length = %d top_bracket = %d top_backref = %d\n",
+ length, re->top_bracket, re->top_backref);
+
+if (re->options != 0)
+ {
+ printf("%s%s%s%s%s%s%s%s%s%s\n",
+ ((re->options & PCRE_NOPARTIAL) != 0)? "nopartial " : "",
+ ((re->options & PCRE_ANCHORED) != 0)? "anchored " : "",
+ ((re->options & PCRE_CASELESS) != 0)? "caseless " : "",
+ ((re->options & PCRE_ICHANGED) != 0)? "case state changed " : "",
+ ((re->options & PCRE_EXTENDED) != 0)? "extended " : "",
+ ((re->options & PCRE_MULTILINE) != 0)? "multiline " : "",
+ ((re->options & PCRE_DOTALL) != 0)? "dotall " : "",
+ ((re->options & PCRE_DOLLAR_ENDONLY) != 0)? "endonly " : "",
+ ((re->options & PCRE_EXTRA) != 0)? "extra " : "",
+ ((re->options & PCRE_UNGREEDY) != 0)? "ungreedy " : "");
+ }
+
+if ((re->options & PCRE_FIRSTSET) != 0)
+ {
+ int ch = re->first_byte & 255;
+ const char *caseless = ((re->first_byte & REQ_CASELESS) == 0)? "" : " (caseless)";
+ if (isprint(ch)) printf("First char = %c%s\n", ch, caseless);
+ else printf("First char = \\x%02x%s\n", ch, caseless);
+ }
+
+if ((re->options & PCRE_REQCHSET) != 0)
+ {
+ int ch = re->req_byte & 255;
+ const char *caseless = ((re->req_byte & REQ_CASELESS) == 0)? "" : " (caseless)";
+ if (isprint(ch)) printf("Req char = %c%s\n", ch, caseless);
+ else printf("Req char = \\x%02x%s\n", ch, caseless);
+ }
+
+print_internals(re, stdout);
+
+/* This check is done here in the debugging case so that the code that
+was compiled can be seen. */
+
+if (code - codestart > length)
+ {
+ *errorptr = ERR23;
+ (pcre_free)(re);
+ *erroroffset = ptr - (uschar *)pattern;
+ return NULL;
+ }
+#endif
+
+return (pcre *)re;
+}
+
+
+
+/*************************************************
+* Match a back-reference *
+*************************************************/
+
+/* If a back reference hasn't been set, the length that is passed is greater
+than the number of characters left in the string, so the match fails.
+
+Arguments:
+ offset index into the offset vector
+ eptr points into the subject
+ length length to be matched
+ md points to match data block
+ ims the ims flags
+
+Returns: TRUE if matched
+*/
+
+static BOOL
+match_ref(int offset, register const uschar *eptr, int length, match_data *md,
+ unsigned long int ims)
+{
+const uschar *p = md->start_subject + md->offset_vector[offset];
+
+#ifdef DEBUG
+if (eptr >= md->end_subject)
+ printf("matching subject <null>");
+else
+ {
+ printf("matching subject ");
+ pchars(eptr, length, TRUE, md);
+ }
+printf(" against backref ");
+pchars(p, length, FALSE, md);
+printf("\n");
+#endif
+
+/* Always fail if not enough characters left */
+
+if (length > md->end_subject - eptr) return FALSE;
+
+/* Separate the caselesss case for speed */
+
+if ((ims & PCRE_CASELESS) != 0)
+ {
+ while (length-- > 0)
+ if (md->lcc[*p++] != md->lcc[*eptr++]) return FALSE;
+ }
+else
+ { while (length-- > 0) if (*p++ != *eptr++) return FALSE; }
+
+return TRUE;
+}
+
+
+#ifdef SUPPORT_UTF8
+/*************************************************
+* Match character against an XCLASS *
+*************************************************/
+
+/* This function is called from within the XCLASS code below, to match a
+character against an extended class which might match values > 255.
+
+Arguments:
+ c the character
+ data points to the flag byte of the XCLASS data
+
+Returns: TRUE if character matches, else FALSE
+*/
+
+static BOOL
+match_xclass(int c, const uschar *data)
+{
+int t;
+BOOL negated = (*data & XCL_NOT) != 0;
+
+/* Character values < 256 are matched against a bitmap, if one is present. If
+not, we still carry on, because there may be ranges that start below 256 in the
+additional data. */
+
+if (c < 256)
+ {
+ if ((*data & XCL_MAP) != 0 && (data[1 + c/8] & (1 << (c&7))) != 0)
+ return !negated; /* char found */
+ }
+
+/* First skip the bit map if present. Then match against the list of Unicode
+properties or large chars or ranges that end with a large char. We won't ever
+encounter XCL_PROP or XCL_NOTPROP when UCP support is not compiled. */
+
+if ((*data++ & XCL_MAP) != 0) data += 32;
+
+while ((t = *data++) != XCL_END)
+ {
+ int x, y;
+ if (t == XCL_SINGLE)
+ {
+ GETCHARINC(x, data);
+ if (c == x) return !negated;
+ }
+ else if (t == XCL_RANGE)
+ {
+ GETCHARINC(x, data);
+ GETCHARINC(y, data);
+ if (c >= x && c <= y) return !negated;
+ }
+
+#ifdef SUPPORT_UCP
+ else /* XCL_PROP & XCL_NOTPROP */
+ {
+ int chartype, othercase;
+ int rqdtype = *data++;
+ int category = ucp_findchar(c, &chartype, &othercase);
+ if (rqdtype >= 128)
+ {
+ if ((rqdtype - 128 == category) == (t == XCL_PROP)) return !negated;
+ }
+ else
+ {
+ if ((rqdtype == chartype) == (t == XCL_PROP)) return !negated;
+ }
+ }
+#endif /* SUPPORT_UCP */
+ }
+
+return negated; /* char did not match */
+}
+#endif
+
+
+/***************************************************************************
+****************************************************************************
+ RECURSION IN THE match() FUNCTION
+
+The match() function is highly recursive. Some regular expressions can cause
+it to recurse thousands of times. I was writing for Unix, so I just let it
+call itself recursively. This uses the stack for saving everything that has
+to be saved for a recursive call. On Unix, the stack can be large, and this
+works fine.
+
+It turns out that on non-Unix systems there are problems with programs that
+use a lot of stack. (This despite the fact that every last chip has oodles
+of memory these days, and techniques for extending the stack have been known
+for decades.) So....
+
+There is a fudge, triggered by defining NO_RECURSE, which avoids recursive
+calls by keeping local variables that need to be preserved in blocks of memory
+obtained from malloc instead instead of on the stack. Macros are used to
+achieve this so that the actual code doesn't look very different to what it
+always used to.
+****************************************************************************
+***************************************************************************/
+
+
+/* These versions of the macros use the stack, as normal */
+
+#ifndef NO_RECURSE
+#define REGISTER register
+#define RMATCH(rx,ra,rb,rc,rd,re,rf,rg) rx = match(ra,rb,rc,rd,re,rf,rg)
+#define RRETURN(ra) return ra
+#else
+
+
+/* These versions of the macros manage a private stack on the heap. Note
+that the rd argument of RMATCH isn't actually used. It's the md argument of
+match(), which never changes. */
+
+#define REGISTER
+
+#define RMATCH(rx,ra,rb,rc,rd,re,rf,rg)\
+ {\
+ heapframe *newframe = (pcre_stack_malloc)(sizeof(heapframe));\
+ if (setjmp(frame->Xwhere) == 0)\
+ {\
+ newframe->Xeptr = ra;\
+ newframe->Xecode = rb;\
+ newframe->Xoffset_top = rc;\
+ newframe->Xims = re;\
+ newframe->Xeptrb = rf;\
+ newframe->Xflags = rg;\
+ newframe->Xprevframe = frame;\
+ frame = newframe;\
+ DPRINTF(("restarting from line %d\n", __LINE__));\
+ goto HEAP_RECURSE;\
+ }\
+ else\
+ {\
+ DPRINTF(("longjumped back to line %d\n", __LINE__));\
+ frame = md->thisframe;\
+ rx = frame->Xresult;\
+ }\
+ }
+
+#define RRETURN(ra)\
+ {\
+ heapframe *newframe = frame;\
+ frame = newframe->Xprevframe;\
+ (pcre_stack_free)(newframe);\
+ if (frame != NULL)\
+ {\
+ frame->Xresult = ra;\
+ md->thisframe = frame;\
+ longjmp(frame->Xwhere, 1);\
+ }\
+ return ra;\
+ }
+
+
+/* Structure for remembering the local variables in a private frame */
+
+typedef struct heapframe {
+ struct heapframe *Xprevframe;
+
+ /* Function arguments that may change */
+
+ const uschar *Xeptr;
+ const uschar *Xecode;
+ int Xoffset_top;
+ long int Xims;
+ eptrblock *Xeptrb;
+ int Xflags;
+
+ /* Function local variables */
+
+ const uschar *Xcallpat;
+ const uschar *Xcharptr;
+ const uschar *Xdata;
+ const uschar *Xnext;
+ const uschar *Xpp;
+ const uschar *Xprev;
+ const uschar *Xsaved_eptr;
+
+ recursion_info Xnew_recursive;
+
+ BOOL Xcur_is_word;
+ BOOL Xcondition;
+ BOOL Xminimize;
+ BOOL Xprev_is_word;
+
+ unsigned long int Xoriginal_ims;
+
+#ifdef SUPPORT_UCP
+ int Xprop_type;
+ int Xprop_fail_result;
+ int Xprop_category;
+ int Xprop_chartype;
+ int Xprop_othercase;
+ int Xprop_test_against;
+ int *Xprop_test_variable;
+#endif
+
+ int Xctype;
+ int Xfc;
+ int Xfi;
+ int Xlength;
+ int Xmax;
+ int Xmin;
+ int Xnumber;
+ int Xoffset;
+ int Xop;
+ int Xsave_capture_last;
+ int Xsave_offset1, Xsave_offset2, Xsave_offset3;
+ int Xstacksave[REC_STACK_SAVE_MAX];
+
+ eptrblock Xnewptrb;
+
+ /* Place to pass back result, and where to jump back to */
+
+ int Xresult;
+ jmp_buf Xwhere;
+
+} heapframe;
+
+#endif
+
+
+/***************************************************************************
+***************************************************************************/
+
+
+
+/*************************************************
+* Match from current position *
+*************************************************/
+
+/* On entry ecode points to the first opcode, and eptr to the first character
+in the subject string, while eptrb holds the value of eptr at the start of the
+last bracketed group - used for breaking infinite loops matching zero-length
+strings. This function is called recursively in many circumstances. Whenever it
+returns a negative (error) response, the outer incarnation must also return the
+same response.
+
+Performance note: It might be tempting to extract commonly used fields from the
+md structure (e.g. utf8, end_subject) into individual variables to improve
+performance. Tests using gcc on a SPARC disproved this; in the first case, it
+made performance worse.
+
+Arguments:
+ eptr pointer in subject
+ ecode position in code
+ offset_top current top pointer
+ md pointer to "static" info for the match
+ ims current /i, /m, and /s options
+ eptrb pointer to chain of blocks containing eptr at start of
+ brackets - for testing for empty matches
+ flags can contain
+ match_condassert - this is an assertion condition
+ match_isgroup - this is the start of a bracketed group
+
+Returns: MATCH_MATCH if matched ) these values are >= 0
+ MATCH_NOMATCH if failed to match )
+ a negative PCRE_ERROR_xxx value if aborted by an error condition
+ (e.g. stopped by recursion limit)
+*/
+
+static int
+match(REGISTER const uschar *eptr, REGISTER const uschar *ecode,
+ int offset_top, match_data *md, unsigned long int ims, eptrblock *eptrb,
+ int flags)
+{
+/* These variables do not need to be preserved over recursion in this function,
+so they can be ordinary variables in all cases. Mark them with "register"
+because they are used a lot in loops. */
+
+register int rrc; /* Returns from recursive calls */
+register int i; /* Used for loops not involving calls to RMATCH() */
+register int c; /* Character values not kept over RMATCH() calls */
+
+/* When recursion is not being used, all "local" variables that have to be
+preserved over calls to RMATCH() are part of a "frame" which is obtained from
+heap storage. Set up the top-level frame here; others are obtained from the
+heap whenever RMATCH() does a "recursion". See the macro definitions above. */
+
+#ifdef NO_RECURSE
+heapframe *frame = (pcre_stack_malloc)(sizeof(heapframe));
+frame->Xprevframe = NULL; /* Marks the top level */
+
+/* Copy in the original argument variables */
+
+frame->Xeptr = eptr;
+frame->Xecode = ecode;
+frame->Xoffset_top = offset_top;
+frame->Xims = ims;
+frame->Xeptrb = eptrb;
+frame->Xflags = flags;
+
+/* This is where control jumps back to to effect "recursion" */
+
+HEAP_RECURSE:
+
+/* Macros make the argument variables come from the current frame */
+
+#define eptr frame->Xeptr
+#define ecode frame->Xecode
+#define offset_top frame->Xoffset_top
+#define ims frame->Xims
+#define eptrb frame->Xeptrb
+#define flags frame->Xflags
+
+/* Ditto for the local variables */
+
+#ifdef SUPPORT_UTF8
+#define charptr frame->Xcharptr
+#endif
+#define callpat frame->Xcallpat
+#define data frame->Xdata
+#define next frame->Xnext
+#define pp frame->Xpp
+#define prev frame->Xprev
+#define saved_eptr frame->Xsaved_eptr
+
+#define new_recursive frame->Xnew_recursive
+
+#define cur_is_word frame->Xcur_is_word
+#define condition frame->Xcondition
+#define minimize frame->Xminimize
+#define prev_is_word frame->Xprev_is_word
+
+#define original_ims frame->Xoriginal_ims
+
+#ifdef SUPPORT_UCP
+#define prop_type frame->Xprop_type
+#define prop_fail_result frame->Xprop_fail_result
+#define prop_category frame->Xprop_category
+#define prop_chartype frame->Xprop_chartype
+#define prop_othercase frame->Xprop_othercase
+#define prop_test_against frame->Xprop_test_against
+#define prop_test_variable frame->Xprop_test_variable
+#endif
+
+#define ctype frame->Xctype
+#define fc frame->Xfc
+#define fi frame->Xfi
+#define length frame->Xlength
+#define max frame->Xmax
+#define min frame->Xmin
+#define number frame->Xnumber
+#define offset frame->Xoffset
+#define op frame->Xop
+#define save_capture_last frame->Xsave_capture_last
+#define save_offset1 frame->Xsave_offset1
+#define save_offset2 frame->Xsave_offset2
+#define save_offset3 frame->Xsave_offset3
+#define stacksave frame->Xstacksave
+
+#define newptrb frame->Xnewptrb
+
+/* When recursion is being used, local variables are allocated on the stack and
+get preserved during recursion in the normal way. In this environment, fi and
+i, and fc and c, can be the same variables. */
+
+#else
+#define fi i
+#define fc c
+
+
+#ifdef SUPPORT_UTF8 /* Many of these variables are used ony */
+const uschar *charptr; /* small blocks of the code. My normal */
+#endif /* style of coding would have declared */
+const uschar *callpat; /* them within each of those blocks. */
+const uschar *data; /* However, in order to accommodate the */
+const uschar *next; /* version of this code that uses an */
+const uschar *pp; /* external "stack" implemented on the */
+const uschar *prev; /* heap, it is easier to declare them */
+const uschar *saved_eptr; /* all here, so the declarations can */
+ /* be cut out in a block. The only */
+recursion_info new_recursive; /* declarations within blocks below are */
+ /* for variables that do not have to */
+BOOL cur_is_word; /* be preserved over a recursive call */
+BOOL condition; /* to RMATCH(). */
+BOOL minimize;
+BOOL prev_is_word;
+
+unsigned long int original_ims;
+
+#ifdef SUPPORT_UCP
+int prop_type;
+int prop_fail_result;
+int prop_category;
+int prop_chartype;
+int prop_othercase;
+int prop_test_against;
+int *prop_test_variable;
+#endif
+
+int ctype;
+int length;
+int max;
+int min;
+int number;
+int offset;
+int op;
+int save_capture_last;
+int save_offset1, save_offset2, save_offset3;
+int stacksave[REC_STACK_SAVE_MAX];
+
+eptrblock newptrb;
+#endif
+
+/* These statements are here to stop the compiler complaining about unitialized
+variables. */
+
+#ifdef SUPPORT_UCP
+prop_fail_result = 0;
+prop_test_against = 0;
+prop_test_variable = NULL;
+#endif
+
+/* OK, now we can get on with the real code of the function. Recursion is
+specified by the macros RMATCH and RRETURN. When NO_RECURSE is *not* defined,
+these just turn into a recursive call to match() and a "return", respectively.
+However, RMATCH isn't like a function call because it's quite a complicated
+macro. It has to be used in one particular way. This shouldn't, however, impact
+performance when true recursion is being used. */
+
+if (md->match_call_count++ >= md->match_limit) RRETURN(PCRE_ERROR_MATCHLIMIT);
+
+original_ims = ims; /* Save for resetting on ')' */
+
+/* At the start of a bracketed group, add the current subject pointer to the
+stack of such pointers, to be re-instated at the end of the group when we hit
+the closing ket. When match() is called in other circumstances, we don't add to
+this stack. */
+
+if ((flags & match_isgroup) != 0)
+ {
+ newptrb.epb_prev = eptrb;
+ newptrb.epb_saved_eptr = eptr;
+ eptrb = &newptrb;
+ }
+
+/* Now start processing the operations. */
+
+for (;;)
+ {
+ op = *ecode;
+ minimize = FALSE;
+
+ /* For partial matching, remember if we ever hit the end of the subject after
+ matching at least one subject character. */
+
+ if (md->partial &&
+ eptr >= md->end_subject &&
+ eptr > md->start_match)
+ md->hitend = TRUE;
+
+ /* Opening capturing bracket. If there is space in the offset vector, save
+ the current subject position in the working slot at the top of the vector. We
+ mustn't change the current values of the data slot, because they may be set
+ from a previous iteration of this group, and be referred to by a reference
+ inside the group.
+
+ If the bracket fails to match, we need to restore this value and also the
+ values of the final offsets, in case they were set by a previous iteration of
+ the same bracket.
+
+ If there isn't enough space in the offset vector, treat this as if it were a
+ non-capturing bracket. Don't worry about setting the flag for the error case
+ here; that is handled in the code for KET. */
+
+ if (op > OP_BRA)
+ {
+ number = op - OP_BRA;
+
+ /* For extended extraction brackets (large number), we have to fish out the
+ number from a dummy opcode at the start. */
+
+ if (number > EXTRACT_BASIC_MAX)
+ number = GET2(ecode, 2+LINK_SIZE);
+ offset = number << 1;
+
+#ifdef DEBUG
+ printf("start bracket %d subject=", number);
+ pchars(eptr, 16, TRUE, md);
+ printf("\n");
+#endif
+
+ if (offset < md->offset_max)
+ {
+ save_offset1 = md->offset_vector[offset];
+ save_offset2 = md->offset_vector[offset+1];
+ save_offset3 = md->offset_vector[md->offset_end - number];
+ save_capture_last = md->capture_last;
+
+ DPRINTF(("saving %d %d %d\n", save_offset1, save_offset2, save_offset3));
+ md->offset_vector[md->offset_end - number] = eptr - md->start_subject;
+
+ do
+ {
+ RMATCH(rrc, eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, eptrb,
+ match_isgroup);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ md->capture_last = save_capture_last;
+ ecode += GET(ecode, 1);
+ }
+ while (*ecode == OP_ALT);
+
+ DPRINTF(("bracket %d failed\n", number));
+
+ md->offset_vector[offset] = save_offset1;
+ md->offset_vector[offset+1] = save_offset2;
+ md->offset_vector[md->offset_end - number] = save_offset3;
+
+ RRETURN(MATCH_NOMATCH);
+ }
+
+ /* Insufficient room for saving captured contents */
+
+ else op = OP_BRA;
+ }
+
+ /* Other types of node can be handled by a switch */
+
+ switch(op)
+ {
+ case OP_BRA: /* Non-capturing bracket: optimized */
+ DPRINTF(("start bracket 0\n"));
+ do
+ {
+ RMATCH(rrc, eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, eptrb,
+ match_isgroup);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ ecode += GET(ecode, 1);
+ }
+ while (*ecode == OP_ALT);
+ DPRINTF(("bracket 0 failed\n"));
+ RRETURN(MATCH_NOMATCH);
+
+ /* Conditional group: compilation checked that there are no more than
+ two branches. If the condition is false, skipping the first branch takes us
+ past the end if there is only one branch, but that's OK because that is
+ exactly what going to the ket would do. */
+
+ case OP_COND:
+ if (ecode[LINK_SIZE+1] == OP_CREF) /* Condition extract or recurse test */
+ {
+ offset = GET2(ecode, LINK_SIZE+2) << 1; /* Doubled ref number */
+ condition = (offset == CREF_RECURSE * 2)?
+ (md->recursive != NULL) :
+ (offset < offset_top && md->offset_vector[offset] >= 0);
+ RMATCH(rrc, eptr, ecode + (condition?
+ (LINK_SIZE + 4) : (LINK_SIZE + 1 + GET(ecode, 1))),
+ offset_top, md, ims, eptrb, match_isgroup);
+ RRETURN(rrc);
+ }
+
+ /* The condition is an assertion. Call match() to evaluate it - setting
+ the final argument TRUE causes it to stop at the end of an assertion. */
+
+ else
+ {
+ RMATCH(rrc, eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, NULL,
+ match_condassert | match_isgroup);
+ if (rrc == MATCH_MATCH)
+ {
+ ecode += 1 + LINK_SIZE + GET(ecode, LINK_SIZE+2);
+ while (*ecode == OP_ALT) ecode += GET(ecode, 1);
+ }
+ else if (rrc != MATCH_NOMATCH)
+ {
+ RRETURN(rrc); /* Need braces because of following else */
+ }
+ else ecode += GET(ecode, 1);
+ RMATCH(rrc, eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, eptrb,
+ match_isgroup);
+ RRETURN(rrc);
+ }
+ /* Control never reaches here */
+
+ /* Skip over conditional reference or large extraction number data if
+ encountered. */
+
+ case OP_CREF:
+ case OP_BRANUMBER:
+ ecode += 3;
+ break;
+
+ /* End of the pattern. If we are in a recursion, we should restore the
+ offsets appropriately and continue from after the call. */
+
+ case OP_END:
+ if (md->recursive != NULL && md->recursive->group_num == 0)
+ {
+ recursion_info *rec = md->recursive;
+ DPRINTF(("Hit the end in a (?0) recursion\n"));
+ md->recursive = rec->prevrec;
+ memmove(md->offset_vector, rec->offset_save,
+ rec->saved_max * sizeof(int));
+ md->start_match = rec->save_start;
+ ims = original_ims;
+ ecode = rec->after_call;
+ break;
+ }
+
+ /* Otherwise, if PCRE_NOTEMPTY is set, fail if we have matched an empty
+ string - backtracking will then try other alternatives, if any. */
+
+ if (md->notempty && eptr == md->start_match) RRETURN(MATCH_NOMATCH);
+ md->end_match_ptr = eptr; /* Record where we ended */
+ md->end_offset_top = offset_top; /* and how many extracts were taken */
+ RRETURN(MATCH_MATCH);
+
+ /* Change option settings */
+
+ case OP_OPT:
+ ims = ecode[1];
+ ecode += 2;
+ DPRINTF(("ims set to %02lx\n", ims));
+ break;
+
+ /* Assertion brackets. Check the alternative branches in turn - the
+ matching won't pass the KET for an assertion. If any one branch matches,
+ the assertion is true. Lookbehind assertions have an OP_REVERSE item at the
+ start of each branch to move the current point backwards, so the code at
+ this level is identical to the lookahead case. */
+
+ case OP_ASSERT:
+ case OP_ASSERTBACK:
+ do
+ {
+ RMATCH(rrc, eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, NULL,
+ match_isgroup);
+ if (rrc == MATCH_MATCH) break;
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ ecode += GET(ecode, 1);
+ }
+ while (*ecode == OP_ALT);
+ if (*ecode == OP_KET) RRETURN(MATCH_NOMATCH);
+
+ /* If checking an assertion for a condition, return MATCH_MATCH. */
+
+ if ((flags & match_condassert) != 0) RRETURN(MATCH_MATCH);
+
+ /* Continue from after the assertion, updating the offsets high water
+ mark, since extracts may have been taken during the assertion. */
+
+ do ecode += GET(ecode,1); while (*ecode == OP_ALT);
+ ecode += 1 + LINK_SIZE;
+ offset_top = md->end_offset_top;
+ continue;
+
+ /* Negative assertion: all branches must fail to match */
+
+ case OP_ASSERT_NOT:
+ case OP_ASSERTBACK_NOT:
+ do
+ {
+ RMATCH(rrc, eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, NULL,
+ match_isgroup);
+ if (rrc == MATCH_MATCH) RRETURN(MATCH_NOMATCH);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ ecode += GET(ecode,1);
+ }
+ while (*ecode == OP_ALT);
+
+ if ((flags & match_condassert) != 0) RRETURN(MATCH_MATCH);
+
+ ecode += 1 + LINK_SIZE;
+ continue;
+
+ /* Move the subject pointer back. This occurs only at the start of
+ each branch of a lookbehind assertion. If we are too close to the start to
+ move back, this match function fails. When working with UTF-8 we move
+ back a number of characters, not bytes. */
+
+ case OP_REVERSE:
+#ifdef SUPPORT_UTF8
+ if (md->utf8)
+ {
+ c = GET(ecode,1);
+ for (i = 0; i < c; i++)
+ {
+ eptr--;
+ if (eptr < md->start_subject) RRETURN(MATCH_NOMATCH);
+ BACKCHAR(eptr)
+ }
+ }
+ else
+#endif
+
+ /* No UTF-8 support, or not in UTF-8 mode: count is byte count */
+
+ {
+ eptr -= GET(ecode,1);
+ if (eptr < md->start_subject) RRETURN(MATCH_NOMATCH);
+ }
+
+ /* Skip to next op code */
+
+ ecode += 1 + LINK_SIZE;
+ break;
+
+ /* The callout item calls an external function, if one is provided, passing
+ details of the match so far. This is mainly for debugging, though the
+ function is able to force a failure. */
+
+ case OP_CALLOUT:
+ if (pcre_callout != NULL)
+ {
+ pcre_callout_block cb;
+ cb.version = 1; /* Version 1 of the callout block */
+ cb.callout_number = ecode[1];
+ cb.offset_vector = md->offset_vector;
+ cb.subject = (const char *)md->start_subject;
+ cb.subject_length = md->end_subject - md->start_subject;
+ cb.start_match = md->start_match - md->start_subject;
+ cb.current_position = eptr - md->start_subject;
+ cb.pattern_position = GET(ecode, 2);
+ cb.next_item_length = GET(ecode, 2 + LINK_SIZE);
+ cb.capture_top = offset_top/2;
+ cb.capture_last = md->capture_last;
+ cb.callout_data = md->callout_data;
+ if ((rrc = (*pcre_callout)(&cb)) > 0) RRETURN(MATCH_NOMATCH);
+ if (rrc < 0) RRETURN(rrc);
+ }
+ ecode += 2 + 2*LINK_SIZE;
+ break;
+
+ /* Recursion either matches the current regex, or some subexpression. The
+ offset data is the offset to the starting bracket from the start of the
+ whole pattern. (This is so that it works from duplicated subpatterns.)
+
+ If there are any capturing brackets started but not finished, we have to
+ save their starting points and reinstate them after the recursion. However,
+ we don't know how many such there are (offset_top records the completed
+ total) so we just have to save all the potential data. There may be up to
+ 65535 such values, which is too large to put on the stack, but using malloc
+ for small numbers seems expensive. As a compromise, the stack is used when
+ there are no more than REC_STACK_SAVE_MAX values to store; otherwise malloc
+ is used. A problem is what to do if the malloc fails ... there is no way of
+ returning to the top level with an error. Save the top REC_STACK_SAVE_MAX
+ values on the stack, and accept that the rest may be wrong.
+
+ There are also other values that have to be saved. We use a chained
+ sequence of blocks that actually live on the stack. Thanks to Robin Houston
+ for the original version of this logic. */
+
+ case OP_RECURSE:
+ {
+ callpat = md->start_code + GET(ecode, 1);
+ new_recursive.group_num = *callpat - OP_BRA;
+
+ /* For extended extraction brackets (large number), we have to fish out
+ the number from a dummy opcode at the start. */
+
+ if (new_recursive.group_num > EXTRACT_BASIC_MAX)
+ new_recursive.group_num = GET2(callpat, 2+LINK_SIZE);
+
+ /* Add to "recursing stack" */
+
+ new_recursive.prevrec = md->recursive;
+ md->recursive = &new_recursive;
+
+ /* Find where to continue from afterwards */
+
+ ecode += 1 + LINK_SIZE;
+ new_recursive.after_call = ecode;
+
+ /* Now save the offset data. */
+
+ new_recursive.saved_max = md->offset_end;
+ if (new_recursive.saved_max <= REC_STACK_SAVE_MAX)
+ new_recursive.offset_save = stacksave;
+ else
+ {
+ new_recursive.offset_save =
+ (int *)(pcre_malloc)(new_recursive.saved_max * sizeof(int));
+ if (new_recursive.offset_save == NULL) RRETURN(PCRE_ERROR_NOMEMORY);
+ }
+
+ memcpy(new_recursive.offset_save, md->offset_vector,
+ new_recursive.saved_max * sizeof(int));
+ new_recursive.save_start = md->start_match;
+ md->start_match = eptr;
+
+ /* OK, now we can do the recursion. For each top-level alternative we
+ restore the offset and recursion data. */
+
+ DPRINTF(("Recursing into group %d\n", new_recursive.group_num));
+ do
+ {
+ RMATCH(rrc, eptr, callpat + 1 + LINK_SIZE, offset_top, md, ims,
+ eptrb, match_isgroup);
+ if (rrc == MATCH_MATCH)
+ {
+ md->recursive = new_recursive.prevrec;
+ if (new_recursive.offset_save != stacksave)
+ (pcre_free)(new_recursive.offset_save);
+ RRETURN(MATCH_MATCH);
+ }
+ else if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+
+ md->recursive = &new_recursive;
+ memcpy(md->offset_vector, new_recursive.offset_save,
+ new_recursive.saved_max * sizeof(int));
+ callpat += GET(callpat, 1);
+ }
+ while (*callpat == OP_ALT);
+
+ DPRINTF(("Recursion didn't match\n"));
+ md->recursive = new_recursive.prevrec;
+ if (new_recursive.offset_save != stacksave)
+ (pcre_free)(new_recursive.offset_save);
+ RRETURN(MATCH_NOMATCH);
+ }
+ /* Control never reaches here */
+
+ /* "Once" brackets are like assertion brackets except that after a match,
+ the point in the subject string is not moved back. Thus there can never be
+ a move back into the brackets. Friedl calls these "atomic" subpatterns.
+ Check the alternative branches in turn - the matching won't pass the KET
+ for this kind of subpattern. If any one branch matches, we carry on as at
+ the end of a normal bracket, leaving the subject pointer. */
+
+ case OP_ONCE:
+ {
+ prev = ecode;
+ saved_eptr = eptr;
+
+ do
+ {
+ RMATCH(rrc, eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims,
+ eptrb, match_isgroup);
+ if (rrc == MATCH_MATCH) break;
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ ecode += GET(ecode,1);
+ }
+ while (*ecode == OP_ALT);
+
+ /* If hit the end of the group (which could be repeated), fail */
+
+ if (*ecode != OP_ONCE && *ecode != OP_ALT) RRETURN(MATCH_NOMATCH);
+
+ /* Continue as from after the assertion, updating the offsets high water
+ mark, since extracts may have been taken. */
+
+ do ecode += GET(ecode,1); while (*ecode == OP_ALT);
+
+ offset_top = md->end_offset_top;
+ eptr = md->end_match_ptr;
+
+ /* For a non-repeating ket, just continue at this level. This also
+ happens for a repeating ket if no characters were matched in the group.
+ This is the forcible breaking of infinite loops as implemented in Perl
+ 5.005. If there is an options reset, it will get obeyed in the normal
+ course of events. */
+
+ if (*ecode == OP_KET || eptr == saved_eptr)
+ {
+ ecode += 1+LINK_SIZE;
+ break;
+ }
+
+ /* The repeating kets try the rest of the pattern or restart from the
+ preceding bracket, in the appropriate order. We need to reset any options
+ that changed within the bracket before re-running it, so check the next
+ opcode. */
+
+ if (ecode[1+LINK_SIZE] == OP_OPT)
+ {
+ ims = (ims & ~PCRE_IMS) | ecode[4];
+ DPRINTF(("ims set to %02lx at group repeat\n", ims));
+ }
+
+ if (*ecode == OP_KETRMIN)
+ {
+ RMATCH(rrc, eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ RMATCH(rrc, eptr, prev, offset_top, md, ims, eptrb, match_isgroup);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ }
+ else /* OP_KETRMAX */
+ {
+ RMATCH(rrc, eptr, prev, offset_top, md, ims, eptrb, match_isgroup);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ RMATCH(rrc, eptr, ecode + 1+LINK_SIZE, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ }
+ }
+ RRETURN(MATCH_NOMATCH);
+
+ /* An alternation is the end of a branch; scan along to find the end of the
+ bracketed group and go to there. */
+
+ case OP_ALT:
+ do ecode += GET(ecode,1); while (*ecode == OP_ALT);
+ break;
+
+ /* BRAZERO and BRAMINZERO occur just before a bracket group, indicating
+ that it may occur zero times. It may repeat infinitely, or not at all -
+ i.e. it could be ()* or ()? in the pattern. Brackets with fixed upper
+ repeat limits are compiled as a number of copies, with the optional ones
+ preceded by BRAZERO or BRAMINZERO. */
+
+ case OP_BRAZERO:
+ {
+ next = ecode+1;
+ RMATCH(rrc, eptr, next, offset_top, md, ims, eptrb, match_isgroup);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ do next += GET(next,1); while (*next == OP_ALT);
+ ecode = next + 1+LINK_SIZE;
+ }
+ break;
+
+ case OP_BRAMINZERO:
+ {
+ next = ecode+1;
+ do next += GET(next,1); while (*next == OP_ALT);
+ RMATCH(rrc, eptr, next + 1+LINK_SIZE, offset_top, md, ims, eptrb,
+ match_isgroup);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ ecode++;
+ }
+ break;
+
+ /* End of a group, repeated or non-repeating. If we are at the end of
+ an assertion "group", stop matching and return MATCH_MATCH, but record the
+ current high water mark for use by positive assertions. Do this also
+ for the "once" (not-backup up) groups. */
+
+ case OP_KET:
+ case OP_KETRMIN:
+ case OP_KETRMAX:
+ {
+ prev = ecode - GET(ecode, 1);
+ saved_eptr = eptrb->epb_saved_eptr;
+
+ /* Back up the stack of bracket start pointers. */
+
+ eptrb = eptrb->epb_prev;
+
+ if (*prev == OP_ASSERT || *prev == OP_ASSERT_NOT ||
+ *prev == OP_ASSERTBACK || *prev == OP_ASSERTBACK_NOT ||
+ *prev == OP_ONCE)
+ {
+ md->end_match_ptr = eptr; /* For ONCE */
+ md->end_offset_top = offset_top;
+ RRETURN(MATCH_MATCH);
+ }
+
+ /* In all other cases except a conditional group we have to check the
+ group number back at the start and if necessary complete handling an
+ extraction by setting the offsets and bumping the high water mark. */
+
+ if (*prev != OP_COND)
+ {
+ number = *prev - OP_BRA;
+
+ /* For extended extraction brackets (large number), we have to fish out
+ the number from a dummy opcode at the start. */
+
+ if (number > EXTRACT_BASIC_MAX) number = GET2(prev, 2+LINK_SIZE);
+ offset = number << 1;
+
+#ifdef DEBUG
+ printf("end bracket %d", number);
+ printf("\n");
+#endif
+
+ /* Test for a numbered group. This includes groups called as a result
+ of recursion. Note that whole-pattern recursion is coded as a recurse
+ into group 0, so it won't be picked up here. Instead, we catch it when
+ the OP_END is reached. */
+
+ if (number > 0)
+ {
+ md->capture_last = number;
+ if (offset >= md->offset_max) md->offset_overflow = TRUE; else
+ {
+ md->offset_vector[offset] =
+ md->offset_vector[md->offset_end - number];
+ md->offset_vector[offset+1] = eptr - md->start_subject;
+ if (offset_top <= offset) offset_top = offset + 2;
+ }
+
+ /* Handle a recursively called group. Restore the offsets
+ appropriately and continue from after the call. */
+
+ if (md->recursive != NULL && md->recursive->group_num == number)
+ {
+ recursion_info *rec = md->recursive;
+ DPRINTF(("Recursion (%d) succeeded - continuing\n", number));
+ md->recursive = rec->prevrec;
+ md->start_match = rec->save_start;
+ memcpy(md->offset_vector, rec->offset_save,
+ rec->saved_max * sizeof(int));
+ ecode = rec->after_call;
+ ims = original_ims;
+ break;
+ }
+ }
+ }
+
+ /* Reset the value of the ims flags, in case they got changed during
+ the group. */
+
+ ims = original_ims;
+ DPRINTF(("ims reset to %02lx\n", ims));
+
+ /* For a non-repeating ket, just continue at this level. This also
+ happens for a repeating ket if no characters were matched in the group.
+ This is the forcible breaking of infinite loops as implemented in Perl
+ 5.005. If there is an options reset, it will get obeyed in the normal
+ course of events. */
+
+ if (*ecode == OP_KET || eptr == saved_eptr)
+ {
+ ecode += 1 + LINK_SIZE;
+ break;
+ }
+
+ /* The repeating kets try the rest of the pattern or restart from the
+ preceding bracket, in the appropriate order. */
+
+ if (*ecode == OP_KETRMIN)
+ {
+ RMATCH(rrc, eptr, ecode + 1+LINK_SIZE, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ RMATCH(rrc, eptr, prev, offset_top, md, ims, eptrb, match_isgroup);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ }
+ else /* OP_KETRMAX */
+ {
+ RMATCH(rrc, eptr, prev, offset_top, md, ims, eptrb, match_isgroup);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ RMATCH(rrc, eptr, ecode + 1+LINK_SIZE, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ }
+ }
+
+ RRETURN(MATCH_NOMATCH);
+
+ /* Start of subject unless notbol, or after internal newline if multiline */
+
+ case OP_CIRC:
+ if (md->notbol && eptr == md->start_subject) RRETURN(MATCH_NOMATCH);
+ if ((ims & PCRE_MULTILINE) != 0)
+ {
+ if (eptr != md->start_subject && eptr[-1] != NEWLINE)
+ RRETURN(MATCH_NOMATCH);
+ ecode++;
+ break;
+ }
+ /* ... else fall through */
+
+ /* Start of subject assertion */
+
+ case OP_SOD:
+ if (eptr != md->start_subject) RRETURN(MATCH_NOMATCH);
+ ecode++;
+ break;
+
+ /* Start of match assertion */
+
+ case OP_SOM:
+ if (eptr != md->start_subject + md->start_offset) RRETURN(MATCH_NOMATCH);
+ ecode++;
+ break;
+
+ /* Assert before internal newline if multiline, or before a terminating
+ newline unless endonly is set, else end of subject unless noteol is set. */
+
+ case OP_DOLL:
+ if ((ims & PCRE_MULTILINE) != 0)
+ {
+ if (eptr < md->end_subject)
+ { if (*eptr != NEWLINE) RRETURN(MATCH_NOMATCH); }
+ else
+ { if (md->noteol) RRETURN(MATCH_NOMATCH); }
+ ecode++;
+ break;
+ }
+ else
+ {
+ if (md->noteol) RRETURN(MATCH_NOMATCH);
+ if (!md->endonly)
+ {
+ if (eptr < md->end_subject - 1 ||
+ (eptr == md->end_subject - 1 && *eptr != NEWLINE))
+ RRETURN(MATCH_NOMATCH);
+ ecode++;
+ break;
+ }
+ }
+ /* ... else fall through */
+
+ /* End of subject assertion (\z) */
+
+ case OP_EOD:
+ if (eptr < md->end_subject) RRETURN(MATCH_NOMATCH);
+ ecode++;
+ break;
+
+ /* End of subject or ending \n assertion (\Z) */
+
+ case OP_EODN:
+ if (eptr < md->end_subject - 1 ||
+ (eptr == md->end_subject - 1 && *eptr != NEWLINE)) RRETURN(MATCH_NOMATCH);
+ ecode++;
+ break;
+
+ /* Word boundary assertions */
+
+ case OP_NOT_WORD_BOUNDARY:
+ case OP_WORD_BOUNDARY:
+ {
+
+ /* Find out if the previous and current characters are "word" characters.
+ It takes a bit more work in UTF-8 mode. Characters > 255 are assumed to
+ be "non-word" characters. */
+
+#ifdef SUPPORT_UTF8
+ if (md->utf8)
+ {
+ if (eptr == md->start_subject) prev_is_word = FALSE; else
+ {
+ const uschar *lastptr = eptr - 1;
+ while((*lastptr & 0xc0) == 0x80) lastptr--;
+ GETCHAR(c, lastptr);
+ prev_is_word = c < 256 && (md->ctypes[c] & ctype_word) != 0;
+ }
+ if (eptr >= md->end_subject) cur_is_word = FALSE; else
+ {
+ GETCHAR(c, eptr);
+ cur_is_word = c < 256 && (md->ctypes[c] & ctype_word) != 0;
+ }
+ }
+ else
+#endif
+
+ /* More streamlined when not in UTF-8 mode */
+
+ {
+ prev_is_word = (eptr != md->start_subject) &&
+ ((md->ctypes[eptr[-1]] & ctype_word) != 0);
+ cur_is_word = (eptr < md->end_subject) &&
+ ((md->ctypes[*eptr] & ctype_word) != 0);
+ }
+
+ /* Now see if the situation is what we want */
+
+ if ((*ecode++ == OP_WORD_BOUNDARY)?
+ cur_is_word == prev_is_word : cur_is_word != prev_is_word)
+ RRETURN(MATCH_NOMATCH);
+ }
+ break;
+
+ /* Match a single character type; inline for speed */
+
+ case OP_ANY:
+ if ((ims & PCRE_DOTALL) == 0 && eptr < md->end_subject && *eptr == NEWLINE)
+ RRETURN(MATCH_NOMATCH);
+ if (eptr++ >= md->end_subject) RRETURN(MATCH_NOMATCH);
+#ifdef SUPPORT_UTF8
+ if (md->utf8)
+ while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
+#endif
+ ecode++;
+ break;
+
+ /* Match a single byte, even in UTF-8 mode. This opcode really does match
+ any byte, even newline, independent of the setting of PCRE_DOTALL. */
+
+ case OP_ANYBYTE:
+ if (eptr++ >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ ecode++;
+ break;
+
+ case OP_NOT_DIGIT:
+ if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINCTEST(c, eptr);
+ if (
+#ifdef SUPPORT_UTF8
+ c < 256 &&
+#endif
+ (md->ctypes[c] & ctype_digit) != 0
+ )
+ RRETURN(MATCH_NOMATCH);
+ ecode++;
+ break;
+
+ case OP_DIGIT:
+ if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINCTEST(c, eptr);
+ if (
+#ifdef SUPPORT_UTF8
+ c >= 256 ||
+#endif
+ (md->ctypes[c] & ctype_digit) == 0
+ )
+ RRETURN(MATCH_NOMATCH);
+ ecode++;
+ break;
+
+ case OP_NOT_WHITESPACE:
+ if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINCTEST(c, eptr);
+ if (
+#ifdef SUPPORT_UTF8
+ c < 256 &&
+#endif
+ (md->ctypes[c] & ctype_space) != 0
+ )
+ RRETURN(MATCH_NOMATCH);
+ ecode++;
+ break;
+
+ case OP_WHITESPACE:
+ if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINCTEST(c, eptr);
+ if (
+#ifdef SUPPORT_UTF8
+ c >= 256 ||
+#endif
+ (md->ctypes[c] & ctype_space) == 0
+ )
+ RRETURN(MATCH_NOMATCH);
+ ecode++;
+ break;
+
+ case OP_NOT_WORDCHAR:
+ if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINCTEST(c, eptr);
+ if (
+#ifdef SUPPORT_UTF8
+ c < 256 &&
+#endif
+ (md->ctypes[c] & ctype_word) != 0
+ )
+ RRETURN(MATCH_NOMATCH);
+ ecode++;
+ break;
+
+ case OP_WORDCHAR:
+ if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINCTEST(c, eptr);
+ if (
+#ifdef SUPPORT_UTF8
+ c >= 256 ||
+#endif
+ (md->ctypes[c] & ctype_word) == 0
+ )
+ RRETURN(MATCH_NOMATCH);
+ ecode++;
+ break;
+
+#ifdef SUPPORT_UCP
+ /* Check the next character by Unicode property. We will get here only
+ if the support is in the binary; otherwise a compile-time error occurs. */
+
+ case OP_PROP:
+ case OP_NOTPROP:
+ if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINCTEST(c, eptr);
+ {
+ int chartype, rqdtype;
+ int othercase;
+ int category = ucp_findchar(c, &chartype, &othercase);
+
+ rqdtype = *(++ecode);
+ ecode++;
+
+ if (rqdtype >= 128)
+ {
+ if ((rqdtype - 128 != category) == (op == OP_PROP))
+ RRETURN(MATCH_NOMATCH);
+ }
+ else
+ {
+ if ((rqdtype != chartype) == (op == OP_PROP))
+ RRETURN(MATCH_NOMATCH);
+ }
+ }
+ break;
+
+ /* Match an extended Unicode sequence. We will get here only if the support
+ is in the binary; otherwise a compile-time error occurs. */
+
+ case OP_EXTUNI:
+ if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINCTEST(c, eptr);
+ {
+ int chartype;
+ int othercase;
+ int category = ucp_findchar(c, &chartype, &othercase);
+ if (category == ucp_M) RRETURN(MATCH_NOMATCH);
+ while (eptr < md->end_subject)
+ {
+ int len = 1;
+ if (!md->utf8) c = *eptr; else
+ {
+ GETCHARLEN(c, eptr, len);
+ }
+ category = ucp_findchar(c, &chartype, &othercase);
+ if (category != ucp_M) break;
+ eptr += len;
+ }
+ }
+ ecode++;
+ break;
+#endif
+
+
+ /* Match a back reference, possibly repeatedly. Look past the end of the
+ item to see if there is repeat information following. The code is similar
+ to that for character classes, but repeated for efficiency. Then obey
+ similar code to character type repeats - written out again for speed.
+ However, if the referenced string is the empty string, always treat
+ it as matched, any number of times (otherwise there could be infinite
+ loops). */
+
+ case OP_REF:
+ {
+ offset = GET2(ecode, 1) << 1; /* Doubled ref number */
+ ecode += 3; /* Advance past item */
+
+ /* If the reference is unset, set the length to be longer than the amount
+ of subject left; this ensures that every attempt at a match fails. We
+ can't just fail here, because of the possibility of quantifiers with zero
+ minima. */
+
+ length = (offset >= offset_top || md->offset_vector[offset] < 0)?
+ md->end_subject - eptr + 1 :
+ md->offset_vector[offset+1] - md->offset_vector[offset];
+
+ /* Set up for repetition, or handle the non-repeated case */
+
+ switch (*ecode)
+ {
+ case OP_CRSTAR:
+ case OP_CRMINSTAR:
+ case OP_CRPLUS:
+ case OP_CRMINPLUS:
+ case OP_CRQUERY:
+ case OP_CRMINQUERY:
+ c = *ecode++ - OP_CRSTAR;
+ minimize = (c & 1) != 0;
+ min = rep_min[c]; /* Pick up values from tables; */
+ max = rep_max[c]; /* zero for max => infinity */
+ if (max == 0) max = INT_MAX;
+ break;
+
+ case OP_CRRANGE:
+ case OP_CRMINRANGE:
+ minimize = (*ecode == OP_CRMINRANGE);
+ min = GET2(ecode, 1);
+ max = GET2(ecode, 3);
+ if (max == 0) max = INT_MAX;
+ ecode += 5;
+ break;
+
+ default: /* No repeat follows */
+ if (!match_ref(offset, eptr, length, md, ims)) RRETURN(MATCH_NOMATCH);
+ eptr += length;
+ continue; /* With the main loop */
+ }
+
+ /* If the length of the reference is zero, just continue with the
+ main loop. */
+
+ if (length == 0) continue;
+
+ /* First, ensure the minimum number of matches are present. We get back
+ the length of the reference string explicitly rather than passing the
+ address of eptr, so that eptr can be a register variable. */
+
+ for (i = 1; i <= min; i++)
+ {
+ if (!match_ref(offset, eptr, length, md, ims)) RRETURN(MATCH_NOMATCH);
+ eptr += length;
+ }
+
+ /* If min = max, continue at the same level without recursion.
+ They are not both allowed to be zero. */
+
+ if (min == max) continue;
+
+ /* If minimizing, keep trying and advancing the pointer */
+
+ if (minimize)
+ {
+ for (fi = min;; fi++)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (fi >= max || !match_ref(offset, eptr, length, md, ims))
+ RRETURN(MATCH_NOMATCH);
+ eptr += length;
+ }
+ /* Control never gets here */
+ }
+
+ /* If maximizing, find the longest string and work backwards */
+
+ else
+ {
+ pp = eptr;
+ for (i = min; i < max; i++)
+ {
+ if (!match_ref(offset, eptr, length, md, ims)) break;
+ eptr += length;
+ }
+ while (eptr >= pp)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ eptr -= length;
+ }
+ RRETURN(MATCH_NOMATCH);
+ }
+ }
+ /* Control never gets here */
+
+
+
+ /* Match a bit-mapped character class, possibly repeatedly. This op code is
+ used when all the characters in the class have values in the range 0-255,
+ and either the matching is caseful, or the characters are in the range
+ 0-127 when UTF-8 processing is enabled. The only difference between
+ OP_CLASS and OP_NCLASS occurs when a data character outside the range is
+ encountered.
+
+ First, look past the end of the item to see if there is repeat information
+ following. Then obey similar code to character type repeats - written out
+ again for speed. */
+
+ case OP_NCLASS:
+ case OP_CLASS:
+ {
+ data = ecode + 1; /* Save for matching */
+ ecode += 33; /* Advance past the item */
+
+ switch (*ecode)
+ {
+ case OP_CRSTAR:
+ case OP_CRMINSTAR:
+ case OP_CRPLUS:
+ case OP_CRMINPLUS:
+ case OP_CRQUERY:
+ case OP_CRMINQUERY:
+ c = *ecode++ - OP_CRSTAR;
+ minimize = (c & 1) != 0;
+ min = rep_min[c]; /* Pick up values from tables; */
+ max = rep_max[c]; /* zero for max => infinity */
+ if (max == 0) max = INT_MAX;
+ break;
+
+ case OP_CRRANGE:
+ case OP_CRMINRANGE:
+ minimize = (*ecode == OP_CRMINRANGE);
+ min = GET2(ecode, 1);
+ max = GET2(ecode, 3);
+ if (max == 0) max = INT_MAX;
+ ecode += 5;
+ break;
+
+ default: /* No repeat follows */
+ min = max = 1;
+ break;
+ }
+
+ /* First, ensure the minimum number of matches are present. */
+
+#ifdef SUPPORT_UTF8
+ /* UTF-8 mode */
+ if (md->utf8)
+ {
+ for (i = 1; i <= min; i++)
+ {
+ if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINC(c, eptr);
+ if (c > 255)
+ {
+ if (op == OP_CLASS) RRETURN(MATCH_NOMATCH);
+ }
+ else
+ {
+ if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH);
+ }
+ }
+ }
+ else
+#endif
+ /* Not UTF-8 mode */
+ {
+ for (i = 1; i <= min; i++)
+ {
+ if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ c = *eptr++;
+ if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH);
+ }
+ }
+
+ /* If max == min we can continue with the main loop without the
+ need to recurse. */
+
+ if (min == max) continue;
+
+ /* If minimizing, keep testing the rest of the expression and advancing
+ the pointer while it matches the class. */
+
+ if (minimize)
+ {
+#ifdef SUPPORT_UTF8
+ /* UTF-8 mode */
+ if (md->utf8)
+ {
+ for (fi = min;; fi++)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINC(c, eptr);
+ if (c > 255)
+ {
+ if (op == OP_CLASS) RRETURN(MATCH_NOMATCH);
+ }
+ else
+ {
+ if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH);
+ }
+ }
+ }
+ else
+#endif
+ /* Not UTF-8 mode */
+ {
+ for (fi = min;; fi++)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ c = *eptr++;
+ if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH);
+ }
+ }
+ /* Control never gets here */
+ }
+
+ /* If maximizing, find the longest possible run, then work backwards. */
+
+ else
+ {
+ pp = eptr;
+
+#ifdef SUPPORT_UTF8
+ /* UTF-8 mode */
+ if (md->utf8)
+ {
+ for (i = min; i < max; i++)
+ {
+ int len = 1;
+ if (eptr >= md->end_subject) break;
+ GETCHARLEN(c, eptr, len);
+ if (c > 255)
+ {
+ if (op == OP_CLASS) break;
+ }
+ else
+ {
+ if ((data[c/8] & (1 << (c&7))) == 0) break;
+ }
+ eptr += len;
+ }
+ for (;;)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (eptr-- == pp) break; /* Stop if tried at original pos */
+ BACKCHAR(eptr);
+ }
+ }
+ else
+#endif
+ /* Not UTF-8 mode */
+ {
+ for (i = min; i < max; i++)
+ {
+ if (eptr >= md->end_subject) break;
+ c = *eptr;
+ if ((data[c/8] & (1 << (c&7))) == 0) break;
+ eptr++;
+ }
+ while (eptr >= pp)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ eptr--;
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ }
+ }
+
+ RRETURN(MATCH_NOMATCH);
+ }
+ }
+ /* Control never gets here */
+
+
+ /* Match an extended character class. This opcode is encountered only
+ in UTF-8 mode, because that's the only time it is compiled. */
+
+#ifdef SUPPORT_UTF8
+ case OP_XCLASS:
+ {
+ data = ecode + 1 + LINK_SIZE; /* Save for matching */
+ ecode += GET(ecode, 1); /* Advance past the item */
+
+ switch (*ecode)
+ {
+ case OP_CRSTAR:
+ case OP_CRMINSTAR:
+ case OP_CRPLUS:
+ case OP_CRMINPLUS:
+ case OP_CRQUERY:
+ case OP_CRMINQUERY:
+ c = *ecode++ - OP_CRSTAR;
+ minimize = (c & 1) != 0;
+ min = rep_min[c]; /* Pick up values from tables; */
+ max = rep_max[c]; /* zero for max => infinity */
+ if (max == 0) max = INT_MAX;
+ break;
+
+ case OP_CRRANGE:
+ case OP_CRMINRANGE:
+ minimize = (*ecode == OP_CRMINRANGE);
+ min = GET2(ecode, 1);
+ max = GET2(ecode, 3);
+ if (max == 0) max = INT_MAX;
+ ecode += 5;
+ break;
+
+ default: /* No repeat follows */
+ min = max = 1;
+ break;
+ }
+
+ /* First, ensure the minimum number of matches are present. */
+
+ for (i = 1; i <= min; i++)
+ {
+ if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINC(c, eptr);
+ if (!match_xclass(c, data)) RRETURN(MATCH_NOMATCH);
+ }
+
+ /* If max == min we can continue with the main loop without the
+ need to recurse. */
+
+ if (min == max) continue;
+
+ /* If minimizing, keep testing the rest of the expression and advancing
+ the pointer while it matches the class. */
+
+ if (minimize)
+ {
+ for (fi = min;; fi++)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINC(c, eptr);
+ if (!match_xclass(c, data)) RRETURN(MATCH_NOMATCH);
+ }
+ /* Control never gets here */
+ }
+
+ /* If maximizing, find the longest possible run, then work backwards. */
+
+ else
+ {
+ pp = eptr;
+ for (i = min; i < max; i++)
+ {
+ int len = 1;
+ if (eptr >= md->end_subject) break;
+ GETCHARLEN(c, eptr, len);
+ if (!match_xclass(c, data)) break;
+ eptr += len;
+ }
+ for(;;)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (eptr-- == pp) break; /* Stop if tried at original pos */
+ BACKCHAR(eptr)
+ }
+ RRETURN(MATCH_NOMATCH);
+ }
+
+ /* Control never gets here */
+ }
+#endif /* End of XCLASS */
+
+ /* Match a single character, casefully */
+
+ case OP_CHAR:
+#ifdef SUPPORT_UTF8
+ if (md->utf8)
+ {
+ length = 1;
+ ecode++;
+ GETCHARLEN(fc, ecode, length);
+ if (length > md->end_subject - eptr) RRETURN(MATCH_NOMATCH);
+ while (length-- > 0) if (*ecode++ != *eptr++) RRETURN(MATCH_NOMATCH);
+ }
+ else
+#endif
+
+ /* Non-UTF-8 mode */
+ {
+ if (md->end_subject - eptr < 1) RRETURN(MATCH_NOMATCH);
+ if (ecode[1] != *eptr++) RRETURN(MATCH_NOMATCH);
+ ecode += 2;
+ }
+ break;
+
+ /* Match a single character, caselessly */
+
+ case OP_CHARNC:
+#ifdef SUPPORT_UTF8
+ if (md->utf8)
+ {
+ length = 1;
+ ecode++;
+ GETCHARLEN(fc, ecode, length);
+
+ if (length > md->end_subject - eptr) RRETURN(MATCH_NOMATCH);
+
+ /* If the pattern character's value is < 128, we have only one byte, and
+ can use the fast lookup table. */
+
+ if (fc < 128)
+ {
+ if (md->lcc[*ecode++] != md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH);
+ }
+
+ /* Otherwise we must pick up the subject character */
+
+ else
+ {
+ int dc;
+ GETCHARINC(dc, eptr);
+ ecode += length;
+
+ /* If we have Unicode property support, we can use it to test the other
+ case of the character, if there is one. The result of ucp_findchar() is
+ < 0 if the char isn't found, and othercase is returned as zero if there
+ isn't one. */
+
+ if (fc != dc)
+ {
+#ifdef SUPPORT_UCP
+ int chartype;
+ int othercase;
+ if (ucp_findchar(fc, &chartype, &othercase) < 0 || dc != othercase)
+#endif
+ RRETURN(MATCH_NOMATCH);
+ }
+ }
+ }
+ else
+#endif /* SUPPORT_UTF8 */
+
+ /* Non-UTF-8 mode */
+ {
+ if (md->end_subject - eptr < 1) RRETURN(MATCH_NOMATCH);
+ if (md->lcc[ecode[1]] != md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH);
+ ecode += 2;
+ }
+ break;
+
+ /* Match a single character repeatedly; different opcodes share code. */
+
+ case OP_EXACT:
+ min = max = GET2(ecode, 1);
+ ecode += 3;
+ goto REPEATCHAR;
+
+ case OP_UPTO:
+ case OP_MINUPTO:
+ min = 0;
+ max = GET2(ecode, 1);
+ minimize = *ecode == OP_MINUPTO;
+ ecode += 3;
+ goto REPEATCHAR;
+
+ case OP_STAR:
+ case OP_MINSTAR:
+ case OP_PLUS:
+ case OP_MINPLUS:
+ case OP_QUERY:
+ case OP_MINQUERY:
+ c = *ecode++ - OP_STAR;
+ minimize = (c & 1) != 0;
+ min = rep_min[c]; /* Pick up values from tables; */
+ max = rep_max[c]; /* zero for max => infinity */
+ if (max == 0) max = INT_MAX;
+
+ /* Common code for all repeated single-character matches. We can give
+ up quickly if there are fewer than the minimum number of characters left in
+ the subject. */
+
+ REPEATCHAR:
+#ifdef SUPPORT_UTF8
+ if (md->utf8)
+ {
+ length = 1;
+ charptr = ecode;
+ GETCHARLEN(fc, ecode, length);
+ if (min * length > md->end_subject - eptr) RRETURN(MATCH_NOMATCH);
+ ecode += length;
+
+ /* Handle multibyte character matching specially here. There is
+ support for caseless matching if UCP support is present. */
+
+ if (length > 1)
+ {
+ int oclength = 0;
+ uschar occhars[8];
+
+#ifdef SUPPORT_UCP
+ int othercase;
+ int chartype;
+ if ((ims & PCRE_CASELESS) != 0 &&
+ ucp_findchar(fc, &chartype, &othercase) >= 0 &&
+ othercase > 0)
+ oclength = ord2utf8(othercase, occhars);
+#endif /* SUPPORT_UCP */
+
+ for (i = 1; i <= min; i++)
+ {
+ if (memcmp(eptr, charptr, length) == 0) eptr += length;
+ /* Need braces because of following else */
+ else if (oclength == 0) { RRETURN(MATCH_NOMATCH); }
+ else
+ {
+ if (memcmp(eptr, occhars, oclength) != 0) RRETURN(MATCH_NOMATCH);
+ eptr += oclength;
+ }
+ }
+
+ if (min == max) continue;
+
+ if (minimize)
+ {
+ for (fi = min;; fi++)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ if (memcmp(eptr, charptr, length) == 0) eptr += length;
+ /* Need braces because of following else */
+ else if (oclength == 0) { RRETURN(MATCH_NOMATCH); }
+ else
+ {
+ if (memcmp(eptr, occhars, oclength) != 0) RRETURN(MATCH_NOMATCH);
+ eptr += oclength;
+ }
+ }
+ /* Control never gets here */
+ }
+ else
+ {
+ pp = eptr;
+ for (i = min; i < max; i++)
+ {
+ if (eptr > md->end_subject - length) break;
+ if (memcmp(eptr, charptr, length) == 0) eptr += length;
+ else if (oclength == 0) break;
+ else
+ {
+ if (memcmp(eptr, occhars, oclength) != 0) break;
+ eptr += oclength;
+ }
+ }
+ while (eptr >= pp)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ eptr -= length;
+ }
+ RRETURN(MATCH_NOMATCH);
+ }
+ /* Control never gets here */
+ }
+
+ /* If the length of a UTF-8 character is 1, we fall through here, and
+ obey the code as for non-UTF-8 characters below, though in this case the
+ value of fc will always be < 128. */
+ }
+ else
+#endif /* SUPPORT_UTF8 */
+
+ /* When not in UTF-8 mode, load a single-byte character. */
+ {
+ if (min > md->end_subject - eptr) RRETURN(MATCH_NOMATCH);
+ fc = *ecode++;
+ }
+
+ /* The value of fc at this point is always less than 256, though we may or
+ may not be in UTF-8 mode. The code is duplicated for the caseless and
+ caseful cases, for speed, since matching characters is likely to be quite
+ common. First, ensure the minimum number of matches are present. If min =
+ max, continue at the same level without recursing. Otherwise, if
+ minimizing, keep trying the rest of the expression and advancing one
+ matching character if failing, up to the maximum. Alternatively, if
+ maximizing, find the maximum number of characters and work backwards. */
+
+ DPRINTF(("matching %c{%d,%d} against subject %.*s\n", fc, min, max,
+ max, eptr));
+
+ if ((ims & PCRE_CASELESS) != 0)
+ {
+ fc = md->lcc[fc];
+ for (i = 1; i <= min; i++)
+ if (fc != md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH);
+ if (min == max) continue;
+ if (minimize)
+ {
+ for (fi = min;; fi++)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (fi >= max || eptr >= md->end_subject ||
+ fc != md->lcc[*eptr++])
+ RRETURN(MATCH_NOMATCH);
+ }
+ /* Control never gets here */
+ }
+ else
+ {
+ pp = eptr;
+ for (i = min; i < max; i++)
+ {
+ if (eptr >= md->end_subject || fc != md->lcc[*eptr]) break;
+ eptr++;
+ }
+ while (eptr >= pp)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ eptr--;
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ }
+ RRETURN(MATCH_NOMATCH);
+ }
+ /* Control never gets here */
+ }
+
+ /* Caseful comparisons (includes all multi-byte characters) */
+
+ else
+ {
+ for (i = 1; i <= min; i++) if (fc != *eptr++) RRETURN(MATCH_NOMATCH);
+ if (min == max) continue;
+ if (minimize)
+ {
+ for (fi = min;; fi++)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (fi >= max || eptr >= md->end_subject || fc != *eptr++)
+ RRETURN(MATCH_NOMATCH);
+ }
+ /* Control never gets here */
+ }
+ else
+ {
+ pp = eptr;
+ for (i = min; i < max; i++)
+ {
+ if (eptr >= md->end_subject || fc != *eptr) break;
+ eptr++;
+ }
+ while (eptr >= pp)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ eptr--;
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ }
+ RRETURN(MATCH_NOMATCH);
+ }
+ }
+ /* Control never gets here */
+
+ /* Match a negated single one-byte character. The character we are
+ checking can be multibyte. */
+
+ case OP_NOT:
+ if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ ecode++;
+ GETCHARINCTEST(c, eptr);
+ if ((ims & PCRE_CASELESS) != 0)
+ {
+#ifdef SUPPORT_UTF8
+ if (c < 256)
+#endif
+ c = md->lcc[c];
+ if (md->lcc[*ecode++] == c) RRETURN(MATCH_NOMATCH);
+ }
+ else
+ {
+ if (*ecode++ == c) RRETURN(MATCH_NOMATCH);
+ }
+ break;
+
+ /* Match a negated single one-byte character repeatedly. This is almost a
+ repeat of the code for a repeated single character, but I haven't found a
+ nice way of commoning these up that doesn't require a test of the
+ positive/negative option for each character match. Maybe that wouldn't add
+ very much to the time taken, but character matching *is* what this is all
+ about... */
+
+ case OP_NOTEXACT:
+ min = max = GET2(ecode, 1);
+ ecode += 3;
+ goto REPEATNOTCHAR;
+
+ case OP_NOTUPTO:
+ case OP_NOTMINUPTO:
+ min = 0;
+ max = GET2(ecode, 1);
+ minimize = *ecode == OP_NOTMINUPTO;
+ ecode += 3;
+ goto REPEATNOTCHAR;
+
+ case OP_NOTSTAR:
+ case OP_NOTMINSTAR:
+ case OP_NOTPLUS:
+ case OP_NOTMINPLUS:
+ case OP_NOTQUERY:
+ case OP_NOTMINQUERY:
+ c = *ecode++ - OP_NOTSTAR;
+ minimize = (c & 1) != 0;
+ min = rep_min[c]; /* Pick up values from tables; */
+ max = rep_max[c]; /* zero for max => infinity */
+ if (max == 0) max = INT_MAX;
+
+ /* Common code for all repeated single-byte matches. We can give up quickly
+ if there are fewer than the minimum number of bytes left in the
+ subject. */
+
+ REPEATNOTCHAR:
+ if (min > md->end_subject - eptr) RRETURN(MATCH_NOMATCH);
+ fc = *ecode++;
+
+ /* The code is duplicated for the caseless and caseful cases, for speed,
+ since matching characters is likely to be quite common. First, ensure the
+ minimum number of matches are present. If min = max, continue at the same
+ level without recursing. Otherwise, if minimizing, keep trying the rest of
+ the expression and advancing one matching character if failing, up to the
+ maximum. Alternatively, if maximizing, find the maximum number of
+ characters and work backwards. */
+
+ DPRINTF(("negative matching %c{%d,%d} against subject %.*s\n", fc, min, max,
+ max, eptr));
+
+ if ((ims & PCRE_CASELESS) != 0)
+ {
+ fc = md->lcc[fc];
+
+#ifdef SUPPORT_UTF8
+ /* UTF-8 mode */
+ if (md->utf8)
+ {
+ register int d;
+ for (i = 1; i <= min; i++)
+ {
+ GETCHARINC(d, eptr);
+ if (d < 256) d = md->lcc[d];
+ if (fc == d) RRETURN(MATCH_NOMATCH);
+ }
+ }
+ else
+#endif
+
+ /* Not UTF-8 mode */
+ {
+ for (i = 1; i <= min; i++)
+ if (fc == md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH);
+ }
+
+ if (min == max) continue;
+
+ if (minimize)
+ {
+#ifdef SUPPORT_UTF8
+ /* UTF-8 mode */
+ if (md->utf8)
+ {
+ register int d;
+ for (fi = min;; fi++)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ GETCHARINC(d, eptr);
+ if (d < 256) d = md->lcc[d];
+ if (fi >= max || eptr >= md->end_subject || fc == d)
+ RRETURN(MATCH_NOMATCH);
+ }
+ }
+ else
+#endif
+ /* Not UTF-8 mode */
+ {
+ for (fi = min;; fi++)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (fi >= max || eptr >= md->end_subject || fc == md->lcc[*eptr++])
+ RRETURN(MATCH_NOMATCH);
+ }
+ }
+ /* Control never gets here */
+ }
+
+ /* Maximize case */
+
+ else
+ {
+ pp = eptr;
+
+#ifdef SUPPORT_UTF8
+ /* UTF-8 mode */
+ if (md->utf8)
+ {
+ register int d;
+ for (i = min; i < max; i++)
+ {
+ int len = 1;
+ if (eptr >= md->end_subject) break;
+ GETCHARLEN(d, eptr, len);
+ if (d < 256) d = md->lcc[d];
+ if (fc == d) break;
+ eptr += len;
+ }
+ for(;;)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (eptr-- == pp) break; /* Stop if tried at original pos */
+ BACKCHAR(eptr);
+ }
+ }
+ else
+#endif
+ /* Not UTF-8 mode */
+ {
+ for (i = min; i < max; i++)
+ {
+ if (eptr >= md->end_subject || fc == md->lcc[*eptr]) break;
+ eptr++;
+ }
+ while (eptr >= pp)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ eptr--;
+ }
+ }
+
+ RRETURN(MATCH_NOMATCH);
+ }
+ /* Control never gets here */
+ }
+
+ /* Caseful comparisons */
+
+ else
+ {
+#ifdef SUPPORT_UTF8
+ /* UTF-8 mode */
+ if (md->utf8)
+ {
+ register int d;
+ for (i = 1; i <= min; i++)
+ {
+ GETCHARINC(d, eptr);
+ if (fc == d) RRETURN(MATCH_NOMATCH);
+ }
+ }
+ else
+#endif
+ /* Not UTF-8 mode */
+ {
+ for (i = 1; i <= min; i++)
+ if (fc == *eptr++) RRETURN(MATCH_NOMATCH);
+ }
+
+ if (min == max) continue;
+
+ if (minimize)
+ {
+#ifdef SUPPORT_UTF8
+ /* UTF-8 mode */
+ if (md->utf8)
+ {
+ register int d;
+ for (fi = min;; fi++)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ GETCHARINC(d, eptr);
+ if (fi >= max || eptr >= md->end_subject || fc == d)
+ RRETURN(MATCH_NOMATCH);
+ }
+ }
+ else
+#endif
+ /* Not UTF-8 mode */
+ {
+ for (fi = min;; fi++)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (fi >= max || eptr >= md->end_subject || fc == *eptr++)
+ RRETURN(MATCH_NOMATCH);
+ }
+ }
+ /* Control never gets here */
+ }
+
+ /* Maximize case */
+
+ else
+ {
+ pp = eptr;
+
+#ifdef SUPPORT_UTF8
+ /* UTF-8 mode */
+ if (md->utf8)
+ {
+ register int d;
+ for (i = min; i < max; i++)
+ {
+ int len = 1;
+ if (eptr >= md->end_subject) break;
+ GETCHARLEN(d, eptr, len);
+ if (fc == d) break;
+ eptr += len;
+ }
+ for(;;)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (eptr-- == pp) break; /* Stop if tried at original pos */
+ BACKCHAR(eptr);
+ }
+ }
+ else
+#endif
+ /* Not UTF-8 mode */
+ {
+ for (i = min; i < max; i++)
+ {
+ if (eptr >= md->end_subject || fc == *eptr) break;
+ eptr++;
+ }
+ while (eptr >= pp)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ eptr--;
+ }
+ }
+
+ RRETURN(MATCH_NOMATCH);
+ }
+ }
+ /* Control never gets here */
+
+ /* Match a single character type repeatedly; several different opcodes
+ share code. This is very similar to the code for single characters, but we
+ repeat it in the interests of efficiency. */
+
+ case OP_TYPEEXACT:
+ min = max = GET2(ecode, 1);
+ minimize = TRUE;
+ ecode += 3;
+ goto REPEATTYPE;
+
+ case OP_TYPEUPTO:
+ case OP_TYPEMINUPTO:
+ min = 0;
+ max = GET2(ecode, 1);
+ minimize = *ecode == OP_TYPEMINUPTO;
+ ecode += 3;
+ goto REPEATTYPE;
+
+ case OP_TYPESTAR:
+ case OP_TYPEMINSTAR:
+ case OP_TYPEPLUS:
+ case OP_TYPEMINPLUS:
+ case OP_TYPEQUERY:
+ case OP_TYPEMINQUERY:
+ c = *ecode++ - OP_TYPESTAR;
+ minimize = (c & 1) != 0;
+ min = rep_min[c]; /* Pick up values from tables; */
+ max = rep_max[c]; /* zero for max => infinity */
+ if (max == 0) max = INT_MAX;
+
+ /* Common code for all repeated single character type matches. Note that
+ in UTF-8 mode, '.' matches a character of any length, but for the other
+ character types, the valid characters are all one-byte long. */
+
+ REPEATTYPE:
+ ctype = *ecode++; /* Code for the character type */
+
+#ifdef SUPPORT_UCP
+ if (ctype == OP_PROP || ctype == OP_NOTPROP)
+ {
+ prop_fail_result = ctype == OP_NOTPROP;
+ prop_type = *ecode++;
+ if (prop_type >= 128)
+ {
+ prop_test_against = prop_type - 128;
+ prop_test_variable = &prop_category;
+ }
+ else
+ {
+ prop_test_against = prop_type;
+ prop_test_variable = &prop_chartype;
+ }
+ }
+ else prop_type = -1;
+#endif
+
+ /* First, ensure the minimum number of matches are present. Use inline
+ code for maximizing the speed, and do the type test once at the start
+ (i.e. keep it out of the loop). Also we can test that there are at least
+ the minimum number of bytes before we start. This isn't as effective in
+ UTF-8 mode, but it does no harm. Separate the UTF-8 code completely as that
+ is tidier. Also separate the UCP code, which can be the same for both UTF-8
+ and single-bytes. */
+
+ if (min > md->end_subject - eptr) RRETURN(MATCH_NOMATCH);
+ if (min > 0)
+ {
+#ifdef SUPPORT_UCP
+ if (prop_type > 0)
+ {
+ for (i = 1; i <= min; i++)
+ {
+ GETCHARINC(c, eptr);
+ prop_category = ucp_findchar(c, &prop_chartype, &prop_othercase);
+ if ((*prop_test_variable == prop_test_against) == prop_fail_result)
+ RRETURN(MATCH_NOMATCH);
+ }
+ }
+
+ /* Match extended Unicode sequences. We will get here only if the
+ support is in the binary; otherwise a compile-time error occurs. */
+
+ else if (ctype == OP_EXTUNI)
+ {
+ for (i = 1; i <= min; i++)
+ {
+ GETCHARINCTEST(c, eptr);
+ prop_category = ucp_findchar(c, &prop_chartype, &prop_othercase);
+ if (prop_category == ucp_M) RRETURN(MATCH_NOMATCH);
+ while (eptr < md->end_subject)
+ {
+ int len = 1;
+ if (!md->utf8) c = *eptr; else
+ {
+ GETCHARLEN(c, eptr, len);
+ }
+ prop_category = ucp_findchar(c, &prop_chartype, &prop_othercase);
+ if (prop_category != ucp_M) break;
+ eptr += len;
+ }
+ }
+ }
+
+ else
+#endif /* SUPPORT_UCP */
+
+/* Handle all other cases when the coding is UTF-8 */
+
+#ifdef SUPPORT_UTF8
+ if (md->utf8) switch(ctype)
+ {
+ case OP_ANY:
+ for (i = 1; i <= min; i++)
+ {
+ if (eptr >= md->end_subject ||
+ (*eptr++ == NEWLINE && (ims & PCRE_DOTALL) == 0))
+ RRETURN(MATCH_NOMATCH);
+ while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
+ }
+ break;
+
+ case OP_ANYBYTE:
+ eptr += min;
+ break;
+
+ case OP_NOT_DIGIT:
+ for (i = 1; i <= min; i++)
+ {
+ if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINC(c, eptr);
+ if (c < 128 && (md->ctypes[c] & ctype_digit) != 0)
+ RRETURN(MATCH_NOMATCH);
+ }
+ break;
+
+ case OP_DIGIT:
+ for (i = 1; i <= min; i++)
+ {
+ if (eptr >= md->end_subject ||
+ *eptr >= 128 || (md->ctypes[*eptr++] & ctype_digit) == 0)
+ RRETURN(MATCH_NOMATCH);
+ /* No need to skip more bytes - we know it's a 1-byte character */
+ }
+ break;
+
+ case OP_NOT_WHITESPACE:
+ for (i = 1; i <= min; i++)
+ {
+ if (eptr >= md->end_subject ||
+ (*eptr < 128 && (md->ctypes[*eptr++] & ctype_space) != 0))
+ RRETURN(MATCH_NOMATCH);
+ while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
+ }
+ break;
+
+ case OP_WHITESPACE:
+ for (i = 1; i <= min; i++)
+ {
+ if (eptr >= md->end_subject ||
+ *eptr >= 128 || (md->ctypes[*eptr++] & ctype_space) == 0)
+ RRETURN(MATCH_NOMATCH);
+ /* No need to skip more bytes - we know it's a 1-byte character */
+ }
+ break;
+
+ case OP_NOT_WORDCHAR:
+ for (i = 1; i <= min; i++)
+ {
+ if (eptr >= md->end_subject ||
+ (*eptr < 128 && (md->ctypes[*eptr++] & ctype_word) != 0))
+ RRETURN(MATCH_NOMATCH);
+ while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
+ }
+ break;
+
+ case OP_WORDCHAR:
+ for (i = 1; i <= min; i++)
+ {
+ if (eptr >= md->end_subject ||
+ *eptr >= 128 || (md->ctypes[*eptr++] & ctype_word) == 0)
+ RRETURN(MATCH_NOMATCH);
+ /* No need to skip more bytes - we know it's a 1-byte character */
+ }
+ break;
+
+ default:
+ RRETURN(PCRE_ERROR_INTERNAL);
+ } /* End switch(ctype) */
+
+ else
+#endif /* SUPPORT_UTF8 */
+
+ /* Code for the non-UTF-8 case for minimum matching of operators other
+ than OP_PROP and OP_NOTPROP. */
+
+ switch(ctype)
+ {
+ case OP_ANY:
+ if ((ims & PCRE_DOTALL) == 0)
+ {
+ for (i = 1; i <= min; i++)
+ if (*eptr++ == NEWLINE) RRETURN(MATCH_NOMATCH);
+ }
+ else eptr += min;
+ break;
+
+ case OP_ANYBYTE:
+ eptr += min;
+ break;
+
+ case OP_NOT_DIGIT:
+ for (i = 1; i <= min; i++)
+ if ((md->ctypes[*eptr++] & ctype_digit) != 0) RRETURN(MATCH_NOMATCH);
+ break;
+
+ case OP_DIGIT:
+ for (i = 1; i <= min; i++)
+ if ((md->ctypes[*eptr++] & ctype_digit) == 0) RRETURN(MATCH_NOMATCH);
+ break;
+
+ case OP_NOT_WHITESPACE:
+ for (i = 1; i <= min; i++)
+ if ((md->ctypes[*eptr++] & ctype_space) != 0) RRETURN(MATCH_NOMATCH);
+ break;
+
+ case OP_WHITESPACE:
+ for (i = 1; i <= min; i++)
+ if ((md->ctypes[*eptr++] & ctype_space) == 0) RRETURN(MATCH_NOMATCH);
+ break;
+
+ case OP_NOT_WORDCHAR:
+ for (i = 1; i <= min; i++)
+ if ((md->ctypes[*eptr++] & ctype_word) != 0)
+ RRETURN(MATCH_NOMATCH);
+ break;
+
+ case OP_WORDCHAR:
+ for (i = 1; i <= min; i++)
+ if ((md->ctypes[*eptr++] & ctype_word) == 0)
+ RRETURN(MATCH_NOMATCH);
+ break;
+
+ default:
+ RRETURN(PCRE_ERROR_INTERNAL);
+ }
+ }
+
+ /* If min = max, continue at the same level without recursing */
+
+ if (min == max) continue;
+
+ /* If minimizing, we have to test the rest of the pattern before each
+ subsequent match. Again, separate the UTF-8 case for speed, and also
+ separate the UCP cases. */
+
+ if (minimize)
+ {
+#ifdef SUPPORT_UCP
+ if (prop_type > 0)
+ {
+ for (fi = min;; fi++)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINC(c, eptr);
+ prop_category = ucp_findchar(c, &prop_chartype, &prop_othercase);
+ if ((*prop_test_variable == prop_test_against) == prop_fail_result)
+ RRETURN(MATCH_NOMATCH);
+ }
+ }
+
+ /* Match extended Unicode sequences. We will get here only if the
+ support is in the binary; otherwise a compile-time error occurs. */
+
+ else if (ctype == OP_EXTUNI)
+ {
+ for (fi = min;; fi++)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ GETCHARINCTEST(c, eptr);
+ prop_category = ucp_findchar(c, &prop_chartype, &prop_othercase);
+ if (prop_category == ucp_M) RRETURN(MATCH_NOMATCH);
+ while (eptr < md->end_subject)
+ {
+ int len = 1;
+ if (!md->utf8) c = *eptr; else
+ {
+ GETCHARLEN(c, eptr, len);
+ }
+ prop_category = ucp_findchar(c, &prop_chartype, &prop_othercase);
+ if (prop_category != ucp_M) break;
+ eptr += len;
+ }
+ }
+ }
+
+ else
+#endif /* SUPPORT_UCP */
+
+#ifdef SUPPORT_UTF8
+ /* UTF-8 mode */
+ if (md->utf8)
+ {
+ for (fi = min;; fi++)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+
+ GETCHARINC(c, eptr);
+ switch(ctype)
+ {
+ case OP_ANY:
+ if ((ims & PCRE_DOTALL) == 0 && c == NEWLINE) RRETURN(MATCH_NOMATCH);
+ break;
+
+ case OP_ANYBYTE:
+ break;
+
+ case OP_NOT_DIGIT:
+ if (c < 256 && (md->ctypes[c] & ctype_digit) != 0)
+ RRETURN(MATCH_NOMATCH);
+ break;
+
+ case OP_DIGIT:
+ if (c >= 256 || (md->ctypes[c] & ctype_digit) == 0)
+ RRETURN(MATCH_NOMATCH);
+ break;
+
+ case OP_NOT_WHITESPACE:
+ if (c < 256 && (md->ctypes[c] & ctype_space) != 0)
+ RRETURN(MATCH_NOMATCH);
+ break;
+
+ case OP_WHITESPACE:
+ if (c >= 256 || (md->ctypes[c] & ctype_space) == 0)
+ RRETURN(MATCH_NOMATCH);
+ break;
+
+ case OP_NOT_WORDCHAR:
+ if (c < 256 && (md->ctypes[c] & ctype_word) != 0)
+ RRETURN(MATCH_NOMATCH);
+ break;
+
+ case OP_WORDCHAR:
+ if (c >= 256 && (md->ctypes[c] & ctype_word) == 0)
+ RRETURN(MATCH_NOMATCH);
+ break;
+
+ default:
+ RRETURN(PCRE_ERROR_INTERNAL);
+ }
+ }
+ }
+ else
+#endif
+ /* Not UTF-8 mode */
+ {
+ for (fi = min;; fi++)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH);
+ c = *eptr++;
+ switch(ctype)
+ {
+ case OP_ANY:
+ if ((ims & PCRE_DOTALL) == 0 && c == NEWLINE) RRETURN(MATCH_NOMATCH);
+ break;
+
+ case OP_ANYBYTE:
+ break;
+
+ case OP_NOT_DIGIT:
+ if ((md->ctypes[c] & ctype_digit) != 0) RRETURN(MATCH_NOMATCH);
+ break;
+
+ case OP_DIGIT:
+ if ((md->ctypes[c] & ctype_digit) == 0) RRETURN(MATCH_NOMATCH);
+ break;
+
+ case OP_NOT_WHITESPACE:
+ if ((md->ctypes[c] & ctype_space) != 0) RRETURN(MATCH_NOMATCH);
+ break;
+
+ case OP_WHITESPACE:
+ if ((md->ctypes[c] & ctype_space) == 0) RRETURN(MATCH_NOMATCH);
+ break;
+
+ case OP_NOT_WORDCHAR:
+ if ((md->ctypes[c] & ctype_word) != 0) RRETURN(MATCH_NOMATCH);
+ break;
+
+ case OP_WORDCHAR:
+ if ((md->ctypes[c] & ctype_word) == 0) RRETURN(MATCH_NOMATCH);
+ break;
+
+ default:
+ RRETURN(PCRE_ERROR_INTERNAL);
+ }
+ }
+ }
+ /* Control never gets here */
+ }
+
+ /* If maximizing it is worth using inline code for speed, doing the type
+ test once at the start (i.e. keep it out of the loop). Again, keep the
+ UTF-8 and UCP stuff separate. */
+
+ else
+ {
+ pp = eptr; /* Remember where we started */
+
+#ifdef SUPPORT_UCP
+ if (prop_type > 0)
+ {
+ for (i = min; i < max; i++)
+ {
+ int len = 1;
+ if (eptr >= md->end_subject) break;
+ GETCHARLEN(c, eptr, len);
+ prop_category = ucp_findchar(c, &prop_chartype, &prop_othercase);
+ if ((*prop_test_variable == prop_test_against) == prop_fail_result)
+ break;
+ eptr+= len;
+ }
+
+ /* eptr is now past the end of the maximum run */
+
+ for(;;)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (eptr-- == pp) break; /* Stop if tried at original pos */
+ BACKCHAR(eptr);
+ }
+ }
+
+ /* Match extended Unicode sequences. We will get here only if the
+ support is in the binary; otherwise a compile-time error occurs. */
+
+ else if (ctype == OP_EXTUNI)
+ {
+ for (i = min; i < max; i++)
+ {
+ if (eptr >= md->end_subject) break;
+ GETCHARINCTEST(c, eptr);
+ prop_category = ucp_findchar(c, &prop_chartype, &prop_othercase);
+ if (prop_category == ucp_M) break;
+ while (eptr < md->end_subject)
+ {
+ int len = 1;
+ if (!md->utf8) c = *eptr; else
+ {
+ GETCHARLEN(c, eptr, len);
+ }
+ prop_category = ucp_findchar(c, &prop_chartype, &prop_othercase);
+ if (prop_category != ucp_M) break;
+ eptr += len;
+ }
+ }
+
+ /* eptr is now past the end of the maximum run */
+
+ for(;;)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (eptr-- == pp) break; /* Stop if tried at original pos */
+ for (;;) /* Move back over one extended */
+ {
+ int len = 1;
+ BACKCHAR(eptr);
+ if (!md->utf8) c = *eptr; else
+ {
+ GETCHARLEN(c, eptr, len);
+ }
+ prop_category = ucp_findchar(c, &prop_chartype, &prop_othercase);
+ if (prop_category != ucp_M) break;
+ eptr--;
+ }
+ }
+ }
+
+ else
+#endif /* SUPPORT_UCP */
+
+#ifdef SUPPORT_UTF8
+ /* UTF-8 mode */
+
+ if (md->utf8)
+ {
+ switch(ctype)
+ {
+ case OP_ANY:
+
+ /* Special code is required for UTF8, but when the maximum is unlimited
+ we don't need it, so we repeat the non-UTF8 code. This is probably
+ worth it, because .* is quite a common idiom. */
+
+ if (max < INT_MAX)
+ {
+ if ((ims & PCRE_DOTALL) == 0)
+ {
+ for (i = min; i < max; i++)
+ {
+ if (eptr >= md->end_subject || *eptr == NEWLINE) break;
+ eptr++;
+ while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
+ }
+ }
+ else
+ {
+ for (i = min; i < max; i++)
+ {
+ eptr++;
+ while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++;
+ }
+ }
+ }
+
+ /* Handle unlimited UTF-8 repeat */
+
+ else
+ {
+ if ((ims & PCRE_DOTALL) == 0)
+ {
+ for (i = min; i < max; i++)
+ {
+ if (eptr >= md->end_subject || *eptr == NEWLINE) break;
+ eptr++;
+ }
+ break;
+ }
+ else
+ {
+ c = max - min;
+ if (c > md->end_subject - eptr) c = md->end_subject - eptr;
+ eptr += c;
+ }
+ }
+ break;
+
+ /* The byte case is the same as non-UTF8 */
+
+ case OP_ANYBYTE:
+ c = max - min;
+ if (c > md->end_subject - eptr) c = md->end_subject - eptr;
+ eptr += c;
+ break;
+
+ case OP_NOT_DIGIT:
+ for (i = min; i < max; i++)
+ {
+ int len = 1;
+ if (eptr >= md->end_subject) break;
+ GETCHARLEN(c, eptr, len);
+ if (c < 256 && (md->ctypes[c] & ctype_digit) != 0) break;
+ eptr+= len;
+ }
+ break;
+
+ case OP_DIGIT:
+ for (i = min; i < max; i++)
+ {
+ int len = 1;
+ if (eptr >= md->end_subject) break;
+ GETCHARLEN(c, eptr, len);
+ if (c >= 256 ||(md->ctypes[c] & ctype_digit) == 0) break;
+ eptr+= len;
+ }
+ break;
+
+ case OP_NOT_WHITESPACE:
+ for (i = min; i < max; i++)
+ {
+ int len = 1;
+ if (eptr >= md->end_subject) break;
+ GETCHARLEN(c, eptr, len);
+ if (c < 256 && (md->ctypes[c] & ctype_space) != 0) break;
+ eptr+= len;
+ }
+ break;
+
+ case OP_WHITESPACE:
+ for (i = min; i < max; i++)
+ {
+ int len = 1;
+ if (eptr >= md->end_subject) break;
+ GETCHARLEN(c, eptr, len);
+ if (c >= 256 ||(md->ctypes[c] & ctype_space) == 0) break;
+ eptr+= len;
+ }
+ break;
+
+ case OP_NOT_WORDCHAR:
+ for (i = min; i < max; i++)
+ {
+ int len = 1;
+ if (eptr >= md->end_subject) break;
+ GETCHARLEN(c, eptr, len);
+ if (c < 256 && (md->ctypes[c] & ctype_word) != 0) break;
+ eptr+= len;
+ }
+ break;
+
+ case OP_WORDCHAR:
+ for (i = min; i < max; i++)
+ {
+ int len = 1;
+ if (eptr >= md->end_subject) break;
+ GETCHARLEN(c, eptr, len);
+ if (c >= 256 || (md->ctypes[c] & ctype_word) == 0) break;
+ eptr+= len;
+ }
+ break;
+
+ default:
+ RRETURN(PCRE_ERROR_INTERNAL);
+ }
+
+ /* eptr is now past the end of the maximum run */
+
+ for(;;)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ if (eptr-- == pp) break; /* Stop if tried at original pos */
+ BACKCHAR(eptr);
+ }
+ }
+ else
+#endif
+
+ /* Not UTF-8 mode */
+ {
+ switch(ctype)
+ {
+ case OP_ANY:
+ if ((ims & PCRE_DOTALL) == 0)
+ {
+ for (i = min; i < max; i++)
+ {
+ if (eptr >= md->end_subject || *eptr == NEWLINE) break;
+ eptr++;
+ }
+ break;
+ }
+ /* For DOTALL case, fall through and treat as \C */
+
+ case OP_ANYBYTE:
+ c = max - min;
+ if (c > md->end_subject - eptr) c = md->end_subject - eptr;
+ eptr += c;
+ break;
+
+ case OP_NOT_DIGIT:
+ for (i = min; i < max; i++)
+ {
+ if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_digit) != 0)
+ break;
+ eptr++;
+ }
+ break;
+
+ case OP_DIGIT:
+ for (i = min; i < max; i++)
+ {
+ if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_digit) == 0)
+ break;
+ eptr++;
+ }
+ break;
+
+ case OP_NOT_WHITESPACE:
+ for (i = min; i < max; i++)
+ {
+ if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_space) != 0)
+ break;
+ eptr++;
+ }
+ break;
+
+ case OP_WHITESPACE:
+ for (i = min; i < max; i++)
+ {
+ if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_space) == 0)
+ break;
+ eptr++;
+ }
+ break;
+
+ case OP_NOT_WORDCHAR:
+ for (i = min; i < max; i++)
+ {
+ if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_word) != 0)
+ break;
+ eptr++;
+ }
+ break;
+
+ case OP_WORDCHAR:
+ for (i = min; i < max; i++)
+ {
+ if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_word) == 0)
+ break;
+ eptr++;
+ }
+ break;
+
+ default:
+ RRETURN(PCRE_ERROR_INTERNAL);
+ }
+
+ /* eptr is now past the end of the maximum run */
+
+ while (eptr >= pp)
+ {
+ RMATCH(rrc, eptr, ecode, offset_top, md, ims, eptrb, 0);
+ eptr--;
+ if (rrc != MATCH_NOMATCH) RRETURN(rrc);
+ }
+ }
+
+ /* Get here if we can't make it match with any permitted repetitions */
+
+ RRETURN(MATCH_NOMATCH);
+ }
+ /* Control never gets here */
+
+ /* There's been some horrible disaster. Since all codes > OP_BRA are
+ for capturing brackets, and there shouldn't be any gaps between 0 and
+ OP_BRA, arrival here can only mean there is something seriously wrong
+ in the code above or the OP_xxx definitions. */
+
+ default:
+ DPRINTF(("Unknown opcode %d\n", *ecode));
+ RRETURN(PCRE_ERROR_UNKNOWN_NODE);
+ }
+
+ /* Do not stick any code in here without much thought; it is assumed
+ that "continue" in the code above comes out to here to repeat the main
+ loop. */
+
+ } /* End of main loop */
+/* Control never reaches here */
+}
+
+
+/***************************************************************************
+****************************************************************************
+ RECURSION IN THE match() FUNCTION
+
+Undefine all the macros that were defined above to handle this. */
+
+#ifdef NO_RECURSE
+#undef eptr
+#undef ecode
+#undef offset_top
+#undef ims
+#undef eptrb
+#undef flags
+
+#undef callpat
+#undef charptr
+#undef data
+#undef next
+#undef pp
+#undef prev
+#undef saved_eptr
+
+#undef new_recursive
+
+#undef cur_is_word
+#undef condition
+#undef minimize
+#undef prev_is_word
+
+#undef original_ims
+
+#undef ctype
+#undef length
+#undef max
+#undef min
+#undef number
+#undef offset
+#undef op
+#undef save_capture_last
+#undef save_offset1
+#undef save_offset2
+#undef save_offset3
+#undef stacksave
+
+#undef newptrb
+
+#endif
+
+/* These two are defined as macros in both cases */
+
+#undef fc
+#undef fi
+
+/***************************************************************************
+***************************************************************************/
+
+
+
+/*************************************************
+* Execute a Regular Expression *
+*************************************************/
+
+/* This function applies a compiled re to a subject string and picks out
+portions of the string if it matches. Two elements in the vector are set for
+each substring: the offsets to the start and end of the substring.
+
+Arguments:
+ argument_re points to the compiled expression
+ extra_data points to extra data or is NULL
+ subject points to the subject string
+ length length of subject string (may contain binary zeros)
+ start_offset where to start in the subject string
+ options option bits
+ offsets points to a vector of ints to be filled in with offsets
+ offsetcount the number of elements in the vector
+
+Returns: > 0 => success; value is the number of elements filled in
+ = 0 => success, but offsets is not big enough
+ -1 => failed to match
+ < -1 => some kind of unexpected problem
+*/
+
+EXPORT int
+pcre_exec(const pcre *argument_re, const pcre_extra *extra_data,
+ const char *subject, int length, int start_offset, int options, int *offsets,
+ int offsetcount)
+{
+int rc, resetcount, ocount;
+int first_byte = -1;
+int req_byte = -1;
+int req_byte2 = -1;
+unsigned long int ims = 0;
+BOOL using_temporary_offsets = FALSE;
+BOOL anchored;
+BOOL startline;
+BOOL first_byte_caseless = FALSE;
+BOOL req_byte_caseless = FALSE;
+match_data match_block;
+const uschar *tables;
+const uschar *start_bits = NULL;
+const uschar *start_match = (const uschar *)subject + start_offset;
+const uschar *end_subject;
+const uschar *req_byte_ptr = start_match - 1;
+
+pcre_study_data internal_study;
+const pcre_study_data *study;
+
+real_pcre internal_re;
+const real_pcre *external_re = (const real_pcre *)argument_re;
+const real_pcre *re = external_re;
+
+/* Plausibility checks */
+
+if ((options & ~PUBLIC_EXEC_OPTIONS) != 0) return PCRE_ERROR_BADOPTION;
+if (re == NULL || subject == NULL ||
+ (offsets == NULL && offsetcount > 0)) return PCRE_ERROR_NULL;
+if (offsetcount < 0) return PCRE_ERROR_BADCOUNT;
+
+/* Fish out the optional data from the extra_data structure, first setting
+the default values. */
+
+study = NULL;
+match_block.match_limit = MATCH_LIMIT;
+match_block.callout_data = NULL;
+
+/* The table pointer is always in native byte order. */
+
+tables = external_re->tables;
+
+if (extra_data != NULL)
+ {
+ register unsigned int flags = extra_data->flags;
+ if ((flags & PCRE_EXTRA_STUDY_DATA) != 0)
+ study = (const pcre_study_data *)extra_data->study_data;
+ if ((flags & PCRE_EXTRA_MATCH_LIMIT) != 0)
+ match_block.match_limit = extra_data->match_limit;
+ if ((flags & PCRE_EXTRA_CALLOUT_DATA) != 0)
+ match_block.callout_data = extra_data->callout_data;
+ if ((flags & PCRE_EXTRA_TABLES) != 0) tables = extra_data->tables;
+ }
+
+/* If the exec call supplied NULL for tables, use the inbuilt ones. This
+is a feature that makes it possible to save compiled regex and re-use them
+in other programs later. */
+
+if (tables == NULL) tables = pcre_default_tables;
+
+/* Check that the first field in the block is the magic number. If it is not,
+test for a regex that was compiled on a host of opposite endianness. If this is
+the case, flipped values are put in internal_re and internal_study if there was
+study data too. */
+
+if (re->magic_number != MAGIC_NUMBER)
+ {
+ re = try_flipped(re, &internal_re, study, &internal_study);
+ if (re == NULL) return PCRE_ERROR_BADMAGIC;
+ if (study != NULL) study = &internal_study;
+ }
+
+/* Set up other data */
+
+anchored = ((re->options | options) & PCRE_ANCHORED) != 0;
+startline = (re->options & PCRE_STARTLINE) != 0;
+
+/* The code starts after the real_pcre block and the capture name table. */
+
+match_block.start_code = (const uschar *)external_re + re->name_table_offset +
+ re->name_count * re->name_entry_size;
+
+match_block.start_subject = (const uschar *)subject;
+match_block.start_offset = start_offset;
+match_block.end_subject = match_block.start_subject + length;
+end_subject = match_block.end_subject;
+
+match_block.endonly = (re->options & PCRE_DOLLAR_ENDONLY) != 0;
+match_block.utf8 = (re->options & PCRE_UTF8) != 0;
+
+match_block.notbol = (options & PCRE_NOTBOL) != 0;
+match_block.noteol = (options & PCRE_NOTEOL) != 0;
+match_block.notempty = (options & PCRE_NOTEMPTY) != 0;
+match_block.partial = (options & PCRE_PARTIAL) != 0;
+match_block.hitend = FALSE;
+
+match_block.recursive = NULL; /* No recursion at top level */
+
+match_block.lcc = tables + lcc_offset;
+match_block.ctypes = tables + ctypes_offset;
+
+/* Partial matching is supported only for a restricted set of regexes at the
+moment. */
+
+if (match_block.partial && (re->options & PCRE_NOPARTIAL) != 0)
+ return PCRE_ERROR_BADPARTIAL;
+
+/* Check a UTF-8 string if required. Unfortunately there's no way of passing
+back the character offset. */
+
+#ifdef SUPPORT_UTF8
+if (match_block.utf8 && (options & PCRE_NO_UTF8_CHECK) == 0)
+ {
+ if (valid_utf8((uschar *)subject, length) >= 0)
+ return PCRE_ERROR_BADUTF8;
+ if (start_offset > 0 && start_offset < length)
+ {
+ int tb = ((uschar *)subject)[start_offset];
+ if (tb > 127)
+ {
+ tb &= 0xc0;
+ if (tb != 0 && tb != 0xc0) return PCRE_ERROR_BADUTF8_OFFSET;
+ }
+ }
+ }
+#endif
+
+/* The ims options can vary during the matching as a result of the presence
+of (?ims) items in the pattern. They are kept in a local variable so that
+restoring at the exit of a group is easy. */
+
+ims = re->options & (PCRE_CASELESS|PCRE_MULTILINE|PCRE_DOTALL);
+
+/* If the expression has got more back references than the offsets supplied can
+hold, we get a temporary chunk of working store to use during the matching.
+Otherwise, we can use the vector supplied, rounding down its size to a multiple
+of 3. */
+
+ocount = offsetcount - (offsetcount % 3);
+
+if (re->top_backref > 0 && re->top_backref >= ocount/3)
+ {
+ ocount = re->top_backref * 3 + 3;
+ match_block.offset_vector = (int *)(pcre_malloc)(ocount * sizeof(int));
+ if (match_block.offset_vector == NULL) return PCRE_ERROR_NOMEMORY;
+ using_temporary_offsets = TRUE;
+ DPRINTF(("Got memory to hold back references\n"));
+ }
+else match_block.offset_vector = offsets;
+
+match_block.offset_end = ocount;
+match_block.offset_max = (2*ocount)/3;
+match_block.offset_overflow = FALSE;
+match_block.capture_last = -1;
+
+/* Compute the minimum number of offsets that we need to reset each time. Doing
+this makes a huge difference to execution time when there aren't many brackets
+in the pattern. */
+
+resetcount = 2 + re->top_bracket * 2;
+if (resetcount > offsetcount) resetcount = ocount;
+
+/* Reset the working variable associated with each extraction. These should
+never be used unless previously set, but they get saved and restored, and so we
+initialize them to avoid reading uninitialized locations. */
+
+if (match_block.offset_vector != NULL)
+ {
+ register int *iptr = match_block.offset_vector + ocount;
+ register int *iend = iptr - resetcount/2 + 1;
+ while (--iptr >= iend) *iptr = -1;
+ }
+
+/* Set up the first character to match, if available. The first_byte value is
+never set for an anchored regular expression, but the anchoring may be forced
+at run time, so we have to test for anchoring. The first char may be unset for
+an unanchored pattern, of course. If there's no first char and the pattern was
+studied, there may be a bitmap of possible first characters. */
+
+if (!anchored)
+ {
+ if ((re->options & PCRE_FIRSTSET) != 0)
+ {
+ first_byte = re->first_byte & 255;
+ if ((first_byte_caseless = ((re->first_byte & REQ_CASELESS) != 0)) == TRUE)
+ first_byte = match_block.lcc[first_byte];
+ }
+ else
+ if (!startline && study != NULL &&
+ (study->options & PCRE_STUDY_MAPPED) != 0)
+ start_bits = study->start_bits;
+ }
+
+/* For anchored or unanchored matches, there may be a "last known required
+character" set. */
+
+if ((re->options & PCRE_REQCHSET) != 0)
+ {
+ req_byte = re->req_byte & 255;
+ req_byte_caseless = (re->req_byte & REQ_CASELESS) != 0;
+ req_byte2 = (tables + fcc_offset)[req_byte]; /* case flipped */
+ }
+
+/* Loop for handling unanchored repeated matching attempts; for anchored regexs
+the loop runs just once. */
+
+do
+ {
+ /* Reset the maximum number of extractions we might see. */
+
+ if (match_block.offset_vector != NULL)
+ {
+ register int *iptr = match_block.offset_vector;
+ register int *iend = iptr + resetcount;
+ while (iptr < iend) *iptr++ = -1;
+ }
+
+ /* Advance to a unique first char if possible */
+
+ if (first_byte >= 0)
+ {
+ if (first_byte_caseless)
+ while (start_match < end_subject &&
+ match_block.lcc[*start_match] != first_byte)
+ start_match++;
+ else
+ while (start_match < end_subject && *start_match != first_byte)
+ start_match++;
+ }
+
+ /* Or to just after \n for a multiline match if possible */
+
+ else if (startline)
+ {
+ if (start_match > match_block.start_subject + start_offset)
+ {
+ while (start_match < end_subject && start_match[-1] != NEWLINE)
+ start_match++;
+ }
+ }
+
+ /* Or to a non-unique first char after study */
+
+ else if (start_bits != NULL)
+ {
+ while (start_match < end_subject)
+ {
+ register unsigned int c = *start_match;
+ if ((start_bits[c/8] & (1 << (c&7))) == 0) start_match++; else break;
+ }
+ }
+
+#ifdef DEBUG /* Sigh. Some compilers never learn. */
+ printf(">>>> Match against: ");
+ pchars(start_match, end_subject - start_match, TRUE, &match_block);
+ printf("\n");
+#endif
+
+ /* If req_byte is set, we know that that character must appear in the subject
+ for the match to succeed. If the first character is set, req_byte must be
+ later in the subject; otherwise the test starts at the match point. This
+ optimization can save a huge amount of backtracking in patterns with nested
+ unlimited repeats that aren't going to match. Writing separate code for
+ cased/caseless versions makes it go faster, as does using an autoincrement
+ and backing off on a match.
+
+ HOWEVER: when the subject string is very, very long, searching to its end can
+ take a long time, and give bad performance on quite ordinary patterns. This
+ showed up when somebody was matching /^C/ on a 32-megabyte string... so we
+ don't do this when the string is sufficiently long.
+
+ ALSO: this processing is disabled when partial matching is requested.
+ */
+
+ if (req_byte >= 0 &&
+ end_subject - start_match < REQ_BYTE_MAX &&
+ !match_block.partial)
+ {
+ register const uschar *p = start_match + ((first_byte >= 0)? 1 : 0);
+
+ /* We don't need to repeat the search if we haven't yet reached the
+ place we found it at last time. */
+
+ if (p > req_byte_ptr)
+ {
+ if (req_byte_caseless)
+ {
+ while (p < end_subject)
+ {
+ register int pp = *p++;
+ if (pp == req_byte || pp == req_byte2) { p--; break; }
+ }
+ }
+ else
+ {
+ while (p < end_subject)
+ {
+ if (*p++ == req_byte) { p--; break; }
+ }
+ }
+
+ /* If we can't find the required character, break the matching loop */
+
+ if (p >= end_subject) break;
+
+ /* If we have found the required character, save the point where we
+ found it, so that we don't search again next time round the loop if
+ the start hasn't passed this character yet. */
+
+ req_byte_ptr = p;
+ }
+ }
+
+ /* When a match occurs, substrings will be set for all internal extractions;
+ we just need to set up the whole thing as substring 0 before returning. If
+ there were too many extractions, set the return code to zero. In the case
+ where we had to get some local store to hold offsets for backreferences, copy
+ those back references that we can. In this case there need not be overflow
+ if certain parts of the pattern were not used. */
+
+ match_block.start_match = start_match;
+ match_block.match_call_count = 0;
+
+ rc = match(start_match, match_block.start_code, 2, &match_block, ims, NULL,
+ match_isgroup);
+
+ if (rc == MATCH_NOMATCH)
+ {
+ start_match++;
+#ifdef SUPPORT_UTF8
+ if (match_block.utf8)
+ while(start_match < end_subject && (*start_match & 0xc0) == 0x80)
+ start_match++;
+#endif
+ continue;
+ }
+
+ if (rc != MATCH_MATCH)
+ {
+ DPRINTF((">>>> error: returning %d\n", rc));
+ return rc;
+ }
+
+ /* We have a match! Copy the offset information from temporary store if
+ necessary */
+
+ if (using_temporary_offsets)
+ {
+ if (offsetcount >= 4)
+ {
+ memcpy(offsets + 2, match_block.offset_vector + 2,
+ (offsetcount - 2) * sizeof(int));
+ DPRINTF(("Copied offsets from temporary memory\n"));
+ }
+ if (match_block.end_offset_top > offsetcount)
+ match_block.offset_overflow = TRUE;
+
+ DPRINTF(("Freeing temporary memory\n"));
+ (pcre_free)(match_block.offset_vector);
+ }
+
+ rc = match_block.offset_overflow? 0 : match_block.end_offset_top/2;
+
+ if (offsetcount < 2) rc = 0; else
+ {
+ offsets[0] = start_match - match_block.start_subject;
+ offsets[1] = match_block.end_match_ptr - match_block.start_subject;
+ }
+
+ DPRINTF((">>>> returning %d\n", rc));
+ return rc;
+ }
+
+/* This "while" is the end of the "do" above */
+
+while (!anchored && start_match <= end_subject);
+
+if (using_temporary_offsets)
+ {
+ DPRINTF(("Freeing temporary memory\n"));
+ (pcre_free)(match_block.offset_vector);
+ }
+
+if (match_block.partial && match_block.hitend)
+ {
+ DPRINTF((">>>> returning PCRE_ERROR_PARTIAL\n"));
+ return PCRE_ERROR_PARTIAL;
+ }
+else
+ {
+ DPRINTF((">>>> returning PCRE_ERROR_NOMATCH\n"));
+ return PCRE_ERROR_NOMATCH;
+ }
+}
+
+/* End of pcre.c */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcre.def b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcre.def
new file mode 100644
index 00000000..4f6c4bff
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcre.def
@@ -0,0 +1,22 @@
+EXPORTS
+
+pcre_malloc DATA
+pcre_free DATA
+
+pcre_compile
+pcre_copy_substring
+pcre_exec
+pcre_get_substring
+pcre_get_substring_list
+pcre_free_substring
+pcre_free_substring_list
+pcre_info
+pcre_fullinfo
+pcre_maketables
+pcre_study
+pcre_version
+
+regcomp
+regexec
+regerror
+regfree
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcre.dsp b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcre.dsp
new file mode 100644
index 00000000..018f7fe7
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcre.dsp
@@ -0,0 +1,193 @@
+# Microsoft Developer Studio Project File - Name="pcre" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Static Library" 0x0104
+
+CFG=pcre - 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 "pcre.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 "pcre.mak" CFG="pcre - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "pcre - Win32 Release" (based on "Win32 (x86) Static Library")
+!MESSAGE "pcre - Win32 Debug" (based on "Win32 (x86) Static Library")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "pcre - 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 "LibR"
+# PROP Intermediate_Dir "LibR"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MD /W3 /O2 /D "_WIN32" /D "NDEBUG" /D "_WINDOWS" /D "PCRE_STATIC" /FD /c
+# ADD CPP /nologo /MD /W3 /Zi /O2 /D "_WIN32" /D "NDEBUG" /D "_WINDOWS" /D "PCRE_STATIC" /Fd"LibR/pcre_src" /FD /c
+# ADD BASE RSC /l 0x409
+# ADD RSC /l 0x409
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LIB32=link.exe -lib
+# ADD BASE LIB32 /nologo
+# ADD LIB32 /nologo
+
+!ELSEIF "$(CFG)" == "pcre - 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 "LibD"
+# PROP Intermediate_Dir "LibD"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "_WIN32" /D "_DEBUG" /D "_WINDOWS" /D "PCRE_STATIC" /FD /c
+# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "_WIN32" /D "_DEBUG" /D "_WINDOWS" /D "PCRE_STATIC" /Fd"LibD/pcre_src" /FD /c
+# ADD BASE RSC /l 0x409
+# ADD RSC /l 0x409
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LIB32=link.exe -lib
+# ADD BASE LIB32 /nologo
+# ADD LIB32 /nologo
+
+!ENDIF
+
+# Begin Target
+
+# Name "pcre - Win32 Release"
+# Name "pcre - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "*.c"
+# Begin Source File
+
+SOURCE=.\dftables.exe
+
+!IF "$(CFG)" == "pcre - Win32 Release"
+
+# Begin Custom Build - Creating pcre chartables.c from dftables
+InputPath=.\dftables.exe
+
+".\chartables.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ .\dftables.exe chartables.c
+
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "pcre - Win32 Debug"
+
+# Begin Custom Build - Creating pcre chartables.c from dftables
+InputPath=.\dftables.exe
+
+".\chartables.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ .\dftables.exe chartables.c
+
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\get.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\maketables.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\pcre.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\study.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "*.h"
+# Begin Source File
+
+SOURCE=.\config.hw
+
+!IF "$(CFG)" == "pcre - Win32 Release"
+
+# Begin Custom Build - Creating pcre config.h from config.hw
+InputPath=.\config.hw
+
+".\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ type .\config.hw > .\config.h
+
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "pcre - Win32 Debug"
+
+# Begin Custom Build - Creating pcre config.h from config.hw
+InputPath=.\config.hw
+
+".\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ type .\config.hw > .\config.h
+
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\internal.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\pcre.hw
+
+!IF "$(CFG)" == "pcre - Win32 Release"
+
+# Begin Custom Build - Creating pcre.h from pcre.hw
+InputPath=.\pcre.hw
+
+".\pcre.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ type .\pcre.hw > .\pcre.h
+
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "pcre - Win32 Debug"
+
+# Begin Custom Build - Creating pcre.h from pcre.hw
+InputPath=.\pcre.hw
+
+".\pcre.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ type .\pcre.hw > .\pcre.h
+
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# End Group
+# End Target
+# End Project
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcre.hw b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcre.hw
new file mode 100644
index 00000000..4534b631
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcre.hw
@@ -0,0 +1,239 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/* In its original form, this is the .in file that is transformed by
+"configure" into pcre.h.
+
+ Copyright (c) 1997-2004 University of Cambridge
+
+-----------------------------------------------------------------------------
+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.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+-----------------------------------------------------------------------------
+*/
+
+#ifndef _PCRE_H
+#define _PCRE_H
+
+/* The file pcre.h is build by "configure" or copied from pcre.hw
+Do not edit it; instead make changes to pcre.in and/or pcre.hw */
+
+#define PCRE_MAJOR 5
+#define PCRE_MINOR 0
+#define PCRE_DATE 13-Sep-2004
+
+/* Win32 uses DLL by default */
+
+#ifdef _WIN32
+# ifdef PCRE_DEFINITION
+# ifdef DLL_EXPORT
+# define PCRE_DATA_SCOPE __declspec(dllexport)
+# endif
+# else
+# ifndef PCRE_STATIC
+# define PCRE_DATA_SCOPE extern __declspec(dllimport)
+# endif
+# endif
+#endif
+#ifndef PCRE_DATA_SCOPE
+# define PCRE_DATA_SCOPE extern
+#endif
+
+/* Have to include stdlib.h in order to ensure that size_t is defined;
+it is needed here for malloc. */
+
+#include <stdlib.h>
+
+/* Allow for C++ users */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Options */
+
+#define PCRE_CASELESS 0x0001
+#define PCRE_MULTILINE 0x0002
+#define PCRE_DOTALL 0x0004
+#define PCRE_EXTENDED 0x0008
+#define PCRE_ANCHORED 0x0010
+#define PCRE_DOLLAR_ENDONLY 0x0020
+#define PCRE_EXTRA 0x0040
+#define PCRE_NOTBOL 0x0080
+#define PCRE_NOTEOL 0x0100
+#define PCRE_UNGREEDY 0x0200
+#define PCRE_NOTEMPTY 0x0400
+#define PCRE_UTF8 0x0800
+#define PCRE_NO_AUTO_CAPTURE 0x1000
+#define PCRE_NO_UTF8_CHECK 0x2000
+#define PCRE_AUTO_CALLOUT 0x4000
+#define PCRE_PARTIAL 0x8000
+
+/* Exec-time and get/set-time error codes */
+
+#define PCRE_ERROR_NOMATCH (-1)
+#define PCRE_ERROR_NULL (-2)
+#define PCRE_ERROR_BADOPTION (-3)
+#define PCRE_ERROR_BADMAGIC (-4)
+#define PCRE_ERROR_UNKNOWN_NODE (-5)
+#define PCRE_ERROR_NOMEMORY (-6)
+#define PCRE_ERROR_NOSUBSTRING (-7)
+#define PCRE_ERROR_MATCHLIMIT (-8)
+#define PCRE_ERROR_CALLOUT (-9) /* Never used by PCRE itself */
+#define PCRE_ERROR_BADUTF8 (-10)
+#define PCRE_ERROR_BADUTF8_OFFSET (-11)
+#define PCRE_ERROR_PARTIAL (-12)
+#define PCRE_ERROR_BADPARTIAL (-13)
+#define PCRE_ERROR_INTERNAL (-14)
+#define PCRE_ERROR_BADCOUNT (-15)
+
+/* Request types for pcre_fullinfo() */
+
+#define PCRE_INFO_OPTIONS 0
+#define PCRE_INFO_SIZE 1
+#define PCRE_INFO_CAPTURECOUNT 2
+#define PCRE_INFO_BACKREFMAX 3
+#define PCRE_INFO_FIRSTBYTE 4
+#define PCRE_INFO_FIRSTCHAR 4 /* For backwards compatibility */
+#define PCRE_INFO_FIRSTTABLE 5
+#define PCRE_INFO_LASTLITERAL 6
+#define PCRE_INFO_NAMEENTRYSIZE 7
+#define PCRE_INFO_NAMECOUNT 8
+#define PCRE_INFO_NAMETABLE 9
+#define PCRE_INFO_STUDYSIZE 10
+#define PCRE_INFO_DEFAULT_TABLES 11
+
+/* Request types for pcre_config() */
+
+#define PCRE_CONFIG_UTF8 0
+#define PCRE_CONFIG_NEWLINE 1
+#define PCRE_CONFIG_LINK_SIZE 2
+#define PCRE_CONFIG_POSIX_MALLOC_THRESHOLD 3
+#define PCRE_CONFIG_MATCH_LIMIT 4
+#define PCRE_CONFIG_STACKRECURSE 5
+#define PCRE_CONFIG_UNICODE_PROPERTIES 6
+
+/* Bit flags for the pcre_extra structure */
+
+#define PCRE_EXTRA_STUDY_DATA 0x0001
+#define PCRE_EXTRA_MATCH_LIMIT 0x0002
+#define PCRE_EXTRA_CALLOUT_DATA 0x0004
+#define PCRE_EXTRA_TABLES 0x0008
+
+/* Types */
+
+struct real_pcre; /* declaration; the definition is private */
+typedef struct real_pcre pcre;
+
+/* The structure for passing additional data to pcre_exec(). This is defined in
+such as way as to be extensible. Always add new fields at the end, in order to
+remain compatible. */
+
+typedef struct pcre_extra {
+ unsigned long int flags; /* Bits for which fields are set */
+ void *study_data; /* Opaque data from pcre_study() */
+ unsigned long int match_limit; /* Maximum number of calls to match() */
+ void *callout_data; /* Data passed back in callouts */
+ const unsigned char *tables; /* Pointer to character tables */
+} pcre_extra;
+
+/* The structure for passing out data via the pcre_callout_function. We use a
+structure so that new fields can be added on the end in future versions,
+without changing the API of the function, thereby allowing old clients to work
+without modification. */
+
+typedef struct pcre_callout_block {
+ int version; /* Identifies version of block */
+ /* ------------------------ Version 0 ------------------------------- */
+ int callout_number; /* Number compiled into pattern */
+ int *offset_vector; /* The offset vector */
+ const char *subject; /* The subject being matched */
+ int subject_length; /* The length of the subject */
+ int start_match; /* Offset to start of this match attempt */
+ int current_position; /* Where we currently are in the subject */
+ int capture_top; /* Max current capture */
+ int capture_last; /* Most recently closed capture */
+ void *callout_data; /* Data passed in with the call */
+ /* ------------------- Added for Version 1 -------------------------- */
+ int pattern_position; /* Offset to next item in the pattern */
+ int next_item_length; /* Length of next item in the pattern */
+ /* ------------------------------------------------------------------ */
+} pcre_callout_block;
+
+/* Indirection for store get and free functions. These can be set to
+alternative malloc/free functions if required. Special ones are used in the
+non-recursive case for "frames". There is also an optional callout function
+that is triggered by the (?) regex item. Some magic is required for Win32 DLL;
+it is null on other OS. For Virtual Pascal, these have to be different again.
+*/
+
+#ifndef VPCOMPAT
+PCRE_DATA_SCOPE void *(*pcre_malloc)(size_t);
+PCRE_DATA_SCOPE void (*pcre_free)(void *);
+PCRE_DATA_SCOPE void *(*pcre_stack_malloc)(size_t);
+PCRE_DATA_SCOPE void (*pcre_stack_free)(void *);
+PCRE_DATA_SCOPE int (*pcre_callout)(pcre_callout_block *);
+#else /* VPCOMPAT */
+extern void *pcre_malloc(size_t);
+extern void pcre_free(void *);
+extern void *pcre_stack_malloc(size_t);
+extern void pcre_stack_free(void *);
+extern int pcre_callout(pcre_callout_block *);
+#endif /* VPCOMPAT */
+
+/* Exported PCRE functions */
+
+extern pcre *pcre_compile(const char *, int, const char **,
+ int *, const unsigned char *);
+extern int pcre_config(int, void *);
+extern int pcre_copy_named_substring(const pcre *, const char *,
+ int *, int, const char *, char *, int);
+extern int pcre_copy_substring(const char *, int *, int, int,
+ char *, int);
+extern int pcre_exec(const pcre *, const pcre_extra *,
+ const char *, int, int, int, int *, int);
+extern void pcre_free_substring(const char *);
+extern void pcre_free_substring_list(const char **);
+extern int pcre_fullinfo(const pcre *, const pcre_extra *, int,
+ void *);
+extern int pcre_get_named_substring(const pcre *, const char *,
+ int *, int, const char *, const char **);
+extern int pcre_get_stringnumber(const pcre *, const char *);
+extern int pcre_get_substring(const char *, int *, int, int,
+ const char **);
+extern int pcre_get_substring_list(const char *, int *, int,
+ const char ***);
+extern int pcre_info(const pcre *, int *, int *);
+extern const unsigned char *pcre_maketables(void);
+extern pcre_extra *pcre_study(const pcre *, int, const char **);
+extern const char *pcre_version(void);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* End of pcre.h */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcre.ia64 b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcre.ia64
new file mode 100644
index 00000000..d7639bb6
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcre.ia64
@@ -0,0 +1,147 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Microsoft Developer Studio Generated NMAKE File, Based on pcre.dsp
+# Use Platform SDK:
+# SetEnv.cmd /SRV64 /RETAIL
+# nmake -f pcre.amd64
+#
+
+CPP=cl.exe
+RSC=rc.exe
+OUTDIR=.\Release_ia64
+INTDIR=.\Release_ia64
+# Begin Custom Macros
+OutDir=.\Release_ia64
+# End Custom Macros
+
+!IF "$(RECURSE)" == "0"
+
+ALL : "$(OUTDIR)\pcre.lib"
+
+!ELSE
+
+ALL : "$(OUTDIR)\pcre.lib"
+
+!ENDIF
+
+CLEAN :
+ -@erase "$(INTDIR)\get.obj"
+ -@erase "$(INTDIR)\maketables.obj"
+ -@erase "$(INTDIR)\pcre.obj"
+ -@erase "$(INTDIR)\pcre_src.idb"
+ -@erase "$(INTDIR)\pcre_src.pdb"
+ -@erase "$(INTDIR)\study.obj"
+ -@erase "$(OUTDIR)\pcre.lib"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+BSC32=bscmake.exe
+BSC32_FLAGS=kernel32.lib /nologo /o"$(OUTDIR)\pcre.bsc"
+BSC32_SBRS= \
+
+LIB32=link.exe -lib
+LIB32_FLAGS=/nologo /out:"$(OUTDIR)\pcre.lib"
+LIB32_OBJS= \
+ "$(INTDIR)\get.obj" \
+ "$(INTDIR)\maketables.obj" \
+ "$(INTDIR)\pcre.obj" \
+ "$(INTDIR)\study.obj"
+
+"$(OUTDIR)\pcre.lib" : "$(OUTDIR)" $(DEF_FILE) $(LIB32_OBJS)
+ $(LIB32) @<<
+ $(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS)
+<<
+
+CPP_PROJ=-nologo -MD -W3 -O2 -Ob2 -Oy- -Zi -EHsc /D "_WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_IA64_=1" -DWIN64 /D "_WIN64" /Wp64 /FIPRE64PRA.H /D "PCRE_STATIC" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\pcre_src" /FD /c
+
+.c{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+SOURCE=.\dftables.exe
+InputPath=.\dftables.exe
+
+".\chartables.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ <<tempfile.bat
+ @echo off
+ .\dftables.exe chartables.c
+<<
+
+SOURCE=.\get.c
+
+"$(INTDIR)\get.obj" : $(SOURCE) "$(INTDIR)" ".\config.h" ".\pcre.h"
+
+
+SOURCE=.\maketables.c
+
+"$(INTDIR)\maketables.obj" : $(SOURCE) "$(INTDIR)" ".\config.h" ".\pcre.h"
+
+
+SOURCE=.\pcre.c
+
+"$(INTDIR)\pcre.obj" : $(SOURCE) "$(INTDIR)" ".\chartables.c" ".\config.h" ".\pcre.h"
+
+
+SOURCE=.\study.c
+
+"$(INTDIR)\study.obj" : $(SOURCE) "$(INTDIR)" ".\config.h" ".\pcre.h"
+
+
+SOURCE=.\config.hw
+InputPath=.\config.hw
+
+".\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ <<tempfile.bat
+ @echo off
+ type .\config.hw > .\config.h
+<<
+
+SOURCE=.\pcre.hw
+InputPath=.\pcre.hw
+
+".\pcre.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ <<tempfile.bat
+ @echo off
+ type .\pcre.hw > .\pcre.h
+<<
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcre.in b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcre.in
new file mode 100644
index 00000000..163cf94b
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcre.in
@@ -0,0 +1,239 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/* In its original form, this is the .in file that is transformed by
+"configure" into pcre.h.
+
+ Copyright (c) 1997-2004 University of Cambridge
+
+-----------------------------------------------------------------------------
+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.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+-----------------------------------------------------------------------------
+*/
+
+#ifndef _PCRE_H
+#define _PCRE_H
+
+/* The file pcre.h is build by "configure". Do not edit it; instead
+make changes to pcre.in. */
+
+#define PCRE_MAJOR @PCRE_MAJOR@
+#define PCRE_MINOR @PCRE_MINOR@
+#define PCRE_DATE @PCRE_DATE@
+
+/* Win32 uses DLL by default */
+
+#ifdef _WIN32
+# ifdef PCRE_DEFINITION
+# ifdef DLL_EXPORT
+# define PCRE_DATA_SCOPE __declspec(dllexport)
+# endif
+# else
+# ifndef PCRE_STATIC
+# define PCRE_DATA_SCOPE extern __declspec(dllimport)
+# endif
+# endif
+#endif
+#ifndef PCRE_DATA_SCOPE
+# define PCRE_DATA_SCOPE extern
+#endif
+
+/* Have to include stdlib.h in order to ensure that size_t is defined;
+it is needed here for malloc. */
+
+#include <stdlib.h>
+
+/* Allow for C++ users */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Options */
+
+#define PCRE_CASELESS 0x0001
+#define PCRE_MULTILINE 0x0002
+#define PCRE_DOTALL 0x0004
+#define PCRE_EXTENDED 0x0008
+#define PCRE_ANCHORED 0x0010
+#define PCRE_DOLLAR_ENDONLY 0x0020
+#define PCRE_EXTRA 0x0040
+#define PCRE_NOTBOL 0x0080
+#define PCRE_NOTEOL 0x0100
+#define PCRE_UNGREEDY 0x0200
+#define PCRE_NOTEMPTY 0x0400
+#define PCRE_UTF8 0x0800
+#define PCRE_NO_AUTO_CAPTURE 0x1000
+#define PCRE_NO_UTF8_CHECK 0x2000
+#define PCRE_AUTO_CALLOUT 0x4000
+#define PCRE_PARTIAL 0x8000
+
+/* Exec-time and get/set-time error codes */
+
+#define PCRE_ERROR_NOMATCH (-1)
+#define PCRE_ERROR_NULL (-2)
+#define PCRE_ERROR_BADOPTION (-3)
+#define PCRE_ERROR_BADMAGIC (-4)
+#define PCRE_ERROR_UNKNOWN_NODE (-5)
+#define PCRE_ERROR_NOMEMORY (-6)
+#define PCRE_ERROR_NOSUBSTRING (-7)
+#define PCRE_ERROR_MATCHLIMIT (-8)
+#define PCRE_ERROR_CALLOUT (-9) /* Never used by PCRE itself */
+#define PCRE_ERROR_BADUTF8 (-10)
+#define PCRE_ERROR_BADUTF8_OFFSET (-11)
+#define PCRE_ERROR_PARTIAL (-12)
+#define PCRE_ERROR_BADPARTIAL (-13)
+#define PCRE_ERROR_INTERNAL (-14)
+#define PCRE_ERROR_BADCOUNT (-15)
+
+/* Request types for pcre_fullinfo() */
+
+#define PCRE_INFO_OPTIONS 0
+#define PCRE_INFO_SIZE 1
+#define PCRE_INFO_CAPTURECOUNT 2
+#define PCRE_INFO_BACKREFMAX 3
+#define PCRE_INFO_FIRSTBYTE 4
+#define PCRE_INFO_FIRSTCHAR 4 /* For backwards compatibility */
+#define PCRE_INFO_FIRSTTABLE 5
+#define PCRE_INFO_LASTLITERAL 6
+#define PCRE_INFO_NAMEENTRYSIZE 7
+#define PCRE_INFO_NAMECOUNT 8
+#define PCRE_INFO_NAMETABLE 9
+#define PCRE_INFO_STUDYSIZE 10
+#define PCRE_INFO_DEFAULT_TABLES 11
+
+/* Request types for pcre_config() */
+
+#define PCRE_CONFIG_UTF8 0
+#define PCRE_CONFIG_NEWLINE 1
+#define PCRE_CONFIG_LINK_SIZE 2
+#define PCRE_CONFIG_POSIX_MALLOC_THRESHOLD 3
+#define PCRE_CONFIG_MATCH_LIMIT 4
+#define PCRE_CONFIG_STACKRECURSE 5
+#define PCRE_CONFIG_UNICODE_PROPERTIES 6
+
+/* Bit flags for the pcre_extra structure */
+
+#define PCRE_EXTRA_STUDY_DATA 0x0001
+#define PCRE_EXTRA_MATCH_LIMIT 0x0002
+#define PCRE_EXTRA_CALLOUT_DATA 0x0004
+#define PCRE_EXTRA_TABLES 0x0008
+
+/* Types */
+
+struct real_pcre; /* declaration; the definition is private */
+typedef struct real_pcre pcre;
+
+/* The structure for passing additional data to pcre_exec(). This is defined in
+such as way as to be extensible. Always add new fields at the end, in order to
+remain compatible. */
+
+typedef struct pcre_extra {
+ unsigned long int flags; /* Bits for which fields are set */
+ void *study_data; /* Opaque data from pcre_study() */
+ unsigned long int match_limit; /* Maximum number of calls to match() */
+ void *callout_data; /* Data passed back in callouts */
+ const unsigned char *tables; /* Pointer to character tables */
+} pcre_extra;
+
+/* The structure for passing out data via the pcre_callout_function. We use a
+structure so that new fields can be added on the end in future versions,
+without changing the API of the function, thereby allowing old clients to work
+without modification. */
+
+typedef struct pcre_callout_block {
+ int version; /* Identifies version of block */
+ /* ------------------------ Version 0 ------------------------------- */
+ int callout_number; /* Number compiled into pattern */
+ int *offset_vector; /* The offset vector */
+ const char *subject; /* The subject being matched */
+ int subject_length; /* The length of the subject */
+ int start_match; /* Offset to start of this match attempt */
+ int current_position; /* Where we currently are in the subject */
+ int capture_top; /* Max current capture */
+ int capture_last; /* Most recently closed capture */
+ void *callout_data; /* Data passed in with the call */
+ /* ------------------- Added for Version 1 -------------------------- */
+ int pattern_position; /* Offset to next item in the pattern */
+ int next_item_length; /* Length of next item in the pattern */
+ /* ------------------------------------------------------------------ */
+} pcre_callout_block;
+
+/* Indirection for store get and free functions. These can be set to
+alternative malloc/free functions if required. Special ones are used in the
+non-recursive case for "frames". There is also an optional callout function
+that is triggered by the (?) regex item. Some magic is required for Win32 DLL;
+it is null on other OS. For Virtual Pascal, these have to be different again.
+*/
+
+#ifndef VPCOMPAT
+PCRE_DATA_SCOPE void *(*pcre_malloc)(size_t);
+PCRE_DATA_SCOPE void (*pcre_free)(void *);
+PCRE_DATA_SCOPE void *(*pcre_stack_malloc)(size_t);
+PCRE_DATA_SCOPE void (*pcre_stack_free)(void *);
+PCRE_DATA_SCOPE int (*pcre_callout)(pcre_callout_block *);
+#else /* VPCOMPAT */
+extern void *pcre_malloc(size_t);
+extern void pcre_free(void *);
+extern void *pcre_stack_malloc(size_t);
+extern void pcre_stack_free(void *);
+extern int pcre_callout(pcre_callout_block *);
+#endif /* VPCOMPAT */
+
+/* Exported PCRE functions */
+
+extern pcre *pcre_compile(const char *, int, const char **,
+ int *, const unsigned char *);
+extern int pcre_config(int, void *);
+extern int pcre_copy_named_substring(const pcre *, const char *,
+ int *, int, const char *, char *, int);
+extern int pcre_copy_substring(const char *, int *, int, int,
+ char *, int);
+extern int pcre_exec(const pcre *, const pcre_extra *,
+ const char *, int, int, int, int *, int);
+extern void pcre_free_substring(const char *);
+extern void pcre_free_substring_list(const char **);
+extern int pcre_fullinfo(const pcre *, const pcre_extra *, int,
+ void *);
+extern int pcre_get_named_substring(const pcre *, const char *,
+ int *, int, const char *, const char **);
+extern int pcre_get_stringnumber(const pcre *, const char *);
+extern int pcre_get_substring(const char *, int *, int, int,
+ const char **);
+extern int pcre_get_substring_list(const char *, int *, int,
+ const char ***);
+extern int pcre_info(const pcre *, int *, int *);
+extern const unsigned char *pcre_maketables(void);
+extern pcre_extra *pcre_study(const pcre *, int, const char **);
+extern const char *pcre_version(void);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* End of pcre.h */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcre.x86 b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcre.x86
new file mode 100644
index 00000000..03bf4a67
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcre.x86
@@ -0,0 +1,154 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+CPP=cl.exe
+RSC=rc.exe
+OUTDIR=.\Release_x86
+INTDIR=.\Release_x86
+# Begin Custom Macros
+OutDir=.\Release_x86
+# End Custom Macros
+
+!IF "$(RECURSE)" == "0"
+
+ALL : "$(OUTDIR)\pcre.lib"
+
+!ELSE
+
+ALL : "dftables_x86" "$(OUTDIR)\pcre.lib"
+
+!ENDIF
+
+!IF "$(RECURSE)" == "1"
+CLEAN :"dftables_x86CLEAN"
+!ELSE
+CLEAN :
+!ENDIF
+ -@erase "$(INTDIR)\get.obj"
+ -@erase "$(INTDIR)\maketables.obj"
+ -@erase "$(INTDIR)\pcre.obj"
+ -@erase "$(INTDIR)\pcre_src.idb"
+ -@erase "$(INTDIR)\pcre_src.pdb"
+ -@erase "$(INTDIR)\study.obj"
+ -@erase "$(OUTDIR)\pcre.lib"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\pcre.bsc"
+BSC32_SBRS= \
+
+LIB32=link.exe -lib
+LIB32_FLAGS=kernel32.lib /nologo /out:"$(OUTDIR)\pcre.lib"
+LIB32_OBJS= \
+ "$(INTDIR)\get.obj" \
+ "$(INTDIR)\maketables.obj" \
+ "$(INTDIR)\pcre.obj" \
+ "$(INTDIR)\study.obj"
+
+"$(OUTDIR)\pcre.lib" : "$(OUTDIR)" $(DEF_FILE) $(LIB32_OBJS)
+ $(LIB32) @<<
+ $(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS)
+<<
+
+CPP_PROJ=-nologo -MD -W3 -O2 -Ob2 -Oy- -Zi -EHsc /D "_WIN32" /D "NDEBUG" /D "_WINDOWS" /D "PCRE_STATIC" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\pcre_src" /FD /c
+
+.c{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+SOURCE=.\dftables.exe
+InputPath=.\dftables.exe
+
+".\chartables.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ <<tempfile.bat
+ @echo off
+ .\dftables.exe chartables.c
+<<
+
+SOURCE=.\get.c
+
+"$(INTDIR)\get.obj" : $(SOURCE) "$(INTDIR)" ".\config.h" ".\pcre.h"
+
+
+SOURCE=.\maketables.c
+
+"$(INTDIR)\maketables.obj" : $(SOURCE) "$(INTDIR)" ".\config.h" ".\pcre.h"
+
+
+SOURCE=.\pcre.c
+
+"$(INTDIR)\pcre.obj" : $(SOURCE) "$(INTDIR)" ".\chartables.c" ".\config.h" ".\pcre.h"
+
+
+SOURCE=.\study.c
+
+"$(INTDIR)\study.obj" : $(SOURCE) "$(INTDIR)" ".\config.h" ".\pcre.h"
+
+
+SOURCE=.\config.hw
+InputPath=.\config.hw
+
+".\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ <<tempfile.bat
+ @echo off
+ type .\config.hw > .\config.h
+<<
+
+SOURCE=.\pcre.hw
+InputPath=.\pcre.hw
+
+".\pcre.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ <<tempfile.bat
+ @echo off
+ type .\pcre.hw > .\pcre.h
+<<
+
+"dftables_x86" :
+ cd "."
+ $(MAKE) /$(MAKEFLAGS) /F ".\dftables.x86" CFG="dftables_x86"
+ cd "."
+
+"dftables_x86CLEAN" :
+ cd "."
+ $(MAKE) /$(MAKEFLAGS) /F ".\dftables.x86" CFG="dftables_x86" RECURSE=1 CLEAN
+ cd "."
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcredemo.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcredemo.c
new file mode 100644
index 00000000..3817203b
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcredemo.c
@@ -0,0 +1,324 @@
+/*************************************************
+* PCRE DEMONSTRATION PROGRAM *
+*************************************************/
+
+/* This is a demonstration program to illustrate the most straightforward ways
+of calling the PCRE regular expression library from a C program. See the
+pcresample documentation for a short discussion.
+
+Compile thuswise:
+ gcc -Wall pcredemo.c -I/usr/local/include -L/usr/local/lib \
+ -R/usr/local/lib -lpcre
+
+Replace "/usr/local/include" and "/usr/local/lib" with wherever the include and
+library files for PCRE are installed on your system. Only some operating
+systems (e.g. Solaris) use the -R option.
+*/
+
+
+#include <stdio.h>
+#include <string.h>
+#include <pcre.h>
+
+#define OVECCOUNT 30 /* should be a multiple of 3 */
+
+
+int main(int argc, char **argv)
+{
+pcre *re;
+const char *error;
+char *pattern;
+char *subject;
+unsigned char *name_table;
+int erroffset;
+int find_all;
+int namecount;
+int name_entry_size;
+int ovector[OVECCOUNT];
+int subject_length;
+int rc, i;
+
+
+/**************************************************************************
+* First, sort out the command line. There is only one possible option at *
+* the moment, "-g" to request repeated matching to find all occurrences, *
+* like Perl's /g option. We set the variable find_all to a non-zero value *
+* if the -g option is present. Apart from that, there must be exactly two *
+* arguments. *
+**************************************************************************/
+
+find_all = 0;
+for (i = 1; i < argc; i++)
+ {
+ if (strcmp(argv[i], "-g") == 0) find_all = 1;
+ else break;
+ }
+
+/* After the options, we require exactly two arguments, which are the pattern,
+and the subject string. */
+
+if (argc - i != 2)
+ {
+ printf("Two arguments required: a regex and a subject string\n");
+ return 1;
+ }
+
+pattern = argv[i];
+subject = argv[i+1];
+subject_length = (int)strlen(subject);
+
+
+/*************************************************************************
+* Now we are going to compile the regular expression pattern, and handle *
+* and errors that are detected. *
+*************************************************************************/
+
+re = pcre_compile(
+ pattern, /* the pattern */
+ 0, /* default options */
+ &error, /* for error message */
+ &erroffset, /* for error offset */
+ NULL); /* use default character tables */
+
+/* Compilation failed: print the error message and exit */
+
+if (re == NULL)
+ {
+ printf("PCRE compilation failed at offset %d: %s\n", erroffset, error);
+ return 1;
+ }
+
+
+/*************************************************************************
+* If the compilation succeeded, we call PCRE again, in order to do a *
+* pattern match against the subject string. This does just ONE match. If *
+* further matching is needed, it will be done below. *
+*************************************************************************/
+
+rc = pcre_exec(
+ re, /* the compiled pattern */
+ NULL, /* no extra data - we didn't study the pattern */
+ subject, /* the subject string */
+ subject_length, /* the length of the subject */
+ 0, /* start at offset 0 in the subject */
+ 0, /* default options */
+ ovector, /* output vector for substring information */
+ OVECCOUNT); /* number of elements in the output vector */
+
+/* Matching failed: handle error cases */
+
+if (rc < 0)
+ {
+ switch(rc)
+ {
+ case PCRE_ERROR_NOMATCH: printf("No match\n"); break;
+ /*
+ Handle other special cases if you like
+ */
+ default: printf("Matching error %d\n", rc); break;
+ }
+ free(re); /* Release memory used for the compiled pattern */
+ return 1;
+ }
+
+/* Match succeded */
+
+printf("\nMatch succeeded at offset %d\n", ovector[0]);
+
+
+/*************************************************************************
+* We have found the first match within the subject string. If the output *
+* vector wasn't big enough, set its size to the maximum. Then output any *
+* substrings that were captured. *
+*************************************************************************/
+
+/* The output vector wasn't big enough */
+
+if (rc == 0)
+ {
+ rc = OVECCOUNT/3;
+ printf("ovector only has room for %d captured substrings\n", rc - 1);
+ }
+
+/* Show substrings stored in the output vector by number. Obviously, in a real
+application you might want to do things other than print them. */
+
+for (i = 0; i < rc; i++)
+ {
+ char *substring_start = subject + ovector[2*i];
+ int substring_length = ovector[2*i+1] - ovector[2*i];
+ printf("%2d: %.*s\n", i, substring_length, substring_start);
+ }
+
+
+/**************************************************************************
+* That concludes the basic part of this demonstration program. We have *
+* compiled a pattern, and performed a single match. The code that follows *
+* first shows how to access named substrings, and then how to code for *
+* repeated matches on the same subject. *
+**************************************************************************/
+
+/* See if there are any named substrings, and if so, show them by name. First
+we have to extract the count of named parentheses from the pattern. */
+
+(void)pcre_fullinfo(
+ re, /* the compiled pattern */
+ NULL, /* no extra data - we didn't study the pattern */
+ PCRE_INFO_NAMECOUNT, /* number of named substrings */
+ &namecount); /* where to put the answer */
+
+if (namecount <= 0) printf("No named substrings\n"); else
+ {
+ unsigned char *tabptr;
+ printf("Named substrings\n");
+
+ /* Before we can access the substrings, we must extract the table for
+ translating names to numbers, and the size of each entry in the table. */
+
+ (void)pcre_fullinfo(
+ re, /* the compiled pattern */
+ NULL, /* no extra data - we didn't study the pattern */
+ PCRE_INFO_NAMETABLE, /* address of the table */
+ &name_table); /* where to put the answer */
+
+ (void)pcre_fullinfo(
+ re, /* the compiled pattern */
+ NULL, /* no extra data - we didn't study the pattern */
+ PCRE_INFO_NAMEENTRYSIZE, /* size of each entry in the table */
+ &name_entry_size); /* where to put the answer */
+
+ /* Now we can scan the table and, for each entry, print the number, the name,
+ and the substring itself. */
+
+ tabptr = name_table;
+ for (i = 0; i < namecount; i++)
+ {
+ int n = (tabptr[0] << 8) | tabptr[1];
+ printf("(%d) %*s: %.*s\n", n, name_entry_size - 3, tabptr + 2,
+ ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]);
+ tabptr += name_entry_size;
+ }
+ }
+
+
+/*************************************************************************
+* If the "-g" option was given on the command line, we want to continue *
+* to search for additional matches in the subject string, in a similar *
+* way to the /g option in Perl. This turns out to be trickier than you *
+* might think because of the possibility of matching an empty string. *
+* What happens is as follows: *
+* *
+* If the previous match was NOT for an empty string, we can just start *
+* the next match at the end of the previous one. *
+* *
+* If the previous match WAS for an empty string, we can't do that, as it *
+* would lead to an infinite loop. Instead, a special call of pcre_exec() *
+* is made with the PCRE_NOTEMPTY and PCRE_ANCHORED flags set. The first *
+* of these tells PCRE that an empty string is not a valid match; other *
+* possibilities must be tried. The second flag restricts PCRE to one *
+* match attempt at the initial string position. If this match succeeds, *
+* an alternative to the empty string match has been found, and we can *
+* proceed round the loop. *
+*************************************************************************/
+
+if (!find_all)
+ {
+ free(re); /* Release the memory used for the compiled pattern */
+ return 0; /* Finish unless -g was given */
+ }
+
+/* Loop for second and subsequent matches */
+
+for (;;)
+ {
+ int options = 0; /* Normally no options */
+ int start_offset = ovector[1]; /* Start at end of previous match */
+
+ /* If the previous match was for an empty string, we are finished if we are
+ at the end of the subject. Otherwise, arrange to run another match at the
+ same point to see if a non-empty match can be found. */
+
+ if (ovector[0] == ovector[1])
+ {
+ if (ovector[0] == subject_length) break;
+ options = PCRE_NOTEMPTY | PCRE_ANCHORED;
+ }
+
+ /* Run the next matching operation */
+
+ rc = pcre_exec(
+ re, /* the compiled pattern */
+ NULL, /* no extra data - we didn't study the pattern */
+ subject, /* the subject string */
+ subject_length, /* the length of the subject */
+ start_offset, /* starting offset in the subject */
+ options, /* options */
+ ovector, /* output vector for substring information */
+ OVECCOUNT); /* number of elements in the output vector */
+
+ /* This time, a result of NOMATCH isn't an error. If the value in "options"
+ is zero, it just means we have found all possible matches, so the loop ends.
+ Otherwise, it means we have failed to find a non-empty-string match at a
+ point where there was a previous empty-string match. In this case, we do what
+ Perl does: advance the matching position by one, and continue. We do this by
+ setting the "end of previous match" offset, because that is picked up at the
+ top of the loop as the point at which to start again. */
+
+ if (rc == PCRE_ERROR_NOMATCH)
+ {
+ if (options == 0) break;
+ ovector[1] = start_offset + 1;
+ continue; /* Go round the loop again */
+ }
+
+ /* Other matching errors are not recoverable. */
+
+ if (rc < 0)
+ {
+ printf("Matching error %d\n", rc);
+ free(re); /* Release memory used for the compiled pattern */
+ return 1;
+ }
+
+ /* Match succeded */
+
+ printf("\nMatch succeeded again at offset %d\n", ovector[0]);
+
+ /* The match succeeded, but the output vector wasn't big enough. */
+
+ if (rc == 0)
+ {
+ rc = OVECCOUNT/3;
+ printf("ovector only has room for %d captured substrings\n", rc - 1);
+ }
+
+ /* As before, show substrings stored in the output vector by number, and then
+ also any named substrings. */
+
+ for (i = 0; i < rc; i++)
+ {
+ char *substring_start = subject + ovector[2*i];
+ int substring_length = ovector[2*i+1] - ovector[2*i];
+ printf("%2d: %.*s\n", i, substring_length, substring_start);
+ }
+
+ if (namecount <= 0) printf("No named substrings\n"); else
+ {
+ unsigned char *tabptr = name_table;
+ printf("Named substrings\n");
+ for (i = 0; i < namecount; i++)
+ {
+ int n = (tabptr[0] << 8) | tabptr[1];
+ printf("(%d) %*s: %.*s\n", n, name_entry_size - 3, tabptr + 2,
+ ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]);
+ tabptr += name_entry_size;
+ }
+ }
+ } /* End of loop to find second and subsequent matches */
+
+printf("\n");
+free(re); /* Release memory used for the compiled pattern */
+return 0;
+}
+
+/* End of pcredemo.c */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcregrep.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcregrep.c
new file mode 100644
index 00000000..21b2a9bb
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcregrep.c
@@ -0,0 +1,673 @@
+/*************************************************
+* pcregrep program *
+*************************************************/
+
+/* This is a grep program that uses the PCRE regular expression library to do
+its pattern matching. On a Unix or Win32 system it can recurse into
+directories.
+
+ Copyright (c) 1997-2004 University of Cambridge
+
+-----------------------------------------------------------------------------
+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.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+-----------------------------------------------------------------------------
+*/
+
+#include <ctype.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#include "config.h"
+#include "pcre.h"
+
+#define FALSE 0
+#define TRUE 1
+
+typedef int BOOL;
+
+#define VERSION "3.0 14-Jan-2003"
+#define MAX_PATTERN_COUNT 100
+
+
+/*************************************************
+* Global variables *
+*************************************************/
+
+static char *pattern_filename = NULL;
+static int pattern_count = 0;
+static pcre **pattern_list;
+static pcre_extra **hints_list;
+
+static BOOL count_only = FALSE;
+static BOOL filenames = TRUE;
+static BOOL filenames_only = FALSE;
+static BOOL invert = FALSE;
+static BOOL number = FALSE;
+static BOOL recurse = FALSE;
+static BOOL silent = FALSE;
+static BOOL whole_lines = FALSE;
+
+/* Structure for options and list of them */
+
+typedef struct option_item {
+ int one_char;
+ const char *long_name;
+ const char *help_text;
+} option_item;
+
+static option_item optionlist[] = {
+ { -1, "help", "display this help and exit" },
+ { 'c', "count", "print only a count of matching lines per FILE" },
+ { 'h', "no-filename", "suppress the prefixing filename on output" },
+ { 'i', "ignore-case", "ignore case distinctions" },
+ { 'l', "files-with-matches", "print only FILE names containing matches" },
+ { 'n', "line-number", "print line number with output lines" },
+ { 'r', "recursive", "recursively scan sub-directories" },
+ { 's', "no-messages", "suppress error messages" },
+ { 'u', "utf-8", "use UTF-8 mode" },
+ { 'V', "version", "print version information and exit" },
+ { 'v', "invert-match", "select non-matching lines" },
+ { 'x', "line-regex", "force PATTERN to match only whole lines" },
+ { 'x', "line-regexp", "force PATTERN to match only whole lines" },
+ { 0, NULL, NULL }
+};
+
+
+/*************************************************
+* Functions for directory scanning *
+*************************************************/
+
+/* These functions are defined so that they can be made system specific,
+although at present the only ones are for Unix, Win32, and for "no directory
+recursion support". */
+
+
+/************* Directory scanning in Unix ***********/
+
+#if IS_UNIX
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <dirent.h>
+
+typedef DIR directory_type;
+
+static int
+isdirectory(char *filename)
+{
+struct stat statbuf;
+if (stat(filename, &statbuf) < 0)
+ return 0; /* In the expectation that opening as a file will fail */
+return ((statbuf.st_mode & S_IFMT) == S_IFDIR)? '/' : 0;
+}
+
+static directory_type *
+opendirectory(char *filename)
+{
+return opendir(filename);
+}
+
+static char *
+readdirectory(directory_type *dir)
+{
+for (;;)
+ {
+ struct dirent *dent = readdir(dir);
+ if (dent == NULL) return NULL;
+ if (strcmp(dent->d_name, ".") != 0 && strcmp(dent->d_name, "..") != 0)
+ return dent->d_name;
+ }
+return NULL; /* Keep compiler happy; never executed */
+}
+
+static void
+closedirectory(directory_type *dir)
+{
+closedir(dir);
+}
+
+
+/************* Directory scanning in Win32 ***********/
+
+/* I (Philip Hazel) have no means of testing this code. It was contributed by
+Lionel Fourquaux. */
+
+
+#elif HAVE_WIN32API
+
+#ifndef STRICT
+# define STRICT
+#endif
+#ifndef WIN32_LEAN_AND_MEAN
+# define WIN32_LEAN_AND_MEAN
+#endif
+#include <windows.h>
+
+typedef struct directory_type
+{
+HANDLE handle;
+BOOL first;
+WIN32_FIND_DATA data;
+} directory_type;
+
+int
+isdirectory(char *filename)
+{
+DWORD attr = GetFileAttributes(filename);
+if (attr == INVALID_FILE_ATTRIBUTES)
+ return 0;
+return ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) ? '/' : 0;
+}
+
+directory_type *
+opendirectory(char *filename)
+{
+size_t len;
+char *pattern;
+directory_type *dir;
+DWORD err;
+len = strlen(filename);
+pattern = (char *) malloc(len + 3);
+dir = (directory_type *) malloc(sizeof(*dir));
+if ((pattern == NULL) || (dir == NULL))
+ {
+ fprintf(stderr, "pcregrep: malloc failed\n");
+ exit(2);
+ }
+memcpy(pattern, filename, len);
+memcpy(&(pattern[len]), "\\*", 3);
+dir->handle = FindFirstFile(pattern, &(dir->data));
+if (dir->handle != INVALID_HANDLE_VALUE)
+ {
+ free(pattern);
+ dir->first = TRUE;
+ return dir;
+ }
+err = GetLastError();
+free(pattern);
+free(dir);
+errno = (err == ERROR_ACCESS_DENIED) ? EACCES : ENOENT;
+return NULL;
+}
+
+char *
+readdirectory(directory_type *dir)
+{
+for (;;)
+ {
+ if (!dir->first)
+ {
+ if (!FindNextFile(dir->handle, &(dir->data)))
+ return NULL;
+ }
+ else
+ {
+ dir->first = FALSE;
+ }
+ if (strcmp(dir->data.cFileName, ".") != 0 && strcmp(dir->data.cFileName, "..") != 0)
+ return dir->data.cFileName;
+ }
+#ifndef _MSC_VER
+return NULL; /* Keep compiler happy; never executed */
+#endif
+}
+
+void
+closedirectory(directory_type *dir)
+{
+FindClose(dir->handle);
+free(dir);
+}
+
+
+/************* Directory scanning when we can't do it ***********/
+
+/* The type is void, and apart from isdirectory(), the functions do nothing. */
+
+#else
+
+typedef void directory_type;
+
+int isdirectory(char *filename) { return FALSE; }
+directory_type * opendirectory(char *filename) {}
+char *readdirectory(directory_type *dir) {}
+void closedirectory(directory_type *dir) {}
+
+#endif
+
+
+
+#if ! HAVE_STRERROR
+/*************************************************
+* Provide strerror() for non-ANSI libraries *
+*************************************************/
+
+/* Some old-fashioned systems still around (e.g. SunOS4) don't have strerror()
+in their libraries, but can provide the same facility by this simple
+alternative function. */
+
+extern int sys_nerr;
+extern char *sys_errlist[];
+
+char *
+strerror(int n)
+{
+if (n < 0 || n >= sys_nerr) return "unknown error number";
+return sys_errlist[n];
+}
+#endif /* HAVE_STRERROR */
+
+
+
+/*************************************************
+* Grep an individual file *
+*************************************************/
+
+static int
+pcregrep(FILE *in, char *name)
+{
+int rc = 1;
+int linenumber = 0;
+int count = 0;
+int offsets[99];
+char buffer[BUFSIZ];
+
+while (fgets(buffer, sizeof(buffer), in) != NULL)
+ {
+ BOOL match = FALSE;
+ int i;
+ int length = (int)strlen(buffer);
+ if (length > 0 && buffer[length-1] == '\n') buffer[--length] = 0;
+ linenumber++;
+
+ for (i = 0; !match && i < pattern_count; i++)
+ {
+ match = pcre_exec(pattern_list[i], hints_list[i], buffer, length, 0, 0,
+ offsets, 99) >= 0;
+ if (match && whole_lines && offsets[1] != length) match = FALSE;
+ }
+
+ if (match != invert)
+ {
+ if (count_only) count++;
+
+ else if (filenames_only)
+ {
+ fprintf(stdout, "%s\n", (name == NULL)? "<stdin>" : name);
+ return 0;
+ }
+
+ else if (silent) return 0;
+
+ else
+ {
+ if (name != NULL) fprintf(stdout, "%s:", name);
+ if (number) fprintf(stdout, "%d:", linenumber);
+ fprintf(stdout, "%s\n", buffer);
+ }
+
+ rc = 0;
+ }
+ }
+
+if (count_only)
+ {
+ if (name != NULL) fprintf(stdout, "%s:", name);
+ fprintf(stdout, "%d\n", count);
+ }
+
+return rc;
+}
+
+
+
+
+/*************************************************
+* Grep a file or recurse into a directory *
+*************************************************/
+
+static int
+grep_or_recurse(char *filename, BOOL dir_recurse, BOOL show_filenames,
+ BOOL only_one_at_top)
+{
+int rc = 1;
+int sep;
+FILE *in;
+
+/* If the file is a directory and we are recursing, scan each file within it.
+The scanning code is localized so it can be made system-specific. */
+
+if ((sep = isdirectory(filename)) != 0 && dir_recurse)
+ {
+ char buffer[1024];
+ char *nextfile;
+ directory_type *dir = opendirectory(filename);
+
+ if (dir == NULL)
+ {
+ fprintf(stderr, "pcregrep: Failed to open directory %s: %s\n", filename,
+ strerror(errno));
+ return 2;
+ }
+
+ while ((nextfile = readdirectory(dir)) != NULL)
+ {
+ int frc;
+ sprintf(buffer, "%.512s%c%.128s", filename, sep, nextfile);
+ frc = grep_or_recurse(buffer, dir_recurse, TRUE, FALSE);
+ if (frc == 0 && rc == 1) rc = 0;
+ }
+
+ closedirectory(dir);
+ return rc;
+ }
+
+/* If the file is not a directory, or we are not recursing, scan it. If this is
+the first and only argument at top level, we don't show the file name (unless
+we are only showing the file name). Otherwise, control is via the
+show_filenames variable. */
+
+in = fopen(filename, "r");
+if (in == NULL)
+ {
+ fprintf(stderr, "pcregrep: Failed to open %s: %s\n", filename, strerror(errno));
+ return 2;
+ }
+
+rc = pcregrep(in, (filenames_only || (show_filenames && !only_one_at_top))?
+ filename : NULL);
+fclose(in);
+return rc;
+}
+
+
+
+
+/*************************************************
+* Usage function *
+*************************************************/
+
+static int
+usage(int rc)
+{
+fprintf(stderr, "Usage: pcregrep [-Vcfhilnrsvx] [long-options] [pattern] [file1 file2 ...]\n");
+fprintf(stderr, "Type `pcregrep --help' for more information.\n");
+return rc;
+}
+
+
+
+
+/*************************************************
+* Help function *
+*************************************************/
+
+static void
+help(void)
+{
+option_item *op;
+
+printf("Usage: pcregrep [OPTION]... [PATTERN] [FILE1 FILE2 ...]\n");
+printf("Search for PATTERN in each FILE or standard input.\n");
+printf("PATTERN must be present if -f is not used.\n");
+printf("Example: pcregrep -i 'hello.*world' menu.h main.c\n\n");
+
+printf("Options:\n");
+
+for (op = optionlist; op->one_char != 0; op++)
+ {
+ int n;
+ char s[4];
+ if (op->one_char > 0) sprintf(s, "-%c,", op->one_char); else strcpy(s, " ");
+ printf(" %s --%s%n", s, op->long_name, &n);
+ n = 30 - n;
+ if (n < 1) n = 1;
+ printf("%.*s%s\n", n, " ", op->help_text);
+ }
+
+printf("\n -f<filename> or --file=<filename>\n");
+printf(" Read patterns from <filename> instead of using a command line option.\n");
+printf(" Trailing white space is removed; blanks lines are ignored.\n");
+printf(" There is a maximum of %d patterns.\n", MAX_PATTERN_COUNT);
+
+printf("\nWith no FILE, read standard input. If fewer than two FILEs given, assume -h.\n");
+printf("Exit status is 0 if any matches, 1 if no matches, and 2 if trouble.\n");
+}
+
+
+
+
+/*************************************************
+* Handle an option *
+*************************************************/
+
+static int
+handle_option(int letter, int options)
+{
+switch(letter)
+ {
+ case -1: help(); exit(0);
+ case 'c': count_only = TRUE; break;
+ case 'h': filenames = FALSE; break;
+ case 'i': options |= PCRE_CASELESS; break;
+ case 'l': filenames_only = TRUE;
+ case 'n': number = TRUE; break;
+ case 'r': recurse = TRUE; break;
+ case 's': silent = TRUE; break;
+ case 'u': options |= PCRE_UTF8; break;
+ case 'v': invert = TRUE; break;
+ case 'x': whole_lines = TRUE; options |= PCRE_ANCHORED; break;
+
+ case 'V':
+ fprintf(stderr, "pcregrep version %s using ", VERSION);
+ fprintf(stderr, "PCRE version %s\n", pcre_version());
+ exit(0);
+ break;
+
+ default:
+ fprintf(stderr, "pcregrep: Unknown option -%c\n", letter);
+ exit(usage(2));
+ }
+
+return options;
+}
+
+
+
+
+/*************************************************
+* Main program *
+*************************************************/
+
+int
+main(int argc, char **argv)
+{
+int i, j;
+int rc = 1;
+int options = 0;
+int errptr;
+const char *error;
+BOOL only_one_at_top;
+
+/* Process the options */
+
+for (i = 1; i < argc; i++)
+ {
+ if (argv[i][0] != '-') break;
+
+ /* Missing options */
+
+ if (argv[i][1] == 0) exit(usage(2));
+
+ /* Long name options */
+
+ if (argv[i][1] == '-')
+ {
+ option_item *op;
+
+ if (strncmp(argv[i]+2, "file=", 5) == 0)
+ {
+ pattern_filename = argv[i] + 7;
+ continue;
+ }
+
+ for (op = optionlist; op->one_char != 0; op++)
+ {
+ if (strcmp(argv[i]+2, op->long_name) == 0)
+ {
+ options = handle_option(op->one_char, options);
+ break;
+ }
+ }
+ if (op->one_char == 0)
+ {
+ fprintf(stderr, "pcregrep: Unknown option %s\n", argv[i]);
+ exit(usage(2));
+ }
+ }
+
+ /* One-char options */
+
+ else
+ {
+ char *s = argv[i] + 1;
+ while (*s != 0)
+ {
+ if (*s == 'f')
+ {
+ pattern_filename = s + 1;
+ if (pattern_filename[0] == 0)
+ {
+ if (i >= argc - 1)
+ {
+ fprintf(stderr, "pcregrep: File name missing after -f\n");
+ exit(usage(2));
+ }
+ pattern_filename = argv[++i];
+ }
+ break;
+ }
+ else options = handle_option(*s++, options);
+ }
+ }
+ }
+
+pattern_list = (pcre **)malloc(MAX_PATTERN_COUNT * sizeof(pcre *));
+hints_list = (pcre_extra **)malloc(MAX_PATTERN_COUNT * sizeof(pcre_extra *));
+
+if (pattern_list == NULL || hints_list == NULL)
+ {
+ fprintf(stderr, "pcregrep: malloc failed\n");
+ return 2;
+ }
+
+/* Compile the regular expression(s). */
+
+if (pattern_filename != NULL)
+ {
+ FILE *f = fopen(pattern_filename, "r");
+ char buffer[BUFSIZ];
+ if (f == NULL)
+ {
+ fprintf(stderr, "pcregrep: Failed to open %s: %s\n", pattern_filename,
+ strerror(errno));
+ return 2;
+ }
+ while (fgets(buffer, sizeof(buffer), f) != NULL)
+ {
+ char *s = buffer + (int)strlen(buffer);
+ if (pattern_count >= MAX_PATTERN_COUNT)
+ {
+ fprintf(stderr, "pcregrep: Too many patterns in file (max %d)\n",
+ MAX_PATTERN_COUNT);
+ return 2;
+ }
+ while (s > buffer && isspace((unsigned char)(s[-1]))) s--;
+ if (s == buffer) continue;
+ *s = 0;
+ pattern_list[pattern_count] = pcre_compile(buffer, options, &error,
+ &errptr, NULL);
+ if (pattern_list[pattern_count++] == NULL)
+ {
+ fprintf(stderr, "pcregrep: Error in regex number %d at offset %d: %s\n",
+ pattern_count, errptr, error);
+ return 2;
+ }
+ }
+ fclose(f);
+ }
+
+/* If no file name, a single regex must be given inline */
+
+else
+ {
+ if (i >= argc) return usage(2);
+ pattern_list[0] = pcre_compile(argv[i++], options, &error, &errptr, NULL);
+ if (pattern_list[0] == NULL)
+ {
+ fprintf(stderr, "pcregrep: Error in regex at offset %d: %s\n", errptr,
+ error);
+ return 2;
+ }
+ pattern_count++;
+ }
+
+/* Study the regular expressions, as we will be running them may times */
+
+for (j = 0; j < pattern_count; j++)
+ {
+ hints_list[j] = pcre_study(pattern_list[j], 0, &error);
+ if (error != NULL)
+ {
+ char s[16];
+ if (pattern_count == 1) s[0] = 0; else sprintf(s, " number %d", j);
+ fprintf(stderr, "pcregrep: Error while studying regex%s: %s\n", s, error);
+ return 2;
+ }
+ }
+
+/* If there are no further arguments, do the business on stdin and exit */
+
+if (i >= argc) return pcregrep(stdin, NULL);
+
+/* Otherwise, work through the remaining arguments as files or directories.
+Pass in the fact that there is only one argument at top level - this suppresses
+the file name if the argument is not a directory. */
+
+only_one_at_top = (i == argc - 1);
+if (filenames_only) filenames = TRUE;
+
+for (; i < argc; i++)
+ {
+ int frc = grep_or_recurse(argv[i], recurse, filenames, only_one_at_top);
+ if (frc == 0 && rc == 1) rc = 0;
+ }
+
+return rc;
+}
+
+/* End */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcreposix.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcreposix.c
new file mode 100644
index 00000000..1e8b6a72
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcreposix.c
@@ -0,0 +1,316 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/*
+This is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language. See
+the file Tech.Notes for some information on the internals.
+
+This module is a wrapper that provides a POSIX API to the underlying PCRE
+functions.
+
+Written by: Philip Hazel <ph10@cam.ac.uk>
+
+ Copyright (c) 1997-2004 University of Cambridge
+
+-----------------------------------------------------------------------------
+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.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+-----------------------------------------------------------------------------
+*/
+
+#include "internal.h"
+#include "pcreposix.h"
+#include "stdlib.h"
+
+
+
+/* Corresponding tables of PCRE error messages and POSIX error codes. */
+
+static const char *const estring[] = {
+ ERR1, ERR2, ERR3, ERR4, ERR5, ERR6, ERR7, ERR8, ERR9, ERR10,
+ ERR11, ERR12, ERR13, ERR14, ERR15, ERR16, ERR17, ERR18, ERR19, ERR20,
+ ERR21, ERR22, ERR23, ERR24, ERR25, ERR26, ERR27, ERR29, ERR29, ERR30,
+ ERR31, ERR32, ERR33, ERR34, ERR35, ERR36, ERR37, ERR38, ERR39, ERR40,
+ ERR41, ERR42, ERR43, ERR44, ERR45, ERR46, ERR47 };
+
+static const int eint[] = {
+ REG_EESCAPE, /* "\\ at end of pattern" */
+ REG_EESCAPE, /* "\\c at end of pattern" */
+ REG_EESCAPE, /* "unrecognized character follows \\" */
+ REG_BADBR, /* "numbers out of order in {} quantifier" */
+ REG_BADBR, /* "number too big in {} quantifier" */
+ REG_EBRACK, /* "missing terminating ] for character class" */
+ REG_ECTYPE, /* "invalid escape sequence in character class" */
+ REG_ERANGE, /* "range out of order in character class" */
+ REG_BADRPT, /* "nothing to repeat" */
+ REG_BADRPT, /* "operand of unlimited repeat could match the empty string" */
+ REG_ASSERT, /* "internal error: unexpected repeat" */
+ REG_BADPAT, /* "unrecognized character after (?" */
+ REG_BADPAT, /* "POSIX named classes are supported only within a class" */
+ REG_EPAREN, /* "missing )" */
+ REG_ESUBREG, /* "reference to non-existent subpattern" */
+ REG_INVARG, /* "erroffset passed as NULL" */
+ REG_INVARG, /* "unknown option bit(s) set" */
+ REG_EPAREN, /* "missing ) after comment" */
+ REG_ESIZE, /* "parentheses nested too deeply" */
+ REG_ESIZE, /* "regular expression too large" */
+ REG_ESPACE, /* "failed to get memory" */
+ REG_EPAREN, /* "unmatched brackets" */
+ REG_ASSERT, /* "internal error: code overflow" */
+ REG_BADPAT, /* "unrecognized character after (?<" */
+ REG_BADPAT, /* "lookbehind assertion is not fixed length" */
+ REG_BADPAT, /* "malformed number after (?(" */
+ REG_BADPAT, /* "conditional group containe more than two branches" */
+ REG_BADPAT, /* "assertion expected after (?(" */
+ REG_BADPAT, /* "(?R or (?digits must be followed by )" */
+ REG_ECTYPE, /* "unknown POSIX class name" */
+ REG_BADPAT, /* "POSIX collating elements are not supported" */
+ REG_INVARG, /* "this version of PCRE is not compiled with PCRE_UTF8 support" */
+ REG_BADPAT, /* "spare error" */
+ REG_BADPAT, /* "character value in \x{...} sequence is too large" */
+ REG_BADPAT, /* "invalid condition (?(0)" */
+ REG_BADPAT, /* "\\C not allowed in lookbehind assertion" */
+ REG_EESCAPE, /* "PCRE does not support \\L, \\l, \\N, \\U, or \\u" */
+ REG_BADPAT, /* "number after (?C is > 255" */
+ REG_BADPAT, /* "closing ) for (?C expected" */
+ REG_BADPAT, /* "recursive call could loop indefinitely" */
+ REG_BADPAT, /* "unrecognized character after (?P" */
+ REG_BADPAT, /* "syntax error after (?P" */
+ REG_BADPAT, /* "two named groups have the same name" */
+ REG_BADPAT, /* "invalid UTF-8 string" */
+ REG_BADPAT, /* "support for \\P, \\p, and \\X has not been compiled" */
+ REG_BADPAT, /* "malformed \\P or \\p sequence" */
+ REG_BADPAT /* "unknown property name after \\P or \\p" */
+};
+
+/* Table of texts corresponding to POSIX error codes */
+
+static const char *const pstring[] = {
+ "", /* Dummy for value 0 */
+ "internal error", /* REG_ASSERT */
+ "invalid repeat counts in {}", /* BADBR */
+ "pattern error", /* BADPAT */
+ "? * + invalid", /* BADRPT */
+ "unbalanced {}", /* EBRACE */
+ "unbalanced []", /* EBRACK */
+ "collation error - not relevant", /* ECOLLATE */
+ "bad class", /* ECTYPE */
+ "bad escape sequence", /* EESCAPE */
+ "empty expression", /* EMPTY */
+ "unbalanced ()", /* EPAREN */
+ "bad range inside []", /* ERANGE */
+ "expression too big", /* ESIZE */
+ "failed to get memory", /* ESPACE */
+ "bad back reference", /* ESUBREG */
+ "bad argument", /* INVARG */
+ "match failed" /* NOMATCH */
+};
+
+
+
+
+/*************************************************
+* Translate PCRE text code to int *
+*************************************************/
+
+/* PCRE compile-time errors are given as strings defined as macros. We can just
+look them up in a table to turn them into POSIX-style error codes. */
+
+static int
+pcre_posix_error_code(const char *s)
+{
+size_t i;
+for (i = 0; i < sizeof(estring)/sizeof(char *); i++)
+ if (strcmp(s, estring[i]) == 0) return eint[i];
+return REG_ASSERT;
+}
+
+
+
+/*************************************************
+* Translate error code to string *
+*************************************************/
+
+EXPORT size_t
+regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size)
+{
+const char *message, *addmessage;
+size_t length, addlength;
+
+message = (errcode >= (int)(sizeof(pstring)/sizeof(char *)))?
+ "unknown error code" : pstring[errcode];
+length = strlen(message) + 1;
+
+addmessage = " at offset ";
+addlength = (preg != NULL && (int)preg->re_erroffset != -1)?
+ strlen(addmessage) + 6 : 0;
+
+if (errbuf_size > 0)
+ {
+ if (addlength > 0 && errbuf_size >= length + addlength)
+ sprintf(errbuf, "%s%s%-6d", message, addmessage, (int)preg->re_erroffset);
+ else
+ {
+ strncpy(errbuf, message, errbuf_size - 1);
+ errbuf[errbuf_size-1] = 0;
+ }
+ }
+
+return length + addlength;
+}
+
+
+
+
+/*************************************************
+* Free store held by a regex *
+*************************************************/
+
+EXPORT void
+regfree(regex_t *preg)
+{
+(pcre_free)(preg->re_pcre);
+}
+
+
+
+
+/*************************************************
+* Compile a regular expression *
+*************************************************/
+
+/*
+Arguments:
+ preg points to a structure for recording the compiled expression
+ pattern the pattern to compile
+ cflags compilation flags
+
+Returns: 0 on success
+ various non-zero codes on failure
+*/
+
+EXPORT int
+regcomp(regex_t *preg, const char *pattern, int cflags)
+{
+const char *errorptr;
+int erroffset;
+int options = 0;
+
+if ((cflags & REG_ICASE) != 0) options |= PCRE_CASELESS;
+if ((cflags & REG_NEWLINE) != 0) options |= PCRE_MULTILINE;
+
+preg->re_pcre = pcre_compile(pattern, options, &errorptr, &erroffset, NULL);
+preg->re_erroffset = erroffset;
+
+if (preg->re_pcre == NULL) return pcre_posix_error_code(errorptr);
+
+preg->re_nsub = pcre_info((const pcre *)preg->re_pcre, NULL, NULL);
+return 0;
+}
+
+
+
+
+/*************************************************
+* Match a regular expression *
+*************************************************/
+
+/* Unfortunately, PCRE requires 3 ints of working space for each captured
+substring, so we have to get and release working store instead of just using
+the POSIX structures as was done in earlier releases when PCRE needed only 2
+ints. However, if the number of possible capturing brackets is small, use a
+block of store on the stack, to reduce the use of malloc/free. The threshold is
+in a macro that can be changed at configure time. */
+
+EXPORT int
+regexec(const regex_t *preg, const char *string, size_t nmatch,
+ regmatch_t pmatch[], int eflags)
+{
+int rc;
+int options = 0;
+int *ovector = NULL;
+int small_ovector[POSIX_MALLOC_THRESHOLD * 3];
+BOOL allocated_ovector = FALSE;
+
+if ((eflags & REG_NOTBOL) != 0) options |= PCRE_NOTBOL;
+if ((eflags & REG_NOTEOL) != 0) options |= PCRE_NOTEOL;
+
+((regex_t *)preg)->re_erroffset = (size_t)(-1); /* Only has meaning after compile */
+
+if (nmatch > 0)
+ {
+ if (nmatch <= POSIX_MALLOC_THRESHOLD)
+ {
+ ovector = &(small_ovector[0]);
+ }
+ else
+ {
+ ovector = (int *)malloc(sizeof(int) * nmatch * 3);
+ if (ovector == NULL) return REG_ESPACE;
+ allocated_ovector = TRUE;
+ }
+ }
+
+rc = pcre_exec((const pcre *)preg->re_pcre, NULL, string, (int)strlen(string),
+ 0, options, ovector, nmatch * 3);
+
+if (rc == 0) rc = nmatch; /* All captured slots were filled in */
+
+if (rc >= 0)
+ {
+ size_t i;
+ for (i = 0; i < (size_t)rc; i++)
+ {
+ pmatch[i].rm_so = ovector[i*2];
+ pmatch[i].rm_eo = ovector[i*2+1];
+ }
+ if (allocated_ovector) free(ovector);
+ for (; i < nmatch; i++) pmatch[i].rm_so = pmatch[i].rm_eo = -1;
+ return 0;
+ }
+
+else
+ {
+ if (allocated_ovector) free(ovector);
+ switch(rc)
+ {
+ case PCRE_ERROR_NOMATCH: return REG_NOMATCH;
+ case PCRE_ERROR_NULL: return REG_INVARG;
+ case PCRE_ERROR_BADOPTION: return REG_INVARG;
+ case PCRE_ERROR_BADMAGIC: return REG_INVARG;
+ case PCRE_ERROR_UNKNOWN_NODE: return REG_ASSERT;
+ case PCRE_ERROR_NOMEMORY: return REG_ESPACE;
+ case PCRE_ERROR_MATCHLIMIT: return REG_ESPACE;
+ case PCRE_ERROR_BADUTF8: return REG_INVARG;
+ case PCRE_ERROR_BADUTF8_OFFSET: return REG_INVARG;
+ default: return REG_ASSERT;
+ }
+ }
+}
+
+/* End of pcreposix.c */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcreposix.dsp b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcreposix.dsp
new file mode 100644
index 00000000..e3cdfc48
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcreposix.dsp
@@ -0,0 +1,154 @@
+# Microsoft Developer Studio Project File - Name="pcreposix" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Static Library" 0x0104
+
+CFG=pcreposix - 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 "pcreposix.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 "pcreposix.mak" CFG="pcreposix - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "pcreposix - Win32 Release" (based on "Win32 (x86) Static Library")
+!MESSAGE "pcreposix - Win32 Debug" (based on "Win32 (x86) Static Library")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "pcreposix - 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 "LibR"
+# PROP Intermediate_Dir "LibR"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MD /W3 /O2 /D "_WIN32" /D "NDEBUG" /D "_WINDOWS" /D "PCRE_STATIC" /FD /c
+# ADD CPP /nologo /MD /W3 /Zi /O2 /Oy- /D "_WIN32" /D "NDEBUG" /D "_WINDOWS" /D "PCRE_STATIC" /Fd"LibR/pcreposix_src" /FD /c
+# ADD BASE RSC /l 0x409
+# ADD RSC /l 0x409
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LIB32=link.exe -lib
+# ADD BASE LIB32 /nologo
+# ADD LIB32 /nologo
+
+!ELSEIF "$(CFG)" == "pcreposix - 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 "LibD"
+# PROP Intermediate_Dir "LibD"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /D "_WIN32" /D "_DEBUG" /D "_WINDOWS" /D "PCRE_STATIC" /FD /EHsc /c
+# ADD CPP /nologo /MDd /W3 /Zi /Od /I "..\..\include" /D "_WIN32" /D "_DEBUG" /D "_WINDOWS" /D "PCRE_STATIC" /Fd"LibD/pcreposix_src" /FD /EHsc /c
+# ADD BASE RSC /l 0x409
+# ADD RSC /l 0x409
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LIB32=link.exe -lib
+# ADD BASE LIB32 /nologo
+# ADD LIB32 /nologo
+
+!ENDIF
+
+# Begin Target
+
+# Name "pcreposix - Win32 Release"
+# Name "pcreposix - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "*.c"
+# Begin Source File
+
+SOURCE=.\pcreposix.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "*.h"
+# Begin Source File
+
+SOURCE=.\config.hw
+
+!IF "$(CFG)" == "pcreposix - Win32 Release"
+
+# Begin Custom Build - Creating pcre config.h from config.hw
+InputPath=.\config.hw
+
+".\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ type .\config.hw > .\config.h
+
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "pcreposix - Win32 Debug"
+
+# Begin Custom Build - Creating pcre config.h from config.hw
+InputPath=.\config.hw
+
+".\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ type .\config.hw > .\config.h
+
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\pcre.hw
+
+!IF "$(CFG)" == "pcreposix - Win32 Release"
+
+# Begin Custom Build - Creating pcre.h from pcre.hw
+InputPath=.\pcre.hw
+
+".\pcre.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ type .\pcre.hw > .\pcre.h
+
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "pcreposix - Win32 Debug"
+
+# Begin Custom Build - Creating pcre.h from pcre.hw
+InputPath=.\pcre.hw
+
+".\pcre.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ type .\pcre.hw > .\pcre.h
+
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\include\pcreposix.h
+# End Source File
+# End Group
+# End Target
+# End Project
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcreposix.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcreposix.h
new file mode 100644
index 00000000..13e27846
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcreposix.h
@@ -0,0 +1,99 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/* Copyright (c) 1997-2000 University of Cambridge */
+
+/**
+ * @file include/pcreposix.h
+ * @brief PCRE definitions
+ */
+
+#ifndef _PCREPOSIX_H
+#define _PCREPOSIX_H
+
+/* This is the header for the POSIX wrapper interface to the PCRE Perl-
+Compatible Regular Expression library. It defines the things POSIX says should
+be there. I hope. */
+
+/* Have to include stdlib.h in order to ensure that size_t is defined. */
+
+#include <stdlib.h>
+
+/* Allow for C++ users */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Options defined by POSIX. */
+
+ /** Ignore case */
+#define REG_ICASE 0x01
+ /** Don't match newlines with wildcards */
+#define REG_NEWLINE 0x02
+ /** Don't match BOL */
+#define REG_NOTBOL 0x04
+ /** Don't match EOL */
+#define REG_NOTEOL 0x08
+
+/* These are not used by PCRE, but by defining them we make it easier
+to slot PCRE into existing programs that make POSIX calls. */
+
+ /** UNUSED! */
+#define REG_EXTENDED 0
+ /** UNUSED! */
+#define REG_NOSUB 0
+
+/* Error values. Not all these are relevant or used by the wrapper. */
+
+enum {
+ REG_ASSERT = 1, /* internal error ? */
+ REG_BADBR, /* invalid repeat counts in {} */
+ REG_BADPAT, /* pattern error */
+ REG_BADRPT, /* ? * + invalid */
+ REG_EBRACE, /* unbalanced {} */
+ REG_EBRACK, /* unbalanced [] */
+ REG_ECOLLATE, /* collation error - not relevant */
+ REG_ECTYPE, /* bad class */
+ REG_EESCAPE, /* bad escape sequence */
+ REG_EMPTY, /* empty expression */
+ REG_EPAREN, /* unbalanced () */
+ REG_ERANGE, /* bad range inside [] */
+ REG_ESIZE, /* expression too big */
+ REG_ESPACE, /* failed to get memory */
+ REG_ESUBREG, /* bad back reference */
+ REG_INVARG, /* bad argument */
+ REG_NOMATCH /* match failed */
+};
+
+
+/* The structure representing a compiled regular expression. */
+
+typedef struct {
+ void *re_pcre;
+ size_t re_nsub;
+ size_t re_erroffset;
+} regex_t;
+
+/* The structure in which a captured offset is returned. */
+
+typedef int regoff_t;
+
+typedef struct {
+ regoff_t rm_so;
+ regoff_t rm_eo;
+} regmatch_t;
+
+/* The functions */
+
+extern int regcomp(regex_t *, const char *, int);
+extern int regexec(const regex_t *, const char *, size_t, regmatch_t *, int);
+extern size_t regerror(int, const regex_t *, char *, size_t);
+extern void regfree(regex_t *);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* End of pcreposix.h */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcretest.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcretest.c
new file mode 100644
index 00000000..e531cc13
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pcretest.c
@@ -0,0 +1,1786 @@
+/*************************************************
+* PCRE testing program *
+*************************************************/
+
+/* This program was hacked up as a tester for PCRE. I really should have
+written it more tidily in the first place. Will I ever learn? It has grown and
+been extended and consequently is now rather untidy in places.
+
+-----------------------------------------------------------------------------
+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.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+-----------------------------------------------------------------------------
+*/
+
+
+#include <ctype.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <time.h>
+#include <locale.h>
+#include <errno.h>
+
+/* We need the internal info for displaying the results of pcre_study(). Also
+for getting the opcodes for showing compiled code. */
+
+#define PCRE_SPY /* For Win32 build, import data, not export */
+#include "internal.h"
+
+/* It is possible to compile this test program without including support for
+testing the POSIX interface, though this is not available via the standard
+Makefile. */
+
+#if !defined NOPOSIX
+#include "pcreposix.h"
+#endif
+
+#ifndef CLOCKS_PER_SEC
+#ifdef CLK_TCK
+#define CLOCKS_PER_SEC CLK_TCK
+#else
+#define CLOCKS_PER_SEC 100
+#endif
+#endif
+
+#define LOOPREPEAT 500000
+
+#define BUFFER_SIZE 30000
+#define PBUFFER_SIZE BUFFER_SIZE
+#define DBUFFER_SIZE BUFFER_SIZE
+
+
+static FILE *outfile;
+static int log_store = 0;
+static int callout_count;
+static int callout_extra;
+static int callout_fail_count;
+static int callout_fail_id;
+static int first_callout;
+static int show_malloc;
+static int use_utf8;
+static size_t gotten_store;
+
+static uschar *pbuffer = NULL;
+
+
+static const int utf8_table1[] = {
+ 0x0000007f, 0x000007ff, 0x0000ffff, 0x001fffff, 0x03ffffff, 0x7fffffff};
+
+static const int utf8_table2[] = {
+ 0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc};
+
+static const int utf8_table3[] = {
+ 0xff, 0x1f, 0x0f, 0x07, 0x03, 0x01};
+
+
+
+/*************************************************
+* Print compiled regex *
+*************************************************/
+
+/* The code for doing this is held in a separate file that is also included in
+pcre.c when it is compiled with the debug switch. It defines a function called
+print_internals(), which uses a table of opcode lengths defined by the macro
+OP_LENGTHS, whose name must be OP_lengths. It also uses a table that translates
+Unicode property names to numbers; this is kept in a separate file. */
+
+static uschar OP_lengths[] = { OP_LENGTHS };
+
+#include "ucp.h"
+#include "ucptypetable.c"
+#include "printint.c"
+
+
+
+/*************************************************
+* Read number from string *
+*************************************************/
+
+/* We don't use strtoul() because SunOS4 doesn't have it. Rather than mess
+around with conditional compilation, just do the job by hand. It is only used
+for unpicking the -o argument, so just keep it simple.
+
+Arguments:
+ str string to be converted
+ endptr where to put the end pointer
+
+Returns: the unsigned long
+*/
+
+static int
+get_value(unsigned char *str, unsigned char **endptr)
+{
+int result = 0;
+while(*str != 0 && isspace(*str)) str++;
+while (isdigit(*str)) result = result * 10 + (int)(*str++ - '0');
+*endptr = str;
+return(result);
+}
+
+
+
+/*************************************************
+* Convert character value to UTF-8 *
+*************************************************/
+
+/* This function takes an integer value in the range 0 - 0x7fffffff
+and encodes it as a UTF-8 character in 0 to 6 bytes.
+
+Arguments:
+ cvalue the character value
+ buffer pointer to buffer for result - at least 6 bytes long
+
+Returns: number of characters placed in the buffer
+ -1 if input character is negative
+ 0 if input character is positive but too big (only when
+ int is longer than 32 bits)
+*/
+
+static int
+ord2utf8(int cvalue, unsigned char *buffer)
+{
+register int i, j;
+for (i = 0; i < sizeof(utf8_table1)/sizeof(int); i++)
+ if (cvalue <= utf8_table1[i]) break;
+if (i >= sizeof(utf8_table1)/sizeof(int)) return 0;
+if (cvalue < 0) return -1;
+
+buffer += i;
+for (j = i; j > 0; j--)
+ {
+ *buffer-- = 0x80 | (cvalue & 0x3f);
+ cvalue >>= 6;
+ }
+*buffer = utf8_table2[i] | cvalue;
+return i + 1;
+}
+
+
+/*************************************************
+* Convert UTF-8 string to value *
+*************************************************/
+
+/* This function takes one or more bytes that represents a UTF-8 character,
+and returns the value of the character.
+
+Argument:
+ buffer a pointer to the byte vector
+ vptr a pointer to an int to receive the value
+
+Returns: > 0 => the number of bytes consumed
+ -6 to 0 => malformed UTF-8 character at offset = (-return)
+*/
+
+static int
+utf82ord(unsigned char *buffer, int *vptr)
+{
+int c = *buffer++;
+int d = c;
+int i, j, s;
+
+for (i = -1; i < 6; i++) /* i is number of additional bytes */
+ {
+ if ((d & 0x80) == 0) break;
+ d <<= 1;
+ }
+
+if (i == -1) { *vptr = c; return 1; } /* ascii character */
+if (i == 0 || i == 6) return 0; /* invalid UTF-8 */
+
+/* i now has a value in the range 1-5 */
+
+s = 6*i;
+d = (c & utf8_table3[i]) << s;
+
+for (j = 0; j < i; j++)
+ {
+ c = *buffer++;
+ if ((c & 0xc0) != 0x80) return -(j+1);
+ s -= 6;
+ d |= (c & 0x3f) << s;
+ }
+
+/* Check that encoding was the correct unique one */
+
+for (j = 0; j < sizeof(utf8_table1)/sizeof(int); j++)
+ if (d <= utf8_table1[j]) break;
+if (j != i) return -(i+1);
+
+/* Valid value */
+
+*vptr = d;
+return i+1;
+}
+
+
+
+/*************************************************
+* Print character string *
+*************************************************/
+
+/* Character string printing function. Must handle UTF-8 strings in utf8
+mode. Yields number of characters printed. If handed a NULL file, just counts
+chars without printing. */
+
+static int pchars(unsigned char *p, int length, FILE *f)
+{
+int c;
+int yield = 0;
+
+while (length-- > 0)
+ {
+ if (use_utf8)
+ {
+ int rc = utf82ord(p, &c);
+
+ if (rc > 0 && rc <= length + 1) /* Mustn't run over the end */
+ {
+ length -= rc - 1;
+ p += rc;
+ if (c < 256 && isprint(c))
+ {
+ if (f != NULL) fprintf(f, "%c", c);
+ yield++;
+ }
+ else
+ {
+ int n;
+ if (f != NULL) fprintf(f, "\\x{%02x}%n", c, &n);
+ yield += n;
+ }
+ continue;
+ }
+ }
+
+ /* Not UTF-8, or malformed UTF-8 */
+
+ if (isprint(c = *(p++)))
+ {
+ if (f != NULL) fprintf(f, "%c", c);
+ yield++;
+ }
+ else
+ {
+ if (f != NULL) fprintf(f, "\\x%02x", c);
+ yield += 4;
+ }
+ }
+
+return yield;
+}
+
+
+
+/*************************************************
+* Callout function *
+*************************************************/
+
+/* Called from PCRE as a result of the (?C) item. We print out where we are in
+the match. Yield zero unless more callouts than the fail count, or the callout
+data is not zero. */
+
+static int callout(pcre_callout_block *cb)
+{
+FILE *f = (first_callout | callout_extra)? outfile : NULL;
+int i, pre_start, post_start, subject_length;
+
+if (callout_extra)
+ {
+ fprintf(f, "Callout %d: last capture = %d\n",
+ cb->callout_number, cb->capture_last);
+
+ for (i = 0; i < cb->capture_top * 2; i += 2)
+ {
+ if (cb->offset_vector[i] < 0)
+ fprintf(f, "%2d: <unset>\n", i/2);
+ else
+ {
+ fprintf(f, "%2d: ", i/2);
+ (void)pchars((unsigned char *)cb->subject + cb->offset_vector[i],
+ cb->offset_vector[i+1] - cb->offset_vector[i], f);
+ fprintf(f, "\n");
+ }
+ }
+ }
+
+/* Re-print the subject in canonical form, the first time or if giving full
+datails. On subsequent calls in the same match, we use pchars just to find the
+printed lengths of the substrings. */
+
+if (f != NULL) fprintf(f, "--->");
+
+pre_start = pchars((unsigned char *)cb->subject, cb->start_match, f);
+post_start = pchars((unsigned char *)(cb->subject + cb->start_match),
+ cb->current_position - cb->start_match, f);
+
+subject_length = pchars((unsigned char *)cb->subject, cb->subject_length, NULL);
+
+(void)pchars((unsigned char *)(cb->subject + cb->current_position),
+ cb->subject_length - cb->current_position, f);
+
+if (f != NULL) fprintf(f, "\n");
+
+/* Always print appropriate indicators, with callout number if not already
+shown. For automatic callouts, show the pattern offset. */
+
+if (cb->callout_number == 255)
+ {
+ fprintf(outfile, "%+3d ", cb->pattern_position);
+ if (cb->pattern_position > 99) fprintf(outfile, "\n ");
+ }
+else
+ {
+ if (callout_extra) fprintf(outfile, " ");
+ else fprintf(outfile, "%3d ", cb->callout_number);
+ }
+
+for (i = 0; i < pre_start; i++) fprintf(outfile, " ");
+fprintf(outfile, "^");
+
+if (post_start > 0)
+ {
+ for (i = 0; i < post_start - 1; i++) fprintf(outfile, " ");
+ fprintf(outfile, "^");
+ }
+
+for (i = 0; i < subject_length - pre_start - post_start + 4; i++)
+ fprintf(outfile, " ");
+
+fprintf(outfile, "%.*s", (cb->next_item_length == 0)? 1 : cb->next_item_length,
+ pbuffer + cb->pattern_position);
+
+fprintf(outfile, "\n");
+first_callout = 0;
+
+if (cb->callout_data != NULL)
+ {
+ int callout_data = *((int *)(cb->callout_data));
+ if (callout_data != 0)
+ {
+ fprintf(outfile, "Callout data = %d\n", callout_data);
+ return callout_data;
+ }
+ }
+
+return (cb->callout_number != callout_fail_id)? 0 :
+ (++callout_count >= callout_fail_count)? 1 : 0;
+}
+
+
+/*************************************************
+* Local malloc functions *
+*************************************************/
+
+/* Alternative malloc function, to test functionality and show the size of the
+compiled re. */
+
+static void *new_malloc(size_t size)
+{
+void *block = malloc(size);
+gotten_store = size;
+if (show_malloc)
+ fprintf(outfile, "malloc %3d %p\n", size, block);
+return block;
+}
+
+static void new_free(void *block)
+{
+if (show_malloc)
+ fprintf(outfile, "free %p\n", block);
+free(block);
+}
+
+
+/* For recursion malloc/free, to test stacking calls */
+
+static void *stack_malloc(size_t size)
+{
+void *block = malloc(size);
+if (show_malloc)
+ fprintf(outfile, "stack_malloc %3d %p\n", size, block);
+return block;
+}
+
+static void stack_free(void *block)
+{
+if (show_malloc)
+ fprintf(outfile, "stack_free %p\n", block);
+free(block);
+}
+
+
+/*************************************************
+* Call pcre_fullinfo() *
+*************************************************/
+
+/* Get one piece of information from the pcre_fullinfo() function */
+
+static void new_info(pcre *re, pcre_extra *study, int option, void *ptr)
+{
+int rc;
+if ((rc = pcre_fullinfo(re, study, option, ptr)) < 0)
+ fprintf(outfile, "Error %d from pcre_fullinfo(%d)\n", rc, option);
+}
+
+
+
+/*************************************************
+* Byte flipping function *
+*************************************************/
+
+static long int
+byteflip(long int value, int n)
+{
+if (n == 2) return ((value & 0x00ff) << 8) | ((value & 0xff00) >> 8);
+return ((value & 0x000000ff) << 24) |
+ ((value & 0x0000ff00) << 8) |
+ ((value & 0x00ff0000) >> 8) |
+ ((value & 0xff000000) >> 24);
+}
+
+
+
+
+/*************************************************
+* Main Program *
+*************************************************/
+
+/* Read lines from named file or stdin and write to named file or stdout; lines
+consist of a regular expression, in delimiters and optionally followed by
+options, followed by a set of test data, terminated by an empty line. */
+
+int main(int argc, char **argv)
+{
+FILE *infile = stdin;
+int options = 0;
+int study_options = 0;
+int op = 1;
+int timeit = 0;
+int showinfo = 0;
+int showstore = 0;
+int size_offsets = 45;
+int size_offsets_max;
+int *offsets;
+#if !defined NOPOSIX
+int posix = 0;
+#endif
+int debug = 0;
+int done = 0;
+
+unsigned char *buffer;
+unsigned char *dbuffer;
+
+/* Get buffers from malloc() so that Electric Fence will check their misuse
+when I am debugging. */
+
+buffer = (unsigned char *)malloc(BUFFER_SIZE);
+dbuffer = (unsigned char *)malloc(DBUFFER_SIZE);
+pbuffer = (unsigned char *)malloc(PBUFFER_SIZE);
+
+/* The outfile variable is static so that new_malloc can use it. The _setmode()
+stuff is some magic that I don't understand, but which apparently does good
+things in Windows. It's related to line terminations. */
+
+#if defined(_WIN32) || defined(WIN32)
+_setmode( _fileno( stdout ), 0x8000 );
+#endif /* defined(_WIN32) || defined(WIN32) */
+
+outfile = stdout;
+
+/* Scan options */
+
+while (argc > 1 && argv[op][0] == '-')
+ {
+ unsigned char *endptr;
+
+ if (strcmp(argv[op], "-s") == 0 || strcmp(argv[op], "-m") == 0)
+ showstore = 1;
+ else if (strcmp(argv[op], "-t") == 0) timeit = 1;
+ else if (strcmp(argv[op], "-i") == 0) showinfo = 1;
+ else if (strcmp(argv[op], "-d") == 0) showinfo = debug = 1;
+ else if (strcmp(argv[op], "-o") == 0 && argc > 2 &&
+ ((size_offsets = get_value((unsigned char *)argv[op+1], &endptr)),
+ *endptr == 0))
+ {
+ op++;
+ argc--;
+ }
+#if !defined NOPOSIX
+ else if (strcmp(argv[op], "-p") == 0) posix = 1;
+#endif
+ else if (strcmp(argv[op], "-C") == 0)
+ {
+ int rc;
+ printf("PCRE version %s\n", pcre_version());
+ printf("Compiled with\n");
+ (void)pcre_config(PCRE_CONFIG_UTF8, &rc);
+ printf(" %sUTF-8 support\n", rc? "" : "No ");
+ (void)pcre_config(PCRE_CONFIG_UNICODE_PROPERTIES, &rc);
+ printf(" %sUnicode properties support\n", rc? "" : "No ");
+ (void)pcre_config(PCRE_CONFIG_NEWLINE, &rc);
+ printf(" Newline character is %s\n", (rc == '\r')? "CR" : "LF");
+ (void)pcre_config(PCRE_CONFIG_LINK_SIZE, &rc);
+ printf(" Internal link size = %d\n", rc);
+ (void)pcre_config(PCRE_CONFIG_POSIX_MALLOC_THRESHOLD, &rc);
+ printf(" POSIX malloc threshold = %d\n", rc);
+ (void)pcre_config(PCRE_CONFIG_MATCH_LIMIT, &rc);
+ printf(" Default match limit = %d\n", rc);
+ (void)pcre_config(PCRE_CONFIG_STACKRECURSE, &rc);
+ printf(" Match recursion uses %s\n", rc? "stack" : "heap");
+ exit(0);
+ }
+ else
+ {
+ printf("** Unknown or malformed option %s\n", argv[op]);
+ printf("Usage: pcretest [-d] [-i] [-o <n>] [-p] [-s] [-t] [<input> [<output>]]\n");
+ printf(" -C show PCRE compile-time options and exit\n");
+ printf(" -d debug: show compiled code; implies -i\n"
+ " -i show information about compiled pattern\n"
+ " -m output memory used information\n"
+ " -o <n> set size of offsets vector to <n>\n");
+#if !defined NOPOSIX
+ printf(" -p use POSIX interface\n");
+#endif
+ printf(" -s output store (memory) used information\n"
+ " -t time compilation and execution\n");
+ return 1;
+ }
+ op++;
+ argc--;
+ }
+
+/* Get the store for the offsets vector, and remember what it was */
+
+size_offsets_max = size_offsets;
+offsets = (int *)malloc(size_offsets_max * sizeof(int));
+if (offsets == NULL)
+ {
+ printf("** Failed to get %d bytes of memory for offsets vector\n",
+ size_offsets_max * sizeof(int));
+ return 1;
+ }
+
+/* Sort out the input and output files */
+
+if (argc > 1)
+ {
+ infile = fopen(argv[op], "rb");
+ if (infile == NULL)
+ {
+ printf("** Failed to open %s\n", argv[op]);
+ return 1;
+ }
+ }
+
+if (argc > 2)
+ {
+ outfile = fopen(argv[op+1], "wb");
+ if (outfile == NULL)
+ {
+ printf("** Failed to open %s\n", argv[op+1]);
+ return 1;
+ }
+ }
+
+/* Set alternative malloc function */
+
+pcre_malloc = new_malloc;
+pcre_free = new_free;
+pcre_stack_malloc = stack_malloc;
+pcre_stack_free = stack_free;
+
+/* Heading line, then prompt for first regex if stdin */
+
+fprintf(outfile, "PCRE version %s\n\n", pcre_version());
+
+/* Main loop */
+
+while (!done)
+ {
+ pcre *re = NULL;
+ pcre_extra *extra = NULL;
+
+#if !defined NOPOSIX /* There are still compilers that require no indent */
+ regex_t preg;
+ int do_posix = 0;
+#endif
+
+ const char *error;
+ unsigned char *p, *pp, *ppp;
+ unsigned char *to_file = NULL;
+ const unsigned char *tables = NULL;
+ unsigned long int true_size, true_study_size = 0;
+ size_t size, regex_gotten_store;
+ int do_study = 0;
+ int do_debug = debug;
+ int do_G = 0;
+ int do_g = 0;
+ int do_showinfo = showinfo;
+ int do_showrest = 0;
+ int do_flip = 0;
+ int erroroffset, len, delimiter;
+
+ use_utf8 = 0;
+
+ if (infile == stdin) printf(" re> ");
+ if (fgets((char *)buffer, BUFFER_SIZE, infile) == NULL) break;
+ if (infile != stdin) fprintf(outfile, "%s", (char *)buffer);
+ fflush(outfile);
+
+ p = buffer;
+ while (isspace(*p)) p++;
+ if (*p == 0) continue;
+
+ /* See if the pattern is to be loaded pre-compiled from a file. */
+
+ if (*p == '<' && strchr((char *)(p+1), '<') == NULL)
+ {
+ unsigned long int magic;
+ uschar sbuf[8];
+ FILE *f;
+
+ p++;
+ pp = p + (int)strlen((char *)p);
+ while (isspace(pp[-1])) pp--;
+ *pp = 0;
+
+ f = fopen((char *)p, "rb");
+ if (f == NULL)
+ {
+ fprintf(outfile, "Failed to open %s: %s\n", p, strerror(errno));
+ continue;
+ }
+
+ if (fread(sbuf, 1, 8, f) != 8) goto FAIL_READ;
+
+ true_size =
+ (sbuf[0] << 24) | (sbuf[1] << 16) | (sbuf[2] << 8) | sbuf[3];
+ true_study_size =
+ (sbuf[4] << 24) | (sbuf[5] << 16) | (sbuf[6] << 8) | sbuf[7];
+
+ re = (real_pcre *)new_malloc(true_size);
+ regex_gotten_store = gotten_store;
+
+ if (fread(re, 1, true_size, f) != true_size) goto FAIL_READ;
+
+ magic = ((real_pcre *)re)->magic_number;
+ if (magic != MAGIC_NUMBER)
+ {
+ if (byteflip(magic, sizeof(magic)) == MAGIC_NUMBER)
+ {
+ do_flip = 1;
+ }
+ else
+ {
+ fprintf(outfile, "Data in %s is not a compiled PCRE regex\n", p);
+ fclose(f);
+ continue;
+ }
+ }
+
+ fprintf(outfile, "Compiled regex%s loaded from %s\n",
+ do_flip? " (byte-inverted)" : "", p);
+
+ /* Need to know if UTF-8 for printing data strings */
+
+ new_info(re, NULL, PCRE_INFO_OPTIONS, &options);
+ use_utf8 = (options & PCRE_UTF8) != 0;
+
+ /* Now see if there is any following study data */
+
+ if (true_study_size != 0)
+ {
+ pcre_study_data *psd;
+
+ extra = (pcre_extra *)new_malloc(sizeof(pcre_extra) + true_study_size);
+ extra->flags = PCRE_EXTRA_STUDY_DATA;
+
+ psd = (pcre_study_data *)(((char *)extra) + sizeof(pcre_extra));
+ extra->study_data = psd;
+
+ if (fread(psd, 1, true_study_size, f) != true_study_size)
+ {
+ FAIL_READ:
+ fprintf(outfile, "Failed to read data from %s\n", p);
+ if (extra != NULL) new_free(extra);
+ if (re != NULL) new_free(re);
+ fclose(f);
+ continue;
+ }
+ fprintf(outfile, "Study data loaded from %s\n", p);
+ do_study = 1; /* To get the data output if requested */
+ }
+ else fprintf(outfile, "No study data\n");
+
+ fclose(f);
+ goto SHOW_INFO;
+ }
+
+ /* In-line pattern (the usual case). Get the delimiter and seek the end of
+ the pattern; if is isn't complete, read more. */
+
+ delimiter = *p++;
+
+ if (isalnum(delimiter) || delimiter == '\\')
+ {
+ fprintf(outfile, "** Delimiter must not be alphameric or \\\n");
+ goto SKIP_DATA;
+ }
+
+ pp = p;
+
+ for(;;)
+ {
+ while (*pp != 0)
+ {
+ if (*pp == '\\' && pp[1] != 0) pp++;
+ else if (*pp == delimiter) break;
+ pp++;
+ }
+ if (*pp != 0) break;
+
+ len = BUFFER_SIZE - (pp - buffer);
+ if (len < 256)
+ {
+ fprintf(outfile, "** Expression too long - missing delimiter?\n");
+ goto SKIP_DATA;
+ }
+
+ if (infile == stdin) printf(" > ");
+ if (fgets((char *)pp, len, infile) == NULL)
+ {
+ fprintf(outfile, "** Unexpected EOF\n");
+ done = 1;
+ goto CONTINUE;
+ }
+ if (infile != stdin) fprintf(outfile, "%s", (char *)pp);
+ }
+
+ /* If the first character after the delimiter is backslash, make
+ the pattern end with backslash. This is purely to provide a way
+ of testing for the error message when a pattern ends with backslash. */
+
+ if (pp[1] == '\\') *pp++ = '\\';
+
+ /* Terminate the pattern at the delimiter, and save a copy of the pattern
+ for callouts. */
+
+ *pp++ = 0;
+ strcpy((char *)pbuffer, (char *)p);
+
+ /* Look for options after final delimiter */
+
+ options = 0;
+ study_options = 0;
+ log_store = showstore; /* default from command line */
+
+ while (*pp != 0)
+ {
+ switch (*pp++)
+ {
+ case 'g': do_g = 1; break;
+ case 'i': options |= PCRE_CASELESS; break;
+ case 'm': options |= PCRE_MULTILINE; break;
+ case 's': options |= PCRE_DOTALL; break;
+ case 'x': options |= PCRE_EXTENDED; break;
+
+ case '+': do_showrest = 1; break;
+ case 'A': options |= PCRE_ANCHORED; break;
+ case 'C': options |= PCRE_AUTO_CALLOUT; break;
+ case 'D': do_debug = do_showinfo = 1; break;
+ case 'E': options |= PCRE_DOLLAR_ENDONLY; break;
+ case 'F': do_flip = 1; break;
+ case 'G': do_G = 1; break;
+ case 'I': do_showinfo = 1; break;
+ case 'M': log_store = 1; break;
+ case 'N': options |= PCRE_NO_AUTO_CAPTURE; break;
+
+#if !defined NOPOSIX
+ case 'P': do_posix = 1; break;
+#endif
+
+ case 'S': do_study = 1; break;
+ case 'U': options |= PCRE_UNGREEDY; break;
+ case 'X': options |= PCRE_EXTRA; break;
+ case '8': options |= PCRE_UTF8; use_utf8 = 1; break;
+ case '?': options |= PCRE_NO_UTF8_CHECK; break;
+
+ case 'L':
+ ppp = pp;
+ while (*ppp != '\n' && *ppp != ' ') ppp++;
+ *ppp = 0;
+ if (setlocale(LC_CTYPE, (const char *)pp) == NULL)
+ {
+ fprintf(outfile, "** Failed to set locale \"%s\"\n", pp);
+ goto SKIP_DATA;
+ }
+ tables = pcre_maketables();
+ pp = ppp;
+ break;
+
+ case '>':
+ to_file = pp;
+ while (*pp != 0) pp++;
+ while (isspace(pp[-1])) pp--;
+ *pp = 0;
+ break;
+
+ case '\n': case ' ': break;
+
+ default:
+ fprintf(outfile, "** Unknown option '%c'\n", pp[-1]);
+ goto SKIP_DATA;
+ }
+ }
+
+ /* Handle compiling via the POSIX interface, which doesn't support the
+ timing, showing, or debugging options, nor the ability to pass over
+ local character tables. */
+
+#if !defined NOPOSIX
+ if (posix || do_posix)
+ {
+ int rc;
+ int cflags = 0;
+
+ if ((options & PCRE_CASELESS) != 0) cflags |= REG_ICASE;
+ if ((options & PCRE_MULTILINE) != 0) cflags |= REG_NEWLINE;
+ rc = regcomp(&preg, (char *)p, cflags);
+
+ /* Compilation failed; go back for another re, skipping to blank line
+ if non-interactive. */
+
+ if (rc != 0)
+ {
+ (void)regerror(rc, &preg, (char *)buffer, BUFFER_SIZE);
+ fprintf(outfile, "Failed: POSIX code %d: %s\n", rc, buffer);
+ goto SKIP_DATA;
+ }
+ }
+
+ /* Handle compiling via the native interface */
+
+ else
+#endif /* !defined NOPOSIX */
+
+ {
+ if (timeit)
+ {
+ register int i;
+ clock_t time_taken;
+ clock_t start_time = clock();
+ for (i = 0; i < LOOPREPEAT; i++)
+ {
+ re = pcre_compile((char *)p, options, &error, &erroroffset, tables);
+ if (re != NULL) free(re);
+ }
+ time_taken = clock() - start_time;
+ fprintf(outfile, "Compile time %.3f milliseconds\n",
+ (((double)time_taken * 1000.0) / (double)LOOPREPEAT) /
+ (double)CLOCKS_PER_SEC);
+ }
+
+ re = pcre_compile((char *)p, options, &error, &erroroffset, tables);
+
+ /* Compilation failed; go back for another re, skipping to blank line
+ if non-interactive. */
+
+ if (re == NULL)
+ {
+ fprintf(outfile, "Failed: %s at offset %d\n", error, erroroffset);
+ SKIP_DATA:
+ if (infile != stdin)
+ {
+ for (;;)
+ {
+ if (fgets((char *)buffer, BUFFER_SIZE, infile) == NULL)
+ {
+ done = 1;
+ goto CONTINUE;
+ }
+ len = (int)strlen((char *)buffer);
+ while (len > 0 && isspace(buffer[len-1])) len--;
+ if (len == 0) break;
+ }
+ fprintf(outfile, "\n");
+ }
+ goto CONTINUE;
+ }
+
+ /* Compilation succeeded; print data if required. There are now two
+ info-returning functions. The old one has a limited interface and
+ returns only limited data. Check that it agrees with the newer one. */
+
+ if (log_store)
+ fprintf(outfile, "Memory allocation (code space): %d\n",
+ (int)(gotten_store -
+ sizeof(real_pcre) -
+ ((real_pcre *)re)->name_count * ((real_pcre *)re)->name_entry_size));
+
+ /* Extract the size for possible writing before possibly flipping it,
+ and remember the store that was got. */
+
+ true_size = ((real_pcre *)re)->size;
+ regex_gotten_store = gotten_store;
+
+ /* If /S was present, study the regexp to generate additional info to
+ help with the matching. */
+
+ if (do_study)
+ {
+ if (timeit)
+ {
+ register int i;
+ clock_t time_taken;
+ clock_t start_time = clock();
+ for (i = 0; i < LOOPREPEAT; i++)
+ extra = pcre_study(re, study_options, &error);
+ time_taken = clock() - start_time;
+ if (extra != NULL) free(extra);
+ fprintf(outfile, " Study time %.3f milliseconds\n",
+ (((double)time_taken * 1000.0) / (double)LOOPREPEAT) /
+ (double)CLOCKS_PER_SEC);
+ }
+ extra = pcre_study(re, study_options, &error);
+ if (error != NULL)
+ fprintf(outfile, "Failed to study: %s\n", error);
+ else if (extra != NULL)
+ true_study_size = ((pcre_study_data *)(extra->study_data))->size;
+ }
+
+ /* If the 'F' option was present, we flip the bytes of all the integer
+ fields in the regex data block and the study block. This is to make it
+ possible to test PCRE's handling of byte-flipped patterns, e.g. those
+ compiled on a different architecture. */
+
+ if (do_flip)
+ {
+ real_pcre *rre = (real_pcre *)re;
+ rre->magic_number = byteflip(rre->magic_number, sizeof(rre->magic_number));
+ rre->size = byteflip(rre->size, sizeof(rre->size));
+ rre->options = byteflip(rre->options, sizeof(rre->options));
+ rre->top_bracket = byteflip(rre->top_bracket, sizeof(rre->top_bracket));
+ rre->top_backref = byteflip(rre->top_backref, sizeof(rre->top_backref));
+ rre->first_byte = byteflip(rre->first_byte, sizeof(rre->first_byte));
+ rre->req_byte = byteflip(rre->req_byte, sizeof(rre->req_byte));
+ rre->name_table_offset = byteflip(rre->name_table_offset,
+ sizeof(rre->name_table_offset));
+ rre->name_entry_size = byteflip(rre->name_entry_size,
+ sizeof(rre->name_entry_size));
+ rre->name_count = byteflip(rre->name_count, sizeof(rre->name_count));
+
+ if (extra != NULL)
+ {
+ pcre_study_data *rsd = (pcre_study_data *)(extra->study_data);
+ rsd->size = byteflip(rsd->size, sizeof(rsd->size));
+ rsd->options = byteflip(rsd->options, sizeof(rsd->options));
+ }
+ }
+
+ /* Extract information from the compiled data if required */
+
+ SHOW_INFO:
+
+ if (do_showinfo)
+ {
+ unsigned long int get_options, all_options;
+ int old_first_char, old_options, old_count;
+ int count, backrefmax, first_char, need_char;
+ int nameentrysize, namecount;
+ const uschar *nametable;
+
+ if (do_debug)
+ {
+ fprintf(outfile, "------------------------------------------------------------------\n");
+ print_internals(re, outfile);
+ }
+
+ new_info(re, NULL, PCRE_INFO_OPTIONS, &get_options);
+ new_info(re, NULL, PCRE_INFO_SIZE, &size);
+ new_info(re, NULL, PCRE_INFO_CAPTURECOUNT, &count);
+ new_info(re, NULL, PCRE_INFO_BACKREFMAX, &backrefmax);
+ new_info(re, NULL, PCRE_INFO_FIRSTBYTE, &first_char);
+ new_info(re, NULL, PCRE_INFO_LASTLITERAL, &need_char);
+ new_info(re, NULL, PCRE_INFO_NAMEENTRYSIZE, &nameentrysize);
+ new_info(re, NULL, PCRE_INFO_NAMECOUNT, &namecount);
+ new_info(re, NULL, PCRE_INFO_NAMETABLE, (void *)&nametable);
+
+ old_count = pcre_info(re, &old_options, &old_first_char);
+ if (count < 0) fprintf(outfile,
+ "Error %d from pcre_info()\n", count);
+ else
+ {
+ if (old_count != count) fprintf(outfile,
+ "Count disagreement: pcre_fullinfo=%d pcre_info=%d\n", count,
+ old_count);
+
+ if (old_first_char != first_char) fprintf(outfile,
+ "First char disagreement: pcre_fullinfo=%d pcre_info=%d\n",
+ first_char, old_first_char);
+
+ if (old_options != (int)get_options) fprintf(outfile,
+ "Options disagreement: pcre_fullinfo=%ld pcre_info=%d\n",
+ get_options, old_options);
+ }
+
+ if (size != regex_gotten_store) fprintf(outfile,
+ "Size disagreement: pcre_fullinfo=%d call to malloc for %d\n",
+ size, regex_gotten_store);
+
+ fprintf(outfile, "Capturing subpattern count = %d\n", count);
+ if (backrefmax > 0)
+ fprintf(outfile, "Max back reference = %d\n", backrefmax);
+
+ if (namecount > 0)
+ {
+ fprintf(outfile, "Named capturing subpatterns:\n");
+ while (namecount-- > 0)
+ {
+ fprintf(outfile, " %s %*s%3d\n", nametable + 2,
+ nameentrysize - 3 - (int)strlen((char *)nametable + 2), "",
+ GET2(nametable, 0));
+ nametable += nameentrysize;
+ }
+ }
+
+ /* The NOPARTIAL bit is a private bit in the options, so we have
+ to fish it out via out back door */
+
+ all_options = ((real_pcre *)re)->options;
+ if (do_flip)
+ {
+ all_options = byteflip(all_options, sizeof(all_options));
+ }
+
+ if ((all_options & PCRE_NOPARTIAL) != 0)
+ fprintf(outfile, "Partial matching not supported\n");
+
+ if (get_options == 0) fprintf(outfile, "No options\n");
+ else fprintf(outfile, "Options:%s%s%s%s%s%s%s%s%s%s\n",
+ ((get_options & PCRE_ANCHORED) != 0)? " anchored" : "",
+ ((get_options & PCRE_CASELESS) != 0)? " caseless" : "",
+ ((get_options & PCRE_EXTENDED) != 0)? " extended" : "",
+ ((get_options & PCRE_MULTILINE) != 0)? " multiline" : "",
+ ((get_options & PCRE_DOTALL) != 0)? " dotall" : "",
+ ((get_options & PCRE_DOLLAR_ENDONLY) != 0)? " dollar_endonly" : "",
+ ((get_options & PCRE_EXTRA) != 0)? " extra" : "",
+ ((get_options & PCRE_UNGREEDY) != 0)? " ungreedy" : "",
+ ((get_options & PCRE_UTF8) != 0)? " utf8" : "",
+ ((get_options & PCRE_NO_UTF8_CHECK) != 0)? " no_utf8_check" : "");
+
+ if (((((real_pcre *)re)->options) & PCRE_ICHANGED) != 0)
+ fprintf(outfile, "Case state changes\n");
+
+ if (first_char == -1)
+ {
+ fprintf(outfile, "First char at start or follows \\n\n");
+ }
+ else if (first_char < 0)
+ {
+ fprintf(outfile, "No first char\n");
+ }
+ else
+ {
+ int ch = first_char & 255;
+ const char *caseless = ((first_char & REQ_CASELESS) == 0)?
+ "" : " (caseless)";
+ if (isprint(ch))
+ fprintf(outfile, "First char = \'%c\'%s\n", ch, caseless);
+ else
+ fprintf(outfile, "First char = %d%s\n", ch, caseless);
+ }
+
+ if (need_char < 0)
+ {
+ fprintf(outfile, "No need char\n");
+ }
+ else
+ {
+ int ch = need_char & 255;
+ const char *caseless = ((need_char & REQ_CASELESS) == 0)?
+ "" : " (caseless)";
+ if (isprint(ch))
+ fprintf(outfile, "Need char = \'%c\'%s\n", ch, caseless);
+ else
+ fprintf(outfile, "Need char = %d%s\n", ch, caseless);
+ }
+
+ /* Don't output study size; at present it is in any case a fixed
+ value, but it varies, depending on the computer architecture, and
+ so messes up the test suite. (And with the /F option, it might be
+ flipped.) */
+
+ if (do_study)
+ {
+ if (extra == NULL)
+ fprintf(outfile, "Study returned NULL\n");
+ else
+ {
+ uschar *start_bits = NULL;
+ new_info(re, extra, PCRE_INFO_FIRSTTABLE, &start_bits);
+
+ if (start_bits == NULL)
+ fprintf(outfile, "No starting byte set\n");
+ else
+ {
+ int i;
+ int c = 24;
+ fprintf(outfile, "Starting byte set: ");
+ for (i = 0; i < 256; i++)
+ {
+ if ((start_bits[i/8] & (1<<(i&7))) != 0)
+ {
+ if (c > 75)
+ {
+ fprintf(outfile, "\n ");
+ c = 2;
+ }
+ if (isprint(i) && i != ' ')
+ {
+ fprintf(outfile, "%c ", i);
+ c += 2;
+ }
+ else
+ {
+ fprintf(outfile, "\\x%02x ", i);
+ c += 5;
+ }
+ }
+ }
+ fprintf(outfile, "\n");
+ }
+ }
+ }
+ }
+
+ /* If the '>' option was present, we write out the regex to a file, and
+ that is all. The first 8 bytes of the file are the regex length and then
+ the study length, in big-endian order. */
+
+ if (to_file != NULL)
+ {
+ FILE *f = fopen((char *)to_file, "wb");
+ if (f == NULL)
+ {
+ fprintf(outfile, "Unable to open %s: %s\n", to_file, strerror(errno));
+ }
+ else
+ {
+ uschar sbuf[8];
+ sbuf[0] = (true_size >> 24) & 255;
+ sbuf[1] = (true_size >> 16) & 255;
+ sbuf[2] = (true_size >> 8) & 255;
+ sbuf[3] = (true_size) & 255;
+
+ sbuf[4] = (true_study_size >> 24) & 255;
+ sbuf[5] = (true_study_size >> 16) & 255;
+ sbuf[6] = (true_study_size >> 8) & 255;
+ sbuf[7] = (true_study_size) & 255;
+
+ if (fwrite(sbuf, 1, 8, f) < 8 ||
+ fwrite(re, 1, true_size, f) < true_size)
+ {
+ fprintf(outfile, "Write error on %s: %s\n", to_file, strerror(errno));
+ }
+ else
+ {
+ fprintf(outfile, "Compiled regex written to %s\n", to_file);
+ if (extra != NULL)
+ {
+ if (fwrite(extra->study_data, 1, true_study_size, f) <
+ true_study_size)
+ {
+ fprintf(outfile, "Write error on %s: %s\n", to_file,
+ strerror(errno));
+ }
+ else fprintf(outfile, "Study data written to %s\n", to_file);
+ }
+ }
+ fclose(f);
+ }
+ continue; /* With next regex */
+ }
+ } /* End of non-POSIX compile */
+
+ /* Read data lines and test them */
+
+ for (;;)
+ {
+ unsigned char *q;
+ unsigned char *bptr = dbuffer;
+ int *use_offsets = offsets;
+ int use_size_offsets = size_offsets;
+ int callout_data = 0;
+ int callout_data_set = 0;
+ int count, c;
+ int copystrings = 0;
+ int find_match_limit = 0;
+ int getstrings = 0;
+ int getlist = 0;
+ int gmatched = 0;
+ int start_offset = 0;
+ int g_notempty = 0;
+
+ options = 0;
+
+ pcre_callout = callout;
+ first_callout = 1;
+ callout_extra = 0;
+ callout_count = 0;
+ callout_fail_count = 999999;
+ callout_fail_id = -1;
+ show_malloc = 0;
+
+ if (infile == stdin) printf("data> ");
+ if (fgets((char *)buffer, BUFFER_SIZE, infile) == NULL)
+ {
+ done = 1;
+ goto CONTINUE;
+ }
+ if (infile != stdin) fprintf(outfile, "%s", (char *)buffer);
+
+ len = (int)strlen((char *)buffer);
+ while (len > 0 && isspace(buffer[len-1])) len--;
+ buffer[len] = 0;
+ if (len == 0) break;
+
+ p = buffer;
+ while (isspace(*p)) p++;
+
+ q = dbuffer;
+ while ((c = *p++) != 0)
+ {
+ int i = 0;
+ int n = 0;
+
+ if (c == '\\') switch ((c = *p++))
+ {
+ case 'a': c = 7; break;
+ case 'b': c = '\b'; break;
+ case 'e': c = 27; break;
+ case 'f': c = '\f'; break;
+ case 'n': c = '\n'; break;
+ case 'r': c = '\r'; break;
+ case 't': c = '\t'; break;
+ case 'v': c = '\v'; break;
+
+ case '0': case '1': case '2': case '3':
+ case '4': case '5': case '6': case '7':
+ c -= '0';
+ while (i++ < 2 && isdigit(*p) && *p != '8' && *p != '9')
+ c = c * 8 + *p++ - '0';
+ break;
+
+ case 'x':
+
+ /* Handle \x{..} specially - new Perl thing for utf8 */
+
+ if (*p == '{')
+ {
+ unsigned char *pt = p;
+ c = 0;
+ while (isxdigit(*(++pt)))
+ c = c * 16 + tolower(*pt) - ((isdigit(*pt))? '0' : 'W');
+ if (*pt == '}')
+ {
+ unsigned char buff8[8];
+ int ii, utn;
+ utn = ord2utf8(c, buff8);
+ for (ii = 0; ii < utn - 1; ii++) *q++ = buff8[ii];
+ c = buff8[ii]; /* Last byte */
+ p = pt + 1;
+ break;
+ }
+ /* Not correct form; fall through */
+ }
+
+ /* Ordinary \x */
+
+ c = 0;
+ while (i++ < 2 && isxdigit(*p))
+ {
+ c = c * 16 + tolower(*p) - ((isdigit(*p))? '0' : 'W');
+ p++;
+ }
+ break;
+
+ case 0: /* \ followed by EOF allows for an empty line */
+ p--;
+ continue;
+
+ case '>':
+ while(isdigit(*p)) start_offset = start_offset * 10 + *p++ - '0';
+ continue;
+
+ case 'A': /* Option setting */
+ options |= PCRE_ANCHORED;
+ continue;
+
+ case 'B':
+ options |= PCRE_NOTBOL;
+ continue;
+
+ case 'C':
+ if (isdigit(*p)) /* Set copy string */
+ {
+ while(isdigit(*p)) n = n * 10 + *p++ - '0';
+ copystrings |= 1 << n;
+ }
+ else if (isalnum(*p))
+ {
+ uschar name[256];
+ uschar *npp = name;
+ while (isalnum(*p)) *npp++ = *p++;
+ *npp = 0;
+ n = pcre_get_stringnumber(re, (char *)name);
+ if (n < 0)
+ fprintf(outfile, "no parentheses with name \"%s\"\n", name);
+ else copystrings |= 1 << n;
+ }
+ else if (*p == '+')
+ {
+ callout_extra = 1;
+ p++;
+ }
+ else if (*p == '-')
+ {
+ pcre_callout = NULL;
+ p++;
+ }
+ else if (*p == '!')
+ {
+ callout_fail_id = 0;
+ p++;
+ while(isdigit(*p))
+ callout_fail_id = callout_fail_id * 10 + *p++ - '0';
+ callout_fail_count = 0;
+ if (*p == '!')
+ {
+ p++;
+ while(isdigit(*p))
+ callout_fail_count = callout_fail_count * 10 + *p++ - '0';
+ }
+ }
+ else if (*p == '*')
+ {
+ int sign = 1;
+ callout_data = 0;
+ if (*(++p) == '-') { sign = -1; p++; }
+ while(isdigit(*p))
+ callout_data = callout_data * 10 + *p++ - '0';
+ callout_data *= sign;
+ callout_data_set = 1;
+ }
+ continue;
+
+ case 'G':
+ if (isdigit(*p))
+ {
+ while(isdigit(*p)) n = n * 10 + *p++ - '0';
+ getstrings |= 1 << n;
+ }
+ else if (isalnum(*p))
+ {
+ uschar name[256];
+ uschar *npp = name;
+ while (isalnum(*p)) *npp++ = *p++;
+ *npp = 0;
+ n = pcre_get_stringnumber(re, (char *)name);
+ if (n < 0)
+ fprintf(outfile, "no parentheses with name \"%s\"\n", name);
+ else getstrings |= 1 << n;
+ }
+ continue;
+
+ case 'L':
+ getlist = 1;
+ continue;
+
+ case 'M':
+ find_match_limit = 1;
+ continue;
+
+ case 'N':
+ options |= PCRE_NOTEMPTY;
+ continue;
+
+ case 'O':
+ while(isdigit(*p)) n = n * 10 + *p++ - '0';
+ if (n > size_offsets_max)
+ {
+ size_offsets_max = n;
+ free(offsets);
+ use_offsets = offsets = (int *)malloc(size_offsets_max * sizeof(int));
+ if (offsets == NULL)
+ {
+ printf("** Failed to get %d bytes of memory for offsets vector\n",
+ size_offsets_max * sizeof(int));
+ return 1;
+ }
+ }
+ use_size_offsets = n;
+ if (n == 0) use_offsets = NULL; /* Ensures it can't write to it */
+ continue;
+
+ case 'P':
+ options |= PCRE_PARTIAL;
+ continue;
+
+ case 'S':
+ show_malloc = 1;
+ continue;
+
+ case 'Z':
+ options |= PCRE_NOTEOL;
+ continue;
+
+ case '?':
+ options |= PCRE_NO_UTF8_CHECK;
+ continue;
+ }
+ *q++ = c;
+ }
+ *q = 0;
+ len = q - dbuffer;
+
+ /* Handle matching via the POSIX interface, which does not
+ support timing or playing with the match limit or callout data. */
+
+#if !defined NOPOSIX
+ if (posix || do_posix)
+ {
+ int rc;
+ int eflags = 0;
+ regmatch_t *pmatch = NULL;
+ if (use_size_offsets > 0)
+ pmatch = (regmatch_t *)malloc(sizeof(regmatch_t) * use_size_offsets);
+ if ((options & PCRE_NOTBOL) != 0) eflags |= REG_NOTBOL;
+ if ((options & PCRE_NOTEOL) != 0) eflags |= REG_NOTEOL;
+
+ rc = regexec(&preg, (const char *)bptr, use_size_offsets, pmatch, eflags);
+
+ if (rc != 0)
+ {
+ (void)regerror(rc, &preg, (char *)buffer, BUFFER_SIZE);
+ fprintf(outfile, "No match: POSIX code %d: %s\n", rc, buffer);
+ }
+ else
+ {
+ size_t i;
+ for (i = 0; i < (size_t)use_size_offsets; i++)
+ {
+ if (pmatch[i].rm_so >= 0)
+ {
+ fprintf(outfile, "%2d: ", (int)i);
+ (void)pchars(dbuffer + pmatch[i].rm_so,
+ pmatch[i].rm_eo - pmatch[i].rm_so, outfile);
+ fprintf(outfile, "\n");
+ if (i == 0 && do_showrest)
+ {
+ fprintf(outfile, " 0+ ");
+ (void)pchars(dbuffer + pmatch[i].rm_eo, len - pmatch[i].rm_eo,
+ outfile);
+ fprintf(outfile, "\n");
+ }
+ }
+ }
+ }
+ free(pmatch);
+ }
+
+ /* Handle matching via the native interface - repeats for /g and /G */
+
+ else
+#endif /* !defined NOPOSIX */
+
+ for (;; gmatched++) /* Loop for /g or /G */
+ {
+ if (timeit)
+ {
+ register int i;
+ clock_t time_taken;
+ clock_t start_time = clock();
+ for (i = 0; i < LOOPREPEAT; i++)
+ count = pcre_exec(re, extra, (char *)bptr, len,
+ start_offset, options | g_notempty, use_offsets, use_size_offsets);
+ time_taken = clock() - start_time;
+ fprintf(outfile, "Execute time %.3f milliseconds\n",
+ (((double)time_taken * 1000.0) / (double)LOOPREPEAT) /
+ (double)CLOCKS_PER_SEC);
+ }
+
+ /* If find_match_limit is set, we want to do repeated matches with
+ varying limits in order to find the minimum value. */
+
+ if (find_match_limit)
+ {
+ int min = 0;
+ int mid = 64;
+ int max = -1;
+
+ if (extra == NULL)
+ {
+ extra = (pcre_extra *)malloc(sizeof(pcre_extra));
+ extra->flags = 0;
+ }
+ extra->flags |= PCRE_EXTRA_MATCH_LIMIT;
+
+ for (;;)
+ {
+ extra->match_limit = mid;
+ count = pcre_exec(re, extra, (char *)bptr, len, start_offset,
+ options | g_notempty, use_offsets, use_size_offsets);
+ if (count == PCRE_ERROR_MATCHLIMIT)
+ {
+ /* fprintf(outfile, "Testing match limit = %d\n", mid); */
+ min = mid;
+ mid = (mid == max - 1)? max : (max > 0)? (min + max)/2 : mid*2;
+ }
+ else if (count >= 0 || count == PCRE_ERROR_NOMATCH ||
+ count == PCRE_ERROR_PARTIAL)
+ {
+ if (mid == min + 1)
+ {
+ fprintf(outfile, "Minimum match limit = %d\n", mid);
+ break;
+ }
+ /* fprintf(outfile, "Testing match limit = %d\n", mid); */
+ max = mid;
+ mid = (min + mid)/2;
+ }
+ else break; /* Some other error */
+ }
+
+ extra->flags &= ~PCRE_EXTRA_MATCH_LIMIT;
+ }
+
+ /* If callout_data is set, use the interface with additional data */
+
+ else if (callout_data_set)
+ {
+ if (extra == NULL)
+ {
+ extra = (pcre_extra *)malloc(sizeof(pcre_extra));
+ extra->flags = 0;
+ }
+ extra->flags |= PCRE_EXTRA_CALLOUT_DATA;
+ extra->callout_data = &callout_data;
+ count = pcre_exec(re, extra, (char *)bptr, len, start_offset,
+ options | g_notempty, use_offsets, use_size_offsets);
+ extra->flags &= ~PCRE_EXTRA_CALLOUT_DATA;
+ }
+
+ /* The normal case is just to do the match once, with the default
+ value of match_limit. */
+
+ else
+ {
+ count = pcre_exec(re, extra, (char *)bptr, len,
+ start_offset, options | g_notempty, use_offsets, use_size_offsets);
+ }
+
+ if (count == 0)
+ {
+ fprintf(outfile, "Matched, but too many substrings\n");
+ count = use_size_offsets/3;
+ }
+
+ /* Matched */
+
+ if (count >= 0)
+ {
+ int i;
+ for (i = 0; i < count * 2; i += 2)
+ {
+ if (use_offsets[i] < 0)
+ fprintf(outfile, "%2d: <unset>\n", i/2);
+ else
+ {
+ fprintf(outfile, "%2d: ", i/2);
+ (void)pchars(bptr + use_offsets[i],
+ use_offsets[i+1] - use_offsets[i], outfile);
+ fprintf(outfile, "\n");
+ if (i == 0)
+ {
+ if (do_showrest)
+ {
+ fprintf(outfile, " 0+ ");
+ (void)pchars(bptr + use_offsets[i+1], len - use_offsets[i+1],
+ outfile);
+ fprintf(outfile, "\n");
+ }
+ }
+ }
+ }
+
+ for (i = 0; i < 32; i++)
+ {
+ if ((copystrings & (1 << i)) != 0)
+ {
+ char copybuffer[16];
+ int rc = pcre_copy_substring((char *)bptr, use_offsets, count,
+ i, copybuffer, sizeof(copybuffer));
+ if (rc < 0)
+ fprintf(outfile, "copy substring %d failed %d\n", i, rc);
+ else
+ fprintf(outfile, "%2dC %s (%d)\n", i, copybuffer, rc);
+ }
+ }
+
+ for (i = 0; i < 32; i++)
+ {
+ if ((getstrings & (1 << i)) != 0)
+ {
+ const char *substring;
+ int rc = pcre_get_substring((char *)bptr, use_offsets, count,
+ i, &substring);
+ if (rc < 0)
+ fprintf(outfile, "get substring %d failed %d\n", i, rc);
+ else
+ {
+ fprintf(outfile, "%2dG %s (%d)\n", i, substring, rc);
+ /* free((void *)substring); */
+ pcre_free_substring(substring);
+ }
+ }
+ }
+
+ if (getlist)
+ {
+ const char **stringlist;
+ int rc = pcre_get_substring_list((char *)bptr, use_offsets, count,
+ &stringlist);
+ if (rc < 0)
+ fprintf(outfile, "get substring list failed %d\n", rc);
+ else
+ {
+ for (i = 0; i < count; i++)
+ fprintf(outfile, "%2dL %s\n", i, stringlist[i]);
+ if (stringlist[i] != NULL)
+ fprintf(outfile, "string list not terminated by NULL\n");
+ /* free((void *)stringlist); */
+ pcre_free_substring_list(stringlist);
+ }
+ }
+ }
+
+ /* There was a partial match */
+
+ else if (count == PCRE_ERROR_PARTIAL)
+ {
+ fprintf(outfile, "Partial match\n");
+ break; /* Out of the /g loop */
+ }
+
+ /* Failed to match. If this is a /g or /G loop and we previously set
+ g_notempty after a null match, this is not necessarily the end.
+ We want to advance the start offset, and continue. In the case of UTF-8
+ matching, the advance must be one character, not one byte. Fudge the
+ offset values to achieve this. We won't be at the end of the string -
+ that was checked before setting g_notempty. */
+
+ else
+ {
+ if (g_notempty != 0)
+ {
+ int onechar = 1;
+ use_offsets[0] = start_offset;
+ if (use_utf8)
+ {
+ while (start_offset + onechar < len)
+ {
+ int tb = bptr[start_offset+onechar];
+ if (tb <= 127) break;
+ tb &= 0xc0;
+ if (tb != 0 && tb != 0xc0) onechar++;
+ }
+ }
+ use_offsets[1] = start_offset + onechar;
+ }
+ else
+ {
+ if (count == PCRE_ERROR_NOMATCH)
+ {
+ if (gmatched == 0) fprintf(outfile, "No match\n");
+ }
+ else fprintf(outfile, "Error %d\n", count);
+ break; /* Out of the /g loop */
+ }
+ }
+
+ /* If not /g or /G we are done */
+
+ if (!do_g && !do_G) break;
+
+ /* If we have matched an empty string, first check to see if we are at
+ the end of the subject. If so, the /g loop is over. Otherwise, mimic
+ what Perl's /g options does. This turns out to be rather cunning. First
+ we set PCRE_NOTEMPTY and PCRE_ANCHORED and try the match again at the
+ same point. If this fails (picked up above) we advance to the next
+ character. */
+
+ g_notempty = 0;
+ if (use_offsets[0] == use_offsets[1])
+ {
+ if (use_offsets[0] == len) break;
+ g_notempty = PCRE_NOTEMPTY | PCRE_ANCHORED;
+ }
+
+ /* For /g, update the start offset, leaving the rest alone */
+
+ if (do_g) start_offset = use_offsets[1];
+
+ /* For /G, update the pointer and length */
+
+ else
+ {
+ bptr += use_offsets[1];
+ len -= use_offsets[1];
+ }
+ } /* End of loop for /g and /G */
+ } /* End of loop for data lines */
+
+ CONTINUE:
+
+#if !defined NOPOSIX
+ if (posix || do_posix) regfree(&preg);
+#endif
+
+ if (re != NULL) free(re);
+ if (extra != NULL) free(extra);
+ if (tables != NULL)
+ {
+ free((void *)tables);
+ setlocale(LC_CTYPE, "C");
+ }
+ }
+
+if (infile == stdin) fprintf(outfile, "\n");
+return 0;
+}
+
+/* End */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/perltest b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/perltest
new file mode 100755
index 00000000..44afbea6
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/perltest
@@ -0,0 +1,211 @@
+#! /usr/bin/perl
+
+# Program for testing regular expressions with perl to check that PCRE handles
+# them the same. This is the version that supports /8 for UTF-8 testing. As it
+# stands, it requires at least Perl 5.8 for UTF-8 support. For Perl 5.6, it
+# can be used as is for non-UTF-8 testing, but you have to uncomment the
+# "use utf8" lines in order to to UTF-8 stuff (and you mustn't uncomment them
+# for non-UTF-8 use).
+
+
+# Function for turning a string into a string of printing chars. There are
+# currently problems with UTF-8 strings; this fudges round them.
+
+sub pchars {
+my($t) = "";
+
+if ($utf8)
+ {
+# use utf8; <=============== For UTF-8 in Perl 5.6
+ @p = unpack('U*', $_[0]);
+ foreach $c (@p)
+ {
+ if ($c >= 32 && $c < 127) { $t .= chr $c; }
+ else { $t .= sprintf("\\x{%02x}", $c); }
+ }
+ }
+
+else
+ {
+ foreach $c (split(//, $_[0]))
+ {
+ if (ord $c >= 32 && ord $c < 127) { $t .= $c; }
+ else { $t .= sprintf("\\x%02x", ord $c); }
+ }
+ }
+
+$t;
+}
+
+
+
+# Read lines from named file or stdin and write to named file or stdout; lines
+# consist of a regular expression, in delimiters and optionally followed by
+# options, followed by a set of test data, terminated by an empty line.
+
+# Sort out the input and output files
+
+if (@ARGV > 0)
+ {
+ open(INFILE, "<$ARGV[0]") || die "Failed to open $ARGV[0]\n";
+ $infile = "INFILE";
+ }
+else { $infile = "STDIN"; }
+
+if (@ARGV > 1)
+ {
+ open(OUTFILE, ">$ARGV[1]") || die "Failed to open $ARGV[1]\n";
+ $outfile = "OUTFILE";
+ }
+else { $outfile = "STDOUT"; }
+
+printf($outfile "Perl $] Regular Expressions\n\n");
+
+# Main loop
+
+NEXT_RE:
+for (;;)
+ {
+ printf " re> " if $infile eq "STDIN";
+ last if ! ($_ = <$infile>);
+ printf $outfile "$_" if $infile ne "STDIN";
+ next if ($_ eq "");
+
+ $pattern = $_;
+
+ while ($pattern !~ /^\s*(.).*\1/s)
+ {
+ printf " > " if $infile eq "STDIN";
+ last if ! ($_ = <$infile>);
+ printf $outfile "$_" if $infile ne "STDIN";
+ $pattern .= $_;
+ }
+
+ chomp($pattern);
+ $pattern =~ s/\s+$//;
+
+ # The private /+ modifier means "print $' afterwards".
+
+ $showrest = ($pattern =~ s/\+(?=[a-z]*$)//);
+
+ # The private /8 modifier means "operate in UTF-8". Currently, Perl
+ # has bugs that we try to work around using this flag.
+
+ $utf8 = ($pattern =~ s/8(?=[a-z]*$)//);
+
+ # Check that the pattern is valid
+
+ if ($utf8)
+ {
+# use utf8; <=============== For UTF-8 in Perl 5.6
+ eval "\$_ =~ ${pattern}";
+ }
+ else
+ {
+ eval "\$_ =~ ${pattern}";
+ }
+
+ if ($@)
+ {
+ printf $outfile "Error: $@";
+ next NEXT_RE;
+ }
+
+ # If the /g modifier is present, we want to put a loop round the matching;
+ # otherwise just a single "if".
+
+ $cmd = ($pattern =~ /g[a-z]*$/)? "while" : "if";
+
+ # If the pattern is actually the null string, Perl uses the most recently
+ # executed (and successfully compiled) regex is used instead. This is a
+ # nasty trap for the unwary! The PCRE test suite does contain null strings
+ # in places - if they are allowed through here all sorts of weird and
+ # unexpected effects happen. To avoid this, we replace such patterns with
+ # a non-null pattern that has the same effect.
+
+ $pattern = "/(?#)/$2" if ($pattern =~ /^(.)\1(.*)$/);
+
+ # Read data lines and test them
+
+ for (;;)
+ {
+ printf "data> " if $infile eq "STDIN";
+ last NEXT_RE if ! ($_ = <$infile>);
+ chomp;
+ printf $outfile "$_\n" if $infile ne "STDIN";
+
+ s/\s+$//;
+ s/^\s+//;
+
+ last if ($_ eq "");
+
+ $x = eval "\"$_\""; # To get escapes processed
+
+ # Empty array for holding results, then do the matching.
+
+ @subs = ();
+
+ $pushes = "push \@subs,\$&;" .
+ "push \@subs,\$1;" .
+ "push \@subs,\$2;" .
+ "push \@subs,\$3;" .
+ "push \@subs,\$4;" .
+ "push \@subs,\$5;" .
+ "push \@subs,\$6;" .
+ "push \@subs,\$7;" .
+ "push \@subs,\$8;" .
+ "push \@subs,\$9;" .
+ "push \@subs,\$10;" .
+ "push \@subs,\$11;" .
+ "push \@subs,\$12;" .
+ "push \@subs,\$13;" .
+ "push \@subs,\$14;" .
+ "push \@subs,\$15;" .
+ "push \@subs,\$16;" .
+ "push \@subs,\$'; }";
+
+ if ($utf8)
+ {
+# use utf8; <=============== For UTF-8 in Perl 5.6
+ eval "${cmd} (\$x =~ ${pattern}) {" . $pushes;
+ }
+ else
+ {
+ eval "${cmd} (\$x =~ ${pattern}) {" . $pushes;
+ }
+
+ if ($@)
+ {
+ printf $outfile "Error: $@\n";
+ next NEXT_RE;
+ }
+ elsif (scalar(@subs) == 0)
+ {
+ printf $outfile "No match\n";
+ }
+ else
+ {
+ while (scalar(@subs) != 0)
+ {
+ printf $outfile (" 0: %s\n", &pchars($subs[0]));
+ printf $outfile (" 0+ %s\n", &pchars($subs[17])) if $showrest;
+ $last_printed = 0;
+ for ($i = 1; $i <= 16; $i++)
+ {
+ if (defined $subs[$i])
+ {
+ while ($last_printed++ < $i-1)
+ { printf $outfile ("%2d: <unset>\n", $last_printed); }
+ printf $outfile ("%2d: %s\n", $i, &pchars($subs[$i]));
+ $last_printed = $i;
+ }
+ }
+ splice(@subs, 0, 18);
+ }
+ }
+ }
+ }
+
+# printf $outfile "\n";
+
+# End
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/perltest8 b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/perltest8
new file mode 100755
index 00000000..2fe522d6
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/perltest8
@@ -0,0 +1,208 @@
+#! /usr/bin/perl
+
+# Program for testing regular expressions with perl to check that PCRE handles
+# them the same. This is the version that supports /8 for UTF-8 testing. It
+# requires at least Perl 5.6.
+
+
+# Function for turning a string into a string of printing chars. There are
+# currently problems with UTF-8 strings; this fudges round them.
+
+sub pchars {
+my($t) = "";
+
+if ($utf8)
+ {
+ use utf8;
+ @p = unpack('U*', $_[0]);
+ foreach $c (@p)
+ {
+ if ($c >= 32 && $c < 127) { $t .= chr $c; }
+ else { $t .= sprintf("\\x{%02x}", $c); }
+ }
+ }
+
+else
+ {
+ foreach $c (split(//, $_[0]))
+ {
+ if (ord $c >= 32 && ord $c < 127) { $t .= $c; }
+ else { $t .= sprintf("\\x%02x", ord $c); }
+ }
+ }
+
+$t;
+}
+
+
+
+# Read lines from named file or stdin and write to named file or stdout; lines
+# consist of a regular expression, in delimiters and optionally followed by
+# options, followed by a set of test data, terminated by an empty line.
+
+# Sort out the input and output files
+
+if (@ARGV > 0)
+ {
+ open(INFILE, "<$ARGV[0]") || die "Failed to open $ARGV[0]\n";
+ $infile = "INFILE";
+ }
+else { $infile = "STDIN"; }
+
+if (@ARGV > 1)
+ {
+ open(OUTFILE, ">$ARGV[1]") || die "Failed to open $ARGV[1]\n";
+ $outfile = "OUTFILE";
+ }
+else { $outfile = "STDOUT"; }
+
+printf($outfile "Perl $] Regular Expressions\n\n");
+
+# Main loop
+
+NEXT_RE:
+for (;;)
+ {
+ printf " re> " if $infile eq "STDIN";
+ last if ! ($_ = <$infile>);
+ printf $outfile "$_" if $infile ne "STDIN";
+ next if ($_ eq "");
+
+ $pattern = $_;
+
+ while ($pattern !~ /^\s*(.).*\1/s)
+ {
+ printf " > " if $infile eq "STDIN";
+ last if ! ($_ = <$infile>);
+ printf $outfile "$_" if $infile ne "STDIN";
+ $pattern .= $_;
+ }
+
+ chomp($pattern);
+ $pattern =~ s/\s+$//;
+
+ # The private /+ modifier means "print $' afterwards".
+
+ $showrest = ($pattern =~ s/\+(?=[a-z]*$)//);
+
+ # The private /8 modifier means "operate in UTF-8". Currently, Perl
+ # has bugs that we try to work around using this flag.
+
+ $utf8 = ($pattern =~ s/8(?=[a-z]*$)//);
+
+ # Check that the pattern is valid
+
+ if ($utf8)
+ {
+ use utf8;
+ eval "\$_ =~ ${pattern}";
+ }
+ else
+ {
+ eval "\$_ =~ ${pattern}";
+ }
+
+ if ($@)
+ {
+ printf $outfile "Error: $@";
+ next NEXT_RE;
+ }
+
+ # If the /g modifier is present, we want to put a loop round the matching;
+ # otherwise just a single "if".
+
+ $cmd = ($pattern =~ /g[a-z]*$/)? "while" : "if";
+
+ # If the pattern is actually the null string, Perl uses the most recently
+ # executed (and successfully compiled) regex is used instead. This is a
+ # nasty trap for the unwary! The PCRE test suite does contain null strings
+ # in places - if they are allowed through here all sorts of weird and
+ # unexpected effects happen. To avoid this, we replace such patterns with
+ # a non-null pattern that has the same effect.
+
+ $pattern = "/(?#)/$2" if ($pattern =~ /^(.)\1(.*)$/);
+
+ # Read data lines and test them
+
+ for (;;)
+ {
+ printf "data> " if $infile eq "STDIN";
+ last NEXT_RE if ! ($_ = <$infile>);
+ chomp;
+ printf $outfile "$_\n" if $infile ne "STDIN";
+
+ s/\s+$//;
+ s/^\s+//;
+
+ last if ($_ eq "");
+
+ $x = eval "\"$_\""; # To get escapes processed
+
+ # Empty array for holding results, then do the matching.
+
+ @subs = ();
+
+ $pushes = "push \@subs,\$&;" .
+ "push \@subs,\$1;" .
+ "push \@subs,\$2;" .
+ "push \@subs,\$3;" .
+ "push \@subs,\$4;" .
+ "push \@subs,\$5;" .
+ "push \@subs,\$6;" .
+ "push \@subs,\$7;" .
+ "push \@subs,\$8;" .
+ "push \@subs,\$9;" .
+ "push \@subs,\$10;" .
+ "push \@subs,\$11;" .
+ "push \@subs,\$12;" .
+ "push \@subs,\$13;" .
+ "push \@subs,\$14;" .
+ "push \@subs,\$15;" .
+ "push \@subs,\$16;" .
+ "push \@subs,\$'; }";
+
+ if ($utf8)
+ {
+ use utf8;
+ eval "${cmd} (\$x =~ ${pattern}) {" . $pushes;
+ }
+ else
+ {
+ eval "${cmd} (\$x =~ ${pattern}) {" . $pushes;
+ }
+
+ if ($@)
+ {
+ printf $outfile "Error: $@\n";
+ next NEXT_RE;
+ }
+ elsif (scalar(@subs) == 0)
+ {
+ printf $outfile "No match\n";
+ }
+ else
+ {
+ while (scalar(@subs) != 0)
+ {
+ printf $outfile (" 0: %s\n", &pchars($subs[0]));
+ printf $outfile (" 0+ %s\n", &pchars($subs[17])) if $showrest;
+ $last_printed = 0;
+ for ($i = 1; $i <= 16; $i++)
+ {
+ if (defined $subs[$i])
+ {
+ while ($last_printed++ < $i-1)
+ { printf $outfile ("%2d: <unset>\n", $last_printed); }
+ printf $outfile ("%2d: %s\n", $i, &pchars($subs[$i]));
+ $last_printed = $i;
+ }
+ }
+ splice(@subs, 0, 18);
+ }
+ }
+ }
+ }
+
+printf $outfile "\n";
+
+# End
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pgrep.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pgrep.c
new file mode 100644
index 00000000..ad1b87ea
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/pgrep.c
@@ -0,0 +1,225 @@
+/*************************************************
+* PCRE grep program *
+*************************************************/
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#include "config.h"
+#include "pcre.h"
+
+#define FALSE 0
+#define TRUE 1
+
+typedef int BOOL;
+
+
+
+/*************************************************
+* Global variables *
+*************************************************/
+
+static pcre *pattern;
+static pcre_extra *hints;
+
+static BOOL count_only = FALSE;
+static BOOL filenames_only = FALSE;
+static BOOL invert = FALSE;
+static BOOL number = FALSE;
+static BOOL silent = FALSE;
+static BOOL whole_lines = FALSE;
+
+
+
+#if ! HAVE_STRERROR
+/*************************************************
+* Provide strerror() for non-ANSI libraries *
+*************************************************/
+
+/* Some old-fashioned systems still around (e.g. SunOS4) don't have strerror()
+in their libraries, but can provide the same facility by this simple
+alternative function. */
+
+extern int sys_nerr;
+extern char *sys_errlist[];
+
+char *
+strerror(int n)
+{
+if (n < 0 || n >= sys_nerr) return "unknown error number";
+return sys_errlist[n];
+}
+#endif /* HAVE_STRERROR */
+
+
+
+/*************************************************
+* Grep an individual file *
+*************************************************/
+
+static int
+pgrep(FILE *in, char *name)
+{
+int rc = 1;
+int linenumber = 0;
+int count = 0;
+int offsets[99];
+char buffer[BUFSIZ];
+
+while (fgets(buffer, sizeof(buffer), in) != NULL)
+ {
+ BOOL match;
+ int length = (int)strlen(buffer);
+ if (length > 0 && buffer[length-1] == '\n') buffer[--length] = 0;
+ linenumber++;
+
+ match = pcre_exec(pattern, hints, buffer, length, 0, 0, offsets, 99) >= 0;
+ if (match && whole_lines && offsets[1] != length) match = FALSE;
+
+ if (match != invert)
+ {
+ if (count_only) count++;
+
+ else if (filenames_only)
+ {
+ fprintf(stdout, "%s\n", (name == NULL)? "<stdin>" : name);
+ return 0;
+ }
+
+ else if (silent) return 0;
+
+ else
+ {
+ if (name != NULL) fprintf(stdout, "%s:", name);
+ if (number) fprintf(stdout, "%d:", linenumber);
+ fprintf(stdout, "%s\n", buffer);
+ }
+
+ rc = 0;
+ }
+ }
+
+if (count_only)
+ {
+ if (name != NULL) fprintf(stdout, "%s:", name);
+ fprintf(stdout, "%d\n", count);
+ }
+
+return rc;
+}
+
+
+
+
+/*************************************************
+* Usage function *
+*************************************************/
+
+static int
+usage(int rc)
+{
+fprintf(stderr, "Usage: pgrep [-Vchilnsvx] pattern [file] ...\n");
+return rc;
+}
+
+
+
+
+/*************************************************
+* Main program *
+*************************************************/
+
+int
+main(int argc, char **argv)
+{
+int i;
+int rc = 1;
+int options = 0;
+int errptr;
+const char *error;
+BOOL filenames = TRUE;
+
+/* Process the options */
+
+for (i = 1; i < argc; i++)
+ {
+ char *s;
+ if (argv[i][0] != '-') break;
+ s = argv[i] + 1;
+ while (*s != 0)
+ {
+ switch (*s++)
+ {
+ case 'c': count_only = TRUE; break;
+ case 'h': filenames = FALSE; break;
+ case 'i': options |= PCRE_CASELESS; break;
+ case 'l': filenames_only = TRUE;
+ case 'n': number = TRUE; break;
+ case 's': silent = TRUE; break;
+ case 'v': invert = TRUE; break;
+ case 'x': whole_lines = TRUE; options |= PCRE_ANCHORED; break;
+
+ case 'V':
+ fprintf(stderr, "PCRE version %s\n", pcre_version());
+ break;
+
+ default:
+ fprintf(stderr, "pgrep: unknown option %c\n", s[-1]);
+ return usage(2);
+ }
+ }
+ }
+
+/* There must be at least a regexp argument */
+
+if (i >= argc) return usage(0);
+
+/* Compile the regular expression. */
+
+pattern = pcre_compile(argv[i++], options, &error, &errptr, NULL);
+if (pattern == NULL)
+ {
+ fprintf(stderr, "pgrep: error in regex at offset %d: %s\n", errptr, error);
+ return 2;
+ }
+
+/* Study the regular expression, as we will be running it may times */
+
+hints = pcre_study(pattern, 0, &error);
+if (error != NULL)
+ {
+ fprintf(stderr, "pgrep: error while studing regex: %s\n", error);
+ return 2;
+ }
+
+/* If there are no further arguments, do the business on stdin and exit */
+
+if (i >= argc) return pgrep(stdin, NULL);
+
+/* Otherwise, work through the remaining arguments as files. If there is only
+one, don't give its name on the output. */
+
+if (i == argc - 1) filenames = FALSE;
+if (filenames_only) filenames = TRUE;
+
+for (; i < argc; i++)
+ {
+ FILE *in = fopen(argv[i], "r");
+ if (in == NULL)
+ {
+ fprintf(stderr, "%s: failed to open: %s\n", argv[i], strerror(errno));
+ rc = 2;
+ }
+ else
+ {
+ int frc = pgrep(in, filenames? argv[i] : NULL);
+ if (frc == 0 && rc == 1) rc = 0;
+ fclose(in);
+ }
+ }
+
+return rc;
+}
+
+/* End */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/printint.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/printint.c
new file mode 100644
index 00000000..ed184958
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/printint.c
@@ -0,0 +1,471 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/*
+This is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language. See
+the file Tech.Notes for some information on the internals.
+
+Written by: Philip Hazel <ph10@cam.ac.uk>
+
+ Copyright (c) 1997-2004 University of Cambridge
+
+-----------------------------------------------------------------------------
+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.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+-----------------------------------------------------------------------------
+*/
+
+
+/* This module contains a debugging function for printing out the internal form
+of a compiled regular expression. It is kept in a separate file so that it can
+be #included both in the pcretest program, and in the library itself when
+compiled with the debugging switch. */
+
+
+static const char *OP_names[] = { OP_NAME_LIST };
+
+
+/*************************************************
+* Print single- or multi-byte character *
+*************************************************/
+
+/* These tables are actually copies of ones in pcre.c. If we compile the
+library with debugging, they are included twice, but that isn't really a
+problem - compiling with debugging is pretty rare and these are very small. */
+
+static const int utf8_t3[] = { 0xff, 0x1f, 0x0f, 0x07, 0x03, 0x01};
+
+static const uschar utf8_t4[] = {
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 };
+
+static int
+print_char(FILE *f, uschar *ptr, BOOL utf8)
+{
+int c = *ptr;
+
+if (!utf8 || (c & 0xc0) != 0xc0)
+ {
+ if (isprint(c)) fprintf(f, "%c", c); else fprintf(f, "\\x%02x", c);
+ return 0;
+ }
+else
+ {
+ int i;
+ int a = utf8_t4[c & 0x3f]; /* Number of additional bytes */
+ int s = 6*a;
+ c = (c & utf8_t3[a]) << s;
+ for (i = 1; i <= a; i++)
+ {
+ /* This is a check for malformed UTF-8; it should only occur if the sanity
+ check has been turned off. Rather than swallow random bytes, just stop if
+ we hit a bad one. Print it with \X instead of \x as an indication. */
+
+ if ((ptr[i] & 0xc0) != 0x80)
+ {
+ fprintf(f, "\\X{%x}", c);
+ return i - 1;
+ }
+
+ /* The byte is OK */
+
+ s -= 6;
+ c |= (ptr[i] & 0x3f) << s;
+ }
+ if (c < 128) fprintf(f, "\\x%02x", c); else fprintf(f, "\\x{%x}", c);
+ return a;
+ }
+}
+
+
+
+
+#ifdef SUPPORT_UCP
+/*************************************************
+* Find Unicode property name *
+*************************************************/
+
+static const char *
+get_ucpname(int property)
+{
+int i;
+for (i = sizeof(utt)/sizeof(ucp_type_table); i >= 0; i--)
+ {
+ if (property == utt[i].value) break;
+ }
+return (i >= 0)? utt[i].name : "??";
+}
+#endif /* SUPPORT_UCP */
+
+
+
+/*************************************************
+* Print compiled regex *
+*************************************************/
+
+/* Make this function work for a regex with integers either byte order.
+However, we assume that what we are passed is a compiled regex. */
+
+static void
+print_internals(pcre *external_re, FILE *f)
+{
+real_pcre *re = (real_pcre *)external_re;
+uschar *codestart, *code;
+BOOL utf8;
+
+unsigned int options = re->options;
+int offset = re->name_table_offset;
+int count = re->name_count;
+int size = re->name_entry_size;
+
+if (re->magic_number != MAGIC_NUMBER)
+ {
+ offset = ((offset << 8) & 0xff00) | ((offset >> 8) & 0xff);
+ count = ((count << 8) & 0xff00) | ((count >> 8) & 0xff);
+ size = ((size << 8) & 0xff00) | ((size >> 8) & 0xff);
+ options = ((options << 24) & 0xff000000) |
+ ((options << 8) & 0x00ff0000) |
+ ((options >> 8) & 0x0000ff00) |
+ ((options >> 24) & 0x000000ff);
+ }
+
+code = codestart = (uschar *)re + offset + count * size;
+utf8 = (options & PCRE_UTF8) != 0;
+
+for(;;)
+ {
+ uschar *ccode;
+ int c;
+ int extra = 0;
+
+ fprintf(f, "%3d ", code - codestart);
+
+ if (*code >= OP_BRA)
+ {
+ if (*code - OP_BRA > EXTRACT_BASIC_MAX)
+ fprintf(f, "%3d Bra extra\n", GET(code, 1));
+ else
+ fprintf(f, "%3d Bra %d\n", GET(code, 1), *code - OP_BRA);
+ code += OP_lengths[OP_BRA];
+ continue;
+ }
+
+ switch(*code)
+ {
+ case OP_END:
+ fprintf(f, " %s\n", OP_names[*code]);
+ fprintf(f, "------------------------------------------------------------------\n");
+ return;
+
+ case OP_OPT:
+ fprintf(f, " %.2x %s", code[1], OP_names[*code]);
+ break;
+
+ case OP_CHAR:
+ {
+ fprintf(f, " ");
+ do
+ {
+ code++;
+ code += 1 + print_char(f, code, utf8);
+ }
+ while (*code == OP_CHAR);
+ fprintf(f, "\n");
+ continue;
+ }
+ break;
+
+ case OP_CHARNC:
+ {
+ fprintf(f, " NC ");
+ do
+ {
+ code++;
+ code += 1 + print_char(f, code, utf8);
+ }
+ while (*code == OP_CHARNC);
+ fprintf(f, "\n");
+ continue;
+ }
+ break;
+
+ case OP_KETRMAX:
+ case OP_KETRMIN:
+ case OP_ALT:
+ case OP_KET:
+ case OP_ASSERT:
+ case OP_ASSERT_NOT:
+ case OP_ASSERTBACK:
+ case OP_ASSERTBACK_NOT:
+ case OP_ONCE:
+ case OP_COND:
+ case OP_REVERSE:
+ fprintf(f, "%3d %s", GET(code, 1), OP_names[*code]);
+ break;
+
+ case OP_BRANUMBER:
+ printf("%3d %s", GET2(code, 1), OP_names[*code]);
+ break;
+
+ case OP_CREF:
+ if (GET2(code, 1) == CREF_RECURSE)
+ fprintf(f, " Cond recurse");
+ else
+ fprintf(f, "%3d %s", GET2(code,1), OP_names[*code]);
+ break;
+
+ case OP_STAR:
+ case OP_MINSTAR:
+ case OP_PLUS:
+ case OP_MINPLUS:
+ case OP_QUERY:
+ case OP_MINQUERY:
+ case OP_TYPESTAR:
+ case OP_TYPEMINSTAR:
+ case OP_TYPEPLUS:
+ case OP_TYPEMINPLUS:
+ case OP_TYPEQUERY:
+ case OP_TYPEMINQUERY:
+ fprintf(f, " ");
+ if (*code >= OP_TYPESTAR)
+ {
+ fprintf(f, "%s", OP_names[code[1]]);
+#ifdef SUPPORT_UCP
+ if (code[1] == OP_PROP || code[1] == OP_NOTPROP)
+ {
+ fprintf(f, " %s ", get_ucpname(code[2]));
+ extra = 1;
+ }
+#endif
+ }
+ else extra = print_char(f, code+1, utf8);
+ fprintf(f, "%s", OP_names[*code]);
+ break;
+
+ case OP_EXACT:
+ case OP_UPTO:
+ case OP_MINUPTO:
+ fprintf(f, " ");
+ extra = print_char(f, code+3, utf8);
+ fprintf(f, "{");
+ if (*code != OP_EXACT) fprintf(f, ",");
+ fprintf(f, "%d}", GET2(code,1));
+ if (*code == OP_MINUPTO) fprintf(f, "?");
+ break;
+
+ case OP_TYPEEXACT:
+ case OP_TYPEUPTO:
+ case OP_TYPEMINUPTO:
+ fprintf(f, " %s", OP_names[code[3]]);
+#ifdef SUPPORT_UCP
+ if (code[3] == OP_PROP || code[3] == OP_NOTPROP)
+ {
+ fprintf(f, " %s ", get_ucpname(code[4]));
+ extra = 1;
+ }
+#endif
+ fprintf(f, "{");
+ if (*code != OP_TYPEEXACT) fprintf(f, "0,");
+ fprintf(f, "%d}", GET2(code,1));
+ if (*code == OP_TYPEMINUPTO) fprintf(f, "?");
+ break;
+
+ case OP_NOT:
+ if (isprint(c = code[1])) fprintf(f, " [^%c]", c);
+ else fprintf(f, " [^\\x%02x]", c);
+ break;
+
+ case OP_NOTSTAR:
+ case OP_NOTMINSTAR:
+ case OP_NOTPLUS:
+ case OP_NOTMINPLUS:
+ case OP_NOTQUERY:
+ case OP_NOTMINQUERY:
+ if (isprint(c = code[1])) fprintf(f, " [^%c]", c);
+ else fprintf(f, " [^\\x%02x]", c);
+ fprintf(f, "%s", OP_names[*code]);
+ break;
+
+ case OP_NOTEXACT:
+ case OP_NOTUPTO:
+ case OP_NOTMINUPTO:
+ if (isprint(c = code[3])) fprintf(f, " [^%c]{", c);
+ else fprintf(f, " [^\\x%02x]{", c);
+ if (*code != OP_NOTEXACT) fprintf(f, ",");
+ fprintf(f, "%d}", GET2(code,1));
+ if (*code == OP_NOTMINUPTO) fprintf(f, "?");
+ break;
+
+ case OP_RECURSE:
+ fprintf(f, "%3d %s", GET(code, 1), OP_names[*code]);
+ break;
+
+ case OP_REF:
+ fprintf(f, " \\%d", GET2(code,1));
+ ccode = code + OP_lengths[*code];
+ goto CLASS_REF_REPEAT;
+
+ case OP_CALLOUT:
+ fprintf(f, " %s %d %d %d", OP_names[*code], code[1], GET(code,2),
+ GET(code, 2 + LINK_SIZE));
+ break;
+
+#ifdef SUPPORT_UCP
+ case OP_PROP:
+ case OP_NOTPROP:
+ fprintf(f, " %s %s", OP_names[*code], get_ucpname(code[1]));
+ break;
+#endif
+
+ /* OP_XCLASS can only occur in UTF-8 mode. However, there's no harm in
+ having this code always here, and it makes it less messy without all those
+ #ifdefs. */
+
+ case OP_CLASS:
+ case OP_NCLASS:
+ case OP_XCLASS:
+ {
+ int i, min, max;
+ BOOL printmap;
+
+ fprintf(f, " [");
+
+ if (*code == OP_XCLASS)
+ {
+ extra = GET(code, 1);
+ ccode = code + LINK_SIZE + 1;
+ printmap = (*ccode & XCL_MAP) != 0;
+ if ((*ccode++ & XCL_NOT) != 0) fprintf(f, "^");
+ }
+ else
+ {
+ printmap = TRUE;
+ ccode = code + 1;
+ }
+
+ /* Print a bit map */
+
+ if (printmap)
+ {
+ for (i = 0; i < 256; i++)
+ {
+ if ((ccode[i/8] & (1 << (i&7))) != 0)
+ {
+ int j;
+ for (j = i+1; j < 256; j++)
+ if ((ccode[j/8] & (1 << (j&7))) == 0) break;
+ if (i == '-' || i == ']') fprintf(f, "\\");
+ if (isprint(i)) fprintf(f, "%c", i); else fprintf(f, "\\x%02x", i);
+ if (--j > i)
+ {
+ if (j != i + 1) fprintf(f, "-");
+ if (j == '-' || j == ']') fprintf(f, "\\");
+ if (isprint(j)) fprintf(f, "%c", j); else fprintf(f, "\\x%02x", j);
+ }
+ i = j;
+ }
+ }
+ ccode += 32;
+ }
+
+ /* For an XCLASS there is always some additional data */
+
+ if (*code == OP_XCLASS)
+ {
+ int ch;
+ while ((ch = *ccode++) != XCL_END)
+ {
+#ifdef SUPPORT_UCP
+ if (ch == XCL_PROP)
+ {
+ fprintf(f, "\\p{%s}", get_ucpname(*ccode++));
+ }
+ else if (ch == XCL_NOTPROP)
+ {
+ fprintf(f, "\\P{%s}", get_ucpname(*ccode++));
+ }
+ else
+#endif
+ {
+ ccode += 1 + print_char(f, ccode, TRUE);
+ if (ch == XCL_RANGE)
+ {
+ fprintf(f, "-");
+ ccode += 1 + print_char(f, ccode, TRUE);
+ }
+ }
+ }
+ }
+
+ /* Indicate a non-UTF8 class which was created by negation */
+
+ fprintf(f, "]%s", (*code == OP_NCLASS)? " (neg)" : "");
+
+ /* Handle repeats after a class or a back reference */
+
+ CLASS_REF_REPEAT:
+ switch(*ccode)
+ {
+ case OP_CRSTAR:
+ case OP_CRMINSTAR:
+ case OP_CRPLUS:
+ case OP_CRMINPLUS:
+ case OP_CRQUERY:
+ case OP_CRMINQUERY:
+ fprintf(f, "%s", OP_names[*ccode]);
+ extra += OP_lengths[*ccode];
+ break;
+
+ case OP_CRRANGE:
+ case OP_CRMINRANGE:
+ min = GET2(ccode,1);
+ max = GET2(ccode,3);
+ if (max == 0) fprintf(f, "{%d,}", min);
+ else fprintf(f, "{%d,%d}", min, max);
+ if (*ccode == OP_CRMINRANGE) fprintf(f, "?");
+ extra += OP_lengths[*ccode];
+ break;
+ }
+ }
+ break;
+
+ /* Anything else is just an item with no data*/
+
+ default:
+ fprintf(f, " %s", OP_names[*code]);
+ break;
+ }
+
+ code += OP_lengths[*code] + extra;
+ fprintf(f, "\n");
+ }
+}
+
+/* End of printint.c */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/study.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/study.c
new file mode 100644
index 00000000..d67070a4
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/study.c
@@ -0,0 +1,484 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/*
+This is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language. See
+the file Tech.Notes for some information on the internals.
+
+Written by: Philip Hazel <ph10@cam.ac.uk>
+
+ Copyright (c) 1997-2004 University of Cambridge
+
+-----------------------------------------------------------------------------
+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.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+-----------------------------------------------------------------------------
+*/
+
+
+/* Include the internals header, which itself includes Standard C headers plus
+the external pcre header. */
+
+#include "internal.h"
+
+
+
+/*************************************************
+* Set a bit and maybe its alternate case *
+*************************************************/
+
+/* Given a character, set its bit in the table, and also the bit for the other
+version of a letter if we are caseless.
+
+Arguments:
+ start_bits points to the bit map
+ c is the character
+ caseless the caseless flag
+ cd the block with char table pointers
+
+Returns: nothing
+*/
+
+static void
+set_bit(uschar *start_bits, unsigned int c, BOOL caseless, compile_data *cd)
+{
+start_bits[c/8] |= (1 << (c&7));
+if (caseless && (cd->ctypes[c] & ctype_letter) != 0)
+ start_bits[cd->fcc[c]/8] |= (1 << (cd->fcc[c]&7));
+}
+
+
+
+/*************************************************
+* Create bitmap of starting chars *
+*************************************************/
+
+/* This function scans a compiled unanchored expression and attempts to build a
+bitmap of the set of initial characters. If it can't, it returns FALSE. As time
+goes by, we may be able to get more clever at doing this.
+
+Arguments:
+ code points to an expression
+ start_bits points to a 32-byte table, initialized to 0
+ caseless the current state of the caseless flag
+ utf8 TRUE if in UTF-8 mode
+ cd the block with char table pointers
+
+Returns: TRUE if table built, FALSE otherwise
+*/
+
+static BOOL
+set_start_bits(const uschar *code, uschar *start_bits, BOOL caseless,
+ BOOL utf8, compile_data *cd)
+{
+register int c;
+
+/* This next statement and the later reference to dummy are here in order to
+trick the optimizer of the IBM C compiler for OS/2 into generating correct
+code. Apparently IBM isn't going to fix the problem, and we would rather not
+disable optimization (in this module it actually makes a big difference, and
+the pcre module can use all the optimization it can get). */
+
+volatile int dummy;
+
+do
+ {
+ const uschar *tcode = code + 1 + LINK_SIZE;
+ BOOL try_next = TRUE;
+
+ while (try_next)
+ {
+ /* If a branch starts with a bracket or a positive lookahead assertion,
+ recurse to set bits from within them. That's all for this branch. */
+
+ if ((int)*tcode >= OP_BRA || *tcode == OP_ASSERT)
+ {
+ if (!set_start_bits(tcode, start_bits, caseless, utf8, cd))
+ return FALSE;
+ try_next = FALSE;
+ }
+
+ else switch(*tcode)
+ {
+ default:
+ return FALSE;
+
+ /* Skip over callout */
+
+ case OP_CALLOUT:
+ tcode += 2 + 2*LINK_SIZE;
+ break;
+
+ /* Skip over extended extraction bracket number */
+
+ case OP_BRANUMBER:
+ tcode += 3;
+ break;
+
+ /* Skip over lookbehind and negative lookahead assertions */
+
+ case OP_ASSERT_NOT:
+ case OP_ASSERTBACK:
+ case OP_ASSERTBACK_NOT:
+ do tcode += GET(tcode, 1); while (*tcode == OP_ALT);
+ tcode += 1+LINK_SIZE;
+ break;
+
+ /* Skip over an option setting, changing the caseless flag */
+
+ case OP_OPT:
+ caseless = (tcode[1] & PCRE_CASELESS) != 0;
+ tcode += 2;
+ break;
+
+ /* BRAZERO does the bracket, but carries on. */
+
+ case OP_BRAZERO:
+ case OP_BRAMINZERO:
+ if (!set_start_bits(++tcode, start_bits, caseless, utf8, cd))
+ return FALSE;
+ dummy = 1;
+ do tcode += GET(tcode,1); while (*tcode == OP_ALT);
+ tcode += 1+LINK_SIZE;
+ break;
+
+ /* Single-char * or ? sets the bit and tries the next item */
+
+ case OP_STAR:
+ case OP_MINSTAR:
+ case OP_QUERY:
+ case OP_MINQUERY:
+ set_bit(start_bits, tcode[1], caseless, cd);
+ tcode += 2;
+#ifdef SUPPORT_UTF8
+ if (utf8) while ((*tcode & 0xc0) == 0x80) tcode++;
+#endif
+ break;
+
+ /* Single-char upto sets the bit and tries the next */
+
+ case OP_UPTO:
+ case OP_MINUPTO:
+ set_bit(start_bits, tcode[3], caseless, cd);
+ tcode += 4;
+#ifdef SUPPORT_UTF8
+ if (utf8) while ((*tcode & 0xc0) == 0x80) tcode++;
+#endif
+ break;
+
+ /* At least one single char sets the bit and stops */
+
+ case OP_EXACT: /* Fall through */
+ tcode += 2;
+
+ case OP_CHAR:
+ case OP_CHARNC:
+ case OP_PLUS:
+ case OP_MINPLUS:
+ set_bit(start_bits, tcode[1], caseless, cd);
+ try_next = FALSE;
+ break;
+
+ /* Single character type sets the bits and stops */
+
+ case OP_NOT_DIGIT:
+ for (c = 0; c < 32; c++)
+ start_bits[c] |= ~cd->cbits[c+cbit_digit];
+ try_next = FALSE;
+ break;
+
+ case OP_DIGIT:
+ for (c = 0; c < 32; c++)
+ start_bits[c] |= cd->cbits[c+cbit_digit];
+ try_next = FALSE;
+ break;
+
+ case OP_NOT_WHITESPACE:
+ for (c = 0; c < 32; c++)
+ start_bits[c] |= ~cd->cbits[c+cbit_space];
+ try_next = FALSE;
+ break;
+
+ case OP_WHITESPACE:
+ for (c = 0; c < 32; c++)
+ start_bits[c] |= cd->cbits[c+cbit_space];
+ try_next = FALSE;
+ break;
+
+ case OP_NOT_WORDCHAR:
+ for (c = 0; c < 32; c++)
+ start_bits[c] |= ~cd->cbits[c+cbit_word];
+ try_next = FALSE;
+ break;
+
+ case OP_WORDCHAR:
+ for (c = 0; c < 32; c++)
+ start_bits[c] |= cd->cbits[c+cbit_word];
+ try_next = FALSE;
+ break;
+
+ /* One or more character type fudges the pointer and restarts, knowing
+ it will hit a single character type and stop there. */
+
+ case OP_TYPEPLUS:
+ case OP_TYPEMINPLUS:
+ tcode++;
+ break;
+
+ case OP_TYPEEXACT:
+ tcode += 3;
+ break;
+
+ /* Zero or more repeats of character types set the bits and then
+ try again. */
+
+ case OP_TYPEUPTO:
+ case OP_TYPEMINUPTO:
+ tcode += 2; /* Fall through */
+
+ case OP_TYPESTAR:
+ case OP_TYPEMINSTAR:
+ case OP_TYPEQUERY:
+ case OP_TYPEMINQUERY:
+ switch(tcode[1])
+ {
+ case OP_ANY:
+ return FALSE;
+
+ case OP_NOT_DIGIT:
+ for (c = 0; c < 32; c++)
+ start_bits[c] |= ~cd->cbits[c+cbit_digit];
+ break;
+
+ case OP_DIGIT:
+ for (c = 0; c < 32; c++)
+ start_bits[c] |= cd->cbits[c+cbit_digit];
+ break;
+
+ case OP_NOT_WHITESPACE:
+ for (c = 0; c < 32; c++)
+ start_bits[c] |= ~cd->cbits[c+cbit_space];
+ break;
+
+ case OP_WHITESPACE:
+ for (c = 0; c < 32; c++)
+ start_bits[c] |= cd->cbits[c+cbit_space];
+ break;
+
+ case OP_NOT_WORDCHAR:
+ for (c = 0; c < 32; c++)
+ start_bits[c] |= ~cd->cbits[c+cbit_word];
+ break;
+
+ case OP_WORDCHAR:
+ for (c = 0; c < 32; c++)
+ start_bits[c] |= cd->cbits[c+cbit_word];
+ break;
+ }
+
+ tcode += 2;
+ break;
+
+ /* Character class where all the information is in a bit map: set the
+ bits and either carry on or not, according to the repeat count. If it was
+ a negative class, and we are operating with UTF-8 characters, any byte
+ with a value >= 0xc4 is a potentially valid starter because it starts a
+ character with a value > 255. */
+
+ case OP_NCLASS:
+ if (utf8)
+ {
+ start_bits[24] |= 0xf0; /* Bits for 0xc4 - 0xc8 */
+ memset(start_bits+25, 0xff, 7); /* Bits for 0xc9 - 0xff */
+ }
+ /* Fall through */
+
+ case OP_CLASS:
+ {
+ tcode++;
+
+ /* In UTF-8 mode, the bits in a bit map correspond to character
+ values, not to byte values. However, the bit map we are constructing is
+ for byte values. So we have to do a conversion for characters whose
+ value is > 127. In fact, there are only two possible starting bytes for
+ characters in the range 128 - 255. */
+
+ if (utf8)
+ {
+ for (c = 0; c < 16; c++) start_bits[c] |= tcode[c];
+ for (c = 128; c < 256; c++)
+ {
+ if ((tcode[c/8] && (1 << (c&7))) != 0)
+ {
+ int d = (c >> 6) | 0xc0; /* Set bit for this starter */
+ start_bits[d/8] |= (1 << (d&7)); /* and then skip on to the */
+ c = (c & 0xc0) + 0x40 - 1; /* next relevant character. */
+ }
+ }
+ }
+
+ /* In non-UTF-8 mode, the two bit maps are completely compatible. */
+
+ else
+ {
+ for (c = 0; c < 32; c++) start_bits[c] |= tcode[c];
+ }
+
+ /* Advance past the bit map, and act on what follows */
+
+ tcode += 32;
+ switch (*tcode)
+ {
+ case OP_CRSTAR:
+ case OP_CRMINSTAR:
+ case OP_CRQUERY:
+ case OP_CRMINQUERY:
+ tcode++;
+ break;
+
+ case OP_CRRANGE:
+ case OP_CRMINRANGE:
+ if (((tcode[1] << 8) + tcode[2]) == 0) tcode += 5;
+ else try_next = FALSE;
+ break;
+
+ default:
+ try_next = FALSE;
+ break;
+ }
+ }
+ break; /* End of bitmap class handling */
+
+ } /* End of switch */
+ } /* End of try_next loop */
+
+ code += GET(code, 1); /* Advance to next branch */
+ }
+while (*code == OP_ALT);
+return TRUE;
+}
+
+
+
+/*************************************************
+* Study a compiled expression *
+*************************************************/
+
+/* This function is handed a compiled expression that it must study to produce
+information that will speed up the matching. It returns a pcre_extra block
+which then gets handed back to pcre_exec().
+
+Arguments:
+ re points to the compiled expression
+ options contains option bits
+ errorptr points to where to place error messages;
+ set NULL unless error
+
+Returns: pointer to a pcre_extra block, with study_data filled in and the
+ appropriate flag set;
+ NULL on error or if no optimization possible
+*/
+
+EXPORT pcre_extra *
+pcre_study(const pcre *external_re, int options, const char **errorptr)
+{
+uschar start_bits[32];
+pcre_extra *extra;
+pcre_study_data *study;
+const uschar *tables;
+const real_pcre *re = (const real_pcre *)external_re;
+uschar *code = (uschar *)re + re->name_table_offset +
+ (re->name_count * re->name_entry_size);
+compile_data compile_block;
+
+*errorptr = NULL;
+
+if (re == NULL || re->magic_number != MAGIC_NUMBER)
+ {
+ *errorptr = "argument is not a compiled regular expression";
+ return NULL;
+ }
+
+if ((options & ~PUBLIC_STUDY_OPTIONS) != 0)
+ {
+ *errorptr = "unknown or incorrect option bit(s) set";
+ return NULL;
+ }
+
+/* For an anchored pattern, or an unanchored pattern that has a first char, or
+a multiline pattern that matches only at "line starts", no further processing
+at present. */
+
+if ((re->options & (PCRE_ANCHORED|PCRE_FIRSTSET|PCRE_STARTLINE)) != 0)
+ return NULL;
+
+/* Set the character tables in the block that is passed around */
+
+tables = re->tables;
+if (tables == NULL)
+ (void)pcre_fullinfo(external_re, NULL, PCRE_INFO_DEFAULT_TABLES, (void*)&tables);
+
+compile_block.lcc = tables + lcc_offset;
+compile_block.fcc = tables + fcc_offset;
+compile_block.cbits = tables + cbits_offset;
+compile_block.ctypes = tables + ctypes_offset;
+
+/* See if we can find a fixed set of initial characters for the pattern. */
+
+memset(start_bits, 0, 32 * sizeof(uschar));
+if (!set_start_bits(code, start_bits, (re->options & PCRE_CASELESS) != 0,
+ (re->options & PCRE_UTF8) != 0, &compile_block)) return NULL;
+
+/* Get a pcre_extra block and a pcre_study_data block. The study data is put in
+the latter, which is pointed to by the former, which may also get additional
+data set later by the calling program. At the moment, the size of
+pcre_study_data is fixed. We nevertheless save it in a field for returning via
+the pcre_fullinfo() function so that if it becomes variable in the future, we
+don't have to change that code. */
+
+extra = (pcre_extra *)(pcre_malloc)
+ (sizeof(pcre_extra) + sizeof(pcre_study_data));
+
+if (extra == NULL)
+ {
+ *errorptr = "failed to get memory";
+ return NULL;
+ }
+
+study = (pcre_study_data *)((char *)extra + sizeof(pcre_extra));
+extra->flags = PCRE_EXTRA_STUDY_DATA;
+extra->study_data = study;
+
+study->size = sizeof(pcre_study_data);
+study->options = PCRE_STUDY_MAPPED;
+memcpy(study->start_bits, start_bits, sizeof(start_bits));
+
+return extra;
+}
+
+/* End of study.c */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testinput1 b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testinput1
new file mode 100644
index 00000000..c4b99c66
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testinput1
@@ -0,0 +1,3841 @@
+/the quick brown fox/
+ the quick brown fox
+ The quick brown FOX
+ What do you know about the quick brown fox?
+ What do you know about THE QUICK BROWN FOX?
+
+/The quick brown fox/i
+ the quick brown fox
+ The quick brown FOX
+ What do you know about the quick brown fox?
+ What do you know about THE QUICK BROWN FOX?
+
+/abcd\t\n\r\f\a\e\071\x3b\$\\\?caxyz/
+ abcd\t\n\r\f\a\e9;\$\\?caxyz
+
+/a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/
+ abxyzpqrrrabbxyyyypqAzz
+ abxyzpqrrrabbxyyyypqAzz
+ aabxyzpqrrrabbxyyyypqAzz
+ aaabxyzpqrrrabbxyyyypqAzz
+ aaaabxyzpqrrrabbxyyyypqAzz
+ abcxyzpqrrrabbxyyyypqAzz
+ aabcxyzpqrrrabbxyyyypqAzz
+ aaabcxyzpqrrrabbxyyyypAzz
+ aaabcxyzpqrrrabbxyyyypqAzz
+ aaabcxyzpqrrrabbxyyyypqqAzz
+ aaabcxyzpqrrrabbxyyyypqqqAzz
+ aaabcxyzpqrrrabbxyyyypqqqqAzz
+ aaabcxyzpqrrrabbxyyyypqqqqqAzz
+ aaabcxyzpqrrrabbxyyyypqqqqqqAzz
+ aaaabcxyzpqrrrabbxyyyypqAzz
+ abxyzzpqrrrabbxyyyypqAzz
+ aabxyzzzpqrrrabbxyyyypqAzz
+ aaabxyzzzzpqrrrabbxyyyypqAzz
+ aaaabxyzzzzpqrrrabbxyyyypqAzz
+ abcxyzzpqrrrabbxyyyypqAzz
+ aabcxyzzzpqrrrabbxyyyypqAzz
+ aaabcxyzzzzpqrrrabbxyyyypqAzz
+ aaaabcxyzzzzpqrrrabbxyyyypqAzz
+ aaaabcxyzzzzpqrrrabbbxyyyypqAzz
+ aaaabcxyzzzzpqrrrabbbxyyyyypqAzz
+ aaabcxyzpqrrrabbxyyyypABzz
+ aaabcxyzpqrrrabbxyyyypABBzz
+ >>>aaabxyzpqrrrabbxyyyypqAzz
+ >aaaabxyzpqrrrabbxyyyypqAzz
+ >>>>abcxyzpqrrrabbxyyyypqAzz
+ *** Failers
+ abxyzpqrrabbxyyyypqAzz
+ abxyzpqrrrrabbxyyyypqAzz
+ abxyzpqrrrabxyyyypqAzz
+ aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz
+ aaaabcxyzzzzpqrrrabbbxyyypqAzz
+ aaabcxyzpqrrrabbxyyyypqqqqqqqAzz
+
+/^(abc){1,2}zz/
+ abczz
+ abcabczz
+ *** Failers
+ zz
+ abcabcabczz
+ >>abczz
+
+/^(b+?|a){1,2}?c/
+ bc
+ bbc
+ bbbc
+ bac
+ bbac
+ aac
+ abbbbbbbbbbbc
+ bbbbbbbbbbbac
+ *** Failers
+ aaac
+ abbbbbbbbbbbac
+
+/^(b+|a){1,2}c/
+ bc
+ bbc
+ bbbc
+ bac
+ bbac
+ aac
+ abbbbbbbbbbbc
+ bbbbbbbbbbbac
+ *** Failers
+ aaac
+ abbbbbbbbbbbac
+
+/^(b+|a){1,2}?bc/
+ bbc
+
+/^(b*|ba){1,2}?bc/
+ babc
+ bbabc
+ bababc
+ *** Failers
+ bababbc
+ babababc
+
+/^(ba|b*){1,2}?bc/
+ babc
+ bbabc
+ bababc
+ *** Failers
+ bababbc
+ babababc
+
+/^\ca\cA\c[\c{\c:/
+ \x01\x01\e;z
+
+/^[ab\]cde]/
+ athing
+ bthing
+ ]thing
+ cthing
+ dthing
+ ething
+ *** Failers
+ fthing
+ [thing
+ \\thing
+
+/^[]cde]/
+ ]thing
+ cthing
+ dthing
+ ething
+ *** Failers
+ athing
+ fthing
+
+/^[^ab\]cde]/
+ fthing
+ [thing
+ \\thing
+ *** Failers
+ athing
+ bthing
+ ]thing
+ cthing
+ dthing
+ ething
+
+/^[^]cde]/
+ athing
+ fthing
+ *** Failers
+ ]thing
+ cthing
+ dthing
+ ething
+
+/^\/
+
+
+/^ÿ/
+ ÿ
+
+/^[0-9]+$/
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+ 10
+ 100
+ *** Failers
+ abc
+
+/^.*nter/
+ enter
+ inter
+ uponter
+
+/^xxx[0-9]+$/
+ xxx0
+ xxx1234
+ *** Failers
+ xxx
+
+/^.+[0-9][0-9][0-9]$/
+ x123
+ xx123
+ 123456
+ *** Failers
+ 123
+ x1234
+
+/^.+?[0-9][0-9][0-9]$/
+ x123
+ xx123
+ 123456
+ *** Failers
+ 123
+ x1234
+
+/^([^!]+)!(.+)=apquxz\.ixr\.zzz\.ac\.uk$/
+ abc!pqr=apquxz.ixr.zzz.ac.uk
+ *** Failers
+ !pqr=apquxz.ixr.zzz.ac.uk
+ abc!=apquxz.ixr.zzz.ac.uk
+ abc!pqr=apquxz:ixr.zzz.ac.uk
+ abc!pqr=apquxz.ixr.zzz.ac.ukk
+
+/:/
+ Well, we need a colon: somewhere
+ *** Fail if we don't
+
+/([\da-f:]+)$/i
+ 0abc
+ abc
+ fed
+ E
+ ::
+ 5f03:12C0::932e
+ fed def
+ Any old stuff
+ *** Failers
+ 0zzz
+ gzzz
+ fed\x20
+ Any old rubbish
+
+/^.*\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/
+ .1.2.3
+ A.12.123.0
+ *** Failers
+ .1.2.3333
+ 1.2.3
+ 1234.2.3
+
+/^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/
+ 1 IN SOA non-sp1 non-sp2(
+ 1 IN SOA non-sp1 non-sp2 (
+ *** Failers
+ 1IN SOA non-sp1 non-sp2(
+
+/^[a-zA-Z\d][a-zA-Z\d\-]*(\.[a-zA-Z\d][a-zA-z\d\-]*)*\.$/
+ a.
+ Z.
+ 2.
+ ab-c.pq-r.
+ sxk.zzz.ac.uk.
+ x-.y-.
+ *** Failers
+ -abc.peq.
+
+/^\*\.[a-z]([a-z\-\d]*[a-z\d]+)?(\.[a-z]([a-z\-\d]*[a-z\d]+)?)*$/
+ *.a
+ *.b0-a
+ *.c3-b.c
+ *.c-a.b-c
+ *** Failers
+ *.0
+ *.a-
+ *.a-b.c-
+ *.c-a.0-c
+
+/^(?=ab(de))(abd)(e)/
+ abde
+
+/^(?!(ab)de|x)(abd)(f)/
+ abdf
+
+/^(?=(ab(cd)))(ab)/
+ abcd
+
+/^[\da-f](\.[\da-f])*$/i
+ a.b.c.d
+ A.B.C.D
+ a.b.c.1.2.3.C
+
+/^\".*\"\s*(;.*)?$/
+ \"1234\"
+ \"abcd\" ;
+ \"\" ; rhubarb
+ *** Failers
+ \"1234\" : things
+
+/^$/
+ \
+ *** Failers
+
+/ ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/x
+ ab c
+ *** Failers
+ abc
+ ab cde
+
+/(?x) ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/
+ ab c
+ *** Failers
+ abc
+ ab cde
+
+/^ a\ b[c ]d $/x
+ a bcd
+ a b d
+ *** Failers
+ abcd
+ ab d
+
+/^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$/
+ abcdefhijklm
+
+/^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$/
+ abcdefhijklm
+
+/^[\w][\W][\s][\S][\d][\D][\b][\n][\c]][\022]/
+ a+ Z0+\x08\n\x1d\x12
+
+/^[.^$|()*+?{,}]+/
+ .^\$(*+)|{?,?}
+
+/^a*\w/
+ z
+ az
+ aaaz
+ a
+ aa
+ aaaa
+ a+
+ aa+
+
+/^a*?\w/
+ z
+ az
+ aaaz
+ a
+ aa
+ aaaa
+ a+
+ aa+
+
+/^a+\w/
+ az
+ aaaz
+ aa
+ aaaa
+ aa+
+
+/^a+?\w/
+ az
+ aaaz
+ aa
+ aaaa
+ aa+
+
+/^\d{8}\w{2,}/
+ 1234567890
+ 12345678ab
+ 12345678__
+ *** Failers
+ 1234567
+
+/^[aeiou\d]{4,5}$/
+ uoie
+ 1234
+ 12345
+ aaaaa
+ *** Failers
+ 123456
+
+/^[aeiou\d]{4,5}?/
+ uoie
+ 1234
+ 12345
+ aaaaa
+ 123456
+
+/\A(abc|def)=(\1){2,3}\Z/
+ abc=abcabc
+ def=defdefdef
+ *** Failers
+ abc=defdef
+
+/^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\11*(\3\4)\1(?#)2$/
+ abcdefghijkcda2
+ abcdefghijkkkkcda2
+
+/(cat(a(ract|tonic)|erpillar)) \1()2(3)/
+ cataract cataract23
+ catatonic catatonic23
+ caterpillar caterpillar23
+
+
+/^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]/
+ From abcd Mon Sep 01 12:33:02 1997
+
+/^From\s+\S+\s+([a-zA-Z]{3}\s+){2}\d{1,2}\s+\d\d:\d\d/
+ From abcd Mon Sep 01 12:33:02 1997
+ From abcd Mon Sep 1 12:33:02 1997
+ *** Failers
+ From abcd Sep 01 12:33:02 1997
+
+/^12.34/s
+ 12\n34
+ 12\r34
+
+/\w+(?=\t)/
+ the quick brown\t fox
+
+/foo(?!bar)(.*)/
+ foobar is foolish see?
+
+/(?:(?!foo)...|^.{0,2})bar(.*)/
+ foobar crowbar etc
+ barrel
+ 2barrel
+ A barrel
+
+/^(\D*)(?=\d)(?!123)/
+ abc456
+ *** Failers
+ abc123
+
+/^1234(?# test newlines
+ inside)/
+ 1234
+
+/^1234 #comment in extended re
+ /x
+ 1234
+
+/#rhubarb
+ abcd/x
+ abcd
+
+/^abcd#rhubarb/x
+ abcd
+
+/^(a)\1{2,3}(.)/
+ aaab
+ aaaab
+ aaaaab
+ aaaaaab
+
+/(?!^)abc/
+ the abc
+ *** Failers
+ abc
+
+/(?=^)abc/
+ abc
+ *** Failers
+ the abc
+
+/^[ab]{1,3}(ab*|b)/
+ aabbbbb
+
+/^[ab]{1,3}?(ab*|b)/
+ aabbbbb
+
+/^[ab]{1,3}?(ab*?|b)/
+ aabbbbb
+
+/^[ab]{1,3}(ab*?|b)/
+ aabbbbb
+
+/ (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* # optional leading comment
+(?: (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+" (?: # opening quote...
+[^\\\x80-\xff\n\015"] # Anything except backslash and quote
+| # or
+\\ [^\x80-\xff] # Escaped something (something != CR)
+)* " # closing quote
+) # initial word
+(?: (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* \. (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+" (?: # opening quote...
+[^\\\x80-\xff\n\015"] # Anything except backslash and quote
+| # or
+\\ [^\x80-\xff] # Escaped something (something != CR)
+)* " # closing quote
+) )* # further okay, if led by a period
+(?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* @ (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+| \[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+) # initial subdomain
+(?: #
+(?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* \. # if led by a period...
+(?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+| \[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+) # ...further okay
+)*
+# address
+| # or
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+" (?: # opening quote...
+[^\\\x80-\xff\n\015"] # Anything except backslash and quote
+| # or
+\\ [^\x80-\xff] # Escaped something (something != CR)
+)* " # closing quote
+) # one word, optionally followed by....
+(?:
+[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] | # atom and space parts, or...
+\(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) | # comments, or...
+
+" (?: # opening quote...
+[^\\\x80-\xff\n\015"] # Anything except backslash and quote
+| # or
+\\ [^\x80-\xff] # Escaped something (something != CR)
+)* " # closing quote
+# quoted strings
+)*
+< (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* # leading <
+(?: @ (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+| \[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+) # initial subdomain
+(?: #
+(?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* \. # if led by a period...
+(?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+| \[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+) # ...further okay
+)*
+
+(?: (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* , (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* @ (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+| \[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+) # initial subdomain
+(?: #
+(?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* \. # if led by a period...
+(?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+| \[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+) # ...further okay
+)*
+)* # further okay, if led by comma
+: # closing colon
+(?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* )? # optional route
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+" (?: # opening quote...
+[^\\\x80-\xff\n\015"] # Anything except backslash and quote
+| # or
+\\ [^\x80-\xff] # Escaped something (something != CR)
+)* " # closing quote
+) # initial word
+(?: (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* \. (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+" (?: # opening quote...
+[^\\\x80-\xff\n\015"] # Anything except backslash and quote
+| # or
+\\ [^\x80-\xff] # Escaped something (something != CR)
+)* " # closing quote
+) )* # further okay, if led by a period
+(?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* @ (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+| \[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+) # initial subdomain
+(?: #
+(?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* \. # if led by a period...
+(?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+| \[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+) # ...further okay
+)*
+# address spec
+(?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* > # trailing >
+# name and address
+) (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* # optional trailing comment
+/x
+ Alan Other <user\@dom.ain>
+ <user\@dom.ain>
+ user\@dom.ain
+ \"A. Other\" <user.1234\@dom.ain> (a comment)
+ A. Other <user.1234\@dom.ain> (a comment)
+ \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay
+ A missing angle <user\@some.where
+ *** Failers
+ The quick brown fox
+
+/[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# optional leading comment
+(?:
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+" # "
+[^\\\x80-\xff\n\015"] * # normal
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )*
+" # "
+# Quoted string
+)
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+(?:
+\.
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+" # "
+[^\\\x80-\xff\n\015"] * # normal
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )*
+" # "
+# Quoted string
+)
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+)
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\.
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+)
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address
+| # or
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+" # "
+[^\\\x80-\xff\n\015"] * # normal
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )*
+" # "
+# Quoted string
+)
+# leading word
+[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # "normal" atoms and or spaces
+(?:
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+|
+" # "
+[^\\\x80-\xff\n\015"] * # normal
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )*
+" # "
+) # "special" comment or quoted string
+[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # more "normal"
+)*
+<
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# <
+(?:
+@
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+)
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\.
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+)
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+(?: ,
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+@
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+)
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\.
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+)
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+)* # additional domains
+:
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)? # optional route
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+" # "
+[^\\\x80-\xff\n\015"] * # normal
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )*
+" # "
+# Quoted string
+)
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+(?:
+\.
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+" # "
+[^\\\x80-\xff\n\015"] * # normal
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )*
+" # "
+# Quoted string
+)
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+)
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\.
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+)
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address spec
+> # >
+# name and address
+)
+/x
+ Alan Other <user\@dom.ain>
+ <user\@dom.ain>
+ user\@dom.ain
+ \"A. Other\" <user.1234\@dom.ain> (a comment)
+ A. Other <user.1234\@dom.ain> (a comment)
+ \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay
+ A missing angle <user\@some.where
+ *** Failers
+ The quick brown fox
+
+/abc\0def\00pqr\000xyz\0000AB/
+ abc\0def\00pqr\000xyz\0000AB
+ abc456 abc\0def\00pqr\000xyz\0000ABCDE
+
+/abc\x0def\x00pqr\x000xyz\x0000AB/
+ abc\x0def\x00pqr\x000xyz\x0000AB
+ abc456 abc\x0def\x00pqr\x000xyz\x0000ABCDE
+
+/^[\000-\037]/
+ \0A
+ \01B
+ \037C
+
+/\0*/
+ \0\0\0\0
+
+/A\x0{2,3}Z/
+ The A\x0\x0Z
+ An A\0\x0\0Z
+ *** Failers
+ A\0Z
+ A\0\x0\0\x0Z
+
+/^(cow|)\1(bell)/
+ cowcowbell
+ bell
+ *** Failers
+ cowbell
+
+/^\s/
+ \040abc
+ \x0cabc
+ \nabc
+ \rabc
+ \tabc
+ *** Failers
+ abc
+
+/^a b
+ c/x
+ abc
+
+/^(a|)\1*b/
+ ab
+ aaaab
+ b
+ *** Failers
+ acb
+
+/^(a|)\1+b/
+ aab
+ aaaab
+ b
+ *** Failers
+ ab
+
+/^(a|)\1?b/
+ ab
+ aab
+ b
+ *** Failers
+ acb
+
+/^(a|)\1{2}b/
+ aaab
+ b
+ *** Failers
+ ab
+ aab
+ aaaab
+
+/^(a|)\1{2,3}b/
+ aaab
+ aaaab
+ b
+ *** Failers
+ ab
+ aab
+ aaaaab
+
+/ab{1,3}bc/
+ abbbbc
+ abbbc
+ abbc
+ *** Failers
+ abc
+ abbbbbc
+
+/([^.]*)\.([^:]*):[T ]+(.*)/
+ track1.title:TBlah blah blah
+
+/([^.]*)\.([^:]*):[T ]+(.*)/i
+ track1.title:TBlah blah blah
+
+/([^.]*)\.([^:]*):[t ]+(.*)/i
+ track1.title:TBlah blah blah
+
+/^[W-c]+$/
+ WXY_^abc
+ *** Failers
+ wxy
+
+/^[W-c]+$/i
+ WXY_^abc
+ wxy_^ABC
+
+/^[\x3f-\x5F]+$/i
+ WXY_^abc
+ wxy_^ABC
+
+/^abc$/m
+ abc
+ qqq\nabc
+ abc\nzzz
+ qqq\nabc\nzzz
+
+/^abc$/
+ abc
+ *** Failers
+ qqq\nabc
+ abc\nzzz
+ qqq\nabc\nzzz
+
+/\Aabc\Z/m
+ abc
+ abc\n
+ *** Failers
+ qqq\nabc
+ abc\nzzz
+ qqq\nabc\nzzz
+
+/\A(.)*\Z/s
+ abc\ndef
+
+/\A(.)*\Z/m
+ *** Failers
+ abc\ndef
+
+/(?:b)|(?::+)/
+ b::c
+ c::b
+
+/[-az]+/
+ az-
+ *** Failers
+ b
+
+/[az-]+/
+ za-
+ *** Failers
+ b
+
+/[a\-z]+/
+ a-z
+ *** Failers
+ b
+
+/[a-z]+/
+ abcdxyz
+
+/[\d-]+/
+ 12-34
+ *** Failers
+ aaa
+
+/[\d-z]+/
+ 12-34z
+ *** Failers
+ aaa
+
+/\x5c/
+ \\
+
+/\x20Z/
+ the Zoo
+ *** Failers
+ Zulu
+
+/(abc)\1/i
+ abcabc
+ ABCabc
+ abcABC
+
+/ab{3cd/
+ ab{3cd
+
+/ab{3,cd/
+ ab{3,cd
+
+/ab{3,4a}cd/
+ ab{3,4a}cd
+
+/{4,5a}bc/
+ {4,5a}bc
+
+/^a.b/
+ a\rb
+ *** Failers
+ a\nb
+
+/abc$/
+ abc
+ abc\n
+ *** Failers
+ abc\ndef
+
+/(abc)\123/
+ abc\x53
+
+/(abc)\223/
+ abc\x93
+
+/(abc)\323/
+ abc\xd3
+
+/(abc)\500/
+ abc\x40
+ abc\100
+
+/(abc)\5000/
+ abc\x400
+ abc\x40\x30
+ abc\1000
+ abc\100\x30
+ abc\100\060
+ abc\100\60
+
+/abc\81/
+ abc\081
+ abc\0\x38\x31
+
+/abc\91/
+ abc\091
+ abc\0\x39\x31
+
+/(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)\12\123/
+ abcdefghijkllS
+
+/(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\12\123/
+ abcdefghijk\12S
+
+/ab\gdef/
+ abgdef
+
+/a{0}bc/
+ bc
+
+/(a|(bc)){0,0}?xyz/
+ xyz
+
+/abc[\10]de/
+ abc\010de
+
+/abc[\1]de/
+ abc\1de
+
+/(abc)[\1]de/
+ abc\1de
+
+/(?s)a.b/
+ a\nb
+
+/^([^a])([^\b])([^c]*)([^d]{3,4})/
+ baNOTccccd
+ baNOTcccd
+ baNOTccd
+ bacccd
+ *** Failers
+ anything
+ b\bc
+ baccd
+
+/[^a]/
+ Abc
+
+/[^a]/i
+ Abc
+
+/[^a]+/
+ AAAaAbc
+
+/[^a]+/i
+ AAAaAbc
+
+/[^a]+/
+ bbb\nccc
+
+/[^k]$/
+ abc
+ *** Failers
+ abk
+
+/[^k]{2,3}$/
+ abc
+ kbc
+ kabc
+ *** Failers
+ abk
+ akb
+ akk
+
+/^\d{8,}\@.+[^k]$/
+ 12345678\@a.b.c.d
+ 123456789\@x.y.z
+ *** Failers
+ 12345678\@x.y.uk
+ 1234567\@a.b.c.d
+
+/(a)\1{8,}/
+ aaaaaaaaa
+ aaaaaaaaaa
+ *** Failers
+ aaaaaaa
+
+/[^a]/
+ aaaabcd
+ aaAabcd
+
+/[^a]/i
+ aaaabcd
+ aaAabcd
+
+/[^az]/
+ aaaabcd
+ aaAabcd
+
+/[^az]/i
+ aaaabcd
+ aaAabcd
+
+/\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117\120\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137\140\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157\160\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377/
+ \000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117\120\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137\140\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157\160\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377
+
+/P[^*]TAIRE[^*]{1,6}?LL/
+ xxxxxxxxxxxPSTAIREISLLxxxxxxxxx
+
+/P[^*]TAIRE[^*]{1,}?LL/
+ xxxxxxxxxxxPSTAIREISLLxxxxxxxxx
+
+/(\.\d\d[1-9]?)\d+/
+ 1.230003938
+ 1.875000282
+ 1.235
+
+/(\.\d\d((?=0)|\d(?=\d)))/
+ 1.230003938
+ 1.875000282
+ *** Failers
+ 1.235
+
+/a(?)b/
+ ab
+
+/\b(foo)\s+(\w+)/i
+ Food is on the foo table
+
+/foo(.*)bar/
+ The food is under the bar in the barn.
+
+/foo(.*?)bar/
+ The food is under the bar in the barn.
+
+/(.*)(\d*)/
+ I have 2 numbers: 53147
+
+/(.*)(\d+)/
+ I have 2 numbers: 53147
+
+/(.*?)(\d*)/
+ I have 2 numbers: 53147
+
+/(.*?)(\d+)/
+ I have 2 numbers: 53147
+
+/(.*)(\d+)$/
+ I have 2 numbers: 53147
+
+/(.*?)(\d+)$/
+ I have 2 numbers: 53147
+
+/(.*)\b(\d+)$/
+ I have 2 numbers: 53147
+
+/(.*\D)(\d+)$/
+ I have 2 numbers: 53147
+
+/^\D*(?!123)/
+ ABC123
+
+/^(\D*)(?=\d)(?!123)/
+ ABC445
+ *** Failers
+ ABC123
+
+/^[W-]46]/
+ W46]789
+ -46]789
+ *** Failers
+ Wall
+ Zebra
+ 42
+ [abcd]
+ ]abcd[
+
+/^[W-\]46]/
+ W46]789
+ Wall
+ Zebra
+ Xylophone
+ 42
+ [abcd]
+ ]abcd[
+ \\backslash
+ *** Failers
+ -46]789
+ well
+
+/\d\d\/\d\d\/\d\d\d\d/
+ 01/01/2000
+
+/word (?:[a-zA-Z0-9]+ ){0,10}otherword/
+ word cat dog elephant mussel cow horse canary baboon snake shark otherword
+ word cat dog elephant mussel cow horse canary baboon snake shark
+
+/word (?:[a-zA-Z0-9]+ ){0,300}otherword/
+ word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope
+
+/^(a){0,0}/
+ bcd
+ abc
+ aab
+
+/^(a){0,1}/
+ bcd
+ abc
+ aab
+
+/^(a){0,2}/
+ bcd
+ abc
+ aab
+
+/^(a){0,3}/
+ bcd
+ abc
+ aab
+ aaa
+
+/^(a){0,}/
+ bcd
+ abc
+ aab
+ aaa
+ aaaaaaaa
+
+/^(a){1,1}/
+ bcd
+ abc
+ aab
+
+/^(a){1,2}/
+ bcd
+ abc
+ aab
+
+/^(a){1,3}/
+ bcd
+ abc
+ aab
+ aaa
+
+/^(a){1,}/
+ bcd
+ abc
+ aab
+ aaa
+ aaaaaaaa
+
+/.*\.gif/
+ borfle\nbib.gif\nno
+
+/.{0,}\.gif/
+ borfle\nbib.gif\nno
+
+/.*\.gif/m
+ borfle\nbib.gif\nno
+
+/.*\.gif/s
+ borfle\nbib.gif\nno
+
+/.*\.gif/ms
+ borfle\nbib.gif\nno
+
+/.*$/
+ borfle\nbib.gif\nno
+
+/.*$/m
+ borfle\nbib.gif\nno
+
+/.*$/s
+ borfle\nbib.gif\nno
+
+/.*$/ms
+ borfle\nbib.gif\nno
+
+/.*$/
+ borfle\nbib.gif\nno\n
+
+/.*$/m
+ borfle\nbib.gif\nno\n
+
+/.*$/s
+ borfle\nbib.gif\nno\n
+
+/.*$/ms
+ borfle\nbib.gif\nno\n
+
+/(.*X|^B)/
+ abcde\n1234Xyz
+ BarFoo
+ *** Failers
+ abcde\nBar
+
+/(.*X|^B)/m
+ abcde\n1234Xyz
+ BarFoo
+ abcde\nBar
+
+/(.*X|^B)/s
+ abcde\n1234Xyz
+ BarFoo
+ *** Failers
+ abcde\nBar
+
+/(.*X|^B)/ms
+ abcde\n1234Xyz
+ BarFoo
+ abcde\nBar
+
+/(?s)(.*X|^B)/
+ abcde\n1234Xyz
+ BarFoo
+ *** Failers
+ abcde\nBar
+
+/(?s:.*X|^B)/
+ abcde\n1234Xyz
+ BarFoo
+ *** Failers
+ abcde\nBar
+
+/^.*B/
+ **** Failers
+ abc\nB
+
+/(?s)^.*B/
+ abc\nB
+
+/(?m)^.*B/
+ abc\nB
+
+/(?ms)^.*B/
+ abc\nB
+
+/(?ms)^B/
+ abc\nB
+
+/(?s)B$/
+ B\n
+
+/^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/
+ 123456654321
+
+/^\d\d\d\d\d\d\d\d\d\d\d\d/
+ 123456654321
+
+/^[\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d]/
+ 123456654321
+
+/^[abc]{12}/
+ abcabcabcabc
+
+/^[a-c]{12}/
+ abcabcabcabc
+
+/^(a|b|c){12}/
+ abcabcabcabc
+
+/^[abcdefghijklmnopqrstuvwxy0123456789]/
+ n
+ *** Failers
+ z
+
+/abcde{0,0}/
+ abcd
+ *** Failers
+ abce
+
+/ab[cd]{0,0}e/
+ abe
+ *** Failers
+ abcde
+
+/ab(c){0,0}d/
+ abd
+ *** Failers
+ abcd
+
+/a(b*)/
+ a
+ ab
+ abbbb
+ *** Failers
+ bbbbb
+
+/ab\d{0}e/
+ abe
+ *** Failers
+ ab1e
+
+/"([^\\"]+|\\.)*"/
+ the \"quick\" brown fox
+ \"the \\\"quick\\\" brown fox\"
+
+/.*?/g+
+ abc
+
+/\b/g+
+ abc
+
+/\b/+g
+ abc
+
+//g
+ abc
+
+/<tr([\w\W\s\d][^<>]{0,})><TD([\w\W\s\d][^<>]{0,})>([\d]{0,}\.)(.*)((<BR>([\w\W\s\d][^<>]{0,})|[\s]{0,}))<\/a><\/TD><TD([\w\W\s\d][^<>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><TD([\w\W\s\d][^<>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><\/TR>/is
+ <TR BGCOLOR='#DBE9E9'><TD align=left valign=top>43.<a href='joblist.cfm?JobID=94 6735&Keyword='>Word Processor<BR>(N-1286)</a></TD><TD align=left valign=top>Lega lstaff.com</TD><TD align=left valign=top>CA - Statewide</TD></TR>
+
+/a[^a]b/
+ acb
+ a\nb
+
+/a.b/
+ acb
+ *** Failers
+ a\nb
+
+/a[^a]b/s
+ acb
+ a\nb
+
+/a.b/s
+ acb
+ a\nb
+
+/^(b+?|a){1,2}?c/
+ bac
+ bbac
+ bbbac
+ bbbbac
+ bbbbbac
+
+/^(b+|a){1,2}?c/
+ bac
+ bbac
+ bbbac
+ bbbbac
+ bbbbbac
+
+/(?!\A)x/m
+ x\nb\n
+ a\bx\n
+
+/\x0{ab}/
+ \0{ab}
+
+/(A|B)*?CD/
+ CD
+
+/(A|B)*CD/
+ CD
+
+/(AB)*?\1/
+ ABABAB
+
+/(AB)*\1/
+ ABABAB
+
+/(?<!bar)foo/
+ foo
+ catfood
+ arfootle
+ rfoosh
+ *** Failers
+ barfoo
+ towbarfoo
+
+/\w{3}(?<!bar)foo/
+ catfood
+ *** Failers
+ foo
+ barfoo
+ towbarfoo
+
+/(?<=(foo)a)bar/
+ fooabar
+ *** Failers
+ bar
+ foobbar
+
+/\Aabc\z/m
+ abc
+ *** Failers
+ abc\n
+ qqq\nabc
+ abc\nzzz
+ qqq\nabc\nzzz
+
+"(?>.*/)foo"
+ /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/
+
+"(?>.*/)foo"
+ /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo
+
+/(?>(\.\d\d[1-9]?))\d+/
+ 1.230003938
+ 1.875000282
+ *** Failers
+ 1.235
+
+/^((?>\w+)|(?>\s+))*$/
+ now is the time for all good men to come to the aid of the party
+ *** Failers
+ this is not a line with only words and spaces!
+
+/(\d+)(\w)/
+ 12345a
+ 12345+
+
+/((?>\d+))(\w)/
+ 12345a
+ *** Failers
+ 12345+
+
+/(?>a+)b/
+ aaab
+
+/((?>a+)b)/
+ aaab
+
+/(?>(a+))b/
+ aaab
+
+/(?>b)+/
+ aaabbbccc
+
+/(?>a+|b+|c+)*c/
+ aaabbbbccccd
+
+/((?>[^()]+)|\([^()]*\))+/
+ ((abc(ade)ufh()()x
+
+/\(((?>[^()]+)|\([^()]+\))+\)/
+ (abc)
+ (abc(def)xyz)
+ *** Failers
+ ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/a(?-i)b/i
+ ab
+ Ab
+ *** Failers
+ aB
+ AB
+
+/(a (?x)b c)d e/
+ a bcd e
+ *** Failers
+ a b cd e
+ abcd e
+ a bcde
+
+/(a b(?x)c d (?-x)e f)/
+ a bcde f
+ *** Failers
+ abcdef
+
+/(a(?i)b)c/
+ abc
+ aBc
+ *** Failers
+ abC
+ aBC
+ Abc
+ ABc
+ ABC
+ AbC
+
+/a(?i:b)c/
+ abc
+ aBc
+ *** Failers
+ ABC
+ abC
+ aBC
+
+/a(?i:b)*c/
+ aBc
+ aBBc
+ *** Failers
+ aBC
+ aBBC
+
+/a(?=b(?i)c)\w\wd/
+ abcd
+ abCd
+ *** Failers
+ aBCd
+ abcD
+
+/(?s-i:more.*than).*million/i
+ more than million
+ more than MILLION
+ more \n than Million
+ *** Failers
+ MORE THAN MILLION
+ more \n than \n million
+
+/(?:(?s-i)more.*than).*million/i
+ more than million
+ more than MILLION
+ more \n than Million
+ *** Failers
+ MORE THAN MILLION
+ more \n than \n million
+
+/(?>a(?i)b+)+c/
+ abc
+ aBbc
+ aBBc
+ *** Failers
+ Abc
+ abAb
+ abbC
+
+/(?=a(?i)b)\w\wc/
+ abc
+ aBc
+ *** Failers
+ Ab
+ abC
+ aBC
+
+/(?<=a(?i)b)(\w\w)c/
+ abxxc
+ aBxxc
+ *** Failers
+ Abxxc
+ ABxxc
+ abxxC
+
+/(?:(a)|b)(?(1)A|B)/
+ aA
+ bB
+ *** Failers
+ aB
+ bA
+
+/^(a)?(?(1)a|b)+$/
+ aa
+ b
+ bb
+ *** Failers
+ ab
+
+/^(?(?=abc)\w{3}:|\d\d)$/
+ abc:
+ 12
+ *** Failers
+ 123
+ xyz
+
+/^(?(?!abc)\d\d|\w{3}:)$/
+ abc:
+ 12
+ *** Failers
+ 123
+ xyz
+
+/(?(?<=foo)bar|cat)/
+ foobar
+ cat
+ fcat
+ focat
+ *** Failers
+ foocat
+
+/(?(?<!foo)cat|bar)/
+ foobar
+ cat
+ fcat
+ focat
+ *** Failers
+ foocat
+
+/( \( )? [^()]+ (?(1) \) |) /x
+ abcd
+ (abcd)
+ the quick (abcd) fox
+ (abcd
+
+/( \( )? [^()]+ (?(1) \) ) /x
+ abcd
+ (abcd)
+ the quick (abcd) fox
+ (abcd
+
+/^(?(2)a|(1)(2))+$/
+ 12
+ 12a
+ 12aa
+ *** Failers
+ 1234
+
+/((?i)blah)\s+\1/
+ blah blah
+ BLAH BLAH
+ Blah Blah
+ blaH blaH
+ *** Failers
+ blah BLAH
+ Blah blah
+ blaH blah
+
+/((?i)blah)\s+(?i:\1)/
+ blah blah
+ BLAH BLAH
+ Blah Blah
+ blaH blaH
+ blah BLAH
+ Blah blah
+ blaH blah
+
+/(?>a*)*/
+ a
+ aa
+ aaaa
+
+/(abc|)+/
+ abc
+ abcabc
+ abcabcabc
+ xyz
+
+/([a]*)*/
+ a
+ aaaaa
+
+/([ab]*)*/
+ a
+ b
+ ababab
+ aaaabcde
+ bbbb
+
+/([^a]*)*/
+ b
+ bbbb
+ aaa
+
+/([^ab]*)*/
+ cccc
+ abab
+
+/([a]*?)*/
+ a
+ aaaa
+
+/([ab]*?)*/
+ a
+ b
+ abab
+ baba
+
+/([^a]*?)*/
+ b
+ bbbb
+ aaa
+
+/([^ab]*?)*/
+ c
+ cccc
+ baba
+
+/(?>a*)*/
+ a
+ aaabcde
+
+/((?>a*))*/
+ aaaaa
+ aabbaa
+
+/((?>a*?))*/
+ aaaaa
+ aabbaa
+
+/(?(?=[^a-z]+[a-z]) \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) /x
+ 12-sep-98
+ 12-09-98
+ *** Failers
+ sep-12-98
+
+/(?<=(foo))bar\1/
+ foobarfoo
+ foobarfootling
+ *** Failers
+ foobar
+ barfoo
+
+/(?i:saturday|sunday)/
+ saturday
+ sunday
+ Saturday
+ Sunday
+ SATURDAY
+ SUNDAY
+ SunDay
+
+/(a(?i)bc|BB)x/
+ abcx
+ aBCx
+ bbx
+ BBx
+ *** Failers
+ abcX
+ aBCX
+ bbX
+ BBX
+
+/^([ab](?i)[cd]|[ef])/
+ ac
+ aC
+ bD
+ elephant
+ Europe
+ frog
+ France
+ *** Failers
+ Africa
+
+/^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/
+ ab
+ aBd
+ xy
+ xY
+ zebra
+ Zambesi
+ *** Failers
+ aCD
+ XY
+
+/(?<=foo\n)^bar/m
+ foo\nbar
+ *** Failers
+ bar
+ baz\nbar
+
+/(?<=(?<!foo)bar)baz/
+ barbaz
+ barbarbaz
+ koobarbaz
+ *** Failers
+ baz
+ foobarbaz
+
+/The case of aaaaaa is missed out below because I think Perl 5.005_02 gets/
+/it wrong; it sets $1 to aaa rather than aa. Compare the following test,/
+/where it does set $1 to aa when matching aaaaaa./
+
+/^(a\1?){4}$/
+ a
+ aa
+ aaa
+ aaaa
+ aaaaa
+ aaaaaaa
+ aaaaaaaa
+ aaaaaaaaa
+ aaaaaaaaaa
+ aaaaaaaaaaa
+ aaaaaaaaaaaa
+ aaaaaaaaaaaaa
+ aaaaaaaaaaaaaa
+ aaaaaaaaaaaaaaa
+ aaaaaaaaaaaaaaaa
+
+/^(a\1?)(a\1?)(a\2?)(a\3?)$/
+ a
+ aa
+ aaa
+ aaaa
+ aaaaa
+ aaaaaa
+ aaaaaaa
+ aaaaaaaa
+ aaaaaaaaa
+ aaaaaaaaaa
+ aaaaaaaaaaa
+ aaaaaaaaaaaa
+ aaaaaaaaaaaaa
+ aaaaaaaaaaaaaa
+ aaaaaaaaaaaaaaa
+ aaaaaaaaaaaaaaaa
+
+/The following tests are taken from the Perl 5.005 test suite; some of them/
+/are compatible with 5.004, but I'd rather not have to sort them out./
+
+/abc/
+ abc
+ xabcy
+ ababc
+ *** Failers
+ xbc
+ axc
+ abx
+
+/ab*c/
+ abc
+
+/ab*bc/
+ abc
+ abbc
+ abbbbc
+
+/.{1}/
+ abbbbc
+
+/.{3,4}/
+ abbbbc
+
+/ab{0,}bc/
+ abbbbc
+
+/ab+bc/
+ abbc
+ *** Failers
+ abc
+ abq
+
+/ab{1,}bc/
+
+/ab+bc/
+ abbbbc
+
+/ab{1,}bc/
+ abbbbc
+
+/ab{1,3}bc/
+ abbbbc
+
+/ab{3,4}bc/
+ abbbbc
+
+/ab{4,5}bc/
+ *** Failers
+ abq
+ abbbbc
+
+/ab?bc/
+ abbc
+ abc
+
+/ab{0,1}bc/
+ abc
+
+/ab?bc/
+
+/ab?c/
+ abc
+
+/ab{0,1}c/
+ abc
+
+/^abc$/
+ abc
+ *** Failers
+ abbbbc
+ abcc
+
+/^abc/
+ abcc
+
+/^abc$/
+
+/abc$/
+ aabc
+ *** Failers
+ aabc
+ aabcd
+
+/^/
+ abc
+
+/$/
+ abc
+
+/a.c/
+ abc
+ axc
+
+/a.*c/
+ axyzc
+
+/a[bc]d/
+ abd
+ *** Failers
+ axyzd
+ abc
+
+/a[b-d]e/
+ ace
+
+/a[b-d]/
+ aac
+
+/a[-b]/
+ a-
+
+/a[b-]/
+ a-
+
+/a]/
+ a]
+
+/a[]]b/
+ a]b
+
+/a[^bc]d/
+ aed
+ *** Failers
+ abd
+ abd
+
+/a[^-b]c/
+ adc
+
+/a[^]b]c/
+ adc
+ *** Failers
+ a-c
+ a]c
+
+/\ba\b/
+ a-
+ -a
+ -a-
+
+/\by\b/
+ *** Failers
+ xy
+ yz
+ xyz
+
+/\Ba\B/
+ *** Failers
+ a-
+ -a
+ -a-
+
+/\By\b/
+ xy
+
+/\by\B/
+ yz
+
+/\By\B/
+ xyz
+
+/\w/
+ a
+
+/\W/
+ -
+ *** Failers
+ -
+ a
+
+/a\sb/
+ a b
+
+/a\Sb/
+ a-b
+ *** Failers
+ a-b
+ a b
+
+/\d/
+ 1
+
+/\D/
+ -
+ *** Failers
+ -
+ 1
+
+/[\w]/
+ a
+
+/[\W]/
+ -
+ *** Failers
+ -
+ a
+
+/a[\s]b/
+ a b
+
+/a[\S]b/
+ a-b
+ *** Failers
+ a-b
+ a b
+
+/[\d]/
+ 1
+
+/[\D]/
+ -
+ *** Failers
+ -
+ 1
+
+/ab|cd/
+ abc
+ abcd
+
+/()ef/
+ def
+
+/$b/
+
+/a\(b/
+ a(b
+
+/a\(*b/
+ ab
+ a((b
+
+/a\\b/
+ a\b
+
+/((a))/
+ abc
+
+/(a)b(c)/
+ abc
+
+/a+b+c/
+ aabbabc
+
+/a{1,}b{1,}c/
+ aabbabc
+
+/a.+?c/
+ abcabc
+
+/(a+|b)*/
+ ab
+
+/(a+|b){0,}/
+ ab
+
+/(a+|b)+/
+ ab
+
+/(a+|b){1,}/
+ ab
+
+/(a+|b)?/
+ ab
+
+/(a+|b){0,1}/
+ ab
+
+/[^ab]*/
+ cde
+
+/abc/
+ *** Failers
+ b
+
+
+/a*/
+
+
+/([abc])*d/
+ abbbcd
+
+/([abc])*bcd/
+ abcd
+
+/a|b|c|d|e/
+ e
+
+/(a|b|c|d|e)f/
+ ef
+
+/abcd*efg/
+ abcdefg
+
+/ab*/
+ xabyabbbz
+ xayabbbz
+
+/(ab|cd)e/
+ abcde
+
+/[abhgefdc]ij/
+ hij
+
+/^(ab|cd)e/
+
+/(abc|)ef/
+ abcdef
+
+/(a|b)c*d/
+ abcd
+
+/(ab|ab*)bc/
+ abc
+
+/a([bc]*)c*/
+ abc
+
+/a([bc]*)(c*d)/
+ abcd
+
+/a([bc]+)(c*d)/
+ abcd
+
+/a([bc]*)(c+d)/
+ abcd
+
+/a[bcd]*dcdcde/
+ adcdcde
+
+/a[bcd]+dcdcde/
+ *** Failers
+ abcde
+ adcdcde
+
+/(ab|a)b*c/
+ abc
+
+/((a)(b)c)(d)/
+ abcd
+
+/[a-zA-Z_][a-zA-Z0-9_]*/
+ alpha
+
+/^a(bc+|b[eh])g|.h$/
+ abh
+
+/(bc+d$|ef*g.|h?i(j|k))/
+ effgz
+ ij
+ reffgz
+ *** Failers
+ effg
+ bcdd
+
+/((((((((((a))))))))))/
+ a
+
+/((((((((((a))))))))))\10/
+ aa
+
+/(((((((((a)))))))))/
+ a
+
+/multiple words of text/
+ *** Failers
+ aa
+ uh-uh
+
+/multiple words/
+ multiple words, yeah
+
+/(.*)c(.*)/
+ abcde
+
+/\((.*), (.*)\)/
+ (a, b)
+
+/[k]/
+
+/abcd/
+ abcd
+
+/a(bc)d/
+ abcd
+
+/a[-]?c/
+ ac
+
+/(abc)\1/
+ abcabc
+
+/([a-c]*)\1/
+ abcabc
+
+/(a)|\1/
+ a
+ *** Failers
+ ab
+ x
+
+/(([a-c])b*?\2)*/
+ ababbbcbc
+
+/(([a-c])b*?\2){3}/
+ ababbbcbc
+
+/((\3|b)\2(a)x)+/
+ aaaxabaxbaaxbbax
+
+/((\3|b)\2(a)){2,}/
+ bbaababbabaaaaabbaaaabba
+
+/abc/i
+ ABC
+ XABCY
+ ABABC
+ *** Failers
+ aaxabxbaxbbx
+ XBC
+ AXC
+ ABX
+
+/ab*c/i
+ ABC
+
+/ab*bc/i
+ ABC
+ ABBC
+
+/ab*?bc/i
+ ABBBBC
+
+/ab{0,}?bc/i
+ ABBBBC
+
+/ab+?bc/i
+ ABBC
+
+/ab+bc/i
+ *** Failers
+ ABC
+ ABQ
+
+/ab{1,}bc/i
+
+/ab+bc/i
+ ABBBBC
+
+/ab{1,}?bc/i
+ ABBBBC
+
+/ab{1,3}?bc/i
+ ABBBBC
+
+/ab{3,4}?bc/i
+ ABBBBC
+
+/ab{4,5}?bc/i
+ *** Failers
+ ABQ
+ ABBBBC
+
+/ab??bc/i
+ ABBC
+ ABC
+
+/ab{0,1}?bc/i
+ ABC
+
+/ab??bc/i
+
+/ab??c/i
+ ABC
+
+/ab{0,1}?c/i
+ ABC
+
+/^abc$/i
+ ABC
+ *** Failers
+ ABBBBC
+ ABCC
+
+/^abc/i
+ ABCC
+
+/^abc$/i
+
+/abc$/i
+ AABC
+
+/^/i
+ ABC
+
+/$/i
+ ABC
+
+/a.c/i
+ ABC
+ AXC
+
+/a.*?c/i
+ AXYZC
+
+/a.*c/i
+ *** Failers
+ AABC
+ AXYZD
+
+/a[bc]d/i
+ ABD
+
+/a[b-d]e/i
+ ACE
+ *** Failers
+ ABC
+ ABD
+
+/a[b-d]/i
+ AAC
+
+/a[-b]/i
+ A-
+
+/a[b-]/i
+ A-
+
+/a]/i
+ A]
+
+/a[]]b/i
+ A]B
+
+/a[^bc]d/i
+ AED
+
+/a[^-b]c/i
+ ADC
+ *** Failers
+ ABD
+ A-C
+
+/a[^]b]c/i
+ ADC
+
+/ab|cd/i
+ ABC
+ ABCD
+
+/()ef/i
+ DEF
+
+/$b/i
+ *** Failers
+ A]C
+ B
+
+/a\(b/i
+ A(B
+
+/a\(*b/i
+ AB
+ A((B
+
+/a\\b/i
+ A\B
+
+/((a))/i
+ ABC
+
+/(a)b(c)/i
+ ABC
+
+/a+b+c/i
+ AABBABC
+
+/a{1,}b{1,}c/i
+ AABBABC
+
+/a.+?c/i
+ ABCABC
+
+/a.*?c/i
+ ABCABC
+
+/a.{0,5}?c/i
+ ABCABC
+
+/(a+|b)*/i
+ AB
+
+/(a+|b){0,}/i
+ AB
+
+/(a+|b)+/i
+ AB
+
+/(a+|b){1,}/i
+ AB
+
+/(a+|b)?/i
+ AB
+
+/(a+|b){0,1}/i
+ AB
+
+/(a+|b){0,1}?/i
+ AB
+
+/[^ab]*/i
+ CDE
+
+/abc/i
+
+/a*/i
+
+
+/([abc])*d/i
+ ABBBCD
+
+/([abc])*bcd/i
+ ABCD
+
+/a|b|c|d|e/i
+ E
+
+/(a|b|c|d|e)f/i
+ EF
+
+/abcd*efg/i
+ ABCDEFG
+
+/ab*/i
+ XABYABBBZ
+ XAYABBBZ
+
+/(ab|cd)e/i
+ ABCDE
+
+/[abhgefdc]ij/i
+ HIJ
+
+/^(ab|cd)e/i
+ ABCDE
+
+/(abc|)ef/i
+ ABCDEF
+
+/(a|b)c*d/i
+ ABCD
+
+/(ab|ab*)bc/i
+ ABC
+
+/a([bc]*)c*/i
+ ABC
+
+/a([bc]*)(c*d)/i
+ ABCD
+
+/a([bc]+)(c*d)/i
+ ABCD
+
+/a([bc]*)(c+d)/i
+ ABCD
+
+/a[bcd]*dcdcde/i
+ ADCDCDE
+
+/a[bcd]+dcdcde/i
+
+/(ab|a)b*c/i
+ ABC
+
+/((a)(b)c)(d)/i
+ ABCD
+
+/[a-zA-Z_][a-zA-Z0-9_]*/i
+ ALPHA
+
+/^a(bc+|b[eh])g|.h$/i
+ ABH
+
+/(bc+d$|ef*g.|h?i(j|k))/i
+ EFFGZ
+ IJ
+ REFFGZ
+ *** Failers
+ ADCDCDE
+ EFFG
+ BCDD
+
+/((((((((((a))))))))))/i
+ A
+
+/((((((((((a))))))))))\10/i
+ AA
+
+/(((((((((a)))))))))/i
+ A
+
+/(?:(?:(?:(?:(?:(?:(?:(?:(?:(a))))))))))/i
+ A
+
+/(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))/i
+ C
+
+/multiple words of text/i
+ *** Failers
+ AA
+ UH-UH
+
+/multiple words/i
+ MULTIPLE WORDS, YEAH
+
+/(.*)c(.*)/i
+ ABCDE
+
+/\((.*), (.*)\)/i
+ (A, B)
+
+/[k]/i
+
+/abcd/i
+ ABCD
+
+/a(bc)d/i
+ ABCD
+
+/a[-]?c/i
+ AC
+
+/(abc)\1/i
+ ABCABC
+
+/([a-c]*)\1/i
+ ABCABC
+
+/a(?!b)./
+ abad
+
+/a(?=d)./
+ abad
+
+/a(?=c|d)./
+ abad
+
+/a(?:b|c|d)(.)/
+ ace
+
+/a(?:b|c|d)*(.)/
+ ace
+
+/a(?:b|c|d)+?(.)/
+ ace
+ acdbcdbe
+
+/a(?:b|c|d)+(.)/
+ acdbcdbe
+
+/a(?:b|c|d){2}(.)/
+ acdbcdbe
+
+/a(?:b|c|d){4,5}(.)/
+ acdbcdbe
+
+/a(?:b|c|d){4,5}?(.)/
+ acdbcdbe
+
+/((foo)|(bar))*/
+ foobar
+
+/a(?:b|c|d){6,7}(.)/
+ acdbcdbe
+
+/a(?:b|c|d){6,7}?(.)/
+ acdbcdbe
+
+/a(?:b|c|d){5,6}(.)/
+ acdbcdbe
+
+/a(?:b|c|d){5,6}?(.)/
+ acdbcdbe
+
+/a(?:b|c|d){5,7}(.)/
+ acdbcdbe
+
+/a(?:b|c|d){5,7}?(.)/
+ acdbcdbe
+
+/a(?:b|(c|e){1,2}?|d)+?(.)/
+ ace
+
+/^(.+)?B/
+ AB
+
+/^([^a-z])|(\^)$/
+ .
+
+/^[<>]&/
+ <&OUT
+
+/^(a\1?){4}$/
+ aaaaaaaaaa
+ *** Failers
+ AB
+ aaaaaaaaa
+ aaaaaaaaaaa
+
+/^(a(?(1)\1)){4}$/
+ aaaaaaaaaa
+ *** Failers
+ aaaaaaaaa
+ aaaaaaaaaaa
+
+/(?:(f)(o)(o)|(b)(a)(r))*/
+ foobar
+
+/(?<=a)b/
+ ab
+ *** Failers
+ cb
+ b
+
+/(?<!c)b/
+ ab
+ b
+ b
+
+/(?:..)*a/
+ aba
+
+/(?:..)*?a/
+ aba
+
+/^(?:b|a(?=(.)))*\1/
+ abc
+
+/^(){3,5}/
+ abc
+
+/^(a+)*ax/
+ aax
+
+/^((a|b)+)*ax/
+ aax
+
+/^((a|bc)+)*ax/
+ aax
+
+/(a|x)*ab/
+ cab
+
+/(a)*ab/
+ cab
+
+/(?:(?i)a)b/
+ ab
+
+/((?i)a)b/
+ ab
+
+/(?:(?i)a)b/
+ Ab
+
+/((?i)a)b/
+ Ab
+
+/(?:(?i)a)b/
+ *** Failers
+ cb
+ aB
+
+/((?i)a)b/
+
+/(?i:a)b/
+ ab
+
+/((?i:a))b/
+ ab
+
+/(?i:a)b/
+ Ab
+
+/((?i:a))b/
+ Ab
+
+/(?i:a)b/
+ *** Failers
+ aB
+ aB
+
+/((?i:a))b/
+
+/(?:(?-i)a)b/i
+ ab
+
+/((?-i)a)b/i
+ ab
+
+/(?:(?-i)a)b/i
+ aB
+
+/((?-i)a)b/i
+ aB
+
+/(?:(?-i)a)b/i
+ *** Failers
+ aB
+ Ab
+
+/((?-i)a)b/i
+
+/(?:(?-i)a)b/i
+ aB
+
+/((?-i)a)b/i
+ aB
+
+/(?:(?-i)a)b/i
+ *** Failers
+ Ab
+ AB
+
+/((?-i)a)b/i
+
+/(?-i:a)b/i
+ ab
+
+/((?-i:a))b/i
+ ab
+
+/(?-i:a)b/i
+ aB
+
+/((?-i:a))b/i
+ aB
+
+/(?-i:a)b/i
+ *** Failers
+ AB
+ Ab
+
+/((?-i:a))b/i
+
+/(?-i:a)b/i
+ aB
+
+/((?-i:a))b/i
+ aB
+
+/(?-i:a)b/i
+ *** Failers
+ Ab
+ AB
+
+/((?-i:a))b/i
+
+/((?-i:a.))b/i
+ *** Failers
+ AB
+ a\nB
+
+/((?s-i:a.))b/i
+ a\nB
+
+/(?:c|d)(?:)(?:a(?:)(?:b)(?:b(?:))(?:b(?:)(?:b)))/
+ cabbbb
+
+/(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))/
+ caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
+
+/(ab)\d\1/i
+ Ab4ab
+ ab4Ab
+
+/foo\w*\d{4}baz/
+ foobar1234baz
+
+/x(~~)*(?:(?:F)?)?/
+ x~~
+
+/^a(?#xxx){3}c/
+ aaac
+
+/^a (?#xxx) (?#yyy) {3}c/x
+ aaac
+
+/(?<![cd])b/
+ *** Failers
+ B\nB
+ dbcb
+
+/(?<![cd])[ab]/
+ dbaacb
+
+/(?<!(c|d))b/
+
+/(?<!(c|d))[ab]/
+ dbaacb
+
+/(?<!cd)[ab]/
+ cdaccb
+
+/^(?:a?b?)*$/
+ *** Failers
+ dbcb
+ a--
+
+/((?s)^a(.))((?m)^b$)/
+ a\nb\nc\n
+
+/((?m)^b$)/
+ a\nb\nc\n
+
+/(?m)^b/
+ a\nb\n
+
+/(?m)^(b)/
+ a\nb\n
+
+/((?m)^b)/
+ a\nb\n
+
+/\n((?m)^b)/
+ a\nb\n
+
+/((?s).)c(?!.)/
+ a\nb\nc\n
+ a\nb\nc\n
+
+/((?s)b.)c(?!.)/
+ a\nb\nc\n
+ a\nb\nc\n
+
+/^b/
+
+/()^b/
+ *** Failers
+ a\nb\nc\n
+ a\nb\nc\n
+
+/((?m)^b)/
+ a\nb\nc\n
+
+/(?(1)a|b)/
+
+/(?(1)b|a)/
+ a
+
+/(x)?(?(1)a|b)/
+ *** Failers
+ a
+ a
+
+/(x)?(?(1)b|a)/
+ a
+
+/()?(?(1)b|a)/
+ a
+
+/()(?(1)b|a)/
+
+/()?(?(1)a|b)/
+ a
+
+/^(\()?blah(?(1)(\)))$/
+ (blah)
+ blah
+ *** Failers
+ a
+ blah)
+ (blah
+
+/^(\(+)?blah(?(1)(\)))$/
+ (blah)
+ blah
+ *** Failers
+ blah)
+ (blah
+
+/(?(?!a)a|b)/
+
+/(?(?!a)b|a)/
+ a
+
+/(?(?=a)b|a)/
+ *** Failers
+ a
+ a
+
+/(?(?=a)a|b)/
+ a
+
+/(?=(a+?))(\1ab)/
+ aaab
+
+/^(?=(a+?))\1ab/
+
+/(\w+:)+/
+ one:
+
+/$(?<=^(a))/
+ a
+
+/(?=(a+?))(\1ab)/
+ aaab
+
+/^(?=(a+?))\1ab/
+ *** Failers
+ aaab
+ aaab
+
+/([\w:]+::)?(\w+)$/
+ abcd
+ xy:z:::abcd
+
+/^[^bcd]*(c+)/
+ aexycd
+
+/(a*)b+/
+ caab
+
+/([\w:]+::)?(\w+)$/
+ abcd
+ xy:z:::abcd
+ *** Failers
+ abcd:
+ abcd:
+
+/^[^bcd]*(c+)/
+ aexycd
+
+/(>a+)ab/
+
+/(?>a+)b/
+ aaab
+
+/([[:]+)/
+ a:[b]:
+
+/([[=]+)/
+ a=[b]=
+
+/([[.]+)/
+ a.[b].
+
+/((?>a+)b)/
+ aaab
+
+/(?>(a+))b/
+ aaab
+
+/((?>[^()]+)|\([^()]*\))+/
+ ((abc(ade)ufh()()x
+
+/a\Z/
+ *** Failers
+ aaab
+ a\nb\n
+
+/b\Z/
+ a\nb\n
+
+/b\z/
+
+/b\Z/
+ a\nb
+
+/b\z/
+ a\nb
+ *** Failers
+
+/^(?>(?(1)\.|())[^\W_](?>[a-z0-9-]*[^\W_])?)+$/
+ a
+ abc
+ a-b
+ 0-9
+ a.b
+ 5.6.7
+ the.quick.brown.fox
+ a100.b200.300c
+ 12-ab.1245
+ *** Failers
+ \
+ .a
+ -a
+ a-
+ a.
+ a_b
+ a.-
+ a..
+ ab..bc
+ the.quick.brown.fox-
+ the.quick.brown.fox.
+ the.quick.brown.fox_
+ the.quick.brown.fox+
+
+/(?>.*)(?<=(abcd|wxyz))/
+ alphabetabcd
+ endingwxyz
+ *** Failers
+ a rather long string that doesn't end with one of them
+
+/word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/
+ word cat dog elephant mussel cow horse canary baboon snake shark otherword
+ word cat dog elephant mussel cow horse canary baboon snake shark
+
+/word (?>[a-zA-Z0-9]+ ){0,30}otherword/
+ word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope
+
+/(?<=\d{3}(?!999))foo/
+ 999foo
+ 123999foo
+ *** Failers
+ 123abcfoo
+
+/(?<=(?!...999)\d{3})foo/
+ 999foo
+ 123999foo
+ *** Failers
+ 123abcfoo
+
+/(?<=\d{3}(?!999)...)foo/
+ 123abcfoo
+ 123456foo
+ *** Failers
+ 123999foo
+
+/(?<=\d{3}...)(?<!999)foo/
+ 123abcfoo
+ 123456foo
+ *** Failers
+ 123999foo
+
+/<a[\s]+href[\s]*=[\s]* # find <a href=
+ ([\"\'])? # find single or double quote
+ (?(1) (.*?)\1 | ([^\s]+)) # if quote found, match up to next matching
+ # quote, otherwise match up to next space
+/isx
+ <a href=abcd xyz
+ <a href=\"abcd xyz pqr\" cats
+ <a href=\'abcd xyz pqr\' cats
+
+/<a\s+href\s*=\s* # find <a href=
+ (["'])? # find single or double quote
+ (?(1) (.*?)\1 | (\S+)) # if quote found, match up to next matching
+ # quote, otherwise match up to next space
+/isx
+ <a href=abcd xyz
+ <a href=\"abcd xyz pqr\" cats
+ <a href = \'abcd xyz pqr\' cats
+
+/<a\s+href(?>\s*)=(?>\s*) # find <a href=
+ (["'])? # find single or double quote
+ (?(1) (.*?)\1 | (\S+)) # if quote found, match up to next matching
+ # quote, otherwise match up to next space
+/isx
+ <a href=abcd xyz
+ <a href=\"abcd xyz pqr\" cats
+ <a href = \'abcd xyz pqr\' cats
+
+/((Z)+|A)*/
+ ZABCDEFG
+
+/(Z()|A)*/
+ ZABCDEFG
+
+/(Z(())|A)*/
+ ZABCDEFG
+
+/((?>Z)+|A)*/
+ ZABCDEFG
+
+/((?>)+|A)*/
+ ZABCDEFG
+
+/a*/g
+ abbab
+
+/^[a-\d]/
+ abcde
+ -things
+ 0digit
+ *** Failers
+ bcdef
+
+/^[\d-a]/
+ abcde
+ -things
+ 0digit
+ *** Failers
+ bcdef
+
+/[[:space:]]+/
+ > \x09\x0a\x0c\x0d\x0b<
+
+/[[:blank:]]+/
+ > \x09\x0a\x0c\x0d\x0b<
+
+/[\s]+/
+ > \x09\x0a\x0c\x0d\x0b<
+
+/\s+/
+ > \x09\x0a\x0c\x0d\x0b<
+
+/a b/x
+ ab
+
+/(?!\A)x/m
+ a\nxb\n
+
+/(?!^)x/m
+ a\nxb\n
+
+/abc\Qabc\Eabc/
+ abcabcabc
+
+/abc\Q(*+|\Eabc/
+ abc(*+|abc
+
+/ abc\Q abc\Eabc/x
+ abc abcabc
+ *** Failers
+ abcabcabc
+
+/abc#comment
+ \Q#not comment
+ literal\E/x
+ abc#not comment\n literal
+
+/abc#comment
+ \Q#not comment
+ literal/x
+ abc#not comment\n literal
+
+/abc#comment
+ \Q#not comment
+ literal\E #more comment
+ /x
+ abc#not comment\n literal
+
+/abc#comment
+ \Q#not comment
+ literal\E #more comment/x
+ abc#not comment\n literal
+
+/\Qabc\$xyz\E/
+ abc\\\$xyz
+
+/\Qabc\E\$\Qxyz\E/
+ abc\$xyz
+
+/\Gabc/
+ abc
+ *** Failers
+ xyzabc
+
+/\Gabc./g
+ abc1abc2xyzabc3
+
+/abc./g
+ abc1abc2xyzabc3
+
+/a(?x: b c )d/
+ XabcdY
+ *** Failers
+ Xa b c d Y
+
+/((?x)x y z | a b c)/
+ XabcY
+ AxyzB
+
+/(?i)AB(?-i)C/
+ XabCY
+ *** Failers
+ XabcY
+
+/((?i)AB(?-i)C|D)E/
+ abCE
+ DE
+ *** Failers
+ abcE
+ abCe
+ dE
+ De
+
+/(.*)\d+\1/
+ abc123abc
+ abc123bc
+
+/(.*)\d+\1/s
+ abc123abc
+ abc123bc
+
+/((.*))\d+\1/
+ abc123abc
+ abc123bc
+
+/-- This tests for an IPv6 address in the form where it can have up to --/
+/-- eight components, one and only one of which is empty. This must be --/
+/-- an internal component. --/
+
+/^(?!:) # colon disallowed at start
+ (?: # start of item
+ (?: [0-9a-f]{1,4} | # 1-4 hex digits or
+ (?(1)0 | () ) ) # if null previously matched, fail; else null
+ : # followed by colon
+ ){1,7} # end item; 1-7 of them required
+ [0-9a-f]{1,4} $ # final hex number at end of string
+ (?(1)|.) # check that there was an empty component
+ /xi
+ a123::a123
+ a123:b342::abcd
+ a123:b342::324e:abcd
+ a123:ddde:b342::324e:abcd
+ a123:ddde:b342::324e:dcba:abcd
+ a123:ddde:9999:b342::324e:dcba:abcd
+ *** Failers
+ 1:2:3:4:5:6:7:8
+ a123:bce:ddde:9999:b342::324e:dcba:abcd
+ a123::9999:b342::324e:dcba:abcd
+ abcde:2:3:4:5:6:7:8
+ ::1
+ abcd:fee0:123::
+ :1
+ 1:
+
+/[z\Qa-d]\E]/
+ z
+ a
+ -
+ d
+ ]
+ *** Failers
+ b
+
+/[\z\C]/
+ z
+ C
+
+/\M/
+ M
+
+/(a+)*b/
+ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/(?i)reg(?:ul(?:[aä]|ae)r|ex)/
+ REGular
+ regulaer
+ Regex
+ regulär
+
+/Åæåä[à-ÿÀ-ß]+/
+ Åæåäà
+ Åæåäÿ
+ ÅæåäÀ
+ Åæåäß
+
+/(?<=Z)X./
+ \x84XAZXB
+
+/ End of testinput1 /
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testinput2 b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testinput2
new file mode 100644
index 00000000..d118daf8
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testinput2
@@ -0,0 +1,1396 @@
+/(a)b|/
+
+/abc/
+ abc
+ defabc
+ \Aabc
+ *** Failers
+ \Adefabc
+ ABC
+
+/^abc/
+ abc
+ \Aabc
+ *** Failers
+ defabc
+ \Adefabc
+
+/a+bc/
+
+/a*bc/
+
+/a{3}bc/
+
+/(abc|a+z)/
+
+/^abc$/
+ abc
+ *** Failers
+ def\nabc
+
+/ab\gdef/X
+
+/(?X)ab\gdef/X
+
+/x{5,4}/
+
+/z{65536}/
+
+/[abcd/
+
+/(?X)[\B]/
+
+/[z-a]/
+
+/^*/
+
+/(abc/
+
+/(?# abc/
+
+/(?z)abc/
+
+/.*b/
+
+/.*?b/
+
+/cat|dog|elephant/
+ this sentence eventually mentions a cat
+ this sentences rambles on and on for a while and then reaches elephant
+
+/cat|dog|elephant/S
+ this sentence eventually mentions a cat
+ this sentences rambles on and on for a while and then reaches elephant
+
+/cat|dog|elephant/iS
+ this sentence eventually mentions a CAT cat
+ this sentences rambles on and on for a while to elephant ElePhant
+
+/a|[bcd]/S
+
+/(a|[^\dZ])/S
+
+/(a|b)*[\s]/S
+
+/(ab\2)/
+
+/{4,5}abc/
+
+/(a)(b)(c)\2/
+ abcb
+ \O0abcb
+ \O3abcb
+ \O6abcb
+ \O9abcb
+ \O12abcb
+
+/(a)bc|(a)(b)\2/
+ abc
+ \O0abc
+ \O3abc
+ \O6abc
+ aba
+ \O0aba
+ \O3aba
+ \O6aba
+ \O9aba
+ \O12aba
+
+/abc$/E
+ abc
+ *** Failers
+ abc\n
+ abc\ndef
+
+/(a)(b)(c)(d)(e)\6/
+
+/the quick brown fox/
+ the quick brown fox
+ this is a line with the quick brown fox
+
+/the quick brown fox/A
+ the quick brown fox
+ *** Failers
+ this is a line with the quick brown fox
+
+/ab(?z)cd/
+
+/^abc|def/
+ abcdef
+ abcdef\B
+
+/.*((abc)$|(def))/
+ defabc
+ \Zdefabc
+
+/abc/P
+ abc
+ *** Failers
+
+/^abc|def/P
+ abcdef
+ abcdef\B
+
+/.*((abc)$|(def))/P
+ defabc
+ \Zdefabc
+
+/the quick brown fox/P
+ the quick brown fox
+ *** Failers
+ The Quick Brown Fox
+
+/the quick brown fox/Pi
+ the quick brown fox
+ The Quick Brown Fox
+
+/abc.def/P
+ *** Failers
+ abc\ndef
+
+/abc$/P
+ abc
+ abc\n
+
+/(abc)\2/P
+
+/(abc\1)/P
+ abc
+
+/)/
+
+/a[]b/
+
+/[^aeiou ]{3,}/
+ co-processors, and for
+
+/<.*>/
+ abc<def>ghi<klm>nop
+
+/<.*?>/
+ abc<def>ghi<klm>nop
+
+/<.*>/U
+ abc<def>ghi<klm>nop
+
+/(?U)<.*>/
+ abc<def>ghi<klm>nop
+
+/<.*?>/U
+ abc<def>ghi<klm>nop
+
+/={3,}/U
+ abc========def
+
+/(?U)={3,}?/
+ abc========def
+
+/(?<!bar|cattle)foo/
+ foo
+ catfoo
+ *** Failers
+ the barfoo
+ and cattlefoo
+
+/(?<=a+)b/
+
+/(?<=aaa|b{0,3})b/
+
+/(?<!(foo)a\1)bar/
+
+/(?i)abc/
+
+/(a|(?m)a)/
+
+/(?i)^1234/
+
+/(^b|(?i)^d)/
+
+/(?s).*/
+
+/[abcd]/S
+
+/(?i)[abcd]/S
+
+/(?m)[xy]|(b|c)/S
+
+/(^a|^b)/m
+
+/(?i)(^a|^b)/m
+
+/(a)(?(1)a|b|c)/
+
+/(?(?=a)a|b|c)/
+
+/(?(1a)/
+
+/(?(?i))/
+
+/(?(abc))/
+
+/(?(?<ab))/
+
+/((?s)blah)\s+\1/
+
+/((?i)blah)\s+\1/
+
+/((?i)b)/DS
+
+/(a*b|(?i:c*(?-i)d))/S
+
+/a$/
+ a
+ a\n
+ *** Failers
+ \Za
+ \Za\n
+
+/a$/m
+ a
+ a\n
+ \Za\n
+ *** Failers
+ \Za
+
+/\Aabc/m
+
+/^abc/m
+
+/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/
+ aaaaabbbbbcccccdef
+
+/(?<=foo)[ab]/S
+
+/(?<!foo)(alpha|omega)/S
+
+/(?!alphabet)[ab]/S
+
+/(?<=foo\n)^bar/m
+ foo\nbarbar
+ ***Failers
+ rhubarb
+ barbell
+ abc\nbarton
+
+/^(?<=foo\n)bar/m
+ foo\nbarbar
+ ***Failers
+ rhubarb
+ barbell
+ abc\nbarton
+
+/(?>^abc)/m
+ abc
+ def\nabc
+ *** Failers
+ defabc
+
+/(?<=ab(c+)d)ef/
+
+/(?<=ab(?<=c+)d)ef/
+
+/(?<=ab(c|de)f)g/
+
+/The next three are in testinput2 because they have variable length branches/
+
+/(?<=bullock|donkey)-cart/
+ the bullock-cart
+ a donkey-cart race
+ *** Failers
+ cart
+ horse-and-cart
+
+/(?<=ab(?i)x|y|z)/
+
+/(?>.*)(?<=(abcd)|(xyz))/
+ alphabetabcd
+ endingxyz
+
+/(?<=ab(?i)x(?-i)y|(?i)z|b)ZZ/
+ abxyZZ
+ abXyZZ
+ ZZZ
+ zZZ
+ bZZ
+ BZZ
+ *** Failers
+ ZZ
+ abXYZZ
+ zzz
+ bzz
+
+/(?<!(foo)a)bar/
+ bar
+ foobbar
+ *** Failers
+ fooabar
+
+/This one is here because Perl 5.005_02 doesn't fail it/
+
+/^(a)?(?(1)a|b)+$/
+ *** Failers
+ a
+
+/This one is here because I think Perl 5.005_02 gets the setting of $1 wrong/
+
+/^(a\1?){4}$/
+ aaaaaa
+
+/These are syntax tests from Perl 5.005/
+
+/a[b-a]/
+
+/a[]b/
+
+/a[/
+
+/*a/
+
+/(*)b/
+
+/abc)/
+
+/(abc/
+
+/a**/
+
+/)(/
+
+/\1/
+
+/\2/
+
+/(a)|\2/
+
+/a[b-a]/i
+
+/a[]b/i
+
+/a[/i
+
+/*a/i
+
+/(*)b/i
+
+/abc)/i
+
+/(abc/i
+
+/a**/i
+
+/)(/i
+
+/:(?:/
+
+/(?<%)b/
+
+/a(?{)b/
+
+/a(?{{})b/
+
+/a(?{}})b/
+
+/a(?{"{"})b/
+
+/a(?{"{"}})b/
+
+/(?(1?)a|b)/
+
+/(?(1)a|b|c)/
+
+/[a[:xyz:/
+
+/(?<=x+)y/
+
+/a{37,17}/
+
+/abc/\
+
+/abc/\P
+
+/abc/\i
+
+/(a)bc(d)/
+ abcd
+ abcd\C2
+ abcd\C5
+
+/(.{20})/
+ abcdefghijklmnopqrstuvwxyz
+ abcdefghijklmnopqrstuvwxyz\C1
+ abcdefghijklmnopqrstuvwxyz\G1
+
+/(.{15})/
+ abcdefghijklmnopqrstuvwxyz
+ abcdefghijklmnopqrstuvwxyz\C1\G1
+
+/(.{16})/
+ abcdefghijklmnopqrstuvwxyz
+ abcdefghijklmnopqrstuvwxyz\C1\G1\L
+
+/^(a|(bc))de(f)/
+ adef\G1\G2\G3\G4\L
+ bcdef\G1\G2\G3\G4\L
+ adefghijk\C0
+
+/^abc\00def/
+ abc\00def\L\C0
+
+/word ((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+
+)((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+
+)?)?)?)?)?)?)?)?)?otherword/M
+
+/.*X/D
+
+/.*X/Ds
+
+/(.*X|^B)/D
+
+/(.*X|^B)/Ds
+
+/(?s)(.*X|^B)/D
+
+/(?s:.*X|^B)/D
+
+/\Biss\B/+
+ Mississippi
+
+/\Biss\B/+P
+ Mississippi
+
+/iss/G+
+ Mississippi
+
+/\Biss\B/G+
+ Mississippi
+
+/\Biss\B/g+
+ Mississippi
+ *** Failers
+ Mississippi\A
+
+/(?<=[Ms])iss/g+
+ Mississippi
+
+/(?<=[Ms])iss/G+
+ Mississippi
+
+/^iss/g+
+ ississippi
+
+/.*iss/g+
+ abciss\nxyzisspqr
+
+/.i./+g
+ Mississippi
+ Mississippi\A
+ Missouri river
+ Missouri river\A
+
+/^.is/+g
+ Mississippi
+
+/^ab\n/g+
+ ab\nab\ncd
+
+/^ab\n/mg+
+ ab\nab\ncd
+
+/abc/
+
+/abc|bac/
+
+/(abc|bac)/
+
+/(abc|(c|dc))/
+
+/(abc|(d|de)c)/
+
+/a*/
+
+/a+/
+
+/(baa|a+)/
+
+/a{0,3}/
+
+/baa{3,}/
+
+/"([^\\"]+|\\.)*"/
+
+/(abc|ab[cd])/
+
+/(a|.)/
+
+/a|ba|\w/
+
+/abc(?=pqr)/
+
+/...(?<=abc)/
+
+/abc(?!pqr)/
+
+/ab./
+
+/ab[xyz]/
+
+/abc*/
+
+/ab.c*/
+
+/a.c*/
+
+/.c*/
+
+/ac*/
+
+/(a.c*|b.c*)/
+
+/a.c*|aba/
+
+/.+a/
+
+/(?=abcda)a.*/
+
+/(?=a)a.*/
+
+/a(b)*/
+
+/a\d*/
+
+/ab\d*/
+
+/a(\d)*/
+
+/abcde{0,0}/
+
+/ab\d+/
+
+/a(?(1)b)/
+
+/a(?(1)bag|big)/
+
+/a(?(1)bag|big)*/
+
+/a(?(1)bag|big)+/
+
+/a(?(1)b..|b..)/
+
+/ab\d{0}e/
+
+/a?b?/
+ a
+ b
+ ab
+ \
+ *** Failers
+ \N
+
+/|-/
+ abcd
+ -abc
+ \Nab-c
+ *** Failers
+ \Nabc
+
+/a*(b+)(z)(z)/P
+ aaaabbbbzzzz
+ aaaabbbbzzzz\O0
+ aaaabbbbzzzz\O1
+ aaaabbbbzzzz\O2
+ aaaabbbbzzzz\O3
+ aaaabbbbzzzz\O4
+ aaaabbbbzzzz\O5
+
+/^.?abcd/S
+
+/\( # ( at start
+ (?: # Non-capturing bracket
+ (?>[^()]+) # Either a sequence of non-brackets (no backtracking)
+ | # Or
+ (?R) # Recurse - i.e. nested bracketed string
+ )* # Zero or more contents
+ \) # Closing )
+ /x
+ (abcd)
+ (abcd)xyz
+ xyz(abcd)
+ (ab(xy)cd)pqr
+ (ab(xycd)pqr
+ () abc ()
+ 12(abcde(fsh)xyz(foo(bar))lmno)89
+ *** Failers
+ abcd
+ abcd)
+ (abcd
+
+/\( ( (?>[^()]+) | (?R) )* \) /xg
+ (ab(xy)cd)pqr
+ 1(abcd)(x(y)z)pqr
+
+/\( (?: (?>[^()]+) | (?R) ) \) /x
+ (abcd)
+ (ab(xy)cd)
+ (a(b(c)d)e)
+ ((ab))
+ *** Failers
+ ()
+
+/\( (?: (?>[^()]+) | (?R) )? \) /x
+ ()
+ 12(abcde(fsh)xyz(foo(bar))lmno)89
+
+/\( ( (?>[^()]+) | (?R) )* \) /x
+ (ab(xy)cd)
+
+/\( ( ( (?>[^()]+) | (?R) )* ) \) /x
+ (ab(xy)cd)
+
+/\( (123)? ( ( (?>[^()]+) | (?R) )* ) \) /x
+ (ab(xy)cd)
+ (123ab(xy)cd)
+
+/\( ( (123)? ( (?>[^()]+) | (?R) )* ) \) /x
+ (ab(xy)cd)
+ (123ab(xy)cd)
+
+/\( (((((((((( ( (?>[^()]+) | (?R) )* )))))))))) \) /x
+ (ab(xy)cd)
+
+/\( ( ( (?>[^()<>]+) | ((?>[^()]+)) | (?R) )* ) \) /x
+ (abcd(xyz<p>qrs)123)
+
+/\( ( ( (?>[^()]+) | ((?R)) )* ) \) /x
+ (ab(cd)ef)
+ (ab(cd(ef)gh)ij)
+
+/^[[:alnum:]]/D
+
+/^[[:^alnum:]]/D
+
+/^[[:alpha:]]/D
+
+/^[[:^alpha:]]/D
+
+/^[[:ascii:]]/D
+
+/^[[:^ascii:]]/D
+
+/^[[:blank:]]/D
+
+/^[[:cntrl:]]/D
+
+/^[[:digit:]]/D
+
+/^[[:graph:]]/D
+
+/^[[:lower:]]/D
+
+/^[[:print:]]/D
+
+/^[[:punct:]]/D
+
+/^[[:space:]]/D
+
+/^[[:upper:]]/D
+
+/^[[:xdigit:]]/D
+
+/^[[:word:]]/D
+
+/^[[:^cntrl:]]/D
+
+/^[12[:^digit:]]/D
+
+/^[[:^blank:]]/D
+
+/[01[:alpha:]%]/D
+
+/[[.ch.]]/
+
+/[[=ch=]]/
+
+/[[:rhubarb:]]/
+
+/[[:upper:]]/i
+ A
+ a
+
+/[[:lower:]]/i
+ A
+ a
+
+/((?-i)[[:lower:]])[[:lower:]]/i
+ ab
+ aB
+ *** Failers
+ Ab
+ AB
+
+/[\200-\410]/
+
+/^(?(0)f|b)oo/
+
+/This one's here because of the large output vector needed/
+
+/(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\w+)\s+(\270)/
+ \O900 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 ABC ABC
+
+/This one's here because Perl does this differently and PCRE can't at present/
+
+/(main(O)?)+/
+ mainmain
+ mainOmain
+
+/These are all cases where Perl does it differently (nested captures)/
+
+/^(a(b)?)+$/
+ aba
+
+/^(aa(bb)?)+$/
+ aabbaa
+
+/^(aa|aa(bb))+$/
+ aabbaa
+
+/^(aa(bb)??)+$/
+ aabbaa
+
+/^(?:aa(bb)?)+$/
+ aabbaa
+
+/^(aa(b(b))?)+$/
+ aabbaa
+
+/^(?:aa(b(b))?)+$/
+ aabbaa
+
+/^(?:aa(b(?:b))?)+$/
+ aabbaa
+
+/^(?:aa(bb(?:b))?)+$/
+ aabbbaa
+
+/^(?:aa(b(?:bb))?)+$/
+ aabbbaa
+
+/^(?:aa(?:b(b))?)+$/
+ aabbaa
+
+/^(?:aa(?:b(bb))?)+$/
+ aabbbaa
+
+/^(aa(b(bb))?)+$/
+ aabbbaa
+
+/^(aa(bb(bb))?)+$/
+ aabbbbaa
+
+/--------------------------------------------------------------------/
+
+/#/xMD
+
+/a#/xMD
+
+/[\s]/D
+
+/[\S]/D
+
+/a(?i)b/D
+ ab
+ aB
+ *** Failers
+ AB
+
+/(a(?i)b)/D
+ ab
+ aB
+ *** Failers
+ AB
+
+/ (?i)abc/xD
+
+/#this is a comment
+ (?i)abc/xD
+
+/123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890/D
+
+/\Q123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890/D
+
+/\Q\E/D
+ \
+
+/\Q\Ex/D
+
+/ \Q\E/D
+
+/a\Q\E/D
+ abc
+ bca
+ bac
+
+/a\Q\Eb/D
+ abc
+
+/\Q\Eabc/D
+
+/x*+\w/D
+ *** Failers
+ xxxxx
+
+/x?+/D
+
+/x++/D
+
+/x{1,3}+/D
+
+/(x)*+/D
+
+/^(\w++|\s++)*$/
+ now is the time for all good men to come to the aid of the party
+ *** Failers
+ this is not a line with only words and spaces!
+
+/(\d++)(\w)/
+ 12345a
+ *** Failers
+ 12345+
+
+/a++b/
+ aaab
+
+/(a++b)/
+ aaab
+
+/(a++)b/
+ aaab
+
+/([^()]++|\([^()]*\))+/
+ ((abc(ade)ufh()()x
+
+/\(([^()]++|\([^()]+\))+\)/
+ (abc)
+ (abc(def)xyz)
+ *** Failers
+ ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/(abc){1,3}+/D
+
+/a+?+/
+
+/a{2,3}?+b/
+
+/(?U)a+?+/
+
+/a{2,3}?+b/U
+
+/x(?U)a++b/D
+ xaaaab
+
+/(?U)xa++b/D
+ xaaaab
+
+/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/D
+
+/^x(?U)a+b/D
+
+/^x(?U)(a+)b/D
+
+/[.x.]/
+
+/[=x=]/
+
+/[:x:]/
+
+/\l/
+
+/\L/
+
+/\N{name}/
+
+/\u/
+
+/\U/
+
+/[/
+
+/[a-/
+
+/[[:space:]/
+
+/[\s]/DM
+
+/[[:space:]]/DM
+
+/[[:space:]abcde]/DM
+
+/< (?: (?(R) \d++ | [^<>]*+) | (?R)) * >/x
+ <>
+ <abcd>
+ <abc <123> hij>
+ <abc <def> hij>
+ <abc<>def>
+ <abc<>
+ *** Failers
+ <abc
+
+|8J\$WE\<\.rX\+ix\[d1b\!H\#\?vV0vrK\:ZH1\=2M\>iV\;\?aPhFB\<\*vW\@QW\@sO9\}cfZA\-i\'w\%hKd6gt1UJP\,15_\#QY\$M\^Mss_U\/\]\&LK9\[5vQub\^w\[KDD\<EjmhUZ\?\.akp2dF\>qmj\;2\}YWFdYx\.Ap\]hjCPTP\(n28k\+3\;o\&WXqs\/gOXdr\$\:r\'do0\;b4c\(f_Gr\=\"\\4\)\[01T7ajQJvL\$W\~mL_sS\/4h\:x\*\[ZN\=KLs\&L5zX\/\/\>it\,o\:aU\(\;Z\>pW\&T7oP\'2K\^E\:x9\'c\[\%z\-\,64JQ5AeH_G\#KijUKghQw\^\\vea3a\?kka_G\$8\#\`\*kynsxzBLru\'\]k_\[7FrVx\}\^\=\$blx\>s\-N\%j\;D\*aZDnsw\:YKZ\%Q\.Kne9\#hP\?\+b3\(SOvL\,\^\;\&u5\@\?5C5Bhb\=m\-vEh_L15Jl\]U\)0RP6\{q\%L\^_z5E\'Dw6X\b|DM
+
+|\$\<\.X\+ix\[d1b\!H\#\?vV0vrK\:ZH1\=2M\>iV\;\?aPhFB\<\*vW\@QW\@sO9\}cfZA\-i\'w\%hKd6gt1UJP\,15_\#QY\$M\^Mss_U\/\]\&LK9\[5vQub\^w\[KDD\<EjmhUZ\?\.akp2dF\>qmj\;2\}YWFdYx\.Ap\]hjCPTP\(n28k\+3\;o\&WXqs\/gOXdr\$\:r\'do0\;b4c\(f_Gr\=\"\\4\)\[01T7ajQJvL\$W\~mL_sS\/4h\:x\*\[ZN\=KLs\&L5zX\/\/\>it\,o\:aU\(\;Z\>pW\&T7oP\'2K\^E\:x9\'c\[\%z\-\,64JQ5AeH_G\#KijUKghQw\^\\vea3a\?kka_G\$8\#\`\*kynsxzBLru\'\]k_\[7FrVx\}\^\=\$blx\>s\-N\%j\;D\*aZDnsw\:YKZ\%Q\.Kne9\#hP\?\+b3\(SOvL\,\^\;\&u5\@\?5C5Bhb\=m\-vEh_L15Jl\]U\)0RP6\{q\%L\^_z5E\'Dw6X\b|DM
+
+/(.*)\d+\1/I
+
+/(.*)\d+/I
+
+/(.*)\d+\1/Is
+
+/(.*)\d+/Is
+
+/(.*(xyz))\d+\2/I
+
+/((.*))\d+\1/I
+ abc123bc
+
+/a[b]/I
+
+/(?=a).*/I
+
+/(?=abc).xyz/iI
+
+/(?=abc)(?i).xyz/I
+
+/(?=a)(?=b)/I
+
+/(?=.)a/I
+
+/((?=abcda)a)/I
+
+/((?=abcda)ab)/I
+
+/()a/I
+
+/(?(1)ab|ac)/I
+
+/(?(1)abz|acz)/I
+
+/(?(1)abz)/I
+
+/(?(1)abz)123/I
+
+/(a)+/I
+
+/(a){2,3}/I
+
+/(a)*/I
+
+/[a]/I
+
+/[ab]/I
+
+/[ab]/IS
+
+/[^a]/I
+
+/\d456/I
+
+/\d456/IS
+
+/a^b/I
+
+/^a/mI
+ abcde
+ xy\nabc
+ *** Failers
+ xyabc
+
+/c|abc/I
+
+/(?i)[ab]/IS
+
+/[ab](?i)cd/IS
+
+/abc(?C)def/
+ abcdef
+ 1234abcdef
+ *** Failers
+ abcxyz
+ abcxyzf
+
+/abc(?C)de(?C1)f/
+ 123abcdef
+
+/(?C1)\dabc(?C2)def/
+ 1234abcdef
+ *** Failers
+ abcdef
+
+/(?C255)ab/
+
+/(?C256)ab/
+
+/(?Cab)xx/
+
+/(?C12vr)x/
+
+/abc(?C)def/
+ *** Failers
+ \x83\x0\x61bcdef
+
+/(abc)(?C)de(?C1)f/
+ 123abcdef
+ 123abcdef\C+
+ 123abcdef\C-
+ *** Failers
+ 123abcdef\C!1
+
+/(?C0)(abc(?C1))*/
+ abcabcabc
+ abcabc\C!1!3
+ *** Failers
+ abcabcabc\C!1!3
+
+/(\d{3}(?C))*/
+ 123\C+
+ 123456\C+
+ 123456789\C+
+
+/((xyz)(?C)p|(?C1)xyzabc)/
+ xyzabc\C+
+
+/(X)((xyz)(?C)p|(?C1)xyzabc)/
+ Xxyzabc\C+
+
+/(?=(abc))(?C)abcdef/
+ abcdef\C+
+
+/(?!(abc)(?C1)d)(?C2)abcxyz/
+ abcxyz\C+
+
+/(?<=(abc)(?C))xyz/
+ abcxyz\C+
+
+/(?C)abc/
+
+/(?C)^abc/
+
+/(?C)a|b/S
+
+/(?R)/
+
+/(a|(?R))/
+
+/(ab|(bc|(de|(?R))))/
+
+/x(ab|(bc|(de|(?R))))/
+ xab
+ xbc
+ xde
+ xxab
+ xxxab
+ *** Failers
+ xyab
+
+/(ab|(bc|(de|(?1))))/
+
+/x(ab|(bc|(de|(?1)x)x)x)/
+
+/^([^()]|\((?1)*\))*$/
+ abc
+ a(b)c
+ a(b(c))d
+ *** Failers)
+ a(b(c)d
+
+/^>abc>([^()]|\((?1)*\))*<xyz<$/
+ >abc>123<xyz<
+ >abc>1(2)3<xyz<
+ >abc>(1(2)3)<xyz<
+
+/(a(?1)b)/D
+
+/(a(?1)+b)/D
+
+/^\W*(?:((.)\W*(?1)\W*\2|)|((.)\W*(?3)\W*\4|\W*.\W*))\W*$/i
+ 1221
+ Satan, oscillate my metallic sonatas!
+ A man, a plan, a canal: Panama!
+ Able was I ere I saw Elba.
+ *** Failers
+ The quick brown fox
+
+/^(\d+|\((?1)([+*-])(?1)\)|-(?1))$/
+ 12
+ (((2+2)*-3)-7)
+ -12
+ *** Failers
+ ((2+2)*-3)-7)
+
+/^(x(y|(?1){2})z)/
+ xyz
+ xxyzxyzz
+ *** Failers
+ xxyzz
+ xxyzxyzxyzz
+
+/((< (?: (?(R) \d++ | [^<>]*+) | (?2)) * >))/x
+ <>
+ <abcd>
+ <abc <123> hij>
+ <abc <def> hij>
+ <abc<>def>
+ <abc<>
+ *** Failers
+ <abc
+
+/(?1)/
+
+/((?2)(abc)/
+
+/^(abc)def(?1)/
+ abcdefabc
+
+/^(a|b|c)=(?1)+/
+ a=a
+ a=b
+ a=bc
+
+/^(a|b|c)=((?1))+/
+ a=a
+ a=b
+ a=bc
+
+/a(?P<name1>b|c)d(?P<longername2>e)/D
+ abde
+ acde
+
+/(?:a(?P<c>c(?P<d>d)))(?P<a>a)/D
+
+/(?P<a>a)...(?P=a)bbb(?P>a)d/D
+
+/^\W*(?:(?P<one>(?P<two>.)\W*(?P>one)\W*(?P=two)|)|(?P<three>(?P<four>.)\W*(?P>three)\W*(?P=four)|\W*.\W*))\W*$/i
+ 1221
+ Satan, oscillate my metallic sonatas!
+ A man, a plan, a canal: Panama!
+ Able was I ere I saw Elba.
+ *** Failers
+ The quick brown fox
+
+/((?(R)a|b))\1(?1)?/
+ bb
+ bbaa
+
+/(.*)a/sI
+
+/(.*)a\1/sI
+
+/(.*)a(b)\2/sI
+
+/((.*)a|(.*)b)z/sI
+
+/((.*)a|(.*)b)z\1/sI
+
+/((.*)a|(.*)b)z\2/sI
+
+/((.*)a|(.*)b)z\3/sI
+
+/((.*)a|^(.*)b)z\3/sI
+
+/(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a/sI
+
+/(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a\31/sI
+
+/(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a\32/sI
+
+/(a)(bc)/ND
+ abc
+
+/(?P<one>a)(bc)/ND
+ abc
+
+/(a)(?P<named>bc)/ND
+
+/(a+)*zz/
+ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazzbbbbbb\M
+ aaaaaaaaaaaaaz\M
+
+/(aaa(?C1)bbb|ab)/
+ aaabbb
+ aaabbb\C*0
+ aaabbb\C*1
+ aaabbb\C*-1
+
+/ab(?P<one>cd)ef(?P<two>gh)/
+ abcdefgh
+ abcdefgh\C1\Gtwo
+ abcdefgh\Cone\Ctwo
+ abcdefgh\Cthree
+
+/(?P<Tes>)(?P<Test>)/D
+
+/(?P<Test>)(?P<Tes>)/D
+
+/(?P<Z>zz)(?P<A>aa)/
+ zzaa\CZ
+ zzaa\CA
+
+/(?P<x>eks)(?P<x>eccs)/
+
+/(?P<abc>abc(?P<def>def)(?P<abc>xyz))/
+
+"\[((?P<elem>\d+)(,(?P>elem))*)\]"
+ [10,20,30,5,5,4,4,2,43,23,4234]
+ *** Failers
+ []
+
+"\[((?P<elem>\d+)(,(?P>elem))*)?\]"
+ [10,20,30,5,5,4,4,2,43,23,4234]
+ []
+
+/(a(b(?2)c))?/D
+
+/(a(b(?2)c))*/D
+
+/(a(b(?2)c)){0,2}/D
+
+/[ab]{1}+/D
+
+/((w\/|-|with)*(free|immediate)*.*?shipping\s*[!.-]*)/i
+ Baby Bjorn Active Carrier - With free SHIPPING!!
+
+/((w\/|-|with)*(free|immediate)*.*?shipping\s*[!.-]*)/iS
+ Baby Bjorn Active Carrier - With free SHIPPING!!
+
+/a*.*b/SD
+
+/(a|b)*.?c/SD
+
+/abc(?C255)de(?C)f/D
+
+/abcde/CD
+ abcde
+ abcdfe
+
+/a*b/CD
+ ab
+ aaaab
+ aaaacb
+
+/a+b/CD
+ ab
+ aaaab
+ aaaacb
+
+/(abc|def)x/CD
+ abcx
+ defx
+ abcdefzx
+
+/(ab|cd){3,4}/C
+ ababab
+ abcdabcd
+ abcdcdcdcdcd
+
+/([ab]{,4}c|xy)/CD
+ Note: that { does NOT introduce a quantifier
+
+/([ab]{1,4}c|xy){4,5}?123/CD
+ aacaacaacaacaac123
+
+/\b.*/I
+ ab cd\>1
+
+/\b.*/Is
+ ab cd\>1
+
+/(?!.bcd).*/I
+ Xbcd12345
+
+/abcde/
+ ab\P
+ abc\P
+ abcd\P
+ abcde\P
+ the quick brown abc\P
+ ** Failers\P
+ the quick brown abxyz fox\P
+
+"^(0?[1-9]|[12][0-9]|3[01])/(0?[1-9]|1[012])/(20)?\d\d$"
+ 13/05/04\P
+ 13/5/2004\P
+ 02/05/09\P
+ 1\P
+ 1/2\P
+ 1/2/0\P
+ 1/2/04\P
+ 0\P
+ 02/\P
+ 02/0\P
+ 02/1\P
+ ** Failers\P
+ \P
+ 123\P
+ 33/4/04\P
+ 3/13/04\P
+ 0/1/2003\P
+ 0/\P
+ 02/0/\P
+ 02/13\P
+
+/0{0,2}ABC/I
+
+/\d{3,}ABC/I
+
+/\d*ABC/I
+
+/[abc]+DE/I
+
+/[abc]?123/
+ 123\P
+ a\P
+ b\P
+ c\P
+ c12\P
+ c123\P
+
+/^(?:\d){3,5}X/
+ 1\P
+ 123\P
+ 123X
+ 1234\P
+ 1234X
+ 12345\P
+ 12345X
+ *** Failers
+ 1X
+ 123456\P
+
+/abc/>testsavedregex
+<testsavedregex
+ abc
+ ** Failers
+ bca
+
+/abc/F>testsavedregex
+<testsavedregex
+ abc
+ ** Failers
+ bca
+
+/(a|b)/S>testsavedregex
+<testsavedregex
+ abc
+ ** Failers
+ def
+
+/(a|b)/SF>testsavedregex
+<testsavedregex
+ abc
+ ** Failers
+ def
+
+~<(\w+)/?>(.)*</(\1)>~smg
+ <!DOCTYPE seite SYSTEM "http://www.lco.lineas.de/xmlCms.dtd">\n<seite>\n<dokumenteninformation>\n<seitentitel>Partner der LCO</seitentitel>\n<sprache>de</sprache>\n<seitenbeschreibung>Partner der LINEAS Consulting\nGmbH</seitenbeschreibung>\n<schluesselworte>LINEAS Consulting GmbH Hamburg\nPartnerfirmen</schluesselworte>\n<revisit>30 days</revisit>\n<robots>index,follow</robots>\n<menueinformation>\n<aktiv>ja</aktiv>\n<menueposition>3</menueposition>\n<menuetext>Partner</menuetext>\n</menueinformation>\n<lastedited>\n<autor>LCO</autor>\n<firma>LINEAS Consulting</firma>\n<datum>15.10.2003</datum>\n</lastedited>\n</dokumenteninformation>\n<inhalt>\n\n<absatzueberschrift>Die Partnerfirmen der LINEAS Consulting\nGmbH</absatzueberschrift>\n\n<absatz><link ziel="http://www.ca.com/" zielfenster="_blank">\n<bild name="logo_ca.gif" rahmen="no"/></link> <link\nziel="http://www.ey.com/" zielfenster="_blank"><bild\nname="logo_euy.gif" rahmen="no"/></link>\n</absatz>\n\n<absatz><link ziel="http://www.cisco.de/" zielfenster="_blank">\n<bild name="logo_cisco.gif" rahmen="ja"/></link></absatz>\n\n<absatz><link ziel="http://www.atelion.de/"\nzielfenster="_blank"><bild\nname="logo_atelion.gif" rahmen="no"/></link>\n</absatz>\n\n<absatz><link ziel="http://www.line-information.de/"\nzielfenster="_blank">\n<bild name="logo_line_information.gif" rahmen="no"/></link>\n</absatz>\n\n<absatz><bild name="logo_aw.gif" rahmen="no"/></absatz>\n\n<absatz><link ziel="http://www.incognis.de/"\nzielfenster="_blank"><bild\nname="logo_incognis.gif" rahmen="no"/></link></absatz>\n\n<absatz><link ziel="http://www.addcraft.com/"\nzielfenster="_blank"><bild\nname="logo_addcraft.gif" rahmen="no"/></link></absatz>\n\n<absatz><link ziel="http://www.comendo.com/"\nzielfenster="_blank"><bild\nname="logo_comendo.gif" rahmen="no"/></link></absatz>\n\n</inhalt>\n</seite>
+
+/^a/IF
+
+/ End of testinput2 /
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testinput3 b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testinput3
new file mode 100644
index 00000000..c2abdbfd
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testinput3
@@ -0,0 +1,65 @@
+/^[\w]+/
+ *** Failers
+ École
+
+/^[\w]+/Lfr_FR
+ École
+
+/^[\w]+/
+ *** Failers
+ École
+
+/^[\W]+/
+ École
+
+/^[\W]+/Lfr_FR
+ *** Failers
+ École
+
+/[\b]/
+ \b
+ *** Failers
+ a
+
+/[\b]/Lfr_FR
+ \b
+ *** Failers
+ a
+
+/^\w+/
+ *** Failers
+ École
+
+/^\w+/Lfr_FR
+ École
+
+/(.+)\b(.+)/
+ École
+
+/(.+)\b(.+)/Lfr_FR
+ *** Failers
+ École
+
+/École/i
+ École
+ *** Failers
+ école
+
+/École/iLfr_FR
+ École
+ école
+
+/\w/IS
+
+/\w/ISLfr_FR
+
+/^[\xc8-\xc9]/iLfr_FR
+ École
+ école
+
+/^[\xc8-\xc9]/Lfr_FR
+ École
+ *** Failers
+ école
+
+/ End of testinput3 /
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testinput4 b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testinput4
new file mode 100644
index 00000000..c16e9d99
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testinput4
@@ -0,0 +1,513 @@
+/-- Do not use the \x{} construct except with patterns that have the --/
+/-- /8 option set, because PCRE doesn't recognize them as UTF-8 unless --/
+/-- that option is set. However, the latest Perls recognize them always. --/
+
+/a.b/8
+ acb
+ a\x7fb
+ a\x{100}b
+ *** Failers
+ a\nb
+
+/a(.{3})b/8
+ a\x{4000}xyb
+ a\x{4000}\x7fyb
+ a\x{4000}\x{100}yb
+ *** Failers
+ a\x{4000}b
+ ac\ncb
+
+/a(.*?)(.)/
+ a\xc0\x88b
+
+/a(.*?)(.)/8
+ a\x{100}b
+
+/a(.*)(.)/
+ a\xc0\x88b
+
+/a(.*)(.)/8
+ a\x{100}b
+
+/a(.)(.)/
+ a\xc0\x92bcd
+
+/a(.)(.)/8
+ a\x{240}bcd
+
+/a(.?)(.)/
+ a\xc0\x92bcd
+
+/a(.?)(.)/8
+ a\x{240}bcd
+
+/a(.??)(.)/
+ a\xc0\x92bcd
+
+/a(.??)(.)/8
+ a\x{240}bcd
+
+/a(.{3})b/8
+ a\x{1234}xyb
+ a\x{1234}\x{4321}yb
+ a\x{1234}\x{4321}\x{3412}b
+ *** Failers
+ a\x{1234}b
+ ac\ncb
+
+/a(.{3,})b/8
+ a\x{1234}xyb
+ a\x{1234}\x{4321}yb
+ a\x{1234}\x{4321}\x{3412}b
+ axxxxbcdefghijb
+ a\x{1234}\x{4321}\x{3412}\x{3421}b
+ *** Failers
+ a\x{1234}b
+
+/a(.{3,}?)b/8
+ a\x{1234}xyb
+ a\x{1234}\x{4321}yb
+ a\x{1234}\x{4321}\x{3412}b
+ axxxxbcdefghijb
+ a\x{1234}\x{4321}\x{3412}\x{3421}b
+ *** Failers
+ a\x{1234}b
+
+/a(.{3,5})b/8
+ a\x{1234}xyb
+ a\x{1234}\x{4321}yb
+ a\x{1234}\x{4321}\x{3412}b
+ axxxxbcdefghijb
+ a\x{1234}\x{4321}\x{3412}\x{3421}b
+ axbxxbcdefghijb
+ axxxxxbcdefghijb
+ *** Failers
+ a\x{1234}b
+ axxxxxxbcdefghijb
+
+/a(.{3,5}?)b/8
+ a\x{1234}xyb
+ a\x{1234}\x{4321}yb
+ a\x{1234}\x{4321}\x{3412}b
+ axxxxbcdefghijb
+ a\x{1234}\x{4321}\x{3412}\x{3421}b
+ axbxxbcdefghijb
+ axxxxxbcdefghijb
+ *** Failers
+ a\x{1234}b
+ axxxxxxbcdefghijb
+
+/^[a\x{c0}]/8
+ *** Failers
+ \x{100}
+
+/(?<=aXb)cd/8
+ aXbcd
+
+/(?<=a\x{100}b)cd/8
+ a\x{100}bcd
+
+/(?<=a\x{100000}b)cd/8
+ a\x{100000}bcd
+
+/(?:\x{100}){3}b/8
+ \x{100}\x{100}\x{100}b
+ *** Failers
+ \x{100}\x{100}b
+
+/\x{ab}/8
+ \x{ab}
+ \xc2\xab
+ *** Failers
+ \x00{ab}
+
+/(?<=(.))X/8
+ WXYZ
+ \x{256}XYZ
+ *** Failers
+ XYZ
+
+/X(\C{3})/8
+ X\x{1234}
+
+/X(\C{4})/8
+ X\x{1234}YZ
+
+/X\C*/8
+ XYZabcdce
+
+/X\C*?/8
+ XYZabcde
+
+/X\C{3,5}/8
+ Xabcdefg
+ X\x{1234}
+ X\x{1234}YZ
+ X\x{1234}\x{512}
+ X\x{1234}\x{512}YZ
+
+/X\C{3,5}?/8
+ Xabcdefg
+ X\x{1234}
+ X\x{1234}YZ
+ X\x{1234}\x{512}
+
+/[^a]+/8g
+ bcd
+ \x{100}aY\x{256}Z
+
+/^[^a]{2}/8
+ \x{100}bc
+
+/^[^a]{2,}/8
+ \x{100}bcAa
+
+/^[^a]{2,}?/8
+ \x{100}bca
+
+/[^a]+/8ig
+ bcd
+ \x{100}aY\x{256}Z
+
+/^[^a]{2}/8i
+ \x{100}bc
+
+/^[^a]{2,}/8i
+ \x{100}bcAa
+
+/^[^a]{2,}?/8i
+ \x{100}bca
+
+/\x{100}{0,0}/8
+ abcd
+
+/\x{100}?/8
+ abcd
+ \x{100}\x{100}
+
+/\x{100}{0,3}/8
+ \x{100}\x{100}
+ \x{100}\x{100}\x{100}\x{100}
+
+/\x{100}*/8
+ abce
+ \x{100}\x{100}\x{100}\x{100}
+
+/\x{100}{1,1}/8
+ abcd\x{100}\x{100}\x{100}\x{100}
+
+/\x{100}{1,3}/8
+ abcd\x{100}\x{100}\x{100}\x{100}
+
+/\x{100}+/8
+ abcd\x{100}\x{100}\x{100}\x{100}
+
+/\x{100}{3}/8
+ abcd\x{100}\x{100}\x{100}XX
+
+/\x{100}{3,5}/8
+ abcd\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}XX
+
+/\x{100}{3,}/8
+ abcd\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}XX
+
+/(?<=a\x{100}{2}b)X/8+
+ Xyyya\x{100}\x{100}bXzzz
+
+/\D*/8
+ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/\D*/8
+ \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}
+
+/\D/8
+ 1X2
+ 1\x{100}2
+
+/>\S/8
+ > >X Y
+ > >\x{100} Y
+
+/\d/8
+ \x{100}3
+
+/\s/8
+ \x{100} X
+
+/\D+/8
+ 12abcd34
+ *** Failers
+ 1234
+
+/\D{2,3}/8
+ 12abcd34
+ 12ab34
+ *** Failers
+ 1234
+ 12a34
+
+/\D{2,3}?/8
+ 12abcd34
+ 12ab34
+ *** Failers
+ 1234
+ 12a34
+
+/\d+/8
+ 12abcd34
+ *** Failers
+
+/\d{2,3}/8
+ 12abcd34
+ 1234abcd
+ *** Failers
+ 1.4
+
+/\d{2,3}?/8
+ 12abcd34
+ 1234abcd
+ *** Failers
+ 1.4
+
+/\S+/8
+ 12abcd34
+ *** Failers
+ \ \
+
+/\S{2,3}/8
+ 12abcd34
+ 1234abcd
+ *** Failers
+ \ \
+
+/\S{2,3}?/8
+ 12abcd34
+ 1234abcd
+ *** Failers
+ \ \
+
+/>\s+</8+
+ 12> <34
+ *** Failers
+
+/>\s{2,3}</8+
+ ab> <cd
+ ab> <ce
+ *** Failers
+ ab> <cd
+
+/>\s{2,3}?</8+
+ ab> <cd
+ ab> <ce
+ *** Failers
+ ab> <cd
+
+/\w+/8
+ 12 34
+ *** Failers
+ +++=*!
+
+/\w{2,3}/8
+ ab cd
+ abcd ce
+ *** Failers
+ a.b.c
+
+/\w{2,3}?/8
+ ab cd
+ abcd ce
+ *** Failers
+ a.b.c
+
+/\W+/8
+ 12====34
+ *** Failers
+ abcd
+
+/\W{2,3}/8
+ ab====cd
+ ab==cd
+ *** Failers
+ a.b.c
+
+/\W{2,3}?/8
+ ab====cd
+ ab==cd
+ *** Failers
+ a.b.c
+
+/[\x{100}]/8
+ \x{100}
+ Z\x{100}
+ \x{100}Z
+ *** Failers
+
+/[Z\x{100}]/8
+ Z\x{100}
+ \x{100}
+ \x{100}Z
+ *** Failers
+
+/[\x{100}\x{200}]/8
+ ab\x{100}cd
+ ab\x{200}cd
+ *** Failers
+
+/[\x{100}-\x{200}]/8
+ ab\x{100}cd
+ ab\x{200}cd
+ ab\x{111}cd
+ *** Failers
+
+/[z-\x{200}]/8
+ ab\x{100}cd
+ ab\x{200}cd
+ ab\x{111}cd
+ abzcd
+ ab|cd
+ *** Failers
+
+/[Q\x{100}\x{200}]/8
+ ab\x{100}cd
+ ab\x{200}cd
+ Q?
+ *** Failers
+
+/[Q\x{100}-\x{200}]/8
+ ab\x{100}cd
+ ab\x{200}cd
+ ab\x{111}cd
+ Q?
+ *** Failers
+
+/[Qz-\x{200}]/8
+ ab\x{100}cd
+ ab\x{200}cd
+ ab\x{111}cd
+ abzcd
+ ab|cd
+ Q?
+ *** Failers
+
+/[\x{100}\x{200}]{1,3}/8
+ ab\x{100}cd
+ ab\x{200}cd
+ ab\x{200}\x{100}\x{200}\x{100}cd
+ *** Failers
+
+/[\x{100}\x{200}]{1,3}?/8
+ ab\x{100}cd
+ ab\x{200}cd
+ ab\x{200}\x{100}\x{200}\x{100}cd
+ *** Failers
+
+/[Q\x{100}\x{200}]{1,3}/8
+ ab\x{100}cd
+ ab\x{200}cd
+ ab\x{200}\x{100}\x{200}\x{100}cd
+ *** Failers
+
+/[Q\x{100}\x{200}]{1,3}?/8
+ ab\x{100}cd
+ ab\x{200}cd
+ ab\x{200}\x{100}\x{200}\x{100}cd
+ *** Failers
+
+/(?<=[\x{100}\x{200}])X/8
+ abc\x{200}X
+ abc\x{100}X
+ *** Failers
+ X
+
+/(?<=[Q\x{100}\x{200}])X/8
+ abc\x{200}X
+ abc\x{100}X
+ abQX
+ *** Failers
+ X
+
+/(?<=[\x{100}\x{200}]{3})X/8
+ abc\x{100}\x{200}\x{100}X
+ *** Failers
+ abc\x{200}X
+ X
+
+/[^\x{100}\x{200}]X/8
+ AX
+ \x{150}X
+ \x{500}X
+ *** Failers
+ \x{100}X
+ \x{200}X
+
+/[^Q\x{100}\x{200}]X/8
+ AX
+ \x{150}X
+ \x{500}X
+ *** Failers
+ \x{100}X
+ \x{200}X
+ QX
+
+/[^\x{100}-\x{200}]X/8
+ AX
+ \x{500}X
+ *** Failers
+ \x{100}X
+ \x{150}X
+ \x{200}X
+
+/a\Cb/
+ aXb
+ a\nb
+
+/a\Cb/8
+ aXb
+ a\nb
+ *** Failers
+ a\x{100}b
+
+/[z-\x{100}]/8i
+ z
+ Z
+ \x{100}
+ *** Failers
+ \x{102}
+ y
+
+/[\xFF]/
+ >\xff<
+
+/[\xff]/8
+ >\x{ff}<
+
+/[^\xFF]/
+ XYZ
+
+/[^\xff]/8
+ XYZ
+ \x{123}
+
+/^[ac]*b/8
+ xb
+
+/^[ac\x{100}]*b/8
+ xb
+
+/^[^x]*b/8i
+ xb
+
+/^[^x]*b/8
+ xb
+
+/^\d*b/8
+ xb
+
+/(|a)/g8
+ catac
+ a\x{256}a
+
+/^\x{85}$/8i
+ \x{85}
+
+/ End of testinput4 /
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testinput5 b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testinput5
new file mode 100644
index 00000000..fe6ee3e6
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testinput5
@@ -0,0 +1,263 @@
+/\x{100}/8DM
+
+/\x{1000}/8DM
+
+/\x{10000}/8DM
+
+/\x{100000}/8DM
+
+/\x{1000000}/8DM
+
+/\x{4000000}/8DM
+
+/\x{7fffFFFF}/8DM
+
+/[\x{ff}]/8DM
+
+/[\x{100}]/8DM
+
+/\x{ffffffff}/8
+
+/\x{100000000}/8
+
+/^\x{100}a\x{1234}/8
+ \x{100}a\x{1234}bcd
+
+/\x80/8D
+
+/\xff/8D
+
+/\x{0041}\x{2262}\x{0391}\x{002e}/D8
+ \x{0041}\x{2262}\x{0391}\x{002e}
+
+/\x{D55c}\x{ad6d}\x{C5B4}/D8
+ \x{D55c}\x{ad6d}\x{C5B4}
+
+/\x{65e5}\x{672c}\x{8a9e}/D8
+ \x{65e5}\x{672c}\x{8a9e}
+
+/\x{80}/D8
+
+/\x{084}/D8
+
+/\x{104}/D8
+
+/\x{861}/D8
+
+/\x{212ab}/D8
+
+/.{3,5}X/D8
+ \x{212ab}\x{212ab}\x{212ab}\x{861}X
+
+
+/.{3,5}?/D8
+ \x{212ab}\x{212ab}\x{212ab}\x{861}
+
+/-- These tests are here rather than in testinput4 because Perl 5.6 has --/
+/-- some problems with UTF-8 support, in the area of \x{..} where the --/
+/-- value is < 255. It grumbles about invalid UTF-8 strings. --/
+
+/^[a\x{c0}]b/8
+ \x{c0}b
+
+/^([a\x{c0}]*?)aa/8
+ a\x{c0}aaaa/
+
+/^([a\x{c0}]*?)aa/8
+ a\x{c0}aaaa/
+ a\x{c0}a\x{c0}aaa/
+
+/^([a\x{c0}]*)aa/8
+ a\x{c0}aaaa/
+ a\x{c0}a\x{c0}aaa/
+
+/^([a\x{c0}]*)a\x{c0}/8
+ a\x{c0}aaaa/
+ a\x{c0}a\x{c0}aaa/
+
+/-- --/
+
+/(?<=\C)X/8
+ Should produce an error diagnostic
+
+/-- This one is here not because it's different to Perl, but because the --/
+/-- way the captured single-byte is displayed. (In Perl it becomes a --/
+/-- character, and you can't tell the difference.) --/
+
+/X(\C)(.*)/8
+ X\x{1234}
+ X\nabc
+
+/^[ab]/8D
+ bar
+ *** Failers
+ c
+ \x{ff}
+ \x{100}
+
+/^[^ab]/8D
+ c
+ \x{ff}
+ \x{100}
+ *** Failers
+ aaa
+
+/[^ab\xC0-\xF0]/8SD
+ \x{f1}
+ \x{bf}
+ \x{100}
+ \x{1000}
+ *** Failers
+ \x{c0}
+ \x{f0}
+
+/Ä€{3,4}/8SD
+ \x{100}\x{100}\x{100}\x{100\x{100}
+
+/(\x{100}+|x)/8SD
+
+/(\x{100}*a|x)/8SD
+
+/(\x{100}{0,2}a|x)/8SD
+
+/(\x{100}{1,2}a|x)/8SD
+
+/\x{100}*(\d+|"(?1)")/8
+ 1234
+ "1234"
+ \x{100}1234
+ "\x{100}1234"
+ \x{100}\x{100}12ab
+ \x{100}\x{100}"12"
+ *** Failers
+ \x{100}\x{100}abcd
+
+/\x{100}/8D
+
+/\x{100}*/8D
+
+/a\x{100}*/8D
+
+/ab\x{100}*/8D
+
+/a\x{100}\x{101}*/8D
+
+/a\x{100}\x{101}+/8D
+
+/\x{100}*A/8D
+ A
+
+/\x{100}*\d(?R)/8D
+
+/[^\x{c4}]/D
+
+/[^\x{c4}]/8D
+
+/[\x{100}]/8DM
+ \x{100}
+ Z\x{100}
+ \x{100}Z
+ *** Failers
+
+/[Z\x{100}]/8DM
+ Z\x{100}
+ \x{100}
+ \x{100}Z
+ *** Failers
+
+/[\x{200}-\x{100}]/8
+
+/[Ä€-Ä„]/8
+ \x{100}
+ \x{104}
+ *** Failers
+ \x{105}
+ \x{ff}
+
+/[z-\x{100}]/8D
+
+/[z\Qa-d]Ä€\E]/8D
+ \x{100}
+ Ā
+
+/[\xFF]/D
+ >\xff<
+
+/[\xff]/D8
+ >\x{ff}<
+
+/[^\xFF]/D
+
+/[^\xff]/8D
+
+/[Ä-Ü]/8
+ Ö # Matches without Study
+ \x{d6}
+
+/[Ä-Ü]/8S
+ Ö <-- Same with Study
+ \x{d6}
+
+/[\x{c4}-\x{dc}]/8
+ Ö # Matches without Study
+ \x{d6}
+
+/[\x{c4}-\x{dc}]/8S
+ Ö <-- Same with Study
+ \x{d6}
+
+/[Ã]/8
+
+/Ã/8
+
+/ÃÃÃxxx/8
+
+/ÃÃÃxxx/8?D
+
+/abc/8
+ Ã]
+ Ã
+ ÃÃÃ
+ ÃÃÃ\?
+
+/anything/8
+ \xc0\x80
+ \xc1\x8f
+ \xe0\x9f\x80
+ \xf0\x8f\x80\x80
+ \xf8\x87\x80\x80\x80
+ \xfc\x83\x80\x80\x80\x80
+ \xfe\x80\x80\x80\x80\x80
+ \xff\x80\x80\x80\x80\x80
+ \xc3\x8f
+ \xe0\xaf\x80
+ \xe1\x80\x80
+ \xf0\x9f\x80\x80
+ \xf1\x8f\x80\x80
+ \xf8\x88\x80\x80\x80
+ \xf9\x87\x80\x80\x80
+ \xfc\x84\x80\x80\x80\x80
+ \xfd\x83\x80\x80\x80\x80
+
+/\x{100}abc(xyz(?1))/8D
+
+/[^\x{100}]abc(xyz(?1))/8D
+
+/[ab\x{100}]abc(xyz(?1))/8D
+
+/(\x{100}(b(?2)c))?/D8
+
+/(\x{100}(b(?2)c)){0,2}/D8
+
+/(\x{100}(b(?1)c))?/D8
+
+/(\x{100}(b(?1)c)){0,2}/D8
+
+/\W/8
+ A.B
+ A\x{100}B
+
+/\w/8
+ \x{100}X
+
+/ End of testinput5 /
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testinput6 b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testinput6
new file mode 100644
index 00000000..01a39477
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testinput6
@@ -0,0 +1,517 @@
+/^\pC\pL\pM\pN\pP\pS\pZ</8
+ \x7f\x{c0}\x{30f}\x{660}\x{66c}\x{f01}\x{1680}<
+ \np\x{300}9!\$ <
+ ** Failers
+ ap\x{300}9!\$ <
+
+/^\PC/8
+ X
+ ** Failers
+ \x7f
+
+/^\PL/8
+ 9
+ ** Failers
+ \x{c0}
+
+/^\PM/8
+ X
+ ** Failers
+ \x{30f}
+
+/^\PN/8
+ X
+ ** Failers
+ \x{660}
+
+/^\PP/8
+ X
+ ** Failers
+ \x{66c}
+
+/^\PS/8
+ X
+ ** Failers
+ \x{f01}
+
+/^\PZ/8
+ X
+ ** Failers
+ \x{1680}
+
+/^\p{Cc}/8
+ \x{017}
+ \x{09f}
+ ** Failers
+ \x{0600}
+
+/^\p{Cf}/8
+ \x{601}
+ ** Failers
+ \x{09f}
+
+/^\p{Cn}/8
+ ** Failers
+ \x{09f}
+
+/^\p{Co}/8
+ \x{f8ff}
+ ** Failers
+ \x{09f}
+
+/^\p{Cs}/8
+ \x{dfff}
+ ** Failers
+ \x{09f}
+
+/^\p{Ll}/8
+ a
+ ** Failers
+ Z
+ \x{dfff}
+
+/^\p{Lm}/8
+ \x{2b0}
+ ** Failers
+ a
+
+/^\p{Lo}/8
+ \x{1bb}
+ ** Failers
+ a
+ \x{2b0}
+
+/^\p{Lt}/8
+ \x{1c5}
+ ** Failers
+ a
+ \x{2b0}
+
+/^\p{Lu}/8
+ A
+ ** Failers
+ \x{2b0}
+
+/^\p{Mc}/8
+ \x{903}
+ ** Failers
+ X
+ \x{300}
+
+/^\p{Me}/8
+ \x{488}
+ ** Failers
+ X
+ \x{903}
+ \x{300}
+
+/^\p{Mn}/8
+ \x{300}
+ ** Failers
+ X
+ \x{903}
+
+/^\p{Nd}+/8
+ 0123456789\x{660}\x{661}\x{662}\x{663}\x{664}\x{665}\x{666}\x{667}\x{668}\x{669}\x{66a}
+ \x{6f0}\x{6f1}\x{6f2}\x{6f3}\x{6f4}\x{6f5}\x{6f6}\x{6f7}\x{6f8}\x{6f9}\x{6fa}
+ \x{966}\x{967}\x{968}\x{969}\x{96a}\x{96b}\x{96c}\x{96d}\x{96e}\x{96f}\x{970}
+ ** Failers
+ X
+
+/^\p{Nl}/8
+ \x{16ee}
+ ** Failers
+ X
+ \x{966}
+
+/^\p{No}/8
+ \x{b2}
+ \x{b3}
+ ** Failers
+ X
+ \x{16ee}
+
+/^\p{Pc}/8
+ \x5f
+ \x{203f}
+ ** Failers
+ X
+ -
+ \x{58a}
+
+/^\p{Pd}/8
+ -
+ \x{58a}
+ ** Failers
+ X
+ \x{203f}
+
+/^\p{Pe}/8
+ )
+ ]
+ }
+ \x{f3b}
+ ** Failers
+ X
+ \x{203f}
+ (
+ [
+ {
+ \x{f3c}
+
+/^\p{Pf}/8
+ \x{bb}
+ \x{2019}
+ ** Failers
+ X
+ \x{203f}
+
+/^\p{Pi}/8
+ \x{ab}
+ \x{2018}
+ ** Failers
+ X
+ \x{203f}
+
+/^\p{Po}/8
+ !
+ \x{37e}
+ ** Failers
+ X
+ \x{203f}
+
+/^\p{Ps}/8
+ (
+ [
+ {
+ \x{f3c}
+ ** Failers
+ X
+ )
+ ]
+ }
+ \x{f3b}
+
+/^\p{Sc}+/8
+ $\x{a2}\x{a3}\x{a4}\x{a5}\x{a6}
+ \x{9f2}
+ ** Failers
+ X
+ \x{2c2}
+
+/^\p{Sk}/8
+ \x{2c2}
+ ** Failers
+ X
+ \x{9f2}
+
+/^\p{Sm}+/8
+ +<|~\x{ac}\x{2044}
+ ** Failers
+ X
+ \x{9f2}
+
+/^\p{So}/8
+ \x{a6}
+ \x{482}
+ ** Failers
+ X
+ \x{9f2}
+
+/^\p{Zl}/8
+ \x{2028}
+ ** Failers
+ X
+ \x{2029}
+
+/^\p{Zp}/8
+ \x{2029}
+ ** Failers
+ X
+ \x{2028}
+
+/^\p{Zs}/8
+ \ \
+ \x{a0}
+ \x{1680}
+ \x{180e}
+ \x{2000}
+ \x{2001}
+ ** Failers
+ \x{2028}
+ \x{200d}
+
+/\p{Nd}+(..)/8
+ \x{660}\x{661}\x{662}ABC
+
+/\p{Nd}+?(..)/8
+ \x{660}\x{661}\x{662}ABC
+
+/\p{Nd}{2,}(..)/8
+ \x{660}\x{661}\x{662}ABC
+
+/\p{Nd}{2,}?(..)/8
+ \x{660}\x{661}\x{662}ABC
+
+/\p{Nd}*(..)/8
+ \x{660}\x{661}\x{662}ABC
+
+/\p{Nd}*?(..)/8
+ \x{660}\x{661}\x{662}ABC
+
+/\p{Nd}{2}(..)/8
+ \x{660}\x{661}\x{662}ABC
+
+/\p{Nd}{2,3}(..)/8
+ \x{660}\x{661}\x{662}ABC
+
+/\p{Nd}{2,3}?(..)/8
+ \x{660}\x{661}\x{662}ABC
+
+/\p{Nd}?(..)/8
+ \x{660}\x{661}\x{662}ABC
+
+/\p{Nd}??(..)/8
+ \x{660}\x{661}\x{662}ABC
+
+/\p{Nd}*+(..)/8
+ \x{660}\x{661}\x{662}ABC
+
+/\p{Nd}*+(...)/8
+ \x{660}\x{661}\x{662}ABC
+
+/\p{Nd}*+(....)/8
+ ** Failers
+ \x{660}\x{661}\x{662}ABC
+
+/\p{Lu}/8i
+ A
+ a\x{10a0}B
+ ** Failers
+ a
+ \x{1d00}
+
+/\p{^Lu}/8i
+ 1234
+ ** Failers
+ ABC
+
+/\P{Lu}/8i
+ 1234
+ ** Failers
+ ABC
+
+/(?<=A\p{Nd})XYZ/8
+ A2XYZ
+ 123A5XYZPQR
+ ABA\x{660}XYZpqr
+ ** Failers
+ AXYZ
+ XYZ
+
+/(?<!\pL)XYZ/8
+ 1XYZ
+ AB=XYZ..
+ XYZ
+ ** Failers
+ WXYZ
+
+/[\p{L}]/D
+
+/[\p{^L}]/D
+
+/[\P{L}]/D
+
+/[\P{^L}]/D
+
+/[abc\p{L}\x{0660}]/8D
+
+/[\p{Nd}]/8DM
+ 1234
+
+/[\p{Nd}+-]+/8DM
+ 1234
+ 12-34
+ 12+\x{661}-34
+ ** Failers
+ abcd
+
+/[\P{Nd}]+/8
+ abcd
+ ** Failers
+ 1234
+
+/\D+/8
+ 11111111111111111111111111111111111111111111111111111111111111111111111
+ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/\P{Nd}+/8
+ 11111111111111111111111111111111111111111111111111111111111111111111111
+ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/[\D]+/8
+ 11111111111111111111111111111111111111111111111111111111111111111111111
+ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/[\P{Nd}]+/8
+ 11111111111111111111111111111111111111111111111111111111111111111111111
+ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/[\D\P{Nd}]+/8
+ 11111111111111111111111111111111111111111111111111111111111111111111111
+ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/\pL/8
+ a
+ A
+
+/\pL/8i
+ a
+ A
+
+/\p{Lu}/8
+ A
+ aZ
+ ** Failers
+ abc
+
+/\p{Lu}/8i
+ A
+ aZ
+ ** Failers
+ abc
+
+/\p{Ll}/8
+ a
+ Az
+ ** Failers
+ ABC
+
+/\p{Ll}/8i
+ a
+ Az
+ ** Failers
+ ABC
+
+/^\x{c0}$/8i
+ \x{c0}
+ \x{e0}
+
+/^\x{e0}$/8i
+ \x{c0}
+ \x{e0}
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8
+ A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+ ** Failers
+ a\x{391}\x{10427}\x{ff3a}\x{1fb0}
+ A\x{3b1}\x{10427}\x{ff3a}\x{1fb0}
+ A\x{391}\x{1044F}\x{ff3a}\x{1fb0}
+ A\x{391}\x{10427}\x{ff5a}\x{1fb0}
+ A\x{391}\x{10427}\x{ff3a}\x{1fb8}
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8i
+ A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+ a\x{391}\x{10427}\x{ff3a}\x{1fb0}
+ A\x{3b1}\x{10427}\x{ff3a}\x{1fb0}
+ A\x{391}\x{1044F}\x{ff3a}\x{1fb0}
+ A\x{391}\x{10427}\x{ff5a}\x{1fb0}
+ A\x{391}\x{10427}\x{ff3a}\x{1fb8}
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8iD
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8D
+
+/AB\x{1fb0}/8D
+
+/AB\x{1fb0}/8Di
+
+/\x{391}+/8i
+ \x{391}\x{3b1}\x{3b1}\x{3b1}\x{391}
+
+/\x{391}{3,5}(.)/8i
+ \x{391}\x{3b1}\x{3b1}\x{3b1}\x{391}X
+
+/\x{391}{3,5}?(.)/8i
+ \x{391}\x{3b1}\x{3b1}\x{3b1}\x{391}X
+
+/[\x{391}\x{ff3a}]/8i
+ \x{391}
+ \x{ff3a}
+ \x{3b1}
+ \x{ff5a}
+
+/[\x{c0}\x{391}]/8i
+ \x{c0}
+ \x{e0}
+
+/[\x{105}-\x{109}]/8iD
+ \x{104}
+ \x{105}
+ \x{109}
+ ** Failers
+ \x{100}
+ \x{10a}
+
+/[z-\x{100}]/8iD
+ Z
+ z
+ \x{39c}
+ \x{178}
+ |
+ \x{80}
+ \x{ff}
+ \x{100}
+ \x{101}
+ ** Failers
+ \x{102}
+ Y
+ y
+
+/[z-\x{100}]/8Di
+
+/^\X/8
+ A
+ A\x{300}BC
+ A\x{300}\x{301}\x{302}BC
+ *** Failers
+ \x{300}
+
+/^[\X]/8
+ X123
+ *** Failers
+ AXYZ
+
+/^(\X*)C/8
+ A\x{300}\x{301}\x{302}BCA\x{300}\x{301}
+ A\x{300}\x{301}\x{302}BCA\x{300}\x{301}C
+
+/^(\X*?)C/8
+ A\x{300}\x{301}\x{302}BCA\x{300}\x{301}
+ A\x{300}\x{301}\x{302}BCA\x{300}\x{301}C
+
+/^(\X*)(.)/8
+ A\x{300}\x{301}\x{302}BCA\x{300}\x{301}
+ A\x{300}\x{301}\x{302}BCA\x{300}\x{301}C
+
+/^(\X*?)(.)/8
+ A\x{300}\x{301}\x{302}BCA\x{300}\x{301}
+ A\x{300}\x{301}\x{302}BCA\x{300}\x{301}C
+
+/^\X(.)/8
+ *** Failers
+ A\x{300}\x{301}\x{302}
+
+/^\X{2,3}(.)/8
+ A\x{300}\x{301}B\x{300}X
+ A\x{300}\x{301}B\x{300}C\x{300}\x{301}
+ A\x{300}\x{301}B\x{300}C\x{300}\x{301}X
+ A\x{300}\x{301}B\x{300}C\x{300}\x{301}DA\x{300}X
+
+/^\X{2,3}?(.)/8
+ A\x{300}\x{301}B\x{300}X
+ A\x{300}\x{301}B\x{300}C\x{300}\x{301}
+ A\x{300}\x{301}B\x{300}C\x{300}\x{301}X
+ A\x{300}\x{301}B\x{300}C\x{300}\x{301}DA\x{300}X
+
+/ End of testinput6 /
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testoutput1 b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testoutput1
new file mode 100644
index 00000000..07e73764
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testoutput1
@@ -0,0 +1,6274 @@
+PCRE version 5.0 13-Sep-2004
+
+/the quick brown fox/
+ the quick brown fox
+ 0: the quick brown fox
+ The quick brown FOX
+No match
+ What do you know about the quick brown fox?
+ 0: the quick brown fox
+ What do you know about THE QUICK BROWN FOX?
+No match
+
+/The quick brown fox/i
+ the quick brown fox
+ 0: the quick brown fox
+ The quick brown FOX
+ 0: The quick brown FOX
+ What do you know about the quick brown fox?
+ 0: the quick brown fox
+ What do you know about THE QUICK BROWN FOX?
+ 0: THE QUICK BROWN FOX
+
+/abcd\t\n\r\f\a\e\071\x3b\$\\\?caxyz/
+ abcd\t\n\r\f\a\e9;\$\\?caxyz
+ 0: abcd\x09\x0a\x0d\x0c\x07\x1b9;$\?caxyz
+
+/a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/
+ abxyzpqrrrabbxyyyypqAzz
+ 0: abxyzpqrrrabbxyyyypqAzz
+ abxyzpqrrrabbxyyyypqAzz
+ 0: abxyzpqrrrabbxyyyypqAzz
+ aabxyzpqrrrabbxyyyypqAzz
+ 0: aabxyzpqrrrabbxyyyypqAzz
+ aaabxyzpqrrrabbxyyyypqAzz
+ 0: aaabxyzpqrrrabbxyyyypqAzz
+ aaaabxyzpqrrrabbxyyyypqAzz
+ 0: aaaabxyzpqrrrabbxyyyypqAzz
+ abcxyzpqrrrabbxyyyypqAzz
+ 0: abcxyzpqrrrabbxyyyypqAzz
+ aabcxyzpqrrrabbxyyyypqAzz
+ 0: aabcxyzpqrrrabbxyyyypqAzz
+ aaabcxyzpqrrrabbxyyyypAzz
+ 0: aaabcxyzpqrrrabbxyyyypAzz
+ aaabcxyzpqrrrabbxyyyypqAzz
+ 0: aaabcxyzpqrrrabbxyyyypqAzz
+ aaabcxyzpqrrrabbxyyyypqqAzz
+ 0: aaabcxyzpqrrrabbxyyyypqqAzz
+ aaabcxyzpqrrrabbxyyyypqqqAzz
+ 0: aaabcxyzpqrrrabbxyyyypqqqAzz
+ aaabcxyzpqrrrabbxyyyypqqqqAzz
+ 0: aaabcxyzpqrrrabbxyyyypqqqqAzz
+ aaabcxyzpqrrrabbxyyyypqqqqqAzz
+ 0: aaabcxyzpqrrrabbxyyyypqqqqqAzz
+ aaabcxyzpqrrrabbxyyyypqqqqqqAzz
+ 0: aaabcxyzpqrrrabbxyyyypqqqqqqAzz
+ aaaabcxyzpqrrrabbxyyyypqAzz
+ 0: aaaabcxyzpqrrrabbxyyyypqAzz
+ abxyzzpqrrrabbxyyyypqAzz
+ 0: abxyzzpqrrrabbxyyyypqAzz
+ aabxyzzzpqrrrabbxyyyypqAzz
+ 0: aabxyzzzpqrrrabbxyyyypqAzz
+ aaabxyzzzzpqrrrabbxyyyypqAzz
+ 0: aaabxyzzzzpqrrrabbxyyyypqAzz
+ aaaabxyzzzzpqrrrabbxyyyypqAzz
+ 0: aaaabxyzzzzpqrrrabbxyyyypqAzz
+ abcxyzzpqrrrabbxyyyypqAzz
+ 0: abcxyzzpqrrrabbxyyyypqAzz
+ aabcxyzzzpqrrrabbxyyyypqAzz
+ 0: aabcxyzzzpqrrrabbxyyyypqAzz
+ aaabcxyzzzzpqrrrabbxyyyypqAzz
+ 0: aaabcxyzzzzpqrrrabbxyyyypqAzz
+ aaaabcxyzzzzpqrrrabbxyyyypqAzz
+ 0: aaaabcxyzzzzpqrrrabbxyyyypqAzz
+ aaaabcxyzzzzpqrrrabbbxyyyypqAzz
+ 0: aaaabcxyzzzzpqrrrabbbxyyyypqAzz
+ aaaabcxyzzzzpqrrrabbbxyyyyypqAzz
+ 0: aaaabcxyzzzzpqrrrabbbxyyyyypqAzz
+ aaabcxyzpqrrrabbxyyyypABzz
+ 0: aaabcxyzpqrrrabbxyyyypABzz
+ aaabcxyzpqrrrabbxyyyypABBzz
+ 0: aaabcxyzpqrrrabbxyyyypABBzz
+ >>>aaabxyzpqrrrabbxyyyypqAzz
+ 0: aaabxyzpqrrrabbxyyyypqAzz
+ >aaaabxyzpqrrrabbxyyyypqAzz
+ 0: aaaabxyzpqrrrabbxyyyypqAzz
+ >>>>abcxyzpqrrrabbxyyyypqAzz
+ 0: abcxyzpqrrrabbxyyyypqAzz
+ *** Failers
+No match
+ abxyzpqrrabbxyyyypqAzz
+No match
+ abxyzpqrrrrabbxyyyypqAzz
+No match
+ abxyzpqrrrabxyyyypqAzz
+No match
+ aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz
+No match
+ aaaabcxyzzzzpqrrrabbbxyyypqAzz
+No match
+ aaabcxyzpqrrrabbxyyyypqqqqqqqAzz
+No match
+
+/^(abc){1,2}zz/
+ abczz
+ 0: abczz
+ 1: abc
+ abcabczz
+ 0: abcabczz
+ 1: abc
+ *** Failers
+No match
+ zz
+No match
+ abcabcabczz
+No match
+ >>abczz
+No match
+
+/^(b+?|a){1,2}?c/
+ bc
+ 0: bc
+ 1: b
+ bbc
+ 0: bbc
+ 1: b
+ bbbc
+ 0: bbbc
+ 1: bb
+ bac
+ 0: bac
+ 1: a
+ bbac
+ 0: bbac
+ 1: a
+ aac
+ 0: aac
+ 1: a
+ abbbbbbbbbbbc
+ 0: abbbbbbbbbbbc
+ 1: bbbbbbbbbbb
+ bbbbbbbbbbbac
+ 0: bbbbbbbbbbbac
+ 1: a
+ *** Failers
+No match
+ aaac
+No match
+ abbbbbbbbbbbac
+No match
+
+/^(b+|a){1,2}c/
+ bc
+ 0: bc
+ 1: b
+ bbc
+ 0: bbc
+ 1: bb
+ bbbc
+ 0: bbbc
+ 1: bbb
+ bac
+ 0: bac
+ 1: a
+ bbac
+ 0: bbac
+ 1: a
+ aac
+ 0: aac
+ 1: a
+ abbbbbbbbbbbc
+ 0: abbbbbbbbbbbc
+ 1: bbbbbbbbbbb
+ bbbbbbbbbbbac
+ 0: bbbbbbbbbbbac
+ 1: a
+ *** Failers
+No match
+ aaac
+No match
+ abbbbbbbbbbbac
+No match
+
+/^(b+|a){1,2}?bc/
+ bbc
+ 0: bbc
+ 1: b
+
+/^(b*|ba){1,2}?bc/
+ babc
+ 0: babc
+ 1: ba
+ bbabc
+ 0: bbabc
+ 1: ba
+ bababc
+ 0: bababc
+ 1: ba
+ *** Failers
+No match
+ bababbc
+No match
+ babababc
+No match
+
+/^(ba|b*){1,2}?bc/
+ babc
+ 0: babc
+ 1: ba
+ bbabc
+ 0: bbabc
+ 1: ba
+ bababc
+ 0: bababc
+ 1: ba
+ *** Failers
+No match
+ bababbc
+No match
+ babababc
+No match
+
+/^\ca\cA\c[\c{\c:/
+ \x01\x01\e;z
+ 0: \x01\x01\x1b;z
+
+/^[ab\]cde]/
+ athing
+ 0: a
+ bthing
+ 0: b
+ ]thing
+ 0: ]
+ cthing
+ 0: c
+ dthing
+ 0: d
+ ething
+ 0: e
+ *** Failers
+No match
+ fthing
+No match
+ [thing
+No match
+ \\thing
+No match
+
+/^[]cde]/
+ ]thing
+ 0: ]
+ cthing
+ 0: c
+ dthing
+ 0: d
+ ething
+ 0: e
+ *** Failers
+No match
+ athing
+No match
+ fthing
+No match
+
+/^[^ab\]cde]/
+ fthing
+ 0: f
+ [thing
+ 0: [
+ \\thing
+ 0: \
+ *** Failers
+ 0: *
+ athing
+No match
+ bthing
+No match
+ ]thing
+No match
+ cthing
+No match
+ dthing
+No match
+ ething
+No match
+
+/^[^]cde]/
+ athing
+ 0: a
+ fthing
+ 0: f
+ *** Failers
+ 0: *
+ ]thing
+No match
+ cthing
+No match
+ dthing
+No match
+ ething
+No match
+
+/^\/
+
+ 0: \x81
+
+/^ÿ/
+ ÿ
+ 0: \xff
+
+/^[0-9]+$/
+ 0
+ 0: 0
+ 1
+ 0: 1
+ 2
+ 0: 2
+ 3
+ 0: 3
+ 4
+ 0: 4
+ 5
+ 0: 5
+ 6
+ 0: 6
+ 7
+ 0: 7
+ 8
+ 0: 8
+ 9
+ 0: 9
+ 10
+ 0: 10
+ 100
+ 0: 100
+ *** Failers
+No match
+ abc
+No match
+
+/^.*nter/
+ enter
+ 0: enter
+ inter
+ 0: inter
+ uponter
+ 0: uponter
+
+/^xxx[0-9]+$/
+ xxx0
+ 0: xxx0
+ xxx1234
+ 0: xxx1234
+ *** Failers
+No match
+ xxx
+No match
+
+/^.+[0-9][0-9][0-9]$/
+ x123
+ 0: x123
+ xx123
+ 0: xx123
+ 123456
+ 0: 123456
+ *** Failers
+No match
+ 123
+No match
+ x1234
+ 0: x1234
+
+/^.+?[0-9][0-9][0-9]$/
+ x123
+ 0: x123
+ xx123
+ 0: xx123
+ 123456
+ 0: 123456
+ *** Failers
+No match
+ 123
+No match
+ x1234
+ 0: x1234
+
+/^([^!]+)!(.+)=apquxz\.ixr\.zzz\.ac\.uk$/
+ abc!pqr=apquxz.ixr.zzz.ac.uk
+ 0: abc!pqr=apquxz.ixr.zzz.ac.uk
+ 1: abc
+ 2: pqr
+ *** Failers
+No match
+ !pqr=apquxz.ixr.zzz.ac.uk
+No match
+ abc!=apquxz.ixr.zzz.ac.uk
+No match
+ abc!pqr=apquxz:ixr.zzz.ac.uk
+No match
+ abc!pqr=apquxz.ixr.zzz.ac.ukk
+No match
+
+/:/
+ Well, we need a colon: somewhere
+ 0: :
+ *** Fail if we don't
+No match
+
+/([\da-f:]+)$/i
+ 0abc
+ 0: 0abc
+ 1: 0abc
+ abc
+ 0: abc
+ 1: abc
+ fed
+ 0: fed
+ 1: fed
+ E
+ 0: E
+ 1: E
+ ::
+ 0: ::
+ 1: ::
+ 5f03:12C0::932e
+ 0: 5f03:12C0::932e
+ 1: 5f03:12C0::932e
+ fed def
+ 0: def
+ 1: def
+ Any old stuff
+ 0: ff
+ 1: ff
+ *** Failers
+No match
+ 0zzz
+No match
+ gzzz
+No match
+ fed\x20
+No match
+ Any old rubbish
+No match
+
+/^.*\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/
+ .1.2.3
+ 0: .1.2.3
+ 1: 1
+ 2: 2
+ 3: 3
+ A.12.123.0
+ 0: A.12.123.0
+ 1: 12
+ 2: 123
+ 3: 0
+ *** Failers
+No match
+ .1.2.3333
+No match
+ 1.2.3
+No match
+ 1234.2.3
+No match
+
+/^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/
+ 1 IN SOA non-sp1 non-sp2(
+ 0: 1 IN SOA non-sp1 non-sp2(
+ 1: 1
+ 2: non-sp1
+ 3: non-sp2
+ 1 IN SOA non-sp1 non-sp2 (
+ 0: 1 IN SOA non-sp1 non-sp2 (
+ 1: 1
+ 2: non-sp1
+ 3: non-sp2
+ *** Failers
+No match
+ 1IN SOA non-sp1 non-sp2(
+No match
+
+/^[a-zA-Z\d][a-zA-Z\d\-]*(\.[a-zA-Z\d][a-zA-z\d\-]*)*\.$/
+ a.
+ 0: a.
+ Z.
+ 0: Z.
+ 2.
+ 0: 2.
+ ab-c.pq-r.
+ 0: ab-c.pq-r.
+ 1: .pq-r
+ sxk.zzz.ac.uk.
+ 0: sxk.zzz.ac.uk.
+ 1: .uk
+ x-.y-.
+ 0: x-.y-.
+ 1: .y-
+ *** Failers
+No match
+ -abc.peq.
+No match
+
+/^\*\.[a-z]([a-z\-\d]*[a-z\d]+)?(\.[a-z]([a-z\-\d]*[a-z\d]+)?)*$/
+ *.a
+ 0: *.a
+ *.b0-a
+ 0: *.b0-a
+ 1: 0-a
+ *.c3-b.c
+ 0: *.c3-b.c
+ 1: 3-b
+ 2: .c
+ *.c-a.b-c
+ 0: *.c-a.b-c
+ 1: -a
+ 2: .b-c
+ 3: -c
+ *** Failers
+No match
+ *.0
+No match
+ *.a-
+No match
+ *.a-b.c-
+No match
+ *.c-a.0-c
+No match
+
+/^(?=ab(de))(abd)(e)/
+ abde
+ 0: abde
+ 1: de
+ 2: abd
+ 3: e
+
+/^(?!(ab)de|x)(abd)(f)/
+ abdf
+ 0: abdf
+ 1: <unset>
+ 2: abd
+ 3: f
+
+/^(?=(ab(cd)))(ab)/
+ abcd
+ 0: ab
+ 1: abcd
+ 2: cd
+ 3: ab
+
+/^[\da-f](\.[\da-f])*$/i
+ a.b.c.d
+ 0: a.b.c.d
+ 1: .d
+ A.B.C.D
+ 0: A.B.C.D
+ 1: .D
+ a.b.c.1.2.3.C
+ 0: a.b.c.1.2.3.C
+ 1: .C
+
+/^\".*\"\s*(;.*)?$/
+ \"1234\"
+ 0: "1234"
+ \"abcd\" ;
+ 0: "abcd" ;
+ 1: ;
+ \"\" ; rhubarb
+ 0: "" ; rhubarb
+ 1: ; rhubarb
+ *** Failers
+No match
+ \"1234\" : things
+No match
+
+/^$/
+ \
+ 0:
+ *** Failers
+No match
+
+/ ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/x
+ ab c
+ 0: ab c
+ *** Failers
+No match
+ abc
+No match
+ ab cde
+No match
+
+/(?x) ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/
+ ab c
+ 0: ab c
+ *** Failers
+No match
+ abc
+No match
+ ab cde
+No match
+
+/^ a\ b[c ]d $/x
+ a bcd
+ 0: a bcd
+ a b d
+ 0: a b d
+ *** Failers
+No match
+ abcd
+No match
+ ab d
+No match
+
+/^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$/
+ abcdefhijklm
+ 0: abcdefhijklm
+ 1: abc
+ 2: bc
+ 3: c
+ 4: def
+ 5: ef
+ 6: f
+ 7: hij
+ 8: ij
+ 9: j
+10: klm
+11: lm
+12: m
+
+/^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$/
+ abcdefhijklm
+ 0: abcdefhijklm
+ 1: bc
+ 2: c
+ 3: ef
+ 4: f
+ 5: ij
+ 6: j
+ 7: lm
+ 8: m
+
+/^[\w][\W][\s][\S][\d][\D][\b][\n][\c]][\022]/
+ a+ Z0+\x08\n\x1d\x12
+ 0: a+ Z0+\x08\x0a\x1d\x12
+
+/^[.^$|()*+?{,}]+/
+ .^\$(*+)|{?,?}
+ 0: .^$(*+)|{?,?}
+
+/^a*\w/
+ z
+ 0: z
+ az
+ 0: az
+ aaaz
+ 0: aaaz
+ a
+ 0: a
+ aa
+ 0: aa
+ aaaa
+ 0: aaaa
+ a+
+ 0: a
+ aa+
+ 0: aa
+
+/^a*?\w/
+ z
+ 0: z
+ az
+ 0: a
+ aaaz
+ 0: a
+ a
+ 0: a
+ aa
+ 0: a
+ aaaa
+ 0: a
+ a+
+ 0: a
+ aa+
+ 0: a
+
+/^a+\w/
+ az
+ 0: az
+ aaaz
+ 0: aaaz
+ aa
+ 0: aa
+ aaaa
+ 0: aaaa
+ aa+
+ 0: aa
+
+/^a+?\w/
+ az
+ 0: az
+ aaaz
+ 0: aa
+ aa
+ 0: aa
+ aaaa
+ 0: aa
+ aa+
+ 0: aa
+
+/^\d{8}\w{2,}/
+ 1234567890
+ 0: 1234567890
+ 12345678ab
+ 0: 12345678ab
+ 12345678__
+ 0: 12345678__
+ *** Failers
+No match
+ 1234567
+No match
+
+/^[aeiou\d]{4,5}$/
+ uoie
+ 0: uoie
+ 1234
+ 0: 1234
+ 12345
+ 0: 12345
+ aaaaa
+ 0: aaaaa
+ *** Failers
+No match
+ 123456
+No match
+
+/^[aeiou\d]{4,5}?/
+ uoie
+ 0: uoie
+ 1234
+ 0: 1234
+ 12345
+ 0: 1234
+ aaaaa
+ 0: aaaa
+ 123456
+ 0: 1234
+
+/\A(abc|def)=(\1){2,3}\Z/
+ abc=abcabc
+ 0: abc=abcabc
+ 1: abc
+ 2: abc
+ def=defdefdef
+ 0: def=defdefdef
+ 1: def
+ 2: def
+ *** Failers
+No match
+ abc=defdef
+No match
+
+/^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\11*(\3\4)\1(?#)2$/
+ abcdefghijkcda2
+ 0: abcdefghijkcda2
+ 1: a
+ 2: b
+ 3: c
+ 4: d
+ 5: e
+ 6: f
+ 7: g
+ 8: h
+ 9: i
+10: j
+11: k
+12: cd
+ abcdefghijkkkkcda2
+ 0: abcdefghijkkkkcda2
+ 1: a
+ 2: b
+ 3: c
+ 4: d
+ 5: e
+ 6: f
+ 7: g
+ 8: h
+ 9: i
+10: j
+11: k
+12: cd
+
+/(cat(a(ract|tonic)|erpillar)) \1()2(3)/
+ cataract cataract23
+ 0: cataract cataract23
+ 1: cataract
+ 2: aract
+ 3: ract
+ 4:
+ 5: 3
+ catatonic catatonic23
+ 0: catatonic catatonic23
+ 1: catatonic
+ 2: atonic
+ 3: tonic
+ 4:
+ 5: 3
+ caterpillar caterpillar23
+ 0: caterpillar caterpillar23
+ 1: caterpillar
+ 2: erpillar
+ 3: <unset>
+ 4:
+ 5: 3
+
+
+/^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]/
+ From abcd Mon Sep 01 12:33:02 1997
+ 0: From abcd Mon Sep 01 12:33
+ 1: abcd
+
+/^From\s+\S+\s+([a-zA-Z]{3}\s+){2}\d{1,2}\s+\d\d:\d\d/
+ From abcd Mon Sep 01 12:33:02 1997
+ 0: From abcd Mon Sep 01 12:33
+ 1: Sep
+ From abcd Mon Sep 1 12:33:02 1997
+ 0: From abcd Mon Sep 1 12:33
+ 1: Sep
+ *** Failers
+No match
+ From abcd Sep 01 12:33:02 1997
+No match
+
+/^12.34/s
+ 12\n34
+ 0: 12\x0a34
+ 12\r34
+ 0: 12\x0d34
+
+/\w+(?=\t)/
+ the quick brown\t fox
+ 0: brown
+
+/foo(?!bar)(.*)/
+ foobar is foolish see?
+ 0: foolish see?
+ 1: lish see?
+
+/(?:(?!foo)...|^.{0,2})bar(.*)/
+ foobar crowbar etc
+ 0: rowbar etc
+ 1: etc
+ barrel
+ 0: barrel
+ 1: rel
+ 2barrel
+ 0: 2barrel
+ 1: rel
+ A barrel
+ 0: A barrel
+ 1: rel
+
+/^(\D*)(?=\d)(?!123)/
+ abc456
+ 0: abc
+ 1: abc
+ *** Failers
+No match
+ abc123
+No match
+
+/^1234(?# test newlines
+ inside)/
+ 1234
+ 0: 1234
+
+/^1234 #comment in extended re
+ /x
+ 1234
+ 0: 1234
+
+/#rhubarb
+ abcd/x
+ abcd
+ 0: abcd
+
+/^abcd#rhubarb/x
+ abcd
+ 0: abcd
+
+/^(a)\1{2,3}(.)/
+ aaab
+ 0: aaab
+ 1: a
+ 2: b
+ aaaab
+ 0: aaaab
+ 1: a
+ 2: b
+ aaaaab
+ 0: aaaaa
+ 1: a
+ 2: a
+ aaaaaab
+ 0: aaaaa
+ 1: a
+ 2: a
+
+/(?!^)abc/
+ the abc
+ 0: abc
+ *** Failers
+No match
+ abc
+No match
+
+/(?=^)abc/
+ abc
+ 0: abc
+ *** Failers
+No match
+ the abc
+No match
+
+/^[ab]{1,3}(ab*|b)/
+ aabbbbb
+ 0: aabb
+ 1: b
+
+/^[ab]{1,3}?(ab*|b)/
+ aabbbbb
+ 0: aabbbbb
+ 1: abbbbb
+
+/^[ab]{1,3}?(ab*?|b)/
+ aabbbbb
+ 0: aa
+ 1: a
+
+/^[ab]{1,3}(ab*?|b)/
+ aabbbbb
+ 0: aabb
+ 1: b
+
+/ (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* # optional leading comment
+(?: (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+" (?: # opening quote...
+[^\\\x80-\xff\n\015"] # Anything except backslash and quote
+| # or
+\\ [^\x80-\xff] # Escaped something (something != CR)
+)* " # closing quote
+) # initial word
+(?: (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* \. (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+" (?: # opening quote...
+[^\\\x80-\xff\n\015"] # Anything except backslash and quote
+| # or
+\\ [^\x80-\xff] # Escaped something (something != CR)
+)* " # closing quote
+) )* # further okay, if led by a period
+(?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* @ (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+| \[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+) # initial subdomain
+(?: #
+(?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* \. # if led by a period...
+(?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+| \[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+) # ...further okay
+)*
+# address
+| # or
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+" (?: # opening quote...
+[^\\\x80-\xff\n\015"] # Anything except backslash and quote
+| # or
+\\ [^\x80-\xff] # Escaped something (something != CR)
+)* " # closing quote
+) # one word, optionally followed by....
+(?:
+[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] | # atom and space parts, or...
+\(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) | # comments, or...
+
+" (?: # opening quote...
+[^\\\x80-\xff\n\015"] # Anything except backslash and quote
+| # or
+\\ [^\x80-\xff] # Escaped something (something != CR)
+)* " # closing quote
+# quoted strings
+)*
+< (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* # leading <
+(?: @ (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+| \[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+) # initial subdomain
+(?: #
+(?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* \. # if led by a period...
+(?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+| \[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+) # ...further okay
+)*
+
+(?: (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* , (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* @ (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+| \[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+) # initial subdomain
+(?: #
+(?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* \. # if led by a period...
+(?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+| \[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+) # ...further okay
+)*
+)* # further okay, if led by comma
+: # closing colon
+(?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* )? # optional route
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+" (?: # opening quote...
+[^\\\x80-\xff\n\015"] # Anything except backslash and quote
+| # or
+\\ [^\x80-\xff] # Escaped something (something != CR)
+)* " # closing quote
+) # initial word
+(?: (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* \. (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+" (?: # opening quote...
+[^\\\x80-\xff\n\015"] # Anything except backslash and quote
+| # or
+\\ [^\x80-\xff] # Escaped something (something != CR)
+)* " # closing quote
+) )* # further okay, if led by a period
+(?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* @ (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+| \[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+) # initial subdomain
+(?: #
+(?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* \. # if led by a period...
+(?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* (?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+| \[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+) # ...further okay
+)*
+# address spec
+(?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* > # trailing >
+# name and address
+) (?: [\040\t] | \(
+(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )*
+\) )* # optional trailing comment
+/x
+ Alan Other <user\@dom.ain>
+ 0: Alan Other <user@dom.ain>
+ <user\@dom.ain>
+ 0: user@dom.ain
+ user\@dom.ain
+ 0: user@dom.ain
+ \"A. Other\" <user.1234\@dom.ain> (a comment)
+ 0: "A. Other" <user.1234@dom.ain> (a comment)
+ A. Other <user.1234\@dom.ain> (a comment)
+ 0: Other <user.1234@dom.ain> (a comment)
+ \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay
+ 0: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re.lay
+ A missing angle <user\@some.where
+ 0: user@some.where
+ *** Failers
+No match
+ The quick brown fox
+No match
+
+/[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# optional leading comment
+(?:
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+" # "
+[^\\\x80-\xff\n\015"] * # normal
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )*
+" # "
+# Quoted string
+)
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+(?:
+\.
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+" # "
+[^\\\x80-\xff\n\015"] * # normal
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )*
+" # "
+# Quoted string
+)
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+)
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\.
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+)
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address
+| # or
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+" # "
+[^\\\x80-\xff\n\015"] * # normal
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )*
+" # "
+# Quoted string
+)
+# leading word
+[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # "normal" atoms and or spaces
+(?:
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+|
+" # "
+[^\\\x80-\xff\n\015"] * # normal
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )*
+" # "
+) # "special" comment or quoted string
+[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # more "normal"
+)*
+<
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# <
+(?:
+@
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+)
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\.
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+)
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+(?: ,
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+@
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+)
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\.
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+)
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+)* # additional domains
+:
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)? # optional route
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+" # "
+[^\\\x80-\xff\n\015"] * # normal
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )*
+" # "
+# Quoted string
+)
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+(?:
+\.
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+# Atom
+| # or
+" # "
+[^\\\x80-\xff\n\015"] * # normal
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )*
+" # "
+# Quoted string
+)
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# additional words
+)*
+@
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+)
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+(?:
+\.
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+(?:
+[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters...
+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom
+|
+\[ # [
+(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff
+\] # ]
+)
+[\040\t]* # Nab whitespace.
+(?:
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: # (
+(?: \\ [^\x80-\xff] |
+\( # (
+[^\\\x80-\xff\n\015()] * # normal*
+(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)*
+\) # )
+) # special
+[^\\\x80-\xff\n\015()] * # normal*
+)* # )*
+\) # )
+[\040\t]* )* # If comment found, allow more spaces.
+# optional trailing comments
+)*
+# address spec
+> # >
+# name and address
+)
+/x
+ Alan Other <user\@dom.ain>
+ 0: Alan Other <user@dom.ain>
+ <user\@dom.ain>
+ 0: user@dom.ain
+ user\@dom.ain
+ 0: user@dom.ain
+ \"A. Other\" <user.1234\@dom.ain> (a comment)
+ 0: "A. Other" <user.1234@dom.ain>
+ A. Other <user.1234\@dom.ain> (a comment)
+ 0: Other <user.1234@dom.ain>
+ \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay
+ 0: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re.lay
+ A missing angle <user\@some.where
+ 0: user@some.where
+ *** Failers
+No match
+ The quick brown fox
+No match
+
+/abc\0def\00pqr\000xyz\0000AB/
+ abc\0def\00pqr\000xyz\0000AB
+ 0: abc\x00def\x00pqr\x00xyz\x000AB
+ abc456 abc\0def\00pqr\000xyz\0000ABCDE
+ 0: abc\x00def\x00pqr\x00xyz\x000AB
+
+/abc\x0def\x00pqr\x000xyz\x0000AB/
+ abc\x0def\x00pqr\x000xyz\x0000AB
+ 0: abc\x0def\x00pqr\x000xyz\x0000AB
+ abc456 abc\x0def\x00pqr\x000xyz\x0000ABCDE
+ 0: abc\x0def\x00pqr\x000xyz\x0000AB
+
+/^[\000-\037]/
+ \0A
+ 0: \x00
+ \01B
+ 0: \x01
+ \037C
+ 0: \x1f
+
+/\0*/
+ \0\0\0\0
+ 0: \x00\x00\x00\x00
+
+/A\x0{2,3}Z/
+ The A\x0\x0Z
+ 0: A\x00\x00Z
+ An A\0\x0\0Z
+ 0: A\x00\x00\x00Z
+ *** Failers
+No match
+ A\0Z
+No match
+ A\0\x0\0\x0Z
+No match
+
+/^(cow|)\1(bell)/
+ cowcowbell
+ 0: cowcowbell
+ 1: cow
+ 2: bell
+ bell
+ 0: bell
+ 1:
+ 2: bell
+ *** Failers
+No match
+ cowbell
+No match
+
+/^\s/
+ \040abc
+ 0:
+ \x0cabc
+ 0: \x0c
+ \nabc
+ 0: \x0a
+ \rabc
+ 0: \x0d
+ \tabc
+ 0: \x09
+ *** Failers
+No match
+ abc
+No match
+
+/^a b
+ c/x
+ abc
+ 0: abc
+
+/^(a|)\1*b/
+ ab
+ 0: ab
+ 1: a
+ aaaab
+ 0: aaaab
+ 1: a
+ b
+ 0: b
+ 1:
+ *** Failers
+No match
+ acb
+No match
+
+/^(a|)\1+b/
+ aab
+ 0: aab
+ 1: a
+ aaaab
+ 0: aaaab
+ 1: a
+ b
+ 0: b
+ 1:
+ *** Failers
+No match
+ ab
+No match
+
+/^(a|)\1?b/
+ ab
+ 0: ab
+ 1: a
+ aab
+ 0: aab
+ 1: a
+ b
+ 0: b
+ 1:
+ *** Failers
+No match
+ acb
+No match
+
+/^(a|)\1{2}b/
+ aaab
+ 0: aaab
+ 1: a
+ b
+ 0: b
+ 1:
+ *** Failers
+No match
+ ab
+No match
+ aab
+No match
+ aaaab
+No match
+
+/^(a|)\1{2,3}b/
+ aaab
+ 0: aaab
+ 1: a
+ aaaab
+ 0: aaaab
+ 1: a
+ b
+ 0: b
+ 1:
+ *** Failers
+No match
+ ab
+No match
+ aab
+No match
+ aaaaab
+No match
+
+/ab{1,3}bc/
+ abbbbc
+ 0: abbbbc
+ abbbc
+ 0: abbbc
+ abbc
+ 0: abbc
+ *** Failers
+No match
+ abc
+No match
+ abbbbbc
+No match
+
+/([^.]*)\.([^:]*):[T ]+(.*)/
+ track1.title:TBlah blah blah
+ 0: track1.title:TBlah blah blah
+ 1: track1
+ 2: title
+ 3: Blah blah blah
+
+/([^.]*)\.([^:]*):[T ]+(.*)/i
+ track1.title:TBlah blah blah
+ 0: track1.title:TBlah blah blah
+ 1: track1
+ 2: title
+ 3: Blah blah blah
+
+/([^.]*)\.([^:]*):[t ]+(.*)/i
+ track1.title:TBlah blah blah
+ 0: track1.title:TBlah blah blah
+ 1: track1
+ 2: title
+ 3: Blah blah blah
+
+/^[W-c]+$/
+ WXY_^abc
+ 0: WXY_^abc
+ *** Failers
+No match
+ wxy
+No match
+
+/^[W-c]+$/i
+ WXY_^abc
+ 0: WXY_^abc
+ wxy_^ABC
+ 0: wxy_^ABC
+
+/^[\x3f-\x5F]+$/i
+ WXY_^abc
+ 0: WXY_^abc
+ wxy_^ABC
+ 0: wxy_^ABC
+
+/^abc$/m
+ abc
+ 0: abc
+ qqq\nabc
+ 0: abc
+ abc\nzzz
+ 0: abc
+ qqq\nabc\nzzz
+ 0: abc
+
+/^abc$/
+ abc
+ 0: abc
+ *** Failers
+No match
+ qqq\nabc
+No match
+ abc\nzzz
+No match
+ qqq\nabc\nzzz
+No match
+
+/\Aabc\Z/m
+ abc
+ 0: abc
+ abc\n
+ 0: abc
+ *** Failers
+No match
+ qqq\nabc
+No match
+ abc\nzzz
+No match
+ qqq\nabc\nzzz
+No match
+
+/\A(.)*\Z/s
+ abc\ndef
+ 0: abc\x0adef
+ 1: f
+
+/\A(.)*\Z/m
+ *** Failers
+ 0: *** Failers
+ 1: s
+ abc\ndef
+No match
+
+/(?:b)|(?::+)/
+ b::c
+ 0: b
+ c::b
+ 0: ::
+
+/[-az]+/
+ az-
+ 0: az-
+ *** Failers
+ 0: a
+ b
+No match
+
+/[az-]+/
+ za-
+ 0: za-
+ *** Failers
+ 0: a
+ b
+No match
+
+/[a\-z]+/
+ a-z
+ 0: a-z
+ *** Failers
+ 0: a
+ b
+No match
+
+/[a-z]+/
+ abcdxyz
+ 0: abcdxyz
+
+/[\d-]+/
+ 12-34
+ 0: 12-34
+ *** Failers
+No match
+ aaa
+No match
+
+/[\d-z]+/
+ 12-34z
+ 0: 12-34z
+ *** Failers
+No match
+ aaa
+No match
+
+/\x5c/
+ \\
+ 0: \
+
+/\x20Z/
+ the Zoo
+ 0: Z
+ *** Failers
+No match
+ Zulu
+No match
+
+/(abc)\1/i
+ abcabc
+ 0: abcabc
+ 1: abc
+ ABCabc
+ 0: ABCabc
+ 1: ABC
+ abcABC
+ 0: abcABC
+ 1: abc
+
+/ab{3cd/
+ ab{3cd
+ 0: ab{3cd
+
+/ab{3,cd/
+ ab{3,cd
+ 0: ab{3,cd
+
+/ab{3,4a}cd/
+ ab{3,4a}cd
+ 0: ab{3,4a}cd
+
+/{4,5a}bc/
+ {4,5a}bc
+ 0: {4,5a}bc
+
+/^a.b/
+ a\rb
+ 0: a\x0db
+ *** Failers
+No match
+ a\nb
+No match
+
+/abc$/
+ abc
+ 0: abc
+ abc\n
+ 0: abc
+ *** Failers
+No match
+ abc\ndef
+No match
+
+/(abc)\123/
+ abc\x53
+ 0: abcS
+ 1: abc
+
+/(abc)\223/
+ abc\x93
+ 0: abc\x93
+ 1: abc
+
+/(abc)\323/
+ abc\xd3
+ 0: abc\xd3
+ 1: abc
+
+/(abc)\500/
+ abc\x40
+ 0: abc@
+ 1: abc
+ abc\100
+ 0: abc@
+ 1: abc
+
+/(abc)\5000/
+ abc\x400
+ 0: abc@0
+ 1: abc
+ abc\x40\x30
+ 0: abc@0
+ 1: abc
+ abc\1000
+ 0: abc@0
+ 1: abc
+ abc\100\x30
+ 0: abc@0
+ 1: abc
+ abc\100\060
+ 0: abc@0
+ 1: abc
+ abc\100\60
+ 0: abc@0
+ 1: abc
+
+/abc\81/
+ abc\081
+ 0: abc\x0081
+ abc\0\x38\x31
+ 0: abc\x0081
+
+/abc\91/
+ abc\091
+ 0: abc\x0091
+ abc\0\x39\x31
+ 0: abc\x0091
+
+/(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)\12\123/
+ abcdefghijkllS
+ 0: abcdefghijkllS
+ 1: a
+ 2: b
+ 3: c
+ 4: d
+ 5: e
+ 6: f
+ 7: g
+ 8: h
+ 9: i
+10: j
+11: k
+12: l
+
+/(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\12\123/
+ abcdefghijk\12S
+ 0: abcdefghijk\x0aS
+ 1: a
+ 2: b
+ 3: c
+ 4: d
+ 5: e
+ 6: f
+ 7: g
+ 8: h
+ 9: i
+10: j
+11: k
+
+/ab\gdef/
+ abgdef
+ 0: abgdef
+
+/a{0}bc/
+ bc
+ 0: bc
+
+/(a|(bc)){0,0}?xyz/
+ xyz
+ 0: xyz
+
+/abc[\10]de/
+ abc\010de
+ 0: abc\x08de
+
+/abc[\1]de/
+ abc\1de
+ 0: abc\x01de
+
+/(abc)[\1]de/
+ abc\1de
+ 0: abc\x01de
+ 1: abc
+
+/(?s)a.b/
+ a\nb
+ 0: a\x0ab
+
+/^([^a])([^\b])([^c]*)([^d]{3,4})/
+ baNOTccccd
+ 0: baNOTcccc
+ 1: b
+ 2: a
+ 3: NOT
+ 4: cccc
+ baNOTcccd
+ 0: baNOTccc
+ 1: b
+ 2: a
+ 3: NOT
+ 4: ccc
+ baNOTccd
+ 0: baNOTcc
+ 1: b
+ 2: a
+ 3: NO
+ 4: Tcc
+ bacccd
+ 0: baccc
+ 1: b
+ 2: a
+ 3:
+ 4: ccc
+ *** Failers
+ 0: *** Failers
+ 1: *
+ 2: *
+ 3: * Fail
+ 4: ers
+ anything
+No match
+ b\bc
+No match
+ baccd
+No match
+
+/[^a]/
+ Abc
+ 0: A
+
+/[^a]/i
+ Abc
+ 0: b
+
+/[^a]+/
+ AAAaAbc
+ 0: AAA
+
+/[^a]+/i
+ AAAaAbc
+ 0: bc
+
+/[^a]+/
+ bbb\nccc
+ 0: bbb\x0accc
+
+/[^k]$/
+ abc
+ 0: c
+ *** Failers
+ 0: s
+ abk
+No match
+
+/[^k]{2,3}$/
+ abc
+ 0: abc
+ kbc
+ 0: bc
+ kabc
+ 0: abc
+ *** Failers
+ 0: ers
+ abk
+No match
+ akb
+No match
+ akk
+No match
+
+/^\d{8,}\@.+[^k]$/
+ 12345678\@a.b.c.d
+ 0: 12345678@a.b.c.d
+ 123456789\@x.y.z
+ 0: 123456789@x.y.z
+ *** Failers
+No match
+ 12345678\@x.y.uk
+No match
+ 1234567\@a.b.c.d
+No match
+
+/(a)\1{8,}/
+ aaaaaaaaa
+ 0: aaaaaaaaa
+ 1: a
+ aaaaaaaaaa
+ 0: aaaaaaaaaa
+ 1: a
+ *** Failers
+No match
+ aaaaaaa
+No match
+
+/[^a]/
+ aaaabcd
+ 0: b
+ aaAabcd
+ 0: A
+
+/[^a]/i
+ aaaabcd
+ 0: b
+ aaAabcd
+ 0: b
+
+/[^az]/
+ aaaabcd
+ 0: b
+ aaAabcd
+ 0: A
+
+/[^az]/i
+ aaaabcd
+ 0: b
+ aaAabcd
+ 0: b
+
+/\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117\120\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137\140\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157\160\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377/
+ \000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117\120\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137\140\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157\160\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377
+ 0: \x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff
+
+/P[^*]TAIRE[^*]{1,6}?LL/
+ xxxxxxxxxxxPSTAIREISLLxxxxxxxxx
+ 0: PSTAIREISLL
+
+/P[^*]TAIRE[^*]{1,}?LL/
+ xxxxxxxxxxxPSTAIREISLLxxxxxxxxx
+ 0: PSTAIREISLL
+
+/(\.\d\d[1-9]?)\d+/
+ 1.230003938
+ 0: .230003938
+ 1: .23
+ 1.875000282
+ 0: .875000282
+ 1: .875
+ 1.235
+ 0: .235
+ 1: .23
+
+/(\.\d\d((?=0)|\d(?=\d)))/
+ 1.230003938
+ 0: .23
+ 1: .23
+ 2:
+ 1.875000282
+ 0: .875
+ 1: .875
+ 2: 5
+ *** Failers
+No match
+ 1.235
+No match
+
+/a(?)b/
+ ab
+ 0: ab
+
+/\b(foo)\s+(\w+)/i
+ Food is on the foo table
+ 0: foo table
+ 1: foo
+ 2: table
+
+/foo(.*)bar/
+ The food is under the bar in the barn.
+ 0: food is under the bar in the bar
+ 1: d is under the bar in the
+
+/foo(.*?)bar/
+ The food is under the bar in the barn.
+ 0: food is under the bar
+ 1: d is under the
+
+/(.*)(\d*)/
+ I have 2 numbers: 53147
+ 0: I have 2 numbers: 53147
+ 1: I have 2 numbers: 53147
+ 2:
+
+/(.*)(\d+)/
+ I have 2 numbers: 53147
+ 0: I have 2 numbers: 53147
+ 1: I have 2 numbers: 5314
+ 2: 7
+
+/(.*?)(\d*)/
+ I have 2 numbers: 53147
+ 0:
+ 1:
+ 2:
+
+/(.*?)(\d+)/
+ I have 2 numbers: 53147
+ 0: I have 2
+ 1: I have
+ 2: 2
+
+/(.*)(\d+)$/
+ I have 2 numbers: 53147
+ 0: I have 2 numbers: 53147
+ 1: I have 2 numbers: 5314
+ 2: 7
+
+/(.*?)(\d+)$/
+ I have 2 numbers: 53147
+ 0: I have 2 numbers: 53147
+ 1: I have 2 numbers:
+ 2: 53147
+
+/(.*)\b(\d+)$/
+ I have 2 numbers: 53147
+ 0: I have 2 numbers: 53147
+ 1: I have 2 numbers:
+ 2: 53147
+
+/(.*\D)(\d+)$/
+ I have 2 numbers: 53147
+ 0: I have 2 numbers: 53147
+ 1: I have 2 numbers:
+ 2: 53147
+
+/^\D*(?!123)/
+ ABC123
+ 0: AB
+
+/^(\D*)(?=\d)(?!123)/
+ ABC445
+ 0: ABC
+ 1: ABC
+ *** Failers
+No match
+ ABC123
+No match
+
+/^[W-]46]/
+ W46]789
+ 0: W46]
+ -46]789
+ 0: -46]
+ *** Failers
+No match
+ Wall
+No match
+ Zebra
+No match
+ 42
+No match
+ [abcd]
+No match
+ ]abcd[
+No match
+
+/^[W-\]46]/
+ W46]789
+ 0: W
+ Wall
+ 0: W
+ Zebra
+ 0: Z
+ Xylophone
+ 0: X
+ 42
+ 0: 4
+ [abcd]
+ 0: [
+ ]abcd[
+ 0: ]
+ \\backslash
+ 0: \
+ *** Failers
+No match
+ -46]789
+No match
+ well
+No match
+
+/\d\d\/\d\d\/\d\d\d\d/
+ 01/01/2000
+ 0: 01/01/2000
+
+/word (?:[a-zA-Z0-9]+ ){0,10}otherword/
+ word cat dog elephant mussel cow horse canary baboon snake shark otherword
+ 0: word cat dog elephant mussel cow horse canary baboon snake shark otherword
+ word cat dog elephant mussel cow horse canary baboon snake shark
+No match
+
+/word (?:[a-zA-Z0-9]+ ){0,300}otherword/
+ word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope
+No match
+
+/^(a){0,0}/
+ bcd
+ 0:
+ abc
+ 0:
+ aab
+ 0:
+
+/^(a){0,1}/
+ bcd
+ 0:
+ abc
+ 0: a
+ 1: a
+ aab
+ 0: a
+ 1: a
+
+/^(a){0,2}/
+ bcd
+ 0:
+ abc
+ 0: a
+ 1: a
+ aab
+ 0: aa
+ 1: a
+
+/^(a){0,3}/
+ bcd
+ 0:
+ abc
+ 0: a
+ 1: a
+ aab
+ 0: aa
+ 1: a
+ aaa
+ 0: aaa
+ 1: a
+
+/^(a){0,}/
+ bcd
+ 0:
+ abc
+ 0: a
+ 1: a
+ aab
+ 0: aa
+ 1: a
+ aaa
+ 0: aaa
+ 1: a
+ aaaaaaaa
+ 0: aaaaaaaa
+ 1: a
+
+/^(a){1,1}/
+ bcd
+No match
+ abc
+ 0: a
+ 1: a
+ aab
+ 0: a
+ 1: a
+
+/^(a){1,2}/
+ bcd
+No match
+ abc
+ 0: a
+ 1: a
+ aab
+ 0: aa
+ 1: a
+
+/^(a){1,3}/
+ bcd
+No match
+ abc
+ 0: a
+ 1: a
+ aab
+ 0: aa
+ 1: a
+ aaa
+ 0: aaa
+ 1: a
+
+/^(a){1,}/
+ bcd
+No match
+ abc
+ 0: a
+ 1: a
+ aab
+ 0: aa
+ 1: a
+ aaa
+ 0: aaa
+ 1: a
+ aaaaaaaa
+ 0: aaaaaaaa
+ 1: a
+
+/.*\.gif/
+ borfle\nbib.gif\nno
+ 0: bib.gif
+
+/.{0,}\.gif/
+ borfle\nbib.gif\nno
+ 0: bib.gif
+
+/.*\.gif/m
+ borfle\nbib.gif\nno
+ 0: bib.gif
+
+/.*\.gif/s
+ borfle\nbib.gif\nno
+ 0: borfle\x0abib.gif
+
+/.*\.gif/ms
+ borfle\nbib.gif\nno
+ 0: borfle\x0abib.gif
+
+/.*$/
+ borfle\nbib.gif\nno
+ 0: no
+
+/.*$/m
+ borfle\nbib.gif\nno
+ 0: borfle
+
+/.*$/s
+ borfle\nbib.gif\nno
+ 0: borfle\x0abib.gif\x0ano
+
+/.*$/ms
+ borfle\nbib.gif\nno
+ 0: borfle\x0abib.gif\x0ano
+
+/.*$/
+ borfle\nbib.gif\nno\n
+ 0: no
+
+/.*$/m
+ borfle\nbib.gif\nno\n
+ 0: borfle
+
+/.*$/s
+ borfle\nbib.gif\nno\n
+ 0: borfle\x0abib.gif\x0ano\x0a
+
+/.*$/ms
+ borfle\nbib.gif\nno\n
+ 0: borfle\x0abib.gif\x0ano\x0a
+
+/(.*X|^B)/
+ abcde\n1234Xyz
+ 0: 1234X
+ 1: 1234X
+ BarFoo
+ 0: B
+ 1: B
+ *** Failers
+No match
+ abcde\nBar
+No match
+
+/(.*X|^B)/m
+ abcde\n1234Xyz
+ 0: 1234X
+ 1: 1234X
+ BarFoo
+ 0: B
+ 1: B
+ abcde\nBar
+ 0: B
+ 1: B
+
+/(.*X|^B)/s
+ abcde\n1234Xyz
+ 0: abcde\x0a1234X
+ 1: abcde\x0a1234X
+ BarFoo
+ 0: B
+ 1: B
+ *** Failers
+No match
+ abcde\nBar
+No match
+
+/(.*X|^B)/ms
+ abcde\n1234Xyz
+ 0: abcde\x0a1234X
+ 1: abcde\x0a1234X
+ BarFoo
+ 0: B
+ 1: B
+ abcde\nBar
+ 0: B
+ 1: B
+
+/(?s)(.*X|^B)/
+ abcde\n1234Xyz
+ 0: abcde\x0a1234X
+ 1: abcde\x0a1234X
+ BarFoo
+ 0: B
+ 1: B
+ *** Failers
+No match
+ abcde\nBar
+No match
+
+/(?s:.*X|^B)/
+ abcde\n1234Xyz
+ 0: abcde\x0a1234X
+ BarFoo
+ 0: B
+ *** Failers
+No match
+ abcde\nBar
+No match
+
+/^.*B/
+ **** Failers
+No match
+ abc\nB
+No match
+
+/(?s)^.*B/
+ abc\nB
+ 0: abc\x0aB
+
+/(?m)^.*B/
+ abc\nB
+ 0: B
+
+/(?ms)^.*B/
+ abc\nB
+ 0: abc\x0aB
+
+/(?ms)^B/
+ abc\nB
+ 0: B
+
+/(?s)B$/
+ B\n
+ 0: B
+
+/^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/
+ 123456654321
+ 0: 123456654321
+
+/^\d\d\d\d\d\d\d\d\d\d\d\d/
+ 123456654321
+ 0: 123456654321
+
+/^[\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d]/
+ 123456654321
+ 0: 123456654321
+
+/^[abc]{12}/
+ abcabcabcabc
+ 0: abcabcabcabc
+
+/^[a-c]{12}/
+ abcabcabcabc
+ 0: abcabcabcabc
+
+/^(a|b|c){12}/
+ abcabcabcabc
+ 0: abcabcabcabc
+ 1: c
+
+/^[abcdefghijklmnopqrstuvwxy0123456789]/
+ n
+ 0: n
+ *** Failers
+No match
+ z
+No match
+
+/abcde{0,0}/
+ abcd
+ 0: abcd
+ *** Failers
+No match
+ abce
+No match
+
+/ab[cd]{0,0}e/
+ abe
+ 0: abe
+ *** Failers
+No match
+ abcde
+No match
+
+/ab(c){0,0}d/
+ abd
+ 0: abd
+ *** Failers
+No match
+ abcd
+No match
+
+/a(b*)/
+ a
+ 0: a
+ 1:
+ ab
+ 0: ab
+ 1: b
+ abbbb
+ 0: abbbb
+ 1: bbbb
+ *** Failers
+ 0: a
+ 1:
+ bbbbb
+No match
+
+/ab\d{0}e/
+ abe
+ 0: abe
+ *** Failers
+No match
+ ab1e
+No match
+
+/"([^\\"]+|\\.)*"/
+ the \"quick\" brown fox
+ 0: "quick"
+ 1: quick
+ \"the \\\"quick\\\" brown fox\"
+ 0: "the \"quick\" brown fox"
+ 1: brown fox
+
+/.*?/g+
+ abc
+ 0:
+ 0+ abc
+ 0: a
+ 0+ bc
+ 0:
+ 0+ bc
+ 0: b
+ 0+ c
+ 0:
+ 0+ c
+ 0: c
+ 0+
+ 0:
+ 0+
+
+/\b/g+
+ abc
+ 0:
+ 0+ abc
+ 0:
+ 0+
+
+/\b/+g
+ abc
+ 0:
+ 0+ abc
+ 0:
+ 0+
+
+//g
+ abc
+ 0:
+ 0:
+ 0:
+ 0:
+
+/<tr([\w\W\s\d][^<>]{0,})><TD([\w\W\s\d][^<>]{0,})>([\d]{0,}\.)(.*)((<BR>([\w\W\s\d][^<>]{0,})|[\s]{0,}))<\/a><\/TD><TD([\w\W\s\d][^<>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><TD([\w\W\s\d][^<>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><\/TR>/is
+ <TR BGCOLOR='#DBE9E9'><TD align=left valign=top>43.<a href='joblist.cfm?JobID=94 6735&Keyword='>Word Processor<BR>(N-1286)</a></TD><TD align=left valign=top>Lega lstaff.com</TD><TD align=left valign=top>CA - Statewide</TD></TR>
+ 0: <TR BGCOLOR='#DBE9E9'><TD align=left valign=top>43.<a href='joblist.cfm?JobID=94 6735&Keyword='>Word Processor<BR>(N-1286)</a></TD><TD align=left valign=top>Lega lstaff.com</TD><TD align=left valign=top>CA - Statewide</TD></TR>
+ 1: BGCOLOR='#DBE9E9'
+ 2: align=left valign=top
+ 3: 43.
+ 4: <a href='joblist.cfm?JobID=94 6735&Keyword='>Word Processor<BR>(N-1286)
+ 5:
+ 6:
+ 7: <unset>
+ 8: align=left valign=top
+ 9: Lega lstaff.com
+10: align=left valign=top
+11: CA - Statewide
+
+/a[^a]b/
+ acb
+ 0: acb
+ a\nb
+ 0: a\x0ab
+
+/a.b/
+ acb
+ 0: acb
+ *** Failers
+No match
+ a\nb
+No match
+
+/a[^a]b/s
+ acb
+ 0: acb
+ a\nb
+ 0: a\x0ab
+
+/a.b/s
+ acb
+ 0: acb
+ a\nb
+ 0: a\x0ab
+
+/^(b+?|a){1,2}?c/
+ bac
+ 0: bac
+ 1: a
+ bbac
+ 0: bbac
+ 1: a
+ bbbac
+ 0: bbbac
+ 1: a
+ bbbbac
+ 0: bbbbac
+ 1: a
+ bbbbbac
+ 0: bbbbbac
+ 1: a
+
+/^(b+|a){1,2}?c/
+ bac
+ 0: bac
+ 1: a
+ bbac
+ 0: bbac
+ 1: a
+ bbbac
+ 0: bbbac
+ 1: a
+ bbbbac
+ 0: bbbbac
+ 1: a
+ bbbbbac
+ 0: bbbbbac
+ 1: a
+
+/(?!\A)x/m
+ x\nb\n
+No match
+ a\bx\n
+ 0: x
+
+/\x0{ab}/
+ \0{ab}
+ 0: \x00{ab}
+
+/(A|B)*?CD/
+ CD
+ 0: CD
+
+/(A|B)*CD/
+ CD
+ 0: CD
+
+/(AB)*?\1/
+ ABABAB
+ 0: ABAB
+ 1: AB
+
+/(AB)*\1/
+ ABABAB
+ 0: ABABAB
+ 1: AB
+
+/(?<!bar)foo/
+ foo
+ 0: foo
+ catfood
+ 0: foo
+ arfootle
+ 0: foo
+ rfoosh
+ 0: foo
+ *** Failers
+No match
+ barfoo
+No match
+ towbarfoo
+No match
+
+/\w{3}(?<!bar)foo/
+ catfood
+ 0: catfoo
+ *** Failers
+No match
+ foo
+No match
+ barfoo
+No match
+ towbarfoo
+No match
+
+/(?<=(foo)a)bar/
+ fooabar
+ 0: bar
+ 1: foo
+ *** Failers
+No match
+ bar
+No match
+ foobbar
+No match
+
+/\Aabc\z/m
+ abc
+ 0: abc
+ *** Failers
+No match
+ abc\n
+No match
+ qqq\nabc
+No match
+ abc\nzzz
+No match
+ qqq\nabc\nzzz
+No match
+
+"(?>.*/)foo"
+ /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/
+No match
+
+"(?>.*/)foo"
+ /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo
+ 0: /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo
+
+/(?>(\.\d\d[1-9]?))\d+/
+ 1.230003938
+ 0: .230003938
+ 1: .23
+ 1.875000282
+ 0: .875000282
+ 1: .875
+ *** Failers
+No match
+ 1.235
+No match
+
+/^((?>\w+)|(?>\s+))*$/
+ now is the time for all good men to come to the aid of the party
+ 0: now is the time for all good men to come to the aid of the party
+ 1: party
+ *** Failers
+No match
+ this is not a line with only words and spaces!
+No match
+
+/(\d+)(\w)/
+ 12345a
+ 0: 12345a
+ 1: 12345
+ 2: a
+ 12345+
+ 0: 12345
+ 1: 1234
+ 2: 5
+
+/((?>\d+))(\w)/
+ 12345a
+ 0: 12345a
+ 1: 12345
+ 2: a
+ *** Failers
+No match
+ 12345+
+No match
+
+/(?>a+)b/
+ aaab
+ 0: aaab
+
+/((?>a+)b)/
+ aaab
+ 0: aaab
+ 1: aaab
+
+/(?>(a+))b/
+ aaab
+ 0: aaab
+ 1: aaa
+
+/(?>b)+/
+ aaabbbccc
+ 0: bbb
+
+/(?>a+|b+|c+)*c/
+ aaabbbbccccd
+ 0: aaabbbbc
+
+/((?>[^()]+)|\([^()]*\))+/
+ ((abc(ade)ufh()()x
+ 0: abc(ade)ufh()()x
+ 1: x
+
+/\(((?>[^()]+)|\([^()]+\))+\)/
+ (abc)
+ 0: (abc)
+ 1: abc
+ (abc(def)xyz)
+ 0: (abc(def)xyz)
+ 1: xyz
+ *** Failers
+No match
+ ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+No match
+
+/a(?-i)b/i
+ ab
+ 0: ab
+ Ab
+ 0: Ab
+ *** Failers
+No match
+ aB
+No match
+ AB
+No match
+
+/(a (?x)b c)d e/
+ a bcd e
+ 0: a bcd e
+ 1: a bc
+ *** Failers
+No match
+ a b cd e
+No match
+ abcd e
+No match
+ a bcde
+No match
+
+/(a b(?x)c d (?-x)e f)/
+ a bcde f
+ 0: a bcde f
+ 1: a bcde f
+ *** Failers
+No match
+ abcdef
+No match
+
+/(a(?i)b)c/
+ abc
+ 0: abc
+ 1: ab
+ aBc
+ 0: aBc
+ 1: aB
+ *** Failers
+No match
+ abC
+No match
+ aBC
+No match
+ Abc
+No match
+ ABc
+No match
+ ABC
+No match
+ AbC
+No match
+
+/a(?i:b)c/
+ abc
+ 0: abc
+ aBc
+ 0: aBc
+ *** Failers
+No match
+ ABC
+No match
+ abC
+No match
+ aBC
+No match
+
+/a(?i:b)*c/
+ aBc
+ 0: aBc
+ aBBc
+ 0: aBBc
+ *** Failers
+No match
+ aBC
+No match
+ aBBC
+No match
+
+/a(?=b(?i)c)\w\wd/
+ abcd
+ 0: abcd
+ abCd
+ 0: abCd
+ *** Failers
+No match
+ aBCd
+No match
+ abcD
+No match
+
+/(?s-i:more.*than).*million/i
+ more than million
+ 0: more than million
+ more than MILLION
+ 0: more than MILLION
+ more \n than Million
+ 0: more \x0a than Million
+ *** Failers
+No match
+ MORE THAN MILLION
+No match
+ more \n than \n million
+No match
+
+/(?:(?s-i)more.*than).*million/i
+ more than million
+ 0: more than million
+ more than MILLION
+ 0: more than MILLION
+ more \n than Million
+ 0: more \x0a than Million
+ *** Failers
+No match
+ MORE THAN MILLION
+No match
+ more \n than \n million
+No match
+
+/(?>a(?i)b+)+c/
+ abc
+ 0: abc
+ aBbc
+ 0: aBbc
+ aBBc
+ 0: aBBc
+ *** Failers
+No match
+ Abc
+No match
+ abAb
+No match
+ abbC
+No match
+
+/(?=a(?i)b)\w\wc/
+ abc
+ 0: abc
+ aBc
+ 0: aBc
+ *** Failers
+No match
+ Ab
+No match
+ abC
+No match
+ aBC
+No match
+
+/(?<=a(?i)b)(\w\w)c/
+ abxxc
+ 0: xxc
+ 1: xx
+ aBxxc
+ 0: xxc
+ 1: xx
+ *** Failers
+No match
+ Abxxc
+No match
+ ABxxc
+No match
+ abxxC
+No match
+
+/(?:(a)|b)(?(1)A|B)/
+ aA
+ 0: aA
+ 1: a
+ bB
+ 0: bB
+ *** Failers
+No match
+ aB
+No match
+ bA
+No match
+
+/^(a)?(?(1)a|b)+$/
+ aa
+ 0: aa
+ 1: a
+ b
+ 0: b
+ bb
+ 0: bb
+ *** Failers
+No match
+ ab
+No match
+
+/^(?(?=abc)\w{3}:|\d\d)$/
+ abc:
+ 0: abc:
+ 12
+ 0: 12
+ *** Failers
+No match
+ 123
+No match
+ xyz
+No match
+
+/^(?(?!abc)\d\d|\w{3}:)$/
+ abc:
+ 0: abc:
+ 12
+ 0: 12
+ *** Failers
+No match
+ 123
+No match
+ xyz
+No match
+
+/(?(?<=foo)bar|cat)/
+ foobar
+ 0: bar
+ cat
+ 0: cat
+ fcat
+ 0: cat
+ focat
+ 0: cat
+ *** Failers
+No match
+ foocat
+No match
+
+/(?(?<!foo)cat|bar)/
+ foobar
+ 0: bar
+ cat
+ 0: cat
+ fcat
+ 0: cat
+ focat
+ 0: cat
+ *** Failers
+No match
+ foocat
+No match
+
+/( \( )? [^()]+ (?(1) \) |) /x
+ abcd
+ 0: abcd
+ (abcd)
+ 0: (abcd)
+ 1: (
+ the quick (abcd) fox
+ 0: the quick
+ (abcd
+ 0: abcd
+
+/( \( )? [^()]+ (?(1) \) ) /x
+ abcd
+ 0: abcd
+ (abcd)
+ 0: (abcd)
+ 1: (
+ the quick (abcd) fox
+ 0: the quick
+ (abcd
+ 0: abcd
+
+/^(?(2)a|(1)(2))+$/
+ 12
+ 0: 12
+ 1: 1
+ 2: 2
+ 12a
+ 0: 12a
+ 1: 1
+ 2: 2
+ 12aa
+ 0: 12aa
+ 1: 1
+ 2: 2
+ *** Failers
+No match
+ 1234
+No match
+
+/((?i)blah)\s+\1/
+ blah blah
+ 0: blah blah
+ 1: blah
+ BLAH BLAH
+ 0: BLAH BLAH
+ 1: BLAH
+ Blah Blah
+ 0: Blah Blah
+ 1: Blah
+ blaH blaH
+ 0: blaH blaH
+ 1: blaH
+ *** Failers
+No match
+ blah BLAH
+No match
+ Blah blah
+No match
+ blaH blah
+No match
+
+/((?i)blah)\s+(?i:\1)/
+ blah blah
+ 0: blah blah
+ 1: blah
+ BLAH BLAH
+ 0: BLAH BLAH
+ 1: BLAH
+ Blah Blah
+ 0: Blah Blah
+ 1: Blah
+ blaH blaH
+ 0: blaH blaH
+ 1: blaH
+ blah BLAH
+ 0: blah BLAH
+ 1: blah
+ Blah blah
+ 0: Blah blah
+ 1: Blah
+ blaH blah
+ 0: blaH blah
+ 1: blaH
+
+/(?>a*)*/
+ a
+ 0: a
+ aa
+ 0: aa
+ aaaa
+ 0: aaaa
+
+/(abc|)+/
+ abc
+ 0: abc
+ 1:
+ abcabc
+ 0: abcabc
+ 1:
+ abcabcabc
+ 0: abcabcabc
+ 1:
+ xyz
+ 0:
+ 1:
+
+/([a]*)*/
+ a
+ 0: a
+ 1:
+ aaaaa
+ 0: aaaaa
+ 1:
+
+/([ab]*)*/
+ a
+ 0: a
+ 1:
+ b
+ 0: b
+ 1:
+ ababab
+ 0: ababab
+ 1:
+ aaaabcde
+ 0: aaaab
+ 1:
+ bbbb
+ 0: bbbb
+ 1:
+
+/([^a]*)*/
+ b
+ 0: b
+ 1:
+ bbbb
+ 0: bbbb
+ 1:
+ aaa
+ 0:
+ 1:
+
+/([^ab]*)*/
+ cccc
+ 0: cccc
+ 1:
+ abab
+ 0:
+ 1:
+
+/([a]*?)*/
+ a
+ 0:
+ 1:
+ aaaa
+ 0:
+ 1:
+
+/([ab]*?)*/
+ a
+ 0:
+ 1:
+ b
+ 0:
+ 1:
+ abab
+ 0:
+ 1:
+ baba
+ 0:
+ 1:
+
+/([^a]*?)*/
+ b
+ 0:
+ 1:
+ bbbb
+ 0:
+ 1:
+ aaa
+ 0:
+ 1:
+
+/([^ab]*?)*/
+ c
+ 0:
+ 1:
+ cccc
+ 0:
+ 1:
+ baba
+ 0:
+ 1:
+
+/(?>a*)*/
+ a
+ 0: a
+ aaabcde
+ 0: aaa
+
+/((?>a*))*/
+ aaaaa
+ 0: aaaaa
+ 1:
+ aabbaa
+ 0: aa
+ 1:
+
+/((?>a*?))*/
+ aaaaa
+ 0:
+ 1:
+ aabbaa
+ 0:
+ 1:
+
+/(?(?=[^a-z]+[a-z]) \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) /x
+ 12-sep-98
+ 0: 12-sep-98
+ 12-09-98
+ 0: 12-09-98
+ *** Failers
+No match
+ sep-12-98
+No match
+
+/(?<=(foo))bar\1/
+ foobarfoo
+ 0: barfoo
+ 1: foo
+ foobarfootling
+ 0: barfoo
+ 1: foo
+ *** Failers
+No match
+ foobar
+No match
+ barfoo
+No match
+
+/(?i:saturday|sunday)/
+ saturday
+ 0: saturday
+ sunday
+ 0: sunday
+ Saturday
+ 0: Saturday
+ Sunday
+ 0: Sunday
+ SATURDAY
+ 0: SATURDAY
+ SUNDAY
+ 0: SUNDAY
+ SunDay
+ 0: SunDay
+
+/(a(?i)bc|BB)x/
+ abcx
+ 0: abcx
+ 1: abc
+ aBCx
+ 0: aBCx
+ 1: aBC
+ bbx
+ 0: bbx
+ 1: bb
+ BBx
+ 0: BBx
+ 1: BB
+ *** Failers
+No match
+ abcX
+No match
+ aBCX
+No match
+ bbX
+No match
+ BBX
+No match
+
+/^([ab](?i)[cd]|[ef])/
+ ac
+ 0: ac
+ 1: ac
+ aC
+ 0: aC
+ 1: aC
+ bD
+ 0: bD
+ 1: bD
+ elephant
+ 0: e
+ 1: e
+ Europe
+ 0: E
+ 1: E
+ frog
+ 0: f
+ 1: f
+ France
+ 0: F
+ 1: F
+ *** Failers
+No match
+ Africa
+No match
+
+/^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/
+ ab
+ 0: ab
+ 1: ab
+ aBd
+ 0: aBd
+ 1: aBd
+ xy
+ 0: xy
+ 1: xy
+ xY
+ 0: xY
+ 1: xY
+ zebra
+ 0: z
+ 1: z
+ Zambesi
+ 0: Z
+ 1: Z
+ *** Failers
+No match
+ aCD
+No match
+ XY
+No match
+
+/(?<=foo\n)^bar/m
+ foo\nbar
+ 0: bar
+ *** Failers
+No match
+ bar
+No match
+ baz\nbar
+No match
+
+/(?<=(?<!foo)bar)baz/
+ barbaz
+ 0: baz
+ barbarbaz
+ 0: baz
+ koobarbaz
+ 0: baz
+ *** Failers
+No match
+ baz
+No match
+ foobarbaz
+No match
+
+/The case of aaaaaa is missed out below because I think Perl 5.005_02 gets/
+/it wrong; it sets $1 to aaa rather than aa. Compare the following test,/
+No match
+/where it does set $1 to aa when matching aaaaaa./
+No match
+
+/^(a\1?){4}$/
+ a
+No match
+ aa
+No match
+ aaa
+No match
+ aaaa
+ 0: aaaa
+ 1: a
+ aaaaa
+ 0: aaaaa
+ 1: a
+ aaaaaaa
+ 0: aaaaaaa
+ 1: a
+ aaaaaaaa
+No match
+ aaaaaaaaa
+No match
+ aaaaaaaaaa
+ 0: aaaaaaaaaa
+ 1: aaaa
+ aaaaaaaaaaa
+No match
+ aaaaaaaaaaaa
+No match
+ aaaaaaaaaaaaa
+No match
+ aaaaaaaaaaaaaa
+No match
+ aaaaaaaaaaaaaaa
+No match
+ aaaaaaaaaaaaaaaa
+No match
+
+/^(a\1?)(a\1?)(a\2?)(a\3?)$/
+ a
+No match
+ aa
+No match
+ aaa
+No match
+ aaaa
+ 0: aaaa
+ 1: a
+ 2: a
+ 3: a
+ 4: a
+ aaaaa
+ 0: aaaaa
+ 1: a
+ 2: aa
+ 3: a
+ 4: a
+ aaaaaa
+ 0: aaaaaa
+ 1: a
+ 2: aa
+ 3: a
+ 4: aa
+ aaaaaaa
+ 0: aaaaaaa
+ 1: a
+ 2: aa
+ 3: aaa
+ 4: a
+ aaaaaaaa
+No match
+ aaaaaaaaa
+No match
+ aaaaaaaaaa
+ 0: aaaaaaaaaa
+ 1: a
+ 2: aa
+ 3: aaa
+ 4: aaaa
+ aaaaaaaaaaa
+No match
+ aaaaaaaaaaaa
+No match
+ aaaaaaaaaaaaa
+No match
+ aaaaaaaaaaaaaa
+No match
+ aaaaaaaaaaaaaaa
+No match
+ aaaaaaaaaaaaaaaa
+No match
+
+/The following tests are taken from the Perl 5.005 test suite; some of them/
+/are compatible with 5.004, but I'd rather not have to sort them out./
+No match
+
+/abc/
+ abc
+ 0: abc
+ xabcy
+ 0: abc
+ ababc
+ 0: abc
+ *** Failers
+No match
+ xbc
+No match
+ axc
+No match
+ abx
+No match
+
+/ab*c/
+ abc
+ 0: abc
+
+/ab*bc/
+ abc
+ 0: abc
+ abbc
+ 0: abbc
+ abbbbc
+ 0: abbbbc
+
+/.{1}/
+ abbbbc
+ 0: a
+
+/.{3,4}/
+ abbbbc
+ 0: abbb
+
+/ab{0,}bc/
+ abbbbc
+ 0: abbbbc
+
+/ab+bc/
+ abbc
+ 0: abbc
+ *** Failers
+No match
+ abc
+No match
+ abq
+No match
+
+/ab{1,}bc/
+
+/ab+bc/
+ abbbbc
+ 0: abbbbc
+
+/ab{1,}bc/
+ abbbbc
+ 0: abbbbc
+
+/ab{1,3}bc/
+ abbbbc
+ 0: abbbbc
+
+/ab{3,4}bc/
+ abbbbc
+ 0: abbbbc
+
+/ab{4,5}bc/
+ *** Failers
+No match
+ abq
+No match
+ abbbbc
+No match
+
+/ab?bc/
+ abbc
+ 0: abbc
+ abc
+ 0: abc
+
+/ab{0,1}bc/
+ abc
+ 0: abc
+
+/ab?bc/
+
+/ab?c/
+ abc
+ 0: abc
+
+/ab{0,1}c/
+ abc
+ 0: abc
+
+/^abc$/
+ abc
+ 0: abc
+ *** Failers
+No match
+ abbbbc
+No match
+ abcc
+No match
+
+/^abc/
+ abcc
+ 0: abc
+
+/^abc$/
+
+/abc$/
+ aabc
+ 0: abc
+ *** Failers
+No match
+ aabc
+ 0: abc
+ aabcd
+No match
+
+/^/
+ abc
+ 0:
+
+/$/
+ abc
+ 0:
+
+/a.c/
+ abc
+ 0: abc
+ axc
+ 0: axc
+
+/a.*c/
+ axyzc
+ 0: axyzc
+
+/a[bc]d/
+ abd
+ 0: abd
+ *** Failers
+No match
+ axyzd
+No match
+ abc
+No match
+
+/a[b-d]e/
+ ace
+ 0: ace
+
+/a[b-d]/
+ aac
+ 0: ac
+
+/a[-b]/
+ a-
+ 0: a-
+
+/a[b-]/
+ a-
+ 0: a-
+
+/a]/
+ a]
+ 0: a]
+
+/a[]]b/
+ a]b
+ 0: a]b
+
+/a[^bc]d/
+ aed
+ 0: aed
+ *** Failers
+No match
+ abd
+No match
+ abd
+No match
+
+/a[^-b]c/
+ adc
+ 0: adc
+
+/a[^]b]c/
+ adc
+ 0: adc
+ *** Failers
+No match
+ a-c
+ 0: a-c
+ a]c
+No match
+
+/\ba\b/
+ a-
+ 0: a
+ -a
+ 0: a
+ -a-
+ 0: a
+
+/\by\b/
+ *** Failers
+No match
+ xy
+No match
+ yz
+No match
+ xyz
+No match
+
+/\Ba\B/
+ *** Failers
+ 0: a
+ a-
+No match
+ -a
+No match
+ -a-
+No match
+
+/\By\b/
+ xy
+ 0: y
+
+/\by\B/
+ yz
+ 0: y
+
+/\By\B/
+ xyz
+ 0: y
+
+/\w/
+ a
+ 0: a
+
+/\W/
+ -
+ 0: -
+ *** Failers
+ 0: *
+ -
+ 0: -
+ a
+No match
+
+/a\sb/
+ a b
+ 0: a b
+
+/a\Sb/
+ a-b
+ 0: a-b
+ *** Failers
+No match
+ a-b
+ 0: a-b
+ a b
+No match
+
+/\d/
+ 1
+ 0: 1
+
+/\D/
+ -
+ 0: -
+ *** Failers
+ 0: *
+ -
+ 0: -
+ 1
+No match
+
+/[\w]/
+ a
+ 0: a
+
+/[\W]/
+ -
+ 0: -
+ *** Failers
+ 0: *
+ -
+ 0: -
+ a
+No match
+
+/a[\s]b/
+ a b
+ 0: a b
+
+/a[\S]b/
+ a-b
+ 0: a-b
+ *** Failers
+No match
+ a-b
+ 0: a-b
+ a b
+No match
+
+/[\d]/
+ 1
+ 0: 1
+
+/[\D]/
+ -
+ 0: -
+ *** Failers
+ 0: *
+ -
+ 0: -
+ 1
+No match
+
+/ab|cd/
+ abc
+ 0: ab
+ abcd
+ 0: ab
+
+/()ef/
+ def
+ 0: ef
+ 1:
+
+/$b/
+
+/a\(b/
+ a(b
+ 0: a(b
+
+/a\(*b/
+ ab
+ 0: ab
+ a((b
+ 0: a((b
+
+/a\\b/
+ a\b
+No match
+
+/((a))/
+ abc
+ 0: a
+ 1: a
+ 2: a
+
+/(a)b(c)/
+ abc
+ 0: abc
+ 1: a
+ 2: c
+
+/a+b+c/
+ aabbabc
+ 0: abc
+
+/a{1,}b{1,}c/
+ aabbabc
+ 0: abc
+
+/a.+?c/
+ abcabc
+ 0: abc
+
+/(a+|b)*/
+ ab
+ 0: ab
+ 1: b
+
+/(a+|b){0,}/
+ ab
+ 0: ab
+ 1: b
+
+/(a+|b)+/
+ ab
+ 0: ab
+ 1: b
+
+/(a+|b){1,}/
+ ab
+ 0: ab
+ 1: b
+
+/(a+|b)?/
+ ab
+ 0: a
+ 1: a
+
+/(a+|b){0,1}/
+ ab
+ 0: a
+ 1: a
+
+/[^ab]*/
+ cde
+ 0: cde
+
+/abc/
+ *** Failers
+No match
+ b
+No match
+
+
+/a*/
+
+
+/([abc])*d/
+ abbbcd
+ 0: abbbcd
+ 1: c
+
+/([abc])*bcd/
+ abcd
+ 0: abcd
+ 1: a
+
+/a|b|c|d|e/
+ e
+ 0: e
+
+/(a|b|c|d|e)f/
+ ef
+ 0: ef
+ 1: e
+
+/abcd*efg/
+ abcdefg
+ 0: abcdefg
+
+/ab*/
+ xabyabbbz
+ 0: ab
+ xayabbbz
+ 0: a
+
+/(ab|cd)e/
+ abcde
+ 0: cde
+ 1: cd
+
+/[abhgefdc]ij/
+ hij
+ 0: hij
+
+/^(ab|cd)e/
+
+/(abc|)ef/
+ abcdef
+ 0: ef
+ 1:
+
+/(a|b)c*d/
+ abcd
+ 0: bcd
+ 1: b
+
+/(ab|ab*)bc/
+ abc
+ 0: abc
+ 1: a
+
+/a([bc]*)c*/
+ abc
+ 0: abc
+ 1: bc
+
+/a([bc]*)(c*d)/
+ abcd
+ 0: abcd
+ 1: bc
+ 2: d
+
+/a([bc]+)(c*d)/
+ abcd
+ 0: abcd
+ 1: bc
+ 2: d
+
+/a([bc]*)(c+d)/
+ abcd
+ 0: abcd
+ 1: b
+ 2: cd
+
+/a[bcd]*dcdcde/
+ adcdcde
+ 0: adcdcde
+
+/a[bcd]+dcdcde/
+ *** Failers
+No match
+ abcde
+No match
+ adcdcde
+No match
+
+/(ab|a)b*c/
+ abc
+ 0: abc
+ 1: ab
+
+/((a)(b)c)(d)/
+ abcd
+ 0: abcd
+ 1: abc
+ 2: a
+ 3: b
+ 4: d
+
+/[a-zA-Z_][a-zA-Z0-9_]*/
+ alpha
+ 0: alpha
+
+/^a(bc+|b[eh])g|.h$/
+ abh
+ 0: bh
+
+/(bc+d$|ef*g.|h?i(j|k))/
+ effgz
+ 0: effgz
+ 1: effgz
+ ij
+ 0: ij
+ 1: ij
+ 2: j
+ reffgz
+ 0: effgz
+ 1: effgz
+ *** Failers
+No match
+ effg
+No match
+ bcdd
+No match
+
+/((((((((((a))))))))))/
+ a
+ 0: a
+ 1: a
+ 2: a
+ 3: a
+ 4: a
+ 5: a
+ 6: a
+ 7: a
+ 8: a
+ 9: a
+10: a
+
+/((((((((((a))))))))))\10/
+ aa
+ 0: aa
+ 1: a
+ 2: a
+ 3: a
+ 4: a
+ 5: a
+ 6: a
+ 7: a
+ 8: a
+ 9: a
+10: a
+
+/(((((((((a)))))))))/
+ a
+ 0: a
+ 1: a
+ 2: a
+ 3: a
+ 4: a
+ 5: a
+ 6: a
+ 7: a
+ 8: a
+ 9: a
+
+/multiple words of text/
+ *** Failers
+No match
+ aa
+No match
+ uh-uh
+No match
+
+/multiple words/
+ multiple words, yeah
+ 0: multiple words
+
+/(.*)c(.*)/
+ abcde
+ 0: abcde
+ 1: ab
+ 2: de
+
+/\((.*), (.*)\)/
+ (a, b)
+ 0: (a, b)
+ 1: a
+ 2: b
+
+/[k]/
+
+/abcd/
+ abcd
+ 0: abcd
+
+/a(bc)d/
+ abcd
+ 0: abcd
+ 1: bc
+
+/a[-]?c/
+ ac
+ 0: ac
+
+/(abc)\1/
+ abcabc
+ 0: abcabc
+ 1: abc
+
+/([a-c]*)\1/
+ abcabc
+ 0: abcabc
+ 1: abc
+
+/(a)|\1/
+ a
+ 0: a
+ 1: a
+ *** Failers
+ 0: a
+ 1: a
+ ab
+ 0: a
+ 1: a
+ x
+No match
+
+/(([a-c])b*?\2)*/
+ ababbbcbc
+ 0: ababb
+ 1: bb
+ 2: b
+
+/(([a-c])b*?\2){3}/
+ ababbbcbc
+ 0: ababbbcbc
+ 1: cbc
+ 2: c
+
+/((\3|b)\2(a)x)+/
+ aaaxabaxbaaxbbax
+ 0: bbax
+ 1: bbax
+ 2: b
+ 3: a
+
+/((\3|b)\2(a)){2,}/
+ bbaababbabaaaaabbaaaabba
+ 0: bbaaaabba
+ 1: bba
+ 2: b
+ 3: a
+
+/abc/i
+ ABC
+ 0: ABC
+ XABCY
+ 0: ABC
+ ABABC
+ 0: ABC
+ *** Failers
+No match
+ aaxabxbaxbbx
+No match
+ XBC
+No match
+ AXC
+No match
+ ABX
+No match
+
+/ab*c/i
+ ABC
+ 0: ABC
+
+/ab*bc/i
+ ABC
+ 0: ABC
+ ABBC
+ 0: ABBC
+
+/ab*?bc/i
+ ABBBBC
+ 0: ABBBBC
+
+/ab{0,}?bc/i
+ ABBBBC
+ 0: ABBBBC
+
+/ab+?bc/i
+ ABBC
+ 0: ABBC
+
+/ab+bc/i
+ *** Failers
+No match
+ ABC
+No match
+ ABQ
+No match
+
+/ab{1,}bc/i
+
+/ab+bc/i
+ ABBBBC
+ 0: ABBBBC
+
+/ab{1,}?bc/i
+ ABBBBC
+ 0: ABBBBC
+
+/ab{1,3}?bc/i
+ ABBBBC
+ 0: ABBBBC
+
+/ab{3,4}?bc/i
+ ABBBBC
+ 0: ABBBBC
+
+/ab{4,5}?bc/i
+ *** Failers
+No match
+ ABQ
+No match
+ ABBBBC
+No match
+
+/ab??bc/i
+ ABBC
+ 0: ABBC
+ ABC
+ 0: ABC
+
+/ab{0,1}?bc/i
+ ABC
+ 0: ABC
+
+/ab??bc/i
+
+/ab??c/i
+ ABC
+ 0: ABC
+
+/ab{0,1}?c/i
+ ABC
+ 0: ABC
+
+/^abc$/i
+ ABC
+ 0: ABC
+ *** Failers
+No match
+ ABBBBC
+No match
+ ABCC
+No match
+
+/^abc/i
+ ABCC
+ 0: ABC
+
+/^abc$/i
+
+/abc$/i
+ AABC
+ 0: ABC
+
+/^/i
+ ABC
+ 0:
+
+/$/i
+ ABC
+ 0:
+
+/a.c/i
+ ABC
+ 0: ABC
+ AXC
+ 0: AXC
+
+/a.*?c/i
+ AXYZC
+ 0: AXYZC
+
+/a.*c/i
+ *** Failers
+No match
+ AABC
+ 0: AABC
+ AXYZD
+No match
+
+/a[bc]d/i
+ ABD
+ 0: ABD
+
+/a[b-d]e/i
+ ACE
+ 0: ACE
+ *** Failers
+No match
+ ABC
+No match
+ ABD
+No match
+
+/a[b-d]/i
+ AAC
+ 0: AC
+
+/a[-b]/i
+ A-
+ 0: A-
+
+/a[b-]/i
+ A-
+ 0: A-
+
+/a]/i
+ A]
+ 0: A]
+
+/a[]]b/i
+ A]B
+ 0: A]B
+
+/a[^bc]d/i
+ AED
+ 0: AED
+
+/a[^-b]c/i
+ ADC
+ 0: ADC
+ *** Failers
+No match
+ ABD
+No match
+ A-C
+No match
+
+/a[^]b]c/i
+ ADC
+ 0: ADC
+
+/ab|cd/i
+ ABC
+ 0: AB
+ ABCD
+ 0: AB
+
+/()ef/i
+ DEF
+ 0: EF
+ 1:
+
+/$b/i
+ *** Failers
+No match
+ A]C
+No match
+ B
+No match
+
+/a\(b/i
+ A(B
+ 0: A(B
+
+/a\(*b/i
+ AB
+ 0: AB
+ A((B
+ 0: A((B
+
+/a\\b/i
+ A\B
+No match
+
+/((a))/i
+ ABC
+ 0: A
+ 1: A
+ 2: A
+
+/(a)b(c)/i
+ ABC
+ 0: ABC
+ 1: A
+ 2: C
+
+/a+b+c/i
+ AABBABC
+ 0: ABC
+
+/a{1,}b{1,}c/i
+ AABBABC
+ 0: ABC
+
+/a.+?c/i
+ ABCABC
+ 0: ABC
+
+/a.*?c/i
+ ABCABC
+ 0: ABC
+
+/a.{0,5}?c/i
+ ABCABC
+ 0: ABC
+
+/(a+|b)*/i
+ AB
+ 0: AB
+ 1: B
+
+/(a+|b){0,}/i
+ AB
+ 0: AB
+ 1: B
+
+/(a+|b)+/i
+ AB
+ 0: AB
+ 1: B
+
+/(a+|b){1,}/i
+ AB
+ 0: AB
+ 1: B
+
+/(a+|b)?/i
+ AB
+ 0: A
+ 1: A
+
+/(a+|b){0,1}/i
+ AB
+ 0: A
+ 1: A
+
+/(a+|b){0,1}?/i
+ AB
+ 0:
+
+/[^ab]*/i
+ CDE
+ 0: CDE
+
+/abc/i
+
+/a*/i
+
+
+/([abc])*d/i
+ ABBBCD
+ 0: ABBBCD
+ 1: C
+
+/([abc])*bcd/i
+ ABCD
+ 0: ABCD
+ 1: A
+
+/a|b|c|d|e/i
+ E
+ 0: E
+
+/(a|b|c|d|e)f/i
+ EF
+ 0: EF
+ 1: E
+
+/abcd*efg/i
+ ABCDEFG
+ 0: ABCDEFG
+
+/ab*/i
+ XABYABBBZ
+ 0: AB
+ XAYABBBZ
+ 0: A
+
+/(ab|cd)e/i
+ ABCDE
+ 0: CDE
+ 1: CD
+
+/[abhgefdc]ij/i
+ HIJ
+ 0: HIJ
+
+/^(ab|cd)e/i
+ ABCDE
+No match
+
+/(abc|)ef/i
+ ABCDEF
+ 0: EF
+ 1:
+
+/(a|b)c*d/i
+ ABCD
+ 0: BCD
+ 1: B
+
+/(ab|ab*)bc/i
+ ABC
+ 0: ABC
+ 1: A
+
+/a([bc]*)c*/i
+ ABC
+ 0: ABC
+ 1: BC
+
+/a([bc]*)(c*d)/i
+ ABCD
+ 0: ABCD
+ 1: BC
+ 2: D
+
+/a([bc]+)(c*d)/i
+ ABCD
+ 0: ABCD
+ 1: BC
+ 2: D
+
+/a([bc]*)(c+d)/i
+ ABCD
+ 0: ABCD
+ 1: B
+ 2: CD
+
+/a[bcd]*dcdcde/i
+ ADCDCDE
+ 0: ADCDCDE
+
+/a[bcd]+dcdcde/i
+
+/(ab|a)b*c/i
+ ABC
+ 0: ABC
+ 1: AB
+
+/((a)(b)c)(d)/i
+ ABCD
+ 0: ABCD
+ 1: ABC
+ 2: A
+ 3: B
+ 4: D
+
+/[a-zA-Z_][a-zA-Z0-9_]*/i
+ ALPHA
+ 0: ALPHA
+
+/^a(bc+|b[eh])g|.h$/i
+ ABH
+ 0: BH
+
+/(bc+d$|ef*g.|h?i(j|k))/i
+ EFFGZ
+ 0: EFFGZ
+ 1: EFFGZ
+ IJ
+ 0: IJ
+ 1: IJ
+ 2: J
+ REFFGZ
+ 0: EFFGZ
+ 1: EFFGZ
+ *** Failers
+No match
+ ADCDCDE
+No match
+ EFFG
+No match
+ BCDD
+No match
+
+/((((((((((a))))))))))/i
+ A
+ 0: A
+ 1: A
+ 2: A
+ 3: A
+ 4: A
+ 5: A
+ 6: A
+ 7: A
+ 8: A
+ 9: A
+10: A
+
+/((((((((((a))))))))))\10/i
+ AA
+ 0: AA
+ 1: A
+ 2: A
+ 3: A
+ 4: A
+ 5: A
+ 6: A
+ 7: A
+ 8: A
+ 9: A
+10: A
+
+/(((((((((a)))))))))/i
+ A
+ 0: A
+ 1: A
+ 2: A
+ 3: A
+ 4: A
+ 5: A
+ 6: A
+ 7: A
+ 8: A
+ 9: A
+
+/(?:(?:(?:(?:(?:(?:(?:(?:(?:(a))))))))))/i
+ A
+ 0: A
+ 1: A
+
+/(?:(?:(?:(?:(?:(?:(?:(?:(?:(a|b|c))))))))))/i
+ C
+ 0: C
+ 1: C
+
+/multiple words of text/i
+ *** Failers
+No match
+ AA
+No match
+ UH-UH
+No match
+
+/multiple words/i
+ MULTIPLE WORDS, YEAH
+ 0: MULTIPLE WORDS
+
+/(.*)c(.*)/i
+ ABCDE
+ 0: ABCDE
+ 1: AB
+ 2: DE
+
+/\((.*), (.*)\)/i
+ (A, B)
+ 0: (A, B)
+ 1: A
+ 2: B
+
+/[k]/i
+
+/abcd/i
+ ABCD
+ 0: ABCD
+
+/a(bc)d/i
+ ABCD
+ 0: ABCD
+ 1: BC
+
+/a[-]?c/i
+ AC
+ 0: AC
+
+/(abc)\1/i
+ ABCABC
+ 0: ABCABC
+ 1: ABC
+
+/([a-c]*)\1/i
+ ABCABC
+ 0: ABCABC
+ 1: ABC
+
+/a(?!b)./
+ abad
+ 0: ad
+
+/a(?=d)./
+ abad
+ 0: ad
+
+/a(?=c|d)./
+ abad
+ 0: ad
+
+/a(?:b|c|d)(.)/
+ ace
+ 0: ace
+ 1: e
+
+/a(?:b|c|d)*(.)/
+ ace
+ 0: ace
+ 1: e
+
+/a(?:b|c|d)+?(.)/
+ ace
+ 0: ace
+ 1: e
+ acdbcdbe
+ 0: acd
+ 1: d
+
+/a(?:b|c|d)+(.)/
+ acdbcdbe
+ 0: acdbcdbe
+ 1: e
+
+/a(?:b|c|d){2}(.)/
+ acdbcdbe
+ 0: acdb
+ 1: b
+
+/a(?:b|c|d){4,5}(.)/
+ acdbcdbe
+ 0: acdbcdb
+ 1: b
+
+/a(?:b|c|d){4,5}?(.)/
+ acdbcdbe
+ 0: acdbcd
+ 1: d
+
+/((foo)|(bar))*/
+ foobar
+ 0: foobar
+ 1: bar
+ 2: foo
+ 3: bar
+
+/a(?:b|c|d){6,7}(.)/
+ acdbcdbe
+ 0: acdbcdbe
+ 1: e
+
+/a(?:b|c|d){6,7}?(.)/
+ acdbcdbe
+ 0: acdbcdbe
+ 1: e
+
+/a(?:b|c|d){5,6}(.)/
+ acdbcdbe
+ 0: acdbcdbe
+ 1: e
+
+/a(?:b|c|d){5,6}?(.)/
+ acdbcdbe
+ 0: acdbcdb
+ 1: b
+
+/a(?:b|c|d){5,7}(.)/
+ acdbcdbe
+ 0: acdbcdbe
+ 1: e
+
+/a(?:b|c|d){5,7}?(.)/
+ acdbcdbe
+ 0: acdbcdb
+ 1: b
+
+/a(?:b|(c|e){1,2}?|d)+?(.)/
+ ace
+ 0: ace
+ 1: c
+ 2: e
+
+/^(.+)?B/
+ AB
+ 0: AB
+ 1: A
+
+/^([^a-z])|(\^)$/
+ .
+ 0: .
+ 1: .
+
+/^[<>]&/
+ <&OUT
+ 0: <&
+
+/^(a\1?){4}$/
+ aaaaaaaaaa
+ 0: aaaaaaaaaa
+ 1: aaaa
+ *** Failers
+No match
+ AB
+No match
+ aaaaaaaaa
+No match
+ aaaaaaaaaaa
+No match
+
+/^(a(?(1)\1)){4}$/
+ aaaaaaaaaa
+ 0: aaaaaaaaaa
+ 1: aaaa
+ *** Failers
+No match
+ aaaaaaaaa
+No match
+ aaaaaaaaaaa
+No match
+
+/(?:(f)(o)(o)|(b)(a)(r))*/
+ foobar
+ 0: foobar
+ 1: f
+ 2: o
+ 3: o
+ 4: b
+ 5: a
+ 6: r
+
+/(?<=a)b/
+ ab
+ 0: b
+ *** Failers
+No match
+ cb
+No match
+ b
+No match
+
+/(?<!c)b/
+ ab
+ 0: b
+ b
+ 0: b
+ b
+ 0: b
+
+/(?:..)*a/
+ aba
+ 0: aba
+
+/(?:..)*?a/
+ aba
+ 0: a
+
+/^(?:b|a(?=(.)))*\1/
+ abc
+ 0: ab
+ 1: b
+
+/^(){3,5}/
+ abc
+ 0:
+ 1:
+
+/^(a+)*ax/
+ aax
+ 0: aax
+ 1: a
+
+/^((a|b)+)*ax/
+ aax
+ 0: aax
+ 1: a
+ 2: a
+
+/^((a|bc)+)*ax/
+ aax
+ 0: aax
+ 1: a
+ 2: a
+
+/(a|x)*ab/
+ cab
+ 0: ab
+
+/(a)*ab/
+ cab
+ 0: ab
+
+/(?:(?i)a)b/
+ ab
+ 0: ab
+
+/((?i)a)b/
+ ab
+ 0: ab
+ 1: a
+
+/(?:(?i)a)b/
+ Ab
+ 0: Ab
+
+/((?i)a)b/
+ Ab
+ 0: Ab
+ 1: A
+
+/(?:(?i)a)b/
+ *** Failers
+No match
+ cb
+No match
+ aB
+No match
+
+/((?i)a)b/
+
+/(?i:a)b/
+ ab
+ 0: ab
+
+/((?i:a))b/
+ ab
+ 0: ab
+ 1: a
+
+/(?i:a)b/
+ Ab
+ 0: Ab
+
+/((?i:a))b/
+ Ab
+ 0: Ab
+ 1: A
+
+/(?i:a)b/
+ *** Failers
+No match
+ aB
+No match
+ aB
+No match
+
+/((?i:a))b/
+
+/(?:(?-i)a)b/i
+ ab
+ 0: ab
+
+/((?-i)a)b/i
+ ab
+ 0: ab
+ 1: a
+
+/(?:(?-i)a)b/i
+ aB
+ 0: aB
+
+/((?-i)a)b/i
+ aB
+ 0: aB
+ 1: a
+
+/(?:(?-i)a)b/i
+ *** Failers
+No match
+ aB
+ 0: aB
+ Ab
+No match
+
+/((?-i)a)b/i
+
+/(?:(?-i)a)b/i
+ aB
+ 0: aB
+
+/((?-i)a)b/i
+ aB
+ 0: aB
+ 1: a
+
+/(?:(?-i)a)b/i
+ *** Failers
+No match
+ Ab
+No match
+ AB
+No match
+
+/((?-i)a)b/i
+
+/(?-i:a)b/i
+ ab
+ 0: ab
+
+/((?-i:a))b/i
+ ab
+ 0: ab
+ 1: a
+
+/(?-i:a)b/i
+ aB
+ 0: aB
+
+/((?-i:a))b/i
+ aB
+ 0: aB
+ 1: a
+
+/(?-i:a)b/i
+ *** Failers
+No match
+ AB
+No match
+ Ab
+No match
+
+/((?-i:a))b/i
+
+/(?-i:a)b/i
+ aB
+ 0: aB
+
+/((?-i:a))b/i
+ aB
+ 0: aB
+ 1: a
+
+/(?-i:a)b/i
+ *** Failers
+No match
+ Ab
+No match
+ AB
+No match
+
+/((?-i:a))b/i
+
+/((?-i:a.))b/i
+ *** Failers
+No match
+ AB
+No match
+ a\nB
+No match
+
+/((?s-i:a.))b/i
+ a\nB
+ 0: a\x0aB
+ 1: a\x0a
+
+/(?:c|d)(?:)(?:a(?:)(?:b)(?:b(?:))(?:b(?:)(?:b)))/
+ cabbbb
+ 0: cabbbb
+
+/(?:c|d)(?:)(?:aaaaaaaa(?:)(?:bbbbbbbb)(?:bbbbbbbb(?:))(?:bbbbbbbb(?:)(?:bbbbbbbb)))/
+ caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
+ 0: caaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
+
+/(ab)\d\1/i
+ Ab4ab
+ 0: Ab4ab
+ 1: Ab
+ ab4Ab
+ 0: ab4Ab
+ 1: ab
+
+/foo\w*\d{4}baz/
+ foobar1234baz
+ 0: foobar1234baz
+
+/x(~~)*(?:(?:F)?)?/
+ x~~
+ 0: x~~
+ 1: ~~
+
+/^a(?#xxx){3}c/
+ aaac
+ 0: aaac
+
+/^a (?#xxx) (?#yyy) {3}c/x
+ aaac
+ 0: aaac
+
+/(?<![cd])b/
+ *** Failers
+No match
+ B\nB
+No match
+ dbcb
+No match
+
+/(?<![cd])[ab]/
+ dbaacb
+ 0: a
+
+/(?<!(c|d))b/
+
+/(?<!(c|d))[ab]/
+ dbaacb
+ 0: a
+
+/(?<!cd)[ab]/
+ cdaccb
+ 0: b
+
+/^(?:a?b?)*$/
+ *** Failers
+No match
+ dbcb
+No match
+ a--
+No match
+
+/((?s)^a(.))((?m)^b$)/
+ a\nb\nc\n
+ 0: a\x0ab
+ 1: a\x0a
+ 2: \x0a
+ 3: b
+
+/((?m)^b$)/
+ a\nb\nc\n
+ 0: b
+ 1: b
+
+/(?m)^b/
+ a\nb\n
+ 0: b
+
+/(?m)^(b)/
+ a\nb\n
+ 0: b
+ 1: b
+
+/((?m)^b)/
+ a\nb\n
+ 0: b
+ 1: b
+
+/\n((?m)^b)/
+ a\nb\n
+ 0: \x0ab
+ 1: b
+
+/((?s).)c(?!.)/
+ a\nb\nc\n
+ 0: \x0ac
+ 1: \x0a
+ a\nb\nc\n
+ 0: \x0ac
+ 1: \x0a
+
+/((?s)b.)c(?!.)/
+ a\nb\nc\n
+ 0: b\x0ac
+ 1: b\x0a
+ a\nb\nc\n
+ 0: b\x0ac
+ 1: b\x0a
+
+/^b/
+
+/()^b/
+ *** Failers
+No match
+ a\nb\nc\n
+No match
+ a\nb\nc\n
+No match
+
+/((?m)^b)/
+ a\nb\nc\n
+ 0: b
+ 1: b
+
+/(?(1)a|b)/
+
+/(?(1)b|a)/
+ a
+ 0: a
+
+/(x)?(?(1)a|b)/
+ *** Failers
+No match
+ a
+No match
+ a
+No match
+
+/(x)?(?(1)b|a)/
+ a
+ 0: a
+
+/()?(?(1)b|a)/
+ a
+ 0: a
+
+/()(?(1)b|a)/
+
+/()?(?(1)a|b)/
+ a
+ 0: a
+ 1:
+
+/^(\()?blah(?(1)(\)))$/
+ (blah)
+ 0: (blah)
+ 1: (
+ 2: )
+ blah
+ 0: blah
+ *** Failers
+No match
+ a
+No match
+ blah)
+No match
+ (blah
+No match
+
+/^(\(+)?blah(?(1)(\)))$/
+ (blah)
+ 0: (blah)
+ 1: (
+ 2: )
+ blah
+ 0: blah
+ *** Failers
+No match
+ blah)
+No match
+ (blah
+No match
+
+/(?(?!a)a|b)/
+
+/(?(?!a)b|a)/
+ a
+ 0: a
+
+/(?(?=a)b|a)/
+ *** Failers
+No match
+ a
+No match
+ a
+No match
+
+/(?(?=a)a|b)/
+ a
+ 0: a
+
+/(?=(a+?))(\1ab)/
+ aaab
+ 0: aab
+ 1: a
+ 2: aab
+
+/^(?=(a+?))\1ab/
+
+/(\w+:)+/
+ one:
+ 0: one:
+ 1: one:
+
+/$(?<=^(a))/
+ a
+ 0:
+ 1: a
+
+/(?=(a+?))(\1ab)/
+ aaab
+ 0: aab
+ 1: a
+ 2: aab
+
+/^(?=(a+?))\1ab/
+ *** Failers
+No match
+ aaab
+No match
+ aaab
+No match
+
+/([\w:]+::)?(\w+)$/
+ abcd
+ 0: abcd
+ 1: <unset>
+ 2: abcd
+ xy:z:::abcd
+ 0: xy:z:::abcd
+ 1: xy:z:::
+ 2: abcd
+
+/^[^bcd]*(c+)/
+ aexycd
+ 0: aexyc
+ 1: c
+
+/(a*)b+/
+ caab
+ 0: aab
+ 1: aa
+
+/([\w:]+::)?(\w+)$/
+ abcd
+ 0: abcd
+ 1: <unset>
+ 2: abcd
+ xy:z:::abcd
+ 0: xy:z:::abcd
+ 1: xy:z:::
+ 2: abcd
+ *** Failers
+ 0: Failers
+ 1: <unset>
+ 2: Failers
+ abcd:
+No match
+ abcd:
+No match
+
+/^[^bcd]*(c+)/
+ aexycd
+ 0: aexyc
+ 1: c
+
+/(>a+)ab/
+
+/(?>a+)b/
+ aaab
+ 0: aaab
+
+/([[:]+)/
+ a:[b]:
+ 0: :[
+ 1: :[
+
+/([[=]+)/
+ a=[b]=
+ 0: =[
+ 1: =[
+
+/([[.]+)/
+ a.[b].
+ 0: .[
+ 1: .[
+
+/((?>a+)b)/
+ aaab
+ 0: aaab
+ 1: aaab
+
+/(?>(a+))b/
+ aaab
+ 0: aaab
+ 1: aaa
+
+/((?>[^()]+)|\([^()]*\))+/
+ ((abc(ade)ufh()()x
+ 0: abc(ade)ufh()()x
+ 1: x
+
+/a\Z/
+ *** Failers
+No match
+ aaab
+No match
+ a\nb\n
+No match
+
+/b\Z/
+ a\nb\n
+ 0: b
+
+/b\z/
+
+/b\Z/
+ a\nb
+ 0: b
+
+/b\z/
+ a\nb
+ 0: b
+ *** Failers
+No match
+
+/^(?>(?(1)\.|())[^\W_](?>[a-z0-9-]*[^\W_])?)+$/
+ a
+ 0: a
+ 1:
+ abc
+ 0: abc
+ 1:
+ a-b
+ 0: a-b
+ 1:
+ 0-9
+ 0: 0-9
+ 1:
+ a.b
+ 0: a.b
+ 1:
+ 5.6.7
+ 0: 5.6.7
+ 1:
+ the.quick.brown.fox
+ 0: the.quick.brown.fox
+ 1:
+ a100.b200.300c
+ 0: a100.b200.300c
+ 1:
+ 12-ab.1245
+ 0: 12-ab.1245
+ 1:
+ *** Failers
+No match
+ \
+No match
+ .a
+No match
+ -a
+No match
+ a-
+No match
+ a.
+No match
+ a_b
+No match
+ a.-
+No match
+ a..
+No match
+ ab..bc
+No match
+ the.quick.brown.fox-
+No match
+ the.quick.brown.fox.
+No match
+ the.quick.brown.fox_
+No match
+ the.quick.brown.fox+
+No match
+
+/(?>.*)(?<=(abcd|wxyz))/
+ alphabetabcd
+ 0: alphabetabcd
+ 1: abcd
+ endingwxyz
+ 0: endingwxyz
+ 1: wxyz
+ *** Failers
+No match
+ a rather long string that doesn't end with one of them
+No match
+
+/word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/
+ word cat dog elephant mussel cow horse canary baboon snake shark otherword
+ 0: word cat dog elephant mussel cow horse canary baboon snake shark otherword
+ word cat dog elephant mussel cow horse canary baboon snake shark
+No match
+
+/word (?>[a-zA-Z0-9]+ ){0,30}otherword/
+ word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope
+No match
+
+/(?<=\d{3}(?!999))foo/
+ 999foo
+ 0: foo
+ 123999foo
+ 0: foo
+ *** Failers
+No match
+ 123abcfoo
+No match
+
+/(?<=(?!...999)\d{3})foo/
+ 999foo
+ 0: foo
+ 123999foo
+ 0: foo
+ *** Failers
+No match
+ 123abcfoo
+No match
+
+/(?<=\d{3}(?!999)...)foo/
+ 123abcfoo
+ 0: foo
+ 123456foo
+ 0: foo
+ *** Failers
+No match
+ 123999foo
+No match
+
+/(?<=\d{3}...)(?<!999)foo/
+ 123abcfoo
+ 0: foo
+ 123456foo
+ 0: foo
+ *** Failers
+No match
+ 123999foo
+No match
+
+/<a[\s]+href[\s]*=[\s]* # find <a href=
+ ([\"\'])? # find single or double quote
+ (?(1) (.*?)\1 | ([^\s]+)) # if quote found, match up to next matching
+ # quote, otherwise match up to next space
+/isx
+ <a href=abcd xyz
+ 0: <a href=abcd
+ 1: <unset>
+ 2: <unset>
+ 3: abcd
+ <a href=\"abcd xyz pqr\" cats
+ 0: <a href="abcd xyz pqr"
+ 1: "
+ 2: abcd xyz pqr
+ <a href=\'abcd xyz pqr\' cats
+ 0: <a href='abcd xyz pqr'
+ 1: '
+ 2: abcd xyz pqr
+
+/<a\s+href\s*=\s* # find <a href=
+ (["'])? # find single or double quote
+ (?(1) (.*?)\1 | (\S+)) # if quote found, match up to next matching
+ # quote, otherwise match up to next space
+/isx
+ <a href=abcd xyz
+ 0: <a href=abcd
+ 1: <unset>
+ 2: <unset>
+ 3: abcd
+ <a href=\"abcd xyz pqr\" cats
+ 0: <a href="abcd xyz pqr"
+ 1: "
+ 2: abcd xyz pqr
+ <a href = \'abcd xyz pqr\' cats
+ 0: <a href = 'abcd xyz pqr'
+ 1: '
+ 2: abcd xyz pqr
+
+/<a\s+href(?>\s*)=(?>\s*) # find <a href=
+ (["'])? # find single or double quote
+ (?(1) (.*?)\1 | (\S+)) # if quote found, match up to next matching
+ # quote, otherwise match up to next space
+/isx
+ <a href=abcd xyz
+ 0: <a href=abcd
+ 1: <unset>
+ 2: <unset>
+ 3: abcd
+ <a href=\"abcd xyz pqr\" cats
+ 0: <a href="abcd xyz pqr"
+ 1: "
+ 2: abcd xyz pqr
+ <a href = \'abcd xyz pqr\' cats
+ 0: <a href = 'abcd xyz pqr'
+ 1: '
+ 2: abcd xyz pqr
+
+/((Z)+|A)*/
+ ZABCDEFG
+ 0: ZA
+ 1: A
+ 2: Z
+
+/(Z()|A)*/
+ ZABCDEFG
+ 0: ZA
+ 1: A
+ 2:
+
+/(Z(())|A)*/
+ ZABCDEFG
+ 0: ZA
+ 1: A
+ 2:
+ 3:
+
+/((?>Z)+|A)*/
+ ZABCDEFG
+ 0: ZA
+ 1: A
+
+/((?>)+|A)*/
+ ZABCDEFG
+ 0:
+ 1:
+
+/a*/g
+ abbab
+ 0: a
+ 0:
+ 0:
+ 0: a
+ 0:
+ 0:
+
+/^[a-\d]/
+ abcde
+ 0: a
+ -things
+ 0: -
+ 0digit
+ 0: 0
+ *** Failers
+No match
+ bcdef
+No match
+
+/^[\d-a]/
+ abcde
+ 0: a
+ -things
+ 0: -
+ 0digit
+ 0: 0
+ *** Failers
+No match
+ bcdef
+No match
+
+/[[:space:]]+/
+ > \x09\x0a\x0c\x0d\x0b<
+ 0: \x09\x0a\x0c\x0d\x0b
+
+/[[:blank:]]+/
+ > \x09\x0a\x0c\x0d\x0b<
+ 0: \x09
+
+/[\s]+/
+ > \x09\x0a\x0c\x0d\x0b<
+ 0: \x09\x0a\x0c\x0d
+
+/\s+/
+ > \x09\x0a\x0c\x0d\x0b<
+ 0: \x09\x0a\x0c\x0d
+
+/a b/x
+ ab
+No match
+
+/(?!\A)x/m
+ a\nxb\n
+ 0: x
+
+/(?!^)x/m
+ a\nxb\n
+No match
+
+/abc\Qabc\Eabc/
+ abcabcabc
+ 0: abcabcabc
+
+/abc\Q(*+|\Eabc/
+ abc(*+|abc
+ 0: abc(*+|abc
+
+/ abc\Q abc\Eabc/x
+ abc abcabc
+ 0: abc abcabc
+ *** Failers
+No match
+ abcabcabc
+No match
+
+/abc#comment
+ \Q#not comment
+ literal\E/x
+ abc#not comment\n literal
+ 0: abc#not comment\x0a literal
+
+/abc#comment
+ \Q#not comment
+ literal/x
+ abc#not comment\n literal
+ 0: abc#not comment\x0a literal
+
+/abc#comment
+ \Q#not comment
+ literal\E #more comment
+ /x
+ abc#not comment\n literal
+ 0: abc#not comment\x0a literal
+
+/abc#comment
+ \Q#not comment
+ literal\E #more comment/x
+ abc#not comment\n literal
+ 0: abc#not comment\x0a literal
+
+/\Qabc\$xyz\E/
+ abc\\\$xyz
+ 0: abc\$xyz
+
+/\Qabc\E\$\Qxyz\E/
+ abc\$xyz
+ 0: abc$xyz
+
+/\Gabc/
+ abc
+ 0: abc
+ *** Failers
+No match
+ xyzabc
+No match
+
+/\Gabc./g
+ abc1abc2xyzabc3
+ 0: abc1
+ 0: abc2
+
+/abc./g
+ abc1abc2xyzabc3
+ 0: abc1
+ 0: abc2
+ 0: abc3
+
+/a(?x: b c )d/
+ XabcdY
+ 0: abcd
+ *** Failers
+No match
+ Xa b c d Y
+No match
+
+/((?x)x y z | a b c)/
+ XabcY
+ 0: abc
+ 1: abc
+ AxyzB
+ 0: xyz
+ 1: xyz
+
+/(?i)AB(?-i)C/
+ XabCY
+ 0: abC
+ *** Failers
+No match
+ XabcY
+No match
+
+/((?i)AB(?-i)C|D)E/
+ abCE
+ 0: abCE
+ 1: abC
+ DE
+ 0: DE
+ 1: D
+ *** Failers
+No match
+ abcE
+No match
+ abCe
+No match
+ dE
+No match
+ De
+No match
+
+/(.*)\d+\1/
+ abc123abc
+ 0: abc123abc
+ 1: abc
+ abc123bc
+ 0: bc123bc
+ 1: bc
+
+/(.*)\d+\1/s
+ abc123abc
+ 0: abc123abc
+ 1: abc
+ abc123bc
+ 0: bc123bc
+ 1: bc
+
+/((.*))\d+\1/
+ abc123abc
+ 0: abc123abc
+ 1: abc
+ 2: abc
+ abc123bc
+ 0: bc123bc
+ 1: bc
+ 2: bc
+
+/-- This tests for an IPv6 address in the form where it can have up to --/
+/-- eight components, one and only one of which is empty. This must be --/
+No match
+/-- an internal component. --/
+No match
+
+/^(?!:) # colon disallowed at start
+ (?: # start of item
+ (?: [0-9a-f]{1,4} | # 1-4 hex digits or
+ (?(1)0 | () ) ) # if null previously matched, fail; else null
+ : # followed by colon
+ ){1,7} # end item; 1-7 of them required
+ [0-9a-f]{1,4} $ # final hex number at end of string
+ (?(1)|.) # check that there was an empty component
+ /xi
+ a123::a123
+ 0: a123::a123
+ 1:
+ a123:b342::abcd
+ 0: a123:b342::abcd
+ 1:
+ a123:b342::324e:abcd
+ 0: a123:b342::324e:abcd
+ 1:
+ a123:ddde:b342::324e:abcd
+ 0: a123:ddde:b342::324e:abcd
+ 1:
+ a123:ddde:b342::324e:dcba:abcd
+ 0: a123:ddde:b342::324e:dcba:abcd
+ 1:
+ a123:ddde:9999:b342::324e:dcba:abcd
+ 0: a123:ddde:9999:b342::324e:dcba:abcd
+ 1:
+ *** Failers
+No match
+ 1:2:3:4:5:6:7:8
+No match
+ a123:bce:ddde:9999:b342::324e:dcba:abcd
+No match
+ a123::9999:b342::324e:dcba:abcd
+No match
+ abcde:2:3:4:5:6:7:8
+No match
+ ::1
+No match
+ abcd:fee0:123::
+No match
+ :1
+No match
+ 1:
+No match
+
+/[z\Qa-d]\E]/
+ z
+ 0: z
+ a
+ 0: a
+ -
+ 0: -
+ d
+ 0: d
+ ]
+ 0: ]
+ *** Failers
+ 0: a
+ b
+No match
+
+/[\z\C]/
+ z
+ 0: z
+ C
+ 0: C
+
+/\M/
+ M
+ 0: M
+
+/(a+)*b/
+ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+No match
+
+/(?i)reg(?:ul(?:[aä]|ae)r|ex)/
+ REGular
+ 0: REGular
+ regulaer
+ 0: regulaer
+ Regex
+ 0: Regex
+ regulär
+ 0: regul\xe4r
+
+/Åæåä[à-ÿÀ-ß]+/
+ Åæåäà
+ 0: \xc5\xe6\xe5\xe4\xe0
+ Åæåäÿ
+ 0: \xc5\xe6\xe5\xe4\xff
+ ÅæåäÀ
+ 0: \xc5\xe6\xe5\xe4\xc0
+ Åæåäß
+ 0: \xc5\xe6\xe5\xe4\xdf
+
+/(?<=Z)X./
+ \x84XAZXB
+ 0: XB
+
+/ End of testinput1 /
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testoutput2 b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testoutput2
new file mode 100644
index 00000000..f2e7d548
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testoutput2
@@ -0,0 +1,5607 @@
+PCRE version 5.0 13-Sep-2004
+
+/(a)b|/
+Capturing subpattern count = 1
+No options
+No first char
+No need char
+
+/abc/
+Capturing subpattern count = 0
+No options
+First char = 'a'
+Need char = 'c'
+ abc
+ 0: abc
+ defabc
+ 0: abc
+ \Aabc
+ 0: abc
+ *** Failers
+No match
+ \Adefabc
+No match
+ ABC
+No match
+
+/^abc/
+Capturing subpattern count = 0
+Options: anchored
+No first char
+No need char
+ abc
+ 0: abc
+ \Aabc
+ 0: abc
+ *** Failers
+No match
+ defabc
+No match
+ \Adefabc
+No match
+
+/a+bc/
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+First char = 'a'
+Need char = 'c'
+
+/a*bc/
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+No first char
+Need char = 'c'
+
+/a{3}bc/
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+First char = 'a'
+Need char = 'c'
+
+/(abc|a+z)/
+Capturing subpattern count = 1
+Partial matching not supported
+No options
+First char = 'a'
+No need char
+
+/^abc$/
+Capturing subpattern count = 0
+Options: anchored
+No first char
+No need char
+ abc
+ 0: abc
+ *** Failers
+No match
+ def\nabc
+No match
+
+/ab\gdef/X
+Failed: unrecognized character follows \ at offset 3
+
+/(?X)ab\gdef/X
+Failed: unrecognized character follows \ at offset 7
+
+/x{5,4}/
+Failed: numbers out of order in {} quantifier at offset 5
+
+/z{65536}/
+Failed: number too big in {} quantifier at offset 7
+
+/[abcd/
+Failed: missing terminating ] for character class at offset 5
+
+/(?X)[\B]/
+Failed: invalid escape sequence in character class at offset 6
+
+/[z-a]/
+Failed: range out of order in character class at offset 3
+
+/^*/
+Failed: nothing to repeat at offset 1
+
+/(abc/
+Failed: missing ) at offset 4
+
+/(?# abc/
+Failed: missing ) after comment at offset 7
+
+/(?z)abc/
+Failed: unrecognized character after (? at offset 2
+
+/.*b/
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+First char at start or follows \n
+Need char = 'b'
+
+/.*?b/
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+First char at start or follows \n
+Need char = 'b'
+
+/cat|dog|elephant/
+Capturing subpattern count = 0
+No options
+No first char
+No need char
+ this sentence eventually mentions a cat
+ 0: cat
+ this sentences rambles on and on for a while and then reaches elephant
+ 0: elephant
+
+/cat|dog|elephant/S
+Capturing subpattern count = 0
+No options
+No first char
+No need char
+Starting byte set: c d e
+ this sentence eventually mentions a cat
+ 0: cat
+ this sentences rambles on and on for a while and then reaches elephant
+ 0: elephant
+
+/cat|dog|elephant/iS
+Capturing subpattern count = 0
+Options: caseless
+No first char
+No need char
+Starting byte set: C D E c d e
+ this sentence eventually mentions a CAT cat
+ 0: CAT
+ this sentences rambles on and on for a while to elephant ElePhant
+ 0: elephant
+
+/a|[bcd]/S
+Capturing subpattern count = 0
+No options
+No first char
+No need char
+Starting byte set: a b c d
+
+/(a|[^\dZ])/S
+Capturing subpattern count = 1
+No options
+No first char
+No need char
+Starting byte set: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0a
+ \x0b \x0c \x0d \x0e \x0f \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19
+ \x1a \x1b \x1c \x1d \x1e \x1f \x20 ! " # $ % & ' ( ) * + , - . / : ; < = >
+ ? @ 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 [ \ ] ^ _ ` 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 { | } ~ \x7f \x80 \x81 \x82 \x83
+ \x84 \x85 \x86 \x87 \x88 \x89 \x8a \x8b \x8c \x8d \x8e \x8f \x90 \x91 \x92
+ \x93 \x94 \x95 \x96 \x97 \x98 \x99 \x9a \x9b \x9c \x9d \x9e \x9f \xa0 \xa1
+ \xa2 \xa3 \xa4 \xa5 \xa6 \xa7 \xa8 \xa9 \xaa \xab \xac \xad \xae \xaf \xb0
+ \xb1 \xb2 \xb3 \xb4 \xb5 \xb6 \xb7 \xb8 \xb9 \xba \xbb \xbc \xbd \xbe \xbf
+ \xc0 \xc1 \xc2 \xc3 \xc4 \xc5 \xc6 \xc7 \xc8 \xc9 \xca \xcb \xcc \xcd \xce
+ \xcf \xd0 \xd1 \xd2 \xd3 \xd4 \xd5 \xd6 \xd7 \xd8 \xd9 \xda \xdb \xdc \xdd
+ \xde \xdf \xe0 \xe1 \xe2 \xe3 \xe4 \xe5 \xe6 \xe7 \xe8 \xe9 \xea \xeb \xec
+ \xed \xee \xef \xf0 \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb
+ \xfc \xfd \xfe \xff
+
+/(a|b)*[\s]/S
+Capturing subpattern count = 1
+No options
+No first char
+No need char
+Starting byte set: \x09 \x0a \x0c \x0d \x20 a b
+
+/(ab\2)/
+Failed: reference to non-existent subpattern at offset 6
+
+/{4,5}abc/
+Failed: nothing to repeat at offset 4
+
+/(a)(b)(c)\2/
+Capturing subpattern count = 3
+Max back reference = 2
+No options
+First char = 'a'
+Need char = 'c'
+ abcb
+ 0: abcb
+ 1: a
+ 2: b
+ 3: c
+ \O0abcb
+Matched, but too many substrings
+ \O3abcb
+Matched, but too many substrings
+ 0: abcb
+ \O6abcb
+Matched, but too many substrings
+ 0: abcb
+ 1: a
+ \O9abcb
+Matched, but too many substrings
+ 0: abcb
+ 1: a
+ 2: b
+ \O12abcb
+ 0: abcb
+ 1: a
+ 2: b
+ 3: c
+
+/(a)bc|(a)(b)\2/
+Capturing subpattern count = 3
+Max back reference = 2
+No options
+First char = 'a'
+No need char
+ abc
+ 0: abc
+ 1: a
+ \O0abc
+Matched, but too many substrings
+ \O3abc
+Matched, but too many substrings
+ 0: abc
+ \O6abc
+ 0: abc
+ 1: a
+ aba
+ 0: aba
+ 1: <unset>
+ 2: a
+ 3: b
+ \O0aba
+Matched, but too many substrings
+ \O3aba
+Matched, but too many substrings
+ 0: aba
+ \O6aba
+Matched, but too many substrings
+ 0: aba
+ 1: <unset>
+ \O9aba
+Matched, but too many substrings
+ 0: aba
+ 1: <unset>
+ 2: a
+ \O12aba
+ 0: aba
+ 1: <unset>
+ 2: a
+ 3: b
+
+/abc$/E
+Capturing subpattern count = 0
+Options: dollar_endonly
+First char = 'a'
+Need char = 'c'
+ abc
+ 0: abc
+ *** Failers
+No match
+ abc\n
+No match
+ abc\ndef
+No match
+
+/(a)(b)(c)(d)(e)\6/
+Failed: reference to non-existent subpattern at offset 17
+
+/the quick brown fox/
+Capturing subpattern count = 0
+No options
+First char = 't'
+Need char = 'x'
+ the quick brown fox
+ 0: the quick brown fox
+ this is a line with the quick brown fox
+ 0: the quick brown fox
+
+/the quick brown fox/A
+Capturing subpattern count = 0
+Options: anchored
+No first char
+No need char
+ the quick brown fox
+ 0: the quick brown fox
+ *** Failers
+No match
+ this is a line with the quick brown fox
+No match
+
+/ab(?z)cd/
+Failed: unrecognized character after (? at offset 4
+
+/^abc|def/
+Capturing subpattern count = 0
+No options
+No first char
+No need char
+ abcdef
+ 0: abc
+ abcdef\B
+ 0: def
+
+/.*((abc)$|(def))/
+Capturing subpattern count = 3
+Partial matching not supported
+No options
+First char at start or follows \n
+No need char
+ defabc
+ 0: defabc
+ 1: abc
+ 2: abc
+ \Zdefabc
+ 0: def
+ 1: def
+ 2: <unset>
+ 3: def
+
+/abc/P
+ abc
+ 0: abc
+ *** Failers
+No match: POSIX code 17: match failed
+
+/^abc|def/P
+ abcdef
+ 0: abc
+ abcdef\B
+ 0: def
+
+/.*((abc)$|(def))/P
+ defabc
+ 0: defabc
+ 1: abc
+ 2: abc
+ \Zdefabc
+ 0: def
+ 1: def
+ 3: def
+
+/the quick brown fox/P
+ the quick brown fox
+ 0: the quick brown fox
+ *** Failers
+No match: POSIX code 17: match failed
+ The Quick Brown Fox
+No match: POSIX code 17: match failed
+
+/the quick brown fox/Pi
+ the quick brown fox
+ 0: the quick brown fox
+ The Quick Brown Fox
+ 0: The Quick Brown Fox
+
+/abc.def/P
+ *** Failers
+No match: POSIX code 17: match failed
+ abc\ndef
+No match: POSIX code 17: match failed
+
+/abc$/P
+ abc
+ 0: abc
+ abc\n
+ 0: abc
+
+/(abc)\2/P
+Failed: POSIX code 15: bad back reference at offset 7
+
+/(abc\1)/P
+ abc
+No match: POSIX code 17: match failed
+
+/)/
+Failed: unmatched parentheses at offset 0
+
+/a[]b/
+Failed: missing terminating ] for character class at offset 4
+
+/[^aeiou ]{3,}/
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+No first char
+No need char
+ co-processors, and for
+ 0: -pr
+
+/<.*>/
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+First char = '<'
+Need char = '>'
+ abc<def>ghi<klm>nop
+ 0: <def>ghi<klm>
+
+/<.*?>/
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+First char = '<'
+Need char = '>'
+ abc<def>ghi<klm>nop
+ 0: <def>
+
+/<.*>/U
+Capturing subpattern count = 0
+Partial matching not supported
+Options: ungreedy
+First char = '<'
+Need char = '>'
+ abc<def>ghi<klm>nop
+ 0: <def>
+
+/(?U)<.*>/
+Capturing subpattern count = 0
+Partial matching not supported
+Options: ungreedy
+First char = '<'
+Need char = '>'
+ abc<def>ghi<klm>nop
+ 0: <def>
+
+/<.*?>/U
+Capturing subpattern count = 0
+Partial matching not supported
+Options: ungreedy
+First char = '<'
+Need char = '>'
+ abc<def>ghi<klm>nop
+ 0: <def>ghi<klm>
+
+/={3,}/U
+Capturing subpattern count = 0
+Partial matching not supported
+Options: ungreedy
+First char = '='
+Need char = '='
+ abc========def
+ 0: ===
+
+/(?U)={3,}?/
+Capturing subpattern count = 0
+Partial matching not supported
+Options: ungreedy
+First char = '='
+Need char = '='
+ abc========def
+ 0: ========
+
+/(?<!bar|cattle)foo/
+Capturing subpattern count = 0
+No options
+First char = 'f'
+Need char = 'o'
+ foo
+ 0: foo
+ catfoo
+ 0: foo
+ *** Failers
+No match
+ the barfoo
+No match
+ and cattlefoo
+No match
+
+/(?<=a+)b/
+Failed: lookbehind assertion is not fixed length at offset 6
+
+/(?<=aaa|b{0,3})b/
+Failed: lookbehind assertion is not fixed length at offset 14
+
+/(?<!(foo)a\1)bar/
+Failed: lookbehind assertion is not fixed length at offset 12
+
+/(?i)abc/
+Capturing subpattern count = 0
+Options: caseless
+First char = 'a' (caseless)
+Need char = 'c' (caseless)
+
+/(a|(?m)a)/
+Capturing subpattern count = 1
+No options
+First char = 'a'
+No need char
+
+/(?i)^1234/
+Capturing subpattern count = 0
+Options: anchored caseless
+No first char
+No need char
+
+/(^b|(?i)^d)/
+Capturing subpattern count = 1
+Options: anchored
+Case state changes
+No first char
+No need char
+
+/(?s).*/
+Capturing subpattern count = 0
+Partial matching not supported
+Options: anchored dotall
+No first char
+No need char
+
+/[abcd]/S
+Capturing subpattern count = 0
+No options
+No first char
+No need char
+Starting byte set: a b c d
+
+/(?i)[abcd]/S
+Capturing subpattern count = 0
+Options: caseless
+No first char
+No need char
+Starting byte set: A B C D a b c d
+
+/(?m)[xy]|(b|c)/S
+Capturing subpattern count = 1
+Options: multiline
+No first char
+No need char
+Starting byte set: b c x y
+
+/(^a|^b)/m
+Capturing subpattern count = 1
+Options: multiline
+First char at start or follows \n
+No need char
+
+/(?i)(^a|^b)/m
+Capturing subpattern count = 1
+Options: caseless multiline
+First char at start or follows \n
+No need char
+
+/(a)(?(1)a|b|c)/
+Failed: conditional group contains more than two branches at offset 13
+
+/(?(?=a)a|b|c)/
+Failed: conditional group contains more than two branches at offset 12
+
+/(?(1a)/
+Failed: malformed number after (?( at offset 4
+
+/(?(?i))/
+Failed: assertion expected after (?( at offset 3
+
+/(?(abc))/
+Failed: assertion expected after (?( at offset 3
+
+/(?(?<ab))/
+Failed: unrecognized character after (?< at offset 5
+
+/((?s)blah)\s+\1/
+Capturing subpattern count = 1
+Max back reference = 1
+Partial matching not supported
+No options
+First char = 'b'
+Need char = 'h'
+
+/((?i)blah)\s+\1/
+Capturing subpattern count = 1
+Max back reference = 1
+Partial matching not supported
+No options
+Case state changes
+First char = 'b' (caseless)
+Need char = 'h' (caseless)
+
+/((?i)b)/DS
+------------------------------------------------------------------
+ 0 15 Bra 0
+ 3 7 Bra 1
+ 6 01 Opt
+ 8 NC b
+ 10 7 Ket
+ 13 00 Opt
+ 15 15 Ket
+ 18 End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+No options
+Case state changes
+First char = 'b' (caseless)
+No need char
+Study returned NULL
+
+/(a*b|(?i:c*(?-i)d))/S
+Capturing subpattern count = 1
+Partial matching not supported
+No options
+Case state changes
+No first char
+No need char
+Starting byte set: C a b c d
+
+/a$/
+Capturing subpattern count = 0
+No options
+First char = 'a'
+No need char
+ a
+ 0: a
+ a\n
+ 0: a
+ *** Failers
+No match
+ \Za
+No match
+ \Za\n
+No match
+
+/a$/m
+Capturing subpattern count = 0
+Options: multiline
+First char = 'a'
+No need char
+ a
+ 0: a
+ a\n
+ 0: a
+ \Za\n
+ 0: a
+ *** Failers
+No match
+ \Za
+No match
+
+/\Aabc/m
+Capturing subpattern count = 0
+Options: anchored multiline
+No first char
+No need char
+
+/^abc/m
+Capturing subpattern count = 0
+Options: multiline
+First char at start or follows \n
+Need char = 'c'
+
+/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/
+Capturing subpattern count = 5
+Partial matching not supported
+Options: anchored
+No first char
+No need char
+ aaaaabbbbbcccccdef
+ 0: aaaaabbbbbcccccdef
+ 1: aaaaabbbbbcccccdef
+ 2: aaaaa
+ 3: b
+ 4: bbbbccccc
+ 5: def
+
+/(?<=foo)[ab]/S
+Capturing subpattern count = 0
+No options
+No first char
+No need char
+Starting byte set: a b
+
+/(?<!foo)(alpha|omega)/S
+Capturing subpattern count = 1
+No options
+No first char
+Need char = 'a'
+Starting byte set: a o
+
+/(?!alphabet)[ab]/S
+Capturing subpattern count = 0
+No options
+No first char
+No need char
+Starting byte set: a b
+
+/(?<=foo\n)^bar/m
+Capturing subpattern count = 0
+Options: multiline
+No first char
+Need char = 'r'
+ foo\nbarbar
+ 0: bar
+ ***Failers
+No match
+ rhubarb
+No match
+ barbell
+No match
+ abc\nbarton
+No match
+
+/^(?<=foo\n)bar/m
+Capturing subpattern count = 0
+Options: multiline
+First char at start or follows \n
+Need char = 'r'
+ foo\nbarbar
+ 0: bar
+ ***Failers
+No match
+ rhubarb
+No match
+ barbell
+No match
+ abc\nbarton
+No match
+
+/(?>^abc)/m
+Capturing subpattern count = 0
+Options: multiline
+First char at start or follows \n
+Need char = 'c'
+ abc
+ 0: abc
+ def\nabc
+ 0: abc
+ *** Failers
+No match
+ defabc
+No match
+
+/(?<=ab(c+)d)ef/
+Failed: lookbehind assertion is not fixed length at offset 11
+
+/(?<=ab(?<=c+)d)ef/
+Failed: lookbehind assertion is not fixed length at offset 12
+
+/(?<=ab(c|de)f)g/
+Failed: lookbehind assertion is not fixed length at offset 13
+
+/The next three are in testinput2 because they have variable length branches/
+Capturing subpattern count = 0
+No options
+First char = 'T'
+Need char = 's'
+
+/(?<=bullock|donkey)-cart/
+Capturing subpattern count = 0
+No options
+First char = '-'
+Need char = 't'
+ the bullock-cart
+ 0: -cart
+ a donkey-cart race
+ 0: -cart
+ *** Failers
+No match
+ cart
+No match
+ horse-and-cart
+No match
+
+/(?<=ab(?i)x|y|z)/
+Capturing subpattern count = 0
+No options
+Case state changes
+No first char
+No need char
+
+/(?>.*)(?<=(abcd)|(xyz))/
+Capturing subpattern count = 2
+Partial matching not supported
+No options
+First char at start or follows \n
+No need char
+ alphabetabcd
+ 0: alphabetabcd
+ 1: abcd
+ endingxyz
+ 0: endingxyz
+ 1: <unset>
+ 2: xyz
+
+/(?<=ab(?i)x(?-i)y|(?i)z|b)ZZ/
+Capturing subpattern count = 0
+No options
+Case state changes
+First char = 'Z'
+Need char = 'Z'
+ abxyZZ
+ 0: ZZ
+ abXyZZ
+ 0: ZZ
+ ZZZ
+ 0: ZZ
+ zZZ
+ 0: ZZ
+ bZZ
+ 0: ZZ
+ BZZ
+ 0: ZZ
+ *** Failers
+No match
+ ZZ
+No match
+ abXYZZ
+No match
+ zzz
+No match
+ bzz
+No match
+
+/(?<!(foo)a)bar/
+Capturing subpattern count = 1
+No options
+First char = 'b'
+Need char = 'r'
+ bar
+ 0: bar
+ foobbar
+ 0: bar
+ *** Failers
+No match
+ fooabar
+No match
+
+/This one is here because Perl 5.005_02 doesn't fail it/
+Capturing subpattern count = 0
+No options
+First char = 'T'
+Need char = 't'
+
+/^(a)?(?(1)a|b)+$/
+Capturing subpattern count = 1
+Options: anchored
+No first char
+No need char
+ *** Failers
+No match
+ a
+No match
+
+/This one is here because I think Perl 5.005_02 gets the setting of $1 wrong/
+Capturing subpattern count = 0
+No options
+First char = 'T'
+Need char = 'g'
+
+/^(a\1?){4}$/
+Capturing subpattern count = 1
+Max back reference = 1
+Options: anchored
+No first char
+No need char
+ aaaaaa
+ 0: aaaaaa
+ 1: aa
+
+/These are syntax tests from Perl 5.005/
+Capturing subpattern count = 0
+No options
+First char = 'T'
+Need char = '5'
+
+/a[b-a]/
+Failed: range out of order in character class at offset 4
+
+/a[]b/
+Failed: missing terminating ] for character class at offset 4
+
+/a[/
+Failed: missing terminating ] for character class at offset 2
+
+/*a/
+Failed: nothing to repeat at offset 0
+
+/(*)b/
+Failed: nothing to repeat at offset 1
+
+/abc)/
+Failed: unmatched parentheses at offset 3
+
+/(abc/
+Failed: missing ) at offset 4
+
+/a**/
+Failed: nothing to repeat at offset 2
+
+/)(/
+Failed: unmatched parentheses at offset 0
+
+/\1/
+Failed: reference to non-existent subpattern at offset 2
+
+/\2/
+Failed: reference to non-existent subpattern at offset 2
+
+/(a)|\2/
+Failed: reference to non-existent subpattern at offset 6
+
+/a[b-a]/i
+Failed: range out of order in character class at offset 4
+
+/a[]b/i
+Failed: missing terminating ] for character class at offset 4
+
+/a[/i
+Failed: missing terminating ] for character class at offset 2
+
+/*a/i
+Failed: nothing to repeat at offset 0
+
+/(*)b/i
+Failed: nothing to repeat at offset 1
+
+/abc)/i
+Failed: unmatched parentheses at offset 3
+
+/(abc/i
+Failed: missing ) at offset 4
+
+/a**/i
+Failed: nothing to repeat at offset 2
+
+/)(/i
+Failed: unmatched parentheses at offset 0
+
+/:(?:/
+Failed: missing ) at offset 4
+
+/(?<%)b/
+Failed: unrecognized character after (?< at offset 3
+
+/a(?{)b/
+Failed: unrecognized character after (? at offset 3
+
+/a(?{{})b/
+Failed: unrecognized character after (? at offset 3
+
+/a(?{}})b/
+Failed: unrecognized character after (? at offset 3
+
+/a(?{"{"})b/
+Failed: unrecognized character after (? at offset 3
+
+/a(?{"{"}})b/
+Failed: unrecognized character after (? at offset 3
+
+/(?(1?)a|b)/
+Failed: malformed number after (?( at offset 4
+
+/(?(1)a|b|c)/
+Failed: conditional group contains more than two branches at offset 10
+
+/[a[:xyz:/
+Failed: missing terminating ] for character class at offset 8
+
+/(?<=x+)y/
+Failed: lookbehind assertion is not fixed length at offset 6
+
+/a{37,17}/
+Failed: numbers out of order in {} quantifier at offset 7
+
+/abc/\
+Failed: \ at end of pattern at offset 4
+
+/abc/\P
+Failed: POSIX code 9: bad escape sequence at offset 4
+
+/abc/\i
+Failed: \ at end of pattern at offset 4
+
+/(a)bc(d)/
+Capturing subpattern count = 2
+No options
+First char = 'a'
+Need char = 'd'
+ abcd
+ 0: abcd
+ 1: a
+ 2: d
+ abcd\C2
+ 0: abcd
+ 1: a
+ 2: d
+ 2C d (1)
+ abcd\C5
+ 0: abcd
+ 1: a
+ 2: d
+copy substring 5 failed -7
+
+/(.{20})/
+Capturing subpattern count = 1
+Partial matching not supported
+No options
+No first char
+No need char
+ abcdefghijklmnopqrstuvwxyz
+ 0: abcdefghijklmnopqrst
+ 1: abcdefghijklmnopqrst
+ abcdefghijklmnopqrstuvwxyz\C1
+ 0: abcdefghijklmnopqrst
+ 1: abcdefghijklmnopqrst
+copy substring 1 failed -6
+ abcdefghijklmnopqrstuvwxyz\G1
+ 0: abcdefghijklmnopqrst
+ 1: abcdefghijklmnopqrst
+ 1G abcdefghijklmnopqrst (20)
+
+/(.{15})/
+Capturing subpattern count = 1
+Partial matching not supported
+No options
+No first char
+No need char
+ abcdefghijklmnopqrstuvwxyz
+ 0: abcdefghijklmno
+ 1: abcdefghijklmno
+ abcdefghijklmnopqrstuvwxyz\C1\G1
+ 0: abcdefghijklmno
+ 1: abcdefghijklmno
+ 1C abcdefghijklmno (15)
+ 1G abcdefghijklmno (15)
+
+/(.{16})/
+Capturing subpattern count = 1
+Partial matching not supported
+No options
+No first char
+No need char
+ abcdefghijklmnopqrstuvwxyz
+ 0: abcdefghijklmnop
+ 1: abcdefghijklmnop
+ abcdefghijklmnopqrstuvwxyz\C1\G1\L
+ 0: abcdefghijklmnop
+ 1: abcdefghijklmnop
+copy substring 1 failed -6
+ 1G abcdefghijklmnop (16)
+ 0L abcdefghijklmnop
+ 1L abcdefghijklmnop
+
+/^(a|(bc))de(f)/
+Capturing subpattern count = 3
+Options: anchored
+No first char
+No need char
+ adef\G1\G2\G3\G4\L
+ 0: adef
+ 1: a
+ 2: <unset>
+ 3: f
+ 1G a (1)
+ 2G (0)
+ 3G f (1)
+get substring 4 failed -7
+ 0L adef
+ 1L a
+ 2L
+ 3L f
+ bcdef\G1\G2\G3\G4\L
+ 0: bcdef
+ 1: bc
+ 2: bc
+ 3: f
+ 1G bc (2)
+ 2G bc (2)
+ 3G f (1)
+get substring 4 failed -7
+ 0L bcdef
+ 1L bc
+ 2L bc
+ 3L f
+ adefghijk\C0
+ 0: adef
+ 1: a
+ 2: <unset>
+ 3: f
+ 0C adef (4)
+
+/^abc\00def/
+Capturing subpattern count = 0
+Options: anchored
+No first char
+No need char
+ abc\00def\L\C0
+ 0: abc\x00def
+ 0C abc (7)
+ 0L abc
+
+/word ((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+
+)((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+
+)?)?)?)?)?)?)?)?)?otherword/M
+Memory allocation (code space): 432
+Capturing subpattern count = 8
+Partial matching not supported
+No options
+First char = 'w'
+Need char = 'd'
+
+/.*X/D
+------------------------------------------------------------------
+ 0 7 Bra 0
+ 3 Any*
+ 5 X
+ 7 7 Ket
+ 10 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+First char at start or follows \n
+Need char = 'X'
+
+/.*X/Ds
+------------------------------------------------------------------
+ 0 7 Bra 0
+ 3 Any*
+ 5 X
+ 7 7 Ket
+ 10 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Partial matching not supported
+Options: anchored dotall
+No first char
+Need char = 'X'
+
+/(.*X|^B)/D
+------------------------------------------------------------------
+ 0 19 Bra 0
+ 3 7 Bra 1
+ 6 Any*
+ 8 X
+ 10 6 Alt
+ 13 ^
+ 14 B
+ 16 13 Ket
+ 19 19 Ket
+ 22 End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Partial matching not supported
+No options
+First char at start or follows \n
+No need char
+
+/(.*X|^B)/Ds
+------------------------------------------------------------------
+ 0 19 Bra 0
+ 3 7 Bra 1
+ 6 Any*
+ 8 X
+ 10 6 Alt
+ 13 ^
+ 14 B
+ 16 13 Ket
+ 19 19 Ket
+ 22 End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Partial matching not supported
+Options: anchored dotall
+No first char
+No need char
+
+/(?s)(.*X|^B)/D
+------------------------------------------------------------------
+ 0 19 Bra 0
+ 3 7 Bra 1
+ 6 Any*
+ 8 X
+ 10 6 Alt
+ 13 ^
+ 14 B
+ 16 13 Ket
+ 19 19 Ket
+ 22 End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Partial matching not supported
+Options: anchored dotall
+No first char
+No need char
+
+/(?s:.*X|^B)/D
+------------------------------------------------------------------
+ 0 25 Bra 0
+ 3 9 Bra 0
+ 6 04 Opt
+ 8 Any*
+ 10 X
+ 12 8 Alt
+ 15 04 Opt
+ 17 ^
+ 18 B
+ 20 17 Ket
+ 23 00 Opt
+ 25 25 Ket
+ 28 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+First char at start or follows \n
+No need char
+
+/\Biss\B/+
+Capturing subpattern count = 0
+No options
+First char = 'i'
+Need char = 's'
+ Mississippi
+ 0: iss
+ 0+ issippi
+
+/\Biss\B/+P
+ Mississippi
+ 0: iss
+ 0+ issippi
+
+/iss/G+
+Capturing subpattern count = 0
+No options
+First char = 'i'
+Need char = 's'
+ Mississippi
+ 0: iss
+ 0+ issippi
+ 0: iss
+ 0+ ippi
+
+/\Biss\B/G+
+Capturing subpattern count = 0
+No options
+First char = 'i'
+Need char = 's'
+ Mississippi
+ 0: iss
+ 0+ issippi
+
+/\Biss\B/g+
+Capturing subpattern count = 0
+No options
+First char = 'i'
+Need char = 's'
+ Mississippi
+ 0: iss
+ 0+ issippi
+ 0: iss
+ 0+ ippi
+ *** Failers
+No match
+ Mississippi\A
+No match
+
+/(?<=[Ms])iss/g+
+Capturing subpattern count = 0
+No options
+First char = 'i'
+Need char = 's'
+ Mississippi
+ 0: iss
+ 0+ issippi
+ 0: iss
+ 0+ ippi
+
+/(?<=[Ms])iss/G+
+Capturing subpattern count = 0
+No options
+First char = 'i'
+Need char = 's'
+ Mississippi
+ 0: iss
+ 0+ issippi
+
+/^iss/g+
+Capturing subpattern count = 0
+Options: anchored
+No first char
+No need char
+ ississippi
+ 0: iss
+ 0+ issippi
+
+/.*iss/g+
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+First char at start or follows \n
+Need char = 's'
+ abciss\nxyzisspqr
+ 0: abciss
+ 0+ \x0axyzisspqr
+ 0: xyziss
+ 0+ pqr
+
+/.i./+g
+Capturing subpattern count = 0
+No options
+No first char
+Need char = 'i'
+ Mississippi
+ 0: Mis
+ 0+ sissippi
+ 0: sis
+ 0+ sippi
+ 0: sip
+ 0+ pi
+ Mississippi\A
+ 0: Mis
+ 0+ sissippi
+ 0: sis
+ 0+ sippi
+ 0: sip
+ 0+ pi
+ Missouri river
+ 0: Mis
+ 0+ souri river
+ 0: ri
+ 0+ river
+ 0: riv
+ 0+ er
+ Missouri river\A
+ 0: Mis
+ 0+ souri river
+
+/^.is/+g
+Capturing subpattern count = 0
+Options: anchored
+No first char
+No need char
+ Mississippi
+ 0: Mis
+ 0+ sissippi
+
+/^ab\n/g+
+Capturing subpattern count = 0
+Options: anchored
+No first char
+No need char
+ ab\nab\ncd
+ 0: ab\x0a
+ 0+ ab\x0acd
+
+/^ab\n/mg+
+Capturing subpattern count = 0
+Options: multiline
+First char at start or follows \n
+Need char = 10
+ ab\nab\ncd
+ 0: ab\x0a
+ 0+ ab\x0acd
+ 0: ab\x0a
+ 0+ cd
+
+/abc/
+Capturing subpattern count = 0
+No options
+First char = 'a'
+Need char = 'c'
+
+/abc|bac/
+Capturing subpattern count = 0
+No options
+No first char
+Need char = 'c'
+
+/(abc|bac)/
+Capturing subpattern count = 1
+No options
+No first char
+Need char = 'c'
+
+/(abc|(c|dc))/
+Capturing subpattern count = 2
+No options
+No first char
+Need char = 'c'
+
+/(abc|(d|de)c)/
+Capturing subpattern count = 2
+No options
+No first char
+Need char = 'c'
+
+/a*/
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+No first char
+No need char
+
+/a+/
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+First char = 'a'
+No need char
+
+/(baa|a+)/
+Capturing subpattern count = 1
+Partial matching not supported
+No options
+No first char
+Need char = 'a'
+
+/a{0,3}/
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+No first char
+No need char
+
+/baa{3,}/
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+First char = 'b'
+Need char = 'a'
+
+/"([^\\"]+|\\.)*"/
+Capturing subpattern count = 1
+Partial matching not supported
+No options
+First char = '"'
+Need char = '"'
+
+/(abc|ab[cd])/
+Capturing subpattern count = 1
+No options
+First char = 'a'
+No need char
+
+/(a|.)/
+Capturing subpattern count = 1
+No options
+No first char
+No need char
+
+/a|ba|\w/
+Capturing subpattern count = 0
+No options
+No first char
+No need char
+
+/abc(?=pqr)/
+Capturing subpattern count = 0
+No options
+First char = 'a'
+Need char = 'r'
+
+/...(?<=abc)/
+Capturing subpattern count = 0
+No options
+No first char
+No need char
+
+/abc(?!pqr)/
+Capturing subpattern count = 0
+No options
+First char = 'a'
+Need char = 'c'
+
+/ab./
+Capturing subpattern count = 0
+No options
+First char = 'a'
+Need char = 'b'
+
+/ab[xyz]/
+Capturing subpattern count = 0
+No options
+First char = 'a'
+Need char = 'b'
+
+/abc*/
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+First char = 'a'
+Need char = 'b'
+
+/ab.c*/
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+First char = 'a'
+Need char = 'b'
+
+/a.c*/
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+First char = 'a'
+No need char
+
+/.c*/
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+No first char
+No need char
+
+/ac*/
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+First char = 'a'
+No need char
+
+/(a.c*|b.c*)/
+Capturing subpattern count = 1
+Partial matching not supported
+No options
+No first char
+No need char
+
+/a.c*|aba/
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+First char = 'a'
+No need char
+
+/.+a/
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+No first char
+Need char = 'a'
+
+/(?=abcda)a.*/
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+First char = 'a'
+Need char = 'a'
+
+/(?=a)a.*/
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+First char = 'a'
+No need char
+
+/a(b)*/
+Capturing subpattern count = 1
+No options
+First char = 'a'
+No need char
+
+/a\d*/
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+First char = 'a'
+No need char
+
+/ab\d*/
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+First char = 'a'
+Need char = 'b'
+
+/a(\d)*/
+Capturing subpattern count = 1
+No options
+First char = 'a'
+No need char
+
+/abcde{0,0}/
+Capturing subpattern count = 0
+No options
+First char = 'a'
+Need char = 'd'
+
+/ab\d+/
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+First char = 'a'
+Need char = 'b'
+
+/a(?(1)b)/
+Capturing subpattern count = 0
+No options
+First char = 'a'
+No need char
+
+/a(?(1)bag|big)/
+Capturing subpattern count = 0
+No options
+First char = 'a'
+Need char = 'g'
+
+/a(?(1)bag|big)*/
+Capturing subpattern count = 0
+No options
+First char = 'a'
+No need char
+
+/a(?(1)bag|big)+/
+Capturing subpattern count = 0
+No options
+First char = 'a'
+Need char = 'g'
+
+/a(?(1)b..|b..)/
+Capturing subpattern count = 0
+No options
+First char = 'a'
+Need char = 'b'
+
+/ab\d{0}e/
+Capturing subpattern count = 0
+No options
+First char = 'a'
+Need char = 'e'
+
+/a?b?/
+Capturing subpattern count = 0
+No options
+No first char
+No need char
+ a
+ 0: a
+ b
+ 0: b
+ ab
+ 0: ab
+ \
+ 0:
+ *** Failers
+ 0:
+ \N
+No match
+
+/|-/
+Capturing subpattern count = 0
+No options
+No first char
+No need char
+ abcd
+ 0:
+ -abc
+ 0:
+ \Nab-c
+ 0: -
+ *** Failers
+ 0:
+ \Nabc
+No match
+
+/a*(b+)(z)(z)/P
+ aaaabbbbzzzz
+ 0: aaaabbbbzz
+ 1: bbbb
+ 2: z
+ 3: z
+ aaaabbbbzzzz\O0
+ aaaabbbbzzzz\O1
+ 0: aaaabbbbzz
+ aaaabbbbzzzz\O2
+ 0: aaaabbbbzz
+ 1: bbbb
+ aaaabbbbzzzz\O3
+ 0: aaaabbbbzz
+ 1: bbbb
+ 2: z
+ aaaabbbbzzzz\O4
+ 0: aaaabbbbzz
+ 1: bbbb
+ 2: z
+ 3: z
+ aaaabbbbzzzz\O5
+ 0: aaaabbbbzz
+ 1: bbbb
+ 2: z
+ 3: z
+
+/^.?abcd/S
+Capturing subpattern count = 0
+Options: anchored
+No first char
+Need char = 'd'
+Study returned NULL
+
+/\( # ( at start
+ (?: # Non-capturing bracket
+ (?>[^()]+) # Either a sequence of non-brackets (no backtracking)
+ | # Or
+ (?R) # Recurse - i.e. nested bracketed string
+ )* # Zero or more contents
+ \) # Closing )
+ /x
+Capturing subpattern count = 0
+Partial matching not supported
+Options: extended
+First char = '('
+Need char = ')'
+ (abcd)
+ 0: (abcd)
+ (abcd)xyz
+ 0: (abcd)
+ xyz(abcd)
+ 0: (abcd)
+ (ab(xy)cd)pqr
+ 0: (ab(xy)cd)
+ (ab(xycd)pqr
+ 0: (xycd)
+ () abc ()
+ 0: ()
+ 12(abcde(fsh)xyz(foo(bar))lmno)89
+ 0: (abcde(fsh)xyz(foo(bar))lmno)
+ *** Failers
+No match
+ abcd
+No match
+ abcd)
+No match
+ (abcd
+No match
+
+/\( ( (?>[^()]+) | (?R) )* \) /xg
+Capturing subpattern count = 1
+Partial matching not supported
+Options: extended
+First char = '('
+Need char = ')'
+ (ab(xy)cd)pqr
+ 0: (ab(xy)cd)
+ 1: cd
+ 1(abcd)(x(y)z)pqr
+ 0: (abcd)
+ 1: abcd
+ 0: (x(y)z)
+ 1: z
+
+/\( (?: (?>[^()]+) | (?R) ) \) /x
+Capturing subpattern count = 0
+Partial matching not supported
+Options: extended
+First char = '('
+Need char = ')'
+ (abcd)
+ 0: (abcd)
+ (ab(xy)cd)
+ 0: (xy)
+ (a(b(c)d)e)
+ 0: (c)
+ ((ab))
+ 0: ((ab))
+ *** Failers
+No match
+ ()
+No match
+
+/\( (?: (?>[^()]+) | (?R) )? \) /x
+Capturing subpattern count = 0
+Partial matching not supported
+Options: extended
+First char = '('
+Need char = ')'
+ ()
+ 0: ()
+ 12(abcde(fsh)xyz(foo(bar))lmno)89
+ 0: (fsh)
+
+/\( ( (?>[^()]+) | (?R) )* \) /x
+Capturing subpattern count = 1
+Partial matching not supported
+Options: extended
+First char = '('
+Need char = ')'
+ (ab(xy)cd)
+ 0: (ab(xy)cd)
+ 1: cd
+
+/\( ( ( (?>[^()]+) | (?R) )* ) \) /x
+Capturing subpattern count = 2
+Partial matching not supported
+Options: extended
+First char = '('
+Need char = ')'
+ (ab(xy)cd)
+ 0: (ab(xy)cd)
+ 1: ab(xy)cd
+ 2: cd
+
+/\( (123)? ( ( (?>[^()]+) | (?R) )* ) \) /x
+Capturing subpattern count = 3
+Partial matching not supported
+Options: extended
+First char = '('
+Need char = ')'
+ (ab(xy)cd)
+ 0: (ab(xy)cd)
+ 1: <unset>
+ 2: ab(xy)cd
+ 3: cd
+ (123ab(xy)cd)
+ 0: (123ab(xy)cd)
+ 1: 123
+ 2: ab(xy)cd
+ 3: cd
+
+/\( ( (123)? ( (?>[^()]+) | (?R) )* ) \) /x
+Capturing subpattern count = 3
+Partial matching not supported
+Options: extended
+First char = '('
+Need char = ')'
+ (ab(xy)cd)
+ 0: (ab(xy)cd)
+ 1: ab(xy)cd
+ 2: <unset>
+ 3: cd
+ (123ab(xy)cd)
+ 0: (123ab(xy)cd)
+ 1: 123ab(xy)cd
+ 2: 123
+ 3: cd
+
+/\( (((((((((( ( (?>[^()]+) | (?R) )* )))))))))) \) /x
+Capturing subpattern count = 11
+Partial matching not supported
+Options: extended
+First char = '('
+Need char = ')'
+ (ab(xy)cd)
+ 0: (ab(xy)cd)
+ 1: ab(xy)cd
+ 2: ab(xy)cd
+ 3: ab(xy)cd
+ 4: ab(xy)cd
+ 5: ab(xy)cd
+ 6: ab(xy)cd
+ 7: ab(xy)cd
+ 8: ab(xy)cd
+ 9: ab(xy)cd
+10: ab(xy)cd
+11: cd
+
+/\( ( ( (?>[^()<>]+) | ((?>[^()]+)) | (?R) )* ) \) /x
+Capturing subpattern count = 3
+Partial matching not supported
+Options: extended
+First char = '('
+Need char = ')'
+ (abcd(xyz<p>qrs)123)
+ 0: (abcd(xyz<p>qrs)123)
+ 1: abcd(xyz<p>qrs)123
+ 2: 123
+ 3: <unset>
+
+/\( ( ( (?>[^()]+) | ((?R)) )* ) \) /x
+Capturing subpattern count = 3
+Partial matching not supported
+Options: extended
+First char = '('
+Need char = ')'
+ (ab(cd)ef)
+ 0: (ab(cd)ef)
+ 1: ab(cd)ef
+ 2: ef
+ 3: (cd)
+ (ab(cd(ef)gh)ij)
+ 0: (ab(cd(ef)gh)ij)
+ 1: ab(cd(ef)gh)ij
+ 2: ij
+ 3: (cd(ef)gh)
+
+/^[[:alnum:]]/D
+------------------------------------------------------------------
+ 0 37 Bra 0
+ 3 ^
+ 4 [0-9A-Za-z]
+ 37 37 Ket
+ 40 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: anchored
+No first char
+No need char
+
+/^[[:^alnum:]]/D
+------------------------------------------------------------------
+ 0 37 Bra 0
+ 3 ^
+ 4 [\x00-/:-@[-`{-\xff]
+ 37 37 Ket
+ 40 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: anchored
+No first char
+No need char
+
+/^[[:alpha:]]/D
+------------------------------------------------------------------
+ 0 37 Bra 0
+ 3 ^
+ 4 [A-Za-z]
+ 37 37 Ket
+ 40 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: anchored
+No first char
+No need char
+
+/^[[:^alpha:]]/D
+------------------------------------------------------------------
+ 0 37 Bra 0
+ 3 ^
+ 4 [\x00-@[-`{-\xff]
+ 37 37 Ket
+ 40 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: anchored
+No first char
+No need char
+
+/^[[:ascii:]]/D
+------------------------------------------------------------------
+ 0 37 Bra 0
+ 3 ^
+ 4 [\x00-\x7f]
+ 37 37 Ket
+ 40 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: anchored
+No first char
+No need char
+
+/^[[:^ascii:]]/D
+------------------------------------------------------------------
+ 0 37 Bra 0
+ 3 ^
+ 4 [\x80-\xff]
+ 37 37 Ket
+ 40 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: anchored
+No first char
+No need char
+
+/^[[:blank:]]/D
+------------------------------------------------------------------
+ 0 37 Bra 0
+ 3 ^
+ 4 [\x09 ]
+ 37 37 Ket
+ 40 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: anchored
+No first char
+No need char
+
+/^[[:cntrl:]]/D
+------------------------------------------------------------------
+ 0 37 Bra 0
+ 3 ^
+ 4 [\x00-\x1f\x7f]
+ 37 37 Ket
+ 40 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: anchored
+No first char
+No need char
+
+/^[[:digit:]]/D
+------------------------------------------------------------------
+ 0 37 Bra 0
+ 3 ^
+ 4 [0-9]
+ 37 37 Ket
+ 40 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: anchored
+No first char
+No need char
+
+/^[[:graph:]]/D
+------------------------------------------------------------------
+ 0 37 Bra 0
+ 3 ^
+ 4 [!-~]
+ 37 37 Ket
+ 40 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: anchored
+No first char
+No need char
+
+/^[[:lower:]]/D
+------------------------------------------------------------------
+ 0 37 Bra 0
+ 3 ^
+ 4 [a-z]
+ 37 37 Ket
+ 40 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: anchored
+No first char
+No need char
+
+/^[[:print:]]/D
+------------------------------------------------------------------
+ 0 37 Bra 0
+ 3 ^
+ 4 [ -~]
+ 37 37 Ket
+ 40 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: anchored
+No first char
+No need char
+
+/^[[:punct:]]/D
+------------------------------------------------------------------
+ 0 37 Bra 0
+ 3 ^
+ 4 [!-/:-@[-`{-~]
+ 37 37 Ket
+ 40 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: anchored
+No first char
+No need char
+
+/^[[:space:]]/D
+------------------------------------------------------------------
+ 0 37 Bra 0
+ 3 ^
+ 4 [\x09-\x0d ]
+ 37 37 Ket
+ 40 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: anchored
+No first char
+No need char
+
+/^[[:upper:]]/D
+------------------------------------------------------------------
+ 0 37 Bra 0
+ 3 ^
+ 4 [A-Z]
+ 37 37 Ket
+ 40 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: anchored
+No first char
+No need char
+
+/^[[:xdigit:]]/D
+------------------------------------------------------------------
+ 0 37 Bra 0
+ 3 ^
+ 4 [0-9A-Fa-f]
+ 37 37 Ket
+ 40 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: anchored
+No first char
+No need char
+
+/^[[:word:]]/D
+------------------------------------------------------------------
+ 0 37 Bra 0
+ 3 ^
+ 4 [0-9A-Z_a-z]
+ 37 37 Ket
+ 40 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: anchored
+No first char
+No need char
+
+/^[[:^cntrl:]]/D
+------------------------------------------------------------------
+ 0 37 Bra 0
+ 3 ^
+ 4 [ -~\x80-\xff]
+ 37 37 Ket
+ 40 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: anchored
+No first char
+No need char
+
+/^[12[:^digit:]]/D
+------------------------------------------------------------------
+ 0 37 Bra 0
+ 3 ^
+ 4 [\x00-/12:-\xff]
+ 37 37 Ket
+ 40 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: anchored
+No first char
+No need char
+
+/^[[:^blank:]]/D
+------------------------------------------------------------------
+ 0 37 Bra 0
+ 3 ^
+ 4 [\x00-\x08\x0a-\x1f!-\xff]
+ 37 37 Ket
+ 40 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: anchored
+No first char
+No need char
+
+/[01[:alpha:]%]/D
+------------------------------------------------------------------
+ 0 36 Bra 0
+ 3 [%01A-Za-z]
+ 36 36 Ket
+ 39 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+No options
+No first char
+No need char
+
+/[[.ch.]]/
+Failed: POSIX collating elements are not supported at offset 1
+
+/[[=ch=]]/
+Failed: POSIX collating elements are not supported at offset 1
+
+/[[:rhubarb:]]/
+Failed: unknown POSIX class name at offset 3
+
+/[[:upper:]]/i
+Capturing subpattern count = 0
+Options: caseless
+No first char
+No need char
+ A
+ 0: A
+ a
+ 0: a
+
+/[[:lower:]]/i
+Capturing subpattern count = 0
+Options: caseless
+No first char
+No need char
+ A
+ 0: A
+ a
+ 0: a
+
+/((?-i)[[:lower:]])[[:lower:]]/i
+Capturing subpattern count = 1
+Options: caseless
+Case state changes
+No first char
+No need char
+ ab
+ 0: ab
+ 1: a
+ aB
+ 0: aB
+ 1: a
+ *** Failers
+ 0: ai
+ 1: a
+ Ab
+No match
+ AB
+No match
+
+/[\200-\410]/
+Failed: range out of order in character class at offset 9
+
+/^(?(0)f|b)oo/
+Failed: invalid condition (?(0) at offset 5
+
+/This one's here because of the large output vector needed/
+Capturing subpattern count = 0
+No options
+First char = 'T'
+Need char = 'd'
+
+/(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\w+)\s+(\270)/
+Capturing subpattern count = 271
+Max back reference = 270
+Partial matching not supported
+No options
+No first char
+No need char
+ \O900 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 ABC ABC
+ 0: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 ABC ABC
+ 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
+14: 14
+15: 15
+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
+30: 30
+31: 31
+32: 32
+33: 33
+34: 34
+35: 35
+36: 36
+37: 37
+38: 38
+39: 39
+40: 40
+41: 41
+42: 42
+43: 43
+44: 44
+45: 45
+46: 46
+47: 47
+48: 48
+49: 49
+50: 50
+51: 51
+52: 52
+53: 53
+54: 54
+55: 55
+56: 56
+57: 57
+58: 58
+59: 59
+60: 60
+61: 61
+62: 62
+63: 63
+64: 64
+65: 65
+66: 66
+67: 67
+68: 68
+69: 69
+70: 70
+71: 71
+72: 72
+73: 73
+74: 74
+75: 75
+76: 76
+77: 77
+78: 78
+79: 79
+80: 80
+81: 81
+82: 82
+83: 83
+84: 84
+85: 85
+86: 86
+87: 87
+88: 88
+89: 89
+90: 90
+91: 91
+92: 92
+93: 93
+94: 94
+95: 95
+96: 96
+97: 97
+98: 98
+99: 99
+100: 100
+101: 101
+102: 102
+103: 103
+104: 104
+105: 105
+106: 106
+107: 107
+108: 108
+109: 109
+110: 110
+111: 111
+112: 112
+113: 113
+114: 114
+115: 115
+116: 116
+117: 117
+118: 118
+119: 119
+120: 120
+121: 121
+122: 122
+123: 123
+124: 124
+125: 125
+126: 126
+127: 127
+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
+143: 143
+144: 144
+145: 145
+146: 146
+147: 147
+148: 148
+149: 149
+150: 150
+151: 151
+152: 152
+153: 153
+154: 154
+155: 155
+156: 156
+157: 157
+158: 158
+159: 159
+160: 160
+161: 161
+162: 162
+163: 163
+164: 164
+165: 165
+166: 166
+167: 167
+168: 168
+169: 169
+170: 170
+171: 171
+172: 172
+173: 173
+174: 174
+175: 175
+176: 176
+177: 177
+178: 178
+179: 179
+180: 180
+181: 181
+182: 182
+183: 183
+184: 184
+185: 185
+186: 186
+187: 187
+188: 188
+189: 189
+190: 190
+191: 191
+192: 192
+193: 193
+194: 194
+195: 195
+196: 196
+197: 197
+198: 198
+199: 199
+200: 200
+201: 201
+202: 202
+203: 203
+204: 204
+205: 205
+206: 206
+207: 207
+208: 208
+209: 209
+210: 210
+211: 211
+212: 212
+213: 213
+214: 214
+215: 215
+216: 216
+217: 217
+218: 218
+219: 219
+220: 220
+221: 221
+222: 222
+223: 223
+224: 224
+225: 225
+226: 226
+227: 227
+228: 228
+229: 229
+230: 230
+231: 231
+232: 232
+233: 233
+234: 234
+235: 235
+236: 236
+237: 237
+238: 238
+239: 239
+240: 240
+241: 241
+242: 242
+243: 243
+244: 244
+245: 245
+246: 246
+247: 247
+248: 248
+249: 249
+250: 250
+251: 251
+252: 252
+253: 253
+254: 254
+255: 255
+256: 256
+257: 257
+258: 258
+259: 259
+260: 260
+261: 261
+262: 262
+263: 263
+264: 264
+265: 265
+266: 266
+267: 267
+268: 268
+269: 269
+270: ABC
+271: ABC
+
+/This one's here because Perl does this differently and PCRE can't at present/
+Capturing subpattern count = 0
+No options
+First char = 'T'
+Need char = 't'
+
+/(main(O)?)+/
+Capturing subpattern count = 2
+No options
+First char = 'm'
+Need char = 'n'
+ mainmain
+ 0: mainmain
+ 1: main
+ mainOmain
+ 0: mainOmain
+ 1: main
+ 2: O
+
+/These are all cases where Perl does it differently (nested captures)/
+Capturing subpattern count = 1
+No options
+First char = 'T'
+Need char = 's'
+
+/^(a(b)?)+$/
+Capturing subpattern count = 2
+Options: anchored
+No first char
+No need char
+ aba
+ 0: aba
+ 1: a
+ 2: b
+
+/^(aa(bb)?)+$/
+Capturing subpattern count = 2
+Options: anchored
+No first char
+No need char
+ aabbaa
+ 0: aabbaa
+ 1: aa
+ 2: bb
+
+/^(aa|aa(bb))+$/
+Capturing subpattern count = 2
+Options: anchored
+No first char
+No need char
+ aabbaa
+ 0: aabbaa
+ 1: aa
+ 2: bb
+
+/^(aa(bb)??)+$/
+Capturing subpattern count = 2
+Options: anchored
+No first char
+No need char
+ aabbaa
+ 0: aabbaa
+ 1: aa
+ 2: bb
+
+/^(?:aa(bb)?)+$/
+Capturing subpattern count = 1
+Options: anchored
+No first char
+No need char
+ aabbaa
+ 0: aabbaa
+ 1: bb
+
+/^(aa(b(b))?)+$/
+Capturing subpattern count = 3
+Options: anchored
+No first char
+No need char
+ aabbaa
+ 0: aabbaa
+ 1: aa
+ 2: bb
+ 3: b
+
+/^(?:aa(b(b))?)+$/
+Capturing subpattern count = 2
+Options: anchored
+No first char
+No need char
+ aabbaa
+ 0: aabbaa
+ 1: bb
+ 2: b
+
+/^(?:aa(b(?:b))?)+$/
+Capturing subpattern count = 1
+Options: anchored
+No first char
+No need char
+ aabbaa
+ 0: aabbaa
+ 1: bb
+
+/^(?:aa(bb(?:b))?)+$/
+Capturing subpattern count = 1
+Options: anchored
+No first char
+No need char
+ aabbbaa
+ 0: aabbbaa
+ 1: bbb
+
+/^(?:aa(b(?:bb))?)+$/
+Capturing subpattern count = 1
+Options: anchored
+No first char
+No need char
+ aabbbaa
+ 0: aabbbaa
+ 1: bbb
+
+/^(?:aa(?:b(b))?)+$/
+Capturing subpattern count = 1
+Options: anchored
+No first char
+No need char
+ aabbaa
+ 0: aabbaa
+ 1: b
+
+/^(?:aa(?:b(bb))?)+$/
+Capturing subpattern count = 1
+Options: anchored
+No first char
+No need char
+ aabbbaa
+ 0: aabbbaa
+ 1: bb
+
+/^(aa(b(bb))?)+$/
+Capturing subpattern count = 3
+Options: anchored
+No first char
+No need char
+ aabbbaa
+ 0: aabbbaa
+ 1: aa
+ 2: bbb
+ 3: bb
+
+/^(aa(bb(bb))?)+$/
+Capturing subpattern count = 3
+Options: anchored
+No first char
+No need char
+ aabbbbaa
+ 0: aabbbbaa
+ 1: aa
+ 2: bbbb
+ 3: bb
+
+/--------------------------------------------------------------------/
+Capturing subpattern count = 0
+No options
+First char = '-'
+Need char = '-'
+
+/#/xMD
+Memory allocation (code space): 7
+------------------------------------------------------------------
+ 0 3 Bra 0
+ 3 3 Ket
+ 6 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: extended
+No first char
+No need char
+
+/a#/xMD
+Memory allocation (code space): 9
+------------------------------------------------------------------
+ 0 5 Bra 0
+ 3 a
+ 5 5 Ket
+ 8 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: extended
+First char = 'a'
+No need char
+
+/[\s]/D
+------------------------------------------------------------------
+ 0 36 Bra 0
+ 3 [\x09\x0a\x0c\x0d ]
+ 36 36 Ket
+ 39 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+No options
+No first char
+No need char
+
+/[\S]/D
+------------------------------------------------------------------
+ 0 36 Bra 0
+ 3 [\x00-\x08\x0b\x0e-\x1f!-\xff]
+ 36 36 Ket
+ 39 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+No options
+No first char
+No need char
+
+/a(?i)b/D
+------------------------------------------------------------------
+ 0 9 Bra 0
+ 3 a
+ 5 01 Opt
+ 7 NC b
+ 9 9 Ket
+ 12 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+No options
+Case state changes
+First char = 'a'
+Need char = 'b' (caseless)
+ ab
+ 0: ab
+ aB
+ 0: aB
+ *** Failers
+No match
+ AB
+No match
+
+/(a(?i)b)/D
+------------------------------------------------------------------
+ 0 17 Bra 0
+ 3 9 Bra 1
+ 6 a
+ 8 01 Opt
+ 10 NC b
+ 12 9 Ket
+ 15 00 Opt
+ 17 17 Ket
+ 20 End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+No options
+Case state changes
+First char = 'a'
+Need char = 'b' (caseless)
+ ab
+ 0: ab
+ 1: ab
+ aB
+ 0: aB
+ 1: aB
+ *** Failers
+No match
+ AB
+No match
+
+/ (?i)abc/xD
+------------------------------------------------------------------
+ 0 9 Bra 0
+ 3 NC abc
+ 9 9 Ket
+ 12 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: caseless extended
+First char = 'a' (caseless)
+Need char = 'c' (caseless)
+
+/#this is a comment
+ (?i)abc/xD
+------------------------------------------------------------------
+ 0 9 Bra 0
+ 3 NC abc
+ 9 9 Ket
+ 12 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: caseless extended
+First char = 'a' (caseless)
+Need char = 'c' (caseless)
+
+/123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890/D
+------------------------------------------------------------------
+ 0 603 Bra 0
+ 3 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
+603 603 Ket
+606 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+No options
+First char = '1'
+Need char = '0'
+
+/\Q123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890/D
+------------------------------------------------------------------
+ 0 603 Bra 0
+ 3 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
+603 603 Ket
+606 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+No options
+First char = '1'
+Need char = '0'
+
+/\Q\E/D
+------------------------------------------------------------------
+ 0 3 Bra 0
+ 3 3 Ket
+ 6 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+No options
+No first char
+No need char
+ \
+ 0:
+
+/\Q\Ex/D
+------------------------------------------------------------------
+ 0 5 Bra 0
+ 3 x
+ 5 5 Ket
+ 8 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+No options
+First char = 'x'
+No need char
+
+/ \Q\E/D
+------------------------------------------------------------------
+ 0 5 Bra 0
+ 3
+ 5 5 Ket
+ 8 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+No options
+First char = ' '
+No need char
+
+/a\Q\E/D
+------------------------------------------------------------------
+ 0 5 Bra 0
+ 3 a
+ 5 5 Ket
+ 8 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+No options
+First char = 'a'
+No need char
+ abc
+ 0: a
+ bca
+ 0: a
+ bac
+ 0: a
+
+/a\Q\Eb/D
+------------------------------------------------------------------
+ 0 7 Bra 0
+ 3 ab
+ 7 7 Ket
+ 10 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+No options
+First char = 'a'
+Need char = 'b'
+ abc
+ 0: ab
+
+/\Q\Eabc/D
+------------------------------------------------------------------
+ 0 9 Bra 0
+ 3 abc
+ 9 9 Ket
+ 12 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+No options
+First char = 'a'
+Need char = 'c'
+
+/x*+\w/D
+------------------------------------------------------------------
+ 0 12 Bra 0
+ 3 5 Once
+ 6 x*
+ 8 5 Ket
+ 11 \w
+ 12 12 Ket
+ 15 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+No first char
+No need char
+ *** Failers
+ 0: F
+ xxxxx
+No match
+
+/x?+/D
+------------------------------------------------------------------
+ 0 11 Bra 0
+ 3 5 Once
+ 6 x?
+ 8 5 Ket
+ 11 11 Ket
+ 14 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+No options
+No first char
+No need char
+
+/x++/D
+------------------------------------------------------------------
+ 0 11 Bra 0
+ 3 5 Once
+ 6 x+
+ 8 5 Ket
+ 11 11 Ket
+ 14 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+First char = 'x'
+No need char
+
+/x{1,3}+/D
+------------------------------------------------------------------
+ 0 15 Bra 0
+ 3 9 Once
+ 6 x
+ 8 x{,2}
+ 12 9 Ket
+ 15 15 Ket
+ 18 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+First char = 'x'
+No need char
+
+/(x)*+/D
+------------------------------------------------------------------
+ 0 18 Bra 0
+ 3 12 Once
+ 6 Brazero
+ 7 5 Bra 1
+ 10 x
+ 12 5 KetRmax
+ 15 12 Ket
+ 18 18 Ket
+ 21 End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+No options
+No first char
+No need char
+
+/^(\w++|\s++)*$/
+Capturing subpattern count = 1
+Partial matching not supported
+Options: anchored
+No first char
+No need char
+ now is the time for all good men to come to the aid of the party
+ 0: now is the time for all good men to come to the aid of the party
+ 1: party
+ *** Failers
+No match
+ this is not a line with only words and spaces!
+No match
+
+/(\d++)(\w)/
+Capturing subpattern count = 2
+Partial matching not supported
+No options
+No first char
+No need char
+ 12345a
+ 0: 12345a
+ 1: 12345
+ 2: a
+ *** Failers
+No match
+ 12345+
+No match
+
+/a++b/
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+First char = 'a'
+Need char = 'b'
+ aaab
+ 0: aaab
+
+/(a++b)/
+Capturing subpattern count = 1
+Partial matching not supported
+No options
+First char = 'a'
+Need char = 'b'
+ aaab
+ 0: aaab
+ 1: aaab
+
+/(a++)b/
+Capturing subpattern count = 1
+Partial matching not supported
+No options
+First char = 'a'
+Need char = 'b'
+ aaab
+ 0: aaab
+ 1: aaa
+
+/([^()]++|\([^()]*\))+/
+Capturing subpattern count = 1
+Partial matching not supported
+No options
+No first char
+No need char
+ ((abc(ade)ufh()()x
+ 0: abc(ade)ufh()()x
+ 1: x
+
+/\(([^()]++|\([^()]+\))+\)/
+Capturing subpattern count = 1
+Partial matching not supported
+No options
+First char = '('
+Need char = ')'
+ (abc)
+ 0: (abc)
+ 1: abc
+ (abc(def)xyz)
+ 0: (abc(def)xyz)
+ 1: xyz
+ *** Failers
+No match
+ ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+No match
+
+/(abc){1,3}+/D
+------------------------------------------------------------------
+ 0 53 Bra 0
+ 3 47 Once
+ 6 9 Bra 1
+ 9 abc
+ 15 9 Ket
+ 18 Brazero
+ 19 28 Bra 0
+ 22 9 Bra 1
+ 25 abc
+ 31 9 Ket
+ 34 Brazero
+ 35 9 Bra 1
+ 38 abc
+ 44 9 Ket
+ 47 28 Ket
+ 50 47 Ket
+ 53 53 Ket
+ 56 End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+No options
+First char = 'a'
+Need char = 'c'
+
+/a+?+/
+Failed: nothing to repeat at offset 3
+
+/a{2,3}?+b/
+Failed: nothing to repeat at offset 7
+
+/(?U)a+?+/
+Failed: nothing to repeat at offset 7
+
+/a{2,3}?+b/U
+Failed: nothing to repeat at offset 7
+
+/x(?U)a++b/D
+------------------------------------------------------------------
+ 0 15 Bra 0
+ 3 x
+ 5 5 Once
+ 8 a+
+ 10 5 Ket
+ 13 b
+ 15 15 Ket
+ 18 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+First char = 'x'
+Need char = 'b'
+ xaaaab
+ 0: xaaaab
+
+/(?U)xa++b/D
+------------------------------------------------------------------
+ 0 15 Bra 0
+ 3 x
+ 5 5 Once
+ 8 a+
+ 10 5 Ket
+ 13 b
+ 15 15 Ket
+ 18 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Partial matching not supported
+Options: ungreedy
+First char = 'x'
+Need char = 'b'
+ xaaaab
+ 0: xaaaab
+
+/^((a+)(?U)([ab]+)(?-U)([bc]+)(\w*))/D
+------------------------------------------------------------------
+ 0 106 Bra 0
+ 3 ^
+ 4 99 Bra 1
+ 7 5 Bra 2
+ 10 a+
+ 12 5 Ket
+ 15 37 Bra 3
+ 18 [ab]+?
+ 52 37 Ket
+ 55 37 Bra 4
+ 58 [bc]+
+ 92 37 Ket
+ 95 5 Bra 5
+ 98 \w*
+100 5 Ket
+103 99 Ket
+106 106 Ket
+109 End
+------------------------------------------------------------------
+Capturing subpattern count = 5
+Partial matching not supported
+Options: anchored
+No first char
+No need char
+
+/^x(?U)a+b/D
+------------------------------------------------------------------
+ 0 10 Bra 0
+ 3 ^
+ 4 x
+ 6 a+?
+ 8 b
+ 10 10 Ket
+ 13 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Partial matching not supported
+Options: anchored
+No first char
+Need char = 'b'
+
+/^x(?U)(a+)b/D
+------------------------------------------------------------------
+ 0 16 Bra 0
+ 3 ^
+ 4 x
+ 6 5 Bra 1
+ 9 a+?
+ 11 5 Ket
+ 14 b
+ 16 16 Ket
+ 19 End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Partial matching not supported
+Options: anchored
+No first char
+Need char = 'b'
+
+/[.x.]/
+Failed: POSIX collating elements are not supported at offset 0
+
+/[=x=]/
+Failed: POSIX collating elements are not supported at offset 0
+
+/[:x:]/
+Failed: POSIX named classes are supported only within a class at offset 0
+
+/\l/
+Failed: PCRE does not support \L, \l, \N, \U, or \u at offset 1
+
+/\L/
+Failed: PCRE does not support \L, \l, \N, \U, or \u at offset 1
+
+/\N{name}/
+Failed: PCRE does not support \L, \l, \N, \U, or \u at offset 1
+
+/\u/
+Failed: PCRE does not support \L, \l, \N, \U, or \u at offset 1
+
+/\U/
+Failed: PCRE does not support \L, \l, \N, \U, or \u at offset 1
+
+/[/
+Failed: missing terminating ] for character class at offset 1
+
+/[a-/
+Failed: missing terminating ] for character class at offset 3
+
+/[[:space:]/
+Failed: missing terminating ] for character class at offset 10
+
+/[\s]/DM
+Memory allocation (code space): 40
+------------------------------------------------------------------
+ 0 36 Bra 0
+ 3 [\x09\x0a\x0c\x0d ]
+ 36 36 Ket
+ 39 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+No options
+No first char
+No need char
+
+/[[:space:]]/DM
+Memory allocation (code space): 40
+------------------------------------------------------------------
+ 0 36 Bra 0
+ 3 [\x09-\x0d ]
+ 36 36 Ket
+ 39 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+No options
+No first char
+No need char
+
+/[[:space:]abcde]/DM
+Memory allocation (code space): 40
+------------------------------------------------------------------
+ 0 36 Bra 0
+ 3 [\x09-\x0d a-e]
+ 36 36 Ket
+ 39 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+No options
+No first char
+No need char
+
+/< (?: (?(R) \d++ | [^<>]*+) | (?R)) * >/x
+Capturing subpattern count = 0
+Partial matching not supported
+Options: extended
+First char = '<'
+Need char = '>'
+ <>
+ 0: <>
+ <abcd>
+ 0: <abcd>
+ <abc <123> hij>
+ 0: <abc <123> hij>
+ <abc <def> hij>
+ 0: <def>
+ <abc<>def>
+ 0: <abc<>def>
+ <abc<>
+ 0: <>
+ *** Failers
+No match
+ <abc
+No match
+
+|8J\$WE\<\.rX\+ix\[d1b\!H\#\?vV0vrK\:ZH1\=2M\>iV\;\?aPhFB\<\*vW\@QW\@sO9\}cfZA\-i\'w\%hKd6gt1UJP\,15_\#QY\$M\^Mss_U\/\]\&LK9\[5vQub\^w\[KDD\<EjmhUZ\?\.akp2dF\>qmj\;2\}YWFdYx\.Ap\]hjCPTP\(n28k\+3\;o\&WXqs\/gOXdr\$\:r\'do0\;b4c\(f_Gr\=\"\\4\)\[01T7ajQJvL\$W\~mL_sS\/4h\:x\*\[ZN\=KLs\&L5zX\/\/\>it\,o\:aU\(\;Z\>pW\&T7oP\'2K\^E\:x9\'c\[\%z\-\,64JQ5AeH_G\#KijUKghQw\^\\vea3a\?kka_G\$8\#\`\*kynsxzBLru\'\]k_\[7FrVx\}\^\=\$blx\>s\-N\%j\;D\*aZDnsw\:YKZ\%Q\.Kne9\#hP\?\+b3\(SOvL\,\^\;\&u5\@\?5C5Bhb\=m\-vEh_L15Jl\]U\)0RP6\{q\%L\^_z5E\'Dw6X\b|DM
+Memory allocation (code space): 826
+------------------------------------------------------------------
+ 0 822 Bra 0
+ 3 8J$WE<.rX+ix[d1b!H#?vV0vrK:ZH1=2M>iV;?aPhFB<*vW@QW@sO9}cfZA-i'w%hKd6gt1UJP,15_#QY$M^Mss_U/]&LK9[5vQub^w[KDD<EjmhUZ?.akp2dF>qmj;2}YWFdYx.Ap]hjCPTP(n28k+3;o&WXqs/gOXdr$:r'do0;b4c(f_Gr="\4)[01T7ajQJvL$W~mL_sS/4h:x*[ZN=KLs&L5zX//>it,o:aU(;Z>pW&T7oP'2K^E:x9'c[%z-,64JQ5AeH_G#KijUKghQw^\vea3a?kka_G$8#`*kynsxzBLru']k_[7FrVx}^=$blx>s-N%j;D*aZDnsw:YKZ%Q.Kne9#hP?+b3(SOvL,^;&u5@?5C5Bhb=m-vEh_L15Jl]U)0RP6{q%L^_z5E'Dw6X
+821 \b
+822 822 Ket
+825 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+No options
+First char = '8'
+Need char = 'X'
+
+|\$\<\.X\+ix\[d1b\!H\#\?vV0vrK\:ZH1\=2M\>iV\;\?aPhFB\<\*vW\@QW\@sO9\}cfZA\-i\'w\%hKd6gt1UJP\,15_\#QY\$M\^Mss_U\/\]\&LK9\[5vQub\^w\[KDD\<EjmhUZ\?\.akp2dF\>qmj\;2\}YWFdYx\.Ap\]hjCPTP\(n28k\+3\;o\&WXqs\/gOXdr\$\:r\'do0\;b4c\(f_Gr\=\"\\4\)\[01T7ajQJvL\$W\~mL_sS\/4h\:x\*\[ZN\=KLs\&L5zX\/\/\>it\,o\:aU\(\;Z\>pW\&T7oP\'2K\^E\:x9\'c\[\%z\-\,64JQ5AeH_G\#KijUKghQw\^\\vea3a\?kka_G\$8\#\`\*kynsxzBLru\'\]k_\[7FrVx\}\^\=\$blx\>s\-N\%j\;D\*aZDnsw\:YKZ\%Q\.Kne9\#hP\?\+b3\(SOvL\,\^\;\&u5\@\?5C5Bhb\=m\-vEh_L15Jl\]U\)0RP6\{q\%L\^_z5E\'Dw6X\b|DM
+Memory allocation (code space): 816
+------------------------------------------------------------------
+ 0 812 Bra 0
+ 3 $<.X+ix[d1b!H#?vV0vrK:ZH1=2M>iV;?aPhFB<*vW@QW@sO9}cfZA-i'w%hKd6gt1UJP,15_#QY$M^Mss_U/]&LK9[5vQub^w[KDD<EjmhUZ?.akp2dF>qmj;2}YWFdYx.Ap]hjCPTP(n28k+3;o&WXqs/gOXdr$:r'do0;b4c(f_Gr="\4)[01T7ajQJvL$W~mL_sS/4h:x*[ZN=KLs&L5zX//>it,o:aU(;Z>pW&T7oP'2K^E:x9'c[%z-,64JQ5AeH_G#KijUKghQw^\vea3a?kka_G$8#`*kynsxzBLru']k_[7FrVx}^=$blx>s-N%j;D*aZDnsw:YKZ%Q.Kne9#hP?+b3(SOvL,^;&u5@?5C5Bhb=m-vEh_L15Jl]U)0RP6{q%L^_z5E'Dw6X
+811 \b
+812 812 Ket
+815 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+No options
+First char = '$'
+Need char = 'X'
+
+/(.*)\d+\1/I
+Capturing subpattern count = 1
+Max back reference = 1
+Partial matching not supported
+No options
+No first char
+No need char
+
+/(.*)\d+/I
+Capturing subpattern count = 1
+Partial matching not supported
+No options
+First char at start or follows \n
+No need char
+
+/(.*)\d+\1/Is
+Capturing subpattern count = 1
+Max back reference = 1
+Partial matching not supported
+Options: dotall
+No first char
+No need char
+
+/(.*)\d+/Is
+Capturing subpattern count = 1
+Partial matching not supported
+Options: anchored dotall
+No first char
+No need char
+
+/(.*(xyz))\d+\2/I
+Capturing subpattern count = 2
+Max back reference = 2
+Partial matching not supported
+No options
+First char at start or follows \n
+Need char = 'z'
+
+/((.*))\d+\1/I
+Capturing subpattern count = 2
+Max back reference = 1
+Partial matching not supported
+No options
+No first char
+No need char
+ abc123bc
+ 0: bc123bc
+ 1: bc
+ 2: bc
+
+/a[b]/I
+Capturing subpattern count = 0
+No options
+First char = 'a'
+Need char = 'b'
+
+/(?=a).*/I
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+First char = 'a'
+No need char
+
+/(?=abc).xyz/iI
+Capturing subpattern count = 0
+Options: caseless
+First char = 'a' (caseless)
+Need char = 'z' (caseless)
+
+/(?=abc)(?i).xyz/I
+Capturing subpattern count = 0
+No options
+Case state changes
+First char = 'a'
+Need char = 'z' (caseless)
+
+/(?=a)(?=b)/I
+Capturing subpattern count = 0
+No options
+First char = 'a'
+No need char
+
+/(?=.)a/I
+Capturing subpattern count = 0
+No options
+First char = 'a'
+No need char
+
+/((?=abcda)a)/I
+Capturing subpattern count = 1
+No options
+First char = 'a'
+Need char = 'a'
+
+/((?=abcda)ab)/I
+Capturing subpattern count = 1
+No options
+First char = 'a'
+Need char = 'b'
+
+/()a/I
+Capturing subpattern count = 1
+No options
+No first char
+Need char = 'a'
+
+/(?(1)ab|ac)/I
+Capturing subpattern count = 0
+No options
+First char = 'a'
+No need char
+
+/(?(1)abz|acz)/I
+Capturing subpattern count = 0
+No options
+First char = 'a'
+Need char = 'z'
+
+/(?(1)abz)/I
+Capturing subpattern count = 0
+No options
+No first char
+No need char
+
+/(?(1)abz)123/I
+Capturing subpattern count = 0
+No options
+No first char
+Need char = '3'
+
+/(a)+/I
+Capturing subpattern count = 1
+No options
+First char = 'a'
+No need char
+
+/(a){2,3}/I
+Capturing subpattern count = 1
+No options
+First char = 'a'
+Need char = 'a'
+
+/(a)*/I
+Capturing subpattern count = 1
+No options
+No first char
+No need char
+
+/[a]/I
+Capturing subpattern count = 0
+No options
+First char = 'a'
+No need char
+
+/[ab]/I
+Capturing subpattern count = 0
+No options
+No first char
+No need char
+
+/[ab]/IS
+Capturing subpattern count = 0
+No options
+No first char
+No need char
+Starting byte set: a b
+
+/[^a]/I
+Capturing subpattern count = 0
+No options
+No first char
+No need char
+
+/\d456/I
+Capturing subpattern count = 0
+No options
+No first char
+Need char = '6'
+
+/\d456/IS
+Capturing subpattern count = 0
+No options
+No first char
+Need char = '6'
+Starting byte set: 0 1 2 3 4 5 6 7 8 9
+
+/a^b/I
+Capturing subpattern count = 0
+No options
+First char = 'a'
+Need char = 'b'
+
+/^a/mI
+Capturing subpattern count = 0
+Options: multiline
+First char at start or follows \n
+Need char = 'a'
+ abcde
+ 0: a
+ xy\nabc
+ 0: a
+ *** Failers
+No match
+ xyabc
+No match
+
+/c|abc/I
+Capturing subpattern count = 0
+No options
+No first char
+Need char = 'c'
+
+/(?i)[ab]/IS
+Capturing subpattern count = 0
+Options: caseless
+No first char
+No need char
+Starting byte set: A B a b
+
+/[ab](?i)cd/IS
+Capturing subpattern count = 0
+No options
+Case state changes
+No first char
+Need char = 'd' (caseless)
+Starting byte set: a b
+
+/abc(?C)def/
+Capturing subpattern count = 0
+No options
+First char = 'a'
+Need char = 'f'
+ abcdef
+--->abcdef
+ 0 ^ ^ d
+ 0: abcdef
+ 1234abcdef
+--->1234abcdef
+ 0 ^ ^ d
+ 0: abcdef
+ *** Failers
+No match
+ abcxyz
+No match
+ abcxyzf
+--->abcxyzf
+ 0 ^ ^ d
+No match
+
+/abc(?C)de(?C1)f/
+Capturing subpattern count = 0
+No options
+First char = 'a'
+Need char = 'f'
+ 123abcdef
+--->123abcdef
+ 0 ^ ^ d
+ 1 ^ ^ f
+ 0: abcdef
+
+/(?C1)\dabc(?C2)def/
+Capturing subpattern count = 0
+No options
+No first char
+Need char = 'f'
+ 1234abcdef
+--->1234abcdef
+ 1 ^ \d
+ 1 ^ \d
+ 1 ^ \d
+ 1 ^ \d
+ 2 ^ ^ d
+ 0: 4abcdef
+ *** Failers
+No match
+ abcdef
+--->abcdef
+ 1 ^ \d
+ 1 ^ \d
+ 1 ^ \d
+ 1 ^ \d
+ 1 ^ \d
+ 1 ^ \d
+No match
+
+/(?C255)ab/
+Capturing subpattern count = 0
+No options
+First char = 'a'
+Need char = 'b'
+
+/(?C256)ab/
+Failed: number after (?C is > 255 at offset 6
+
+/(?Cab)xx/
+Failed: closing ) for (?C expected at offset 3
+
+/(?C12vr)x/
+Failed: closing ) for (?C expected at offset 5
+
+/abc(?C)def/
+Capturing subpattern count = 0
+No options
+First char = 'a'
+Need char = 'f'
+ *** Failers
+No match
+ \x83\x0\x61bcdef
+--->\x83\x00abcdef
+ 0 ^ ^ d
+ 0: abcdef
+
+/(abc)(?C)de(?C1)f/
+Capturing subpattern count = 1
+No options
+First char = 'a'
+Need char = 'f'
+ 123abcdef
+--->123abcdef
+ 0 ^ ^ d
+ 1 ^ ^ f
+ 0: abcdef
+ 1: abc
+ 123abcdef\C+
+Callout 0: last capture = 1
+ 0: <unset>
+ 1: abc
+--->123abcdef
+ ^ ^ d
+Callout 1: last capture = 1
+ 0: <unset>
+ 1: abc
+--->123abcdef
+ ^ ^ f
+ 0: abcdef
+ 1: abc
+ 123abcdef\C-
+ 0: abcdef
+ 1: abc
+ *** Failers
+No match
+ 123abcdef\C!1
+--->123abcdef
+ 0 ^ ^ d
+ 1 ^ ^ f
+No match
+
+/(?C0)(abc(?C1))*/
+Capturing subpattern count = 1
+No options
+No first char
+No need char
+ abcabcabc
+--->abcabcabc
+ 0 ^ (abc(?C1))*
+ 1 ^ ^ )
+ 1 ^ ^ )
+ 1 ^ ^ )
+ 0: abcabcabc
+ 1: abc
+ abcabc\C!1!3
+--->abcabc
+ 0 ^ (abc(?C1))*
+ 1 ^ ^ )
+ 1 ^ ^ )
+ 0: abcabc
+ 1: abc
+ *** Failers
+--->*** Failers
+ 0 ^ (abc(?C1))*
+ 0:
+ abcabcabc\C!1!3
+--->abcabcabc
+ 0 ^ (abc(?C1))*
+ 1 ^ ^ )
+ 1 ^ ^ )
+ 1 ^ ^ )
+ 0: abcabc
+ 1: abc
+
+/(\d{3}(?C))*/
+Capturing subpattern count = 1
+Partial matching not supported
+No options
+No first char
+No need char
+ 123\C+
+Callout 0: last capture = -1
+ 0: <unset>
+--->123
+ ^ ^ )
+ 0: 123
+ 1: 123
+ 123456\C+
+Callout 0: last capture = -1
+ 0: <unset>
+--->123456
+ ^ ^ )
+Callout 0: last capture = 1
+ 0: <unset>
+ 1: 123
+--->123456
+ ^ ^ )
+ 0: 123456
+ 1: 456
+ 123456789\C+
+Callout 0: last capture = -1
+ 0: <unset>
+--->123456789
+ ^ ^ )
+Callout 0: last capture = 1
+ 0: <unset>
+ 1: 123
+--->123456789
+ ^ ^ )
+Callout 0: last capture = 1
+ 0: <unset>
+ 1: 456
+--->123456789
+ ^ ^ )
+ 0: 123456789
+ 1: 789
+
+/((xyz)(?C)p|(?C1)xyzabc)/
+Capturing subpattern count = 2
+No options
+First char = 'x'
+No need char
+ xyzabc\C+
+Callout 0: last capture = 2
+ 0: <unset>
+ 1: <unset>
+ 2: xyz
+--->xyzabc
+ ^ ^ p
+Callout 1: last capture = -1
+ 0: <unset>
+--->xyzabc
+ ^ x
+ 0: xyzabc
+ 1: xyzabc
+
+/(X)((xyz)(?C)p|(?C1)xyzabc)/
+Capturing subpattern count = 3
+No options
+First char = 'X'
+Need char = 'x'
+ Xxyzabc\C+
+Callout 0: last capture = 3
+ 0: <unset>
+ 1: X
+ 2: <unset>
+ 3: xyz
+--->Xxyzabc
+ ^ ^ p
+Callout 1: last capture = 1
+ 0: <unset>
+ 1: X
+--->Xxyzabc
+ ^^ x
+ 0: Xxyzabc
+ 1: X
+ 2: xyzabc
+
+/(?=(abc))(?C)abcdef/
+Capturing subpattern count = 1
+No options
+First char = 'a'
+Need char = 'f'
+ abcdef\C+
+Callout 0: last capture = 1
+ 0: <unset>
+ 1: abc
+--->abcdef
+ ^ a
+ 0: abcdef
+ 1: abc
+
+/(?!(abc)(?C1)d)(?C2)abcxyz/
+Capturing subpattern count = 1
+No options
+First char = 'a'
+Need char = 'z'
+ abcxyz\C+
+Callout 1: last capture = 1
+ 0: <unset>
+ 1: abc
+--->abcxyz
+ ^ ^ d
+Callout 2: last capture = -1
+ 0: <unset>
+--->abcxyz
+ ^ a
+ 0: abcxyz
+
+/(?<=(abc)(?C))xyz/
+Capturing subpattern count = 1
+No options
+First char = 'x'
+Need char = 'z'
+ abcxyz\C+
+Callout 0: last capture = 1
+ 0: <unset>
+ 1: abc
+--->abcxyz
+ ^ )
+ 0: xyz
+ 1: abc
+
+/(?C)abc/
+Capturing subpattern count = 0
+No options
+First char = 'a'
+Need char = 'c'
+
+/(?C)^abc/
+Capturing subpattern count = 0
+Options: anchored
+No first char
+No need char
+
+/(?C)a|b/S
+Capturing subpattern count = 0
+No options
+No first char
+No need char
+Starting byte set: a b
+
+/(?R)/
+Failed: recursive call could loop indefinitely at offset 3
+
+/(a|(?R))/
+Failed: recursive call could loop indefinitely at offset 6
+
+/(ab|(bc|(de|(?R))))/
+Failed: recursive call could loop indefinitely at offset 15
+
+/x(ab|(bc|(de|(?R))))/
+Capturing subpattern count = 3
+No options
+First char = 'x'
+No need char
+ xab
+ 0: xab
+ 1: ab
+ xbc
+ 0: xbc
+ 1: bc
+ 2: bc
+ xde
+ 0: xde
+ 1: de
+ 2: de
+ 3: de
+ xxab
+ 0: xxab
+ 1: xab
+ 2: xab
+ 3: xab
+ xxxab
+ 0: xxxab
+ 1: xxab
+ 2: xxab
+ 3: xxab
+ *** Failers
+No match
+ xyab
+No match
+
+/(ab|(bc|(de|(?1))))/
+Failed: recursive call could loop indefinitely at offset 15
+
+/x(ab|(bc|(de|(?1)x)x)x)/
+Failed: recursive call could loop indefinitely at offset 16
+
+/^([^()]|\((?1)*\))*$/
+Capturing subpattern count = 1
+Options: anchored
+No first char
+No need char
+ abc
+ 0: abc
+ 1: c
+ a(b)c
+ 0: a(b)c
+ 1: c
+ a(b(c))d
+ 0: a(b(c))d
+ 1: d
+ *** Failers)
+No match
+ a(b(c)d
+No match
+
+/^>abc>([^()]|\((?1)*\))*<xyz<$/
+Capturing subpattern count = 1
+Options: anchored
+No first char
+Need char = '<'
+ >abc>123<xyz<
+ 0: >abc>123<xyz<
+ 1: 3
+ >abc>1(2)3<xyz<
+ 0: >abc>1(2)3<xyz<
+ 1: 3
+ >abc>(1(2)3)<xyz<
+ 0: >abc>(1(2)3)<xyz<
+ 1: (1(2)3)
+
+/(a(?1)b)/D
+------------------------------------------------------------------
+ 0 16 Bra 0
+ 3 10 Bra 1
+ 6 a
+ 8 3 Recurse
+ 11 b
+ 13 10 Ket
+ 16 16 Ket
+ 19 End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+No options
+First char = 'a'
+Need char = 'b'
+
+/(a(?1)+b)/D
+------------------------------------------------------------------
+ 0 22 Bra 0
+ 3 16 Bra 1
+ 6 a
+ 8 6 Bra 0
+ 11 3 Recurse
+ 14 6 KetRmax
+ 17 b
+ 19 16 Ket
+ 22 22 Ket
+ 25 End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+No options
+First char = 'a'
+Need char = 'b'
+
+/^\W*(?:((.)\W*(?1)\W*\2|)|((.)\W*(?3)\W*\4|\W*.\W*))\W*$/i
+Capturing subpattern count = 4
+Max back reference = 4
+Partial matching not supported
+Options: anchored caseless
+No first char
+No need char
+ 1221
+ 0: 1221
+ 1: 1221
+ 2: 1
+ Satan, oscillate my metallic sonatas!
+ 0: Satan, oscillate my metallic sonatas!
+ 1: <unset>
+ 2: <unset>
+ 3: Satan, oscillate my metallic sonatas
+ 4: S
+ A man, a plan, a canal: Panama!
+ 0: A man, a plan, a canal: Panama!
+ 1: <unset>
+ 2: <unset>
+ 3: A man, a plan, a canal: Panama
+ 4: A
+ Able was I ere I saw Elba.
+ 0: Able was I ere I saw Elba.
+ 1: <unset>
+ 2: <unset>
+ 3: Able was I ere I saw Elba
+ 4: A
+ *** Failers
+No match
+ The quick brown fox
+No match
+
+/^(\d+|\((?1)([+*-])(?1)\)|-(?1))$/
+Capturing subpattern count = 2
+Partial matching not supported
+Options: anchored
+No first char
+No need char
+ 12
+ 0: 12
+ 1: 12
+ (((2+2)*-3)-7)
+ 0: (((2+2)*-3)-7)
+ 1: (((2+2)*-3)-7)
+ 2: -
+ -12
+ 0: -12
+ 1: -12
+ *** Failers
+No match
+ ((2+2)*-3)-7)
+No match
+
+/^(x(y|(?1){2})z)/
+Capturing subpattern count = 2
+Options: anchored
+No first char
+No need char
+ xyz
+ 0: xyz
+ 1: xyz
+ 2: y
+ xxyzxyzz
+ 0: xxyzxyzz
+ 1: xxyzxyzz
+ 2: xyzxyz
+ *** Failers
+No match
+ xxyzz
+No match
+ xxyzxyzxyzz
+No match
+
+/((< (?: (?(R) \d++ | [^<>]*+) | (?2)) * >))/x
+Capturing subpattern count = 2
+Partial matching not supported
+Options: extended
+First char = '<'
+Need char = '>'
+ <>
+ 0: <>
+ 1: <>
+ 2: <>
+ <abcd>
+ 0: <abcd>
+ 1: <abcd>
+ 2: <abcd>
+ <abc <123> hij>
+ 0: <abc <123> hij>
+ 1: <abc <123> hij>
+ 2: <abc <123> hij>
+ <abc <def> hij>
+ 0: <def>
+ 1: <def>
+ 2: <def>
+ <abc<>def>
+ 0: <abc<>def>
+ 1: <abc<>def>
+ 2: <abc<>def>
+ <abc<>
+ 0: <>
+ 1: <>
+ 2: <>
+ *** Failers
+No match
+ <abc
+No match
+
+/(?1)/
+Failed: reference to non-existent subpattern at offset 3
+
+/((?2)(abc)/
+Failed: reference to non-existent subpattern at offset 4
+
+/^(abc)def(?1)/
+Capturing subpattern count = 1
+Options: anchored
+No first char
+No need char
+ abcdefabc
+ 0: abcdefabc
+ 1: abc
+
+/^(a|b|c)=(?1)+/
+Capturing subpattern count = 1
+Options: anchored
+No first char
+No need char
+ a=a
+ 0: a=a
+ 1: a
+ a=b
+ 0: a=b
+ 1: a
+ a=bc
+ 0: a=bc
+ 1: a
+
+/^(a|b|c)=((?1))+/
+Capturing subpattern count = 2
+Options: anchored
+No first char
+No need char
+ a=a
+ 0: a=a
+ 1: a
+ 2: a
+ a=b
+ 0: a=b
+ 1: a
+ 2: b
+ a=bc
+ 0: a=bc
+ 1: a
+ 2: c
+
+/a(?P<name1>b|c)d(?P<longername2>e)/D
+------------------------------------------------------------------
+ 0 28 Bra 0
+ 3 a
+ 5 5 Bra 1
+ 8 b
+ 10 5 Alt
+ 13 c
+ 15 10 Ket
+ 18 d
+ 20 5 Bra 2
+ 23 e
+ 25 5 Ket
+ 28 28 Ket
+ 31 End
+------------------------------------------------------------------
+Capturing subpattern count = 2
+Named capturing subpatterns:
+ longername2 2
+ name1 1
+No options
+First char = 'a'
+Need char = 'e'
+ abde
+ 0: abde
+ 1: b
+ 2: e
+ acde
+ 0: acde
+ 1: c
+ 2: e
+
+/(?:a(?P<c>c(?P<d>d)))(?P<a>a)/D
+------------------------------------------------------------------
+ 0 35 Bra 0
+ 3 21 Bra 0
+ 6 a
+ 8 13 Bra 1
+ 11 c
+ 13 5 Bra 2
+ 16 d
+ 18 5 Ket
+ 21 13 Ket
+ 24 21 Ket
+ 27 5 Bra 3
+ 30 a
+ 32 5 Ket
+ 35 35 Ket
+ 38 End
+------------------------------------------------------------------
+Capturing subpattern count = 3
+Named capturing subpatterns:
+ a 3
+ c 1
+ d 2
+No options
+First char = 'a'
+Need char = 'a'
+
+/(?P<a>a)...(?P=a)bbb(?P>a)d/D
+------------------------------------------------------------------
+ 0 28 Bra 0
+ 3 5 Bra 1
+ 6 a
+ 8 5 Ket
+ 11 Any
+ 12 Any
+ 13 Any
+ 14 \1
+ 17 bbb
+ 23 3 Recurse
+ 26 d
+ 28 28 Ket
+ 31 End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Max back reference = 1
+Named capturing subpatterns:
+ a 1
+No options
+First char = 'a'
+Need char = 'd'
+
+/^\W*(?:(?P<one>(?P<two>.)\W*(?P>one)\W*(?P=two)|)|(?P<three>(?P<four>.)\W*(?P>three)\W*(?P=four)|\W*.\W*))\W*$/i
+Capturing subpattern count = 4
+Max back reference = 4
+Named capturing subpatterns:
+ four 4
+ one 1
+ three 3
+ two 2
+Partial matching not supported
+Options: anchored caseless
+No first char
+No need char
+ 1221
+ 0: 1221
+ 1: 1221
+ 2: 1
+ Satan, oscillate my metallic sonatas!
+ 0: Satan, oscillate my metallic sonatas!
+ 1: <unset>
+ 2: <unset>
+ 3: Satan, oscillate my metallic sonatas
+ 4: S
+ A man, a plan, a canal: Panama!
+ 0: A man, a plan, a canal: Panama!
+ 1: <unset>
+ 2: <unset>
+ 3: A man, a plan, a canal: Panama
+ 4: A
+ Able was I ere I saw Elba.
+ 0: Able was I ere I saw Elba.
+ 1: <unset>
+ 2: <unset>
+ 3: Able was I ere I saw Elba
+ 4: A
+ *** Failers
+No match
+ The quick brown fox
+No match
+
+/((?(R)a|b))\1(?1)?/
+Capturing subpattern count = 1
+Max back reference = 1
+No options
+No first char
+No need char
+ bb
+ 0: bb
+ 1: b
+ bbaa
+ 0: bba
+ 1: b
+
+/(.*)a/sI
+Capturing subpattern count = 1
+Partial matching not supported
+Options: anchored dotall
+No first char
+Need char = 'a'
+
+/(.*)a\1/sI
+Capturing subpattern count = 1
+Max back reference = 1
+Partial matching not supported
+Options: dotall
+No first char
+Need char = 'a'
+
+/(.*)a(b)\2/sI
+Capturing subpattern count = 2
+Max back reference = 2
+Partial matching not supported
+Options: anchored dotall
+No first char
+Need char = 'b'
+
+/((.*)a|(.*)b)z/sI
+Capturing subpattern count = 3
+Partial matching not supported
+Options: anchored dotall
+No first char
+Need char = 'z'
+
+/((.*)a|(.*)b)z\1/sI
+Capturing subpattern count = 3
+Max back reference = 1
+Partial matching not supported
+Options: dotall
+No first char
+Need char = 'z'
+
+/((.*)a|(.*)b)z\2/sI
+Capturing subpattern count = 3
+Max back reference = 2
+Partial matching not supported
+Options: dotall
+No first char
+Need char = 'z'
+
+/((.*)a|(.*)b)z\3/sI
+Capturing subpattern count = 3
+Max back reference = 3
+Partial matching not supported
+Options: dotall
+No first char
+Need char = 'z'
+
+/((.*)a|^(.*)b)z\3/sI
+Capturing subpattern count = 3
+Max back reference = 3
+Partial matching not supported
+Options: anchored dotall
+No first char
+Need char = 'z'
+
+/(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a/sI
+Capturing subpattern count = 31
+Partial matching not supported
+Options: anchored dotall
+No first char
+No need char
+
+/(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a\31/sI
+Capturing subpattern count = 31
+Max back reference = 31
+Partial matching not supported
+Options: dotall
+No first char
+No need char
+
+/(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)|(.*)a\32/sI
+Capturing subpattern count = 32
+Max back reference = 32
+Partial matching not supported
+Options: dotall
+No first char
+No need char
+
+/(a)(bc)/ND
+------------------------------------------------------------------
+ 0 21 Bra 0
+ 3 5 Bra 0
+ 6 a
+ 8 5 Ket
+ 11 7 Bra 0
+ 14 bc
+ 18 7 Ket
+ 21 21 Ket
+ 24 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options:
+First char = 'a'
+Need char = 'c'
+ abc
+ 0: abc
+
+/(?P<one>a)(bc)/ND
+------------------------------------------------------------------
+ 0 21 Bra 0
+ 3 5 Bra 1
+ 6 a
+ 8 5 Ket
+ 11 7 Bra 0
+ 14 bc
+ 18 7 Ket
+ 21 21 Ket
+ 24 End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Named capturing subpatterns:
+ one 1
+Options:
+First char = 'a'
+Need char = 'c'
+ abc
+ 0: abc
+ 1: a
+
+/(a)(?P<named>bc)/ND
+------------------------------------------------------------------
+ 0 21 Bra 0
+ 3 5 Bra 0
+ 6 a
+ 8 5 Ket
+ 11 7 Bra 1
+ 14 bc
+ 18 7 Ket
+ 21 21 Ket
+ 24 End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Named capturing subpatterns:
+ named 1
+Options:
+First char = 'a'
+Need char = 'c'
+
+/(a+)*zz/
+Capturing subpattern count = 1
+Partial matching not supported
+No options
+No first char
+Need char = 'z'
+ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazzbbbbbb\M
+Minimum match limit = 8
+ 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazz
+ 1: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ aaaaaaaaaaaaaz\M
+Minimum match limit = 32768
+No match
+
+/(aaa(?C1)bbb|ab)/
+Capturing subpattern count = 1
+No options
+First char = 'a'
+Need char = 'b'
+ aaabbb
+--->aaabbb
+ 1 ^ ^ b
+ 0: aaabbb
+ 1: aaabbb
+ aaabbb\C*0
+--->aaabbb
+ 1 ^ ^ b
+ 0: aaabbb
+ 1: aaabbb
+ aaabbb\C*1
+--->aaabbb
+ 1 ^ ^ b
+Callout data = 1
+ 0: ab
+ 1: ab
+ aaabbb\C*-1
+--->aaabbb
+ 1 ^ ^ b
+Callout data = -1
+No match
+
+/ab(?P<one>cd)ef(?P<two>gh)/
+Capturing subpattern count = 2
+Named capturing subpatterns:
+ one 1
+ two 2
+No options
+First char = 'a'
+Need char = 'h'
+ abcdefgh
+ 0: abcdefgh
+ 1: cd
+ 2: gh
+ abcdefgh\C1\Gtwo
+ 0: abcdefgh
+ 1: cd
+ 2: gh
+ 1C cd (2)
+ 2G gh (2)
+ abcdefgh\Cone\Ctwo
+ 0: abcdefgh
+ 1: cd
+ 2: gh
+ 1C cd (2)
+ 2C gh (2)
+ abcdefgh\Cthree
+no parentheses with name "three"
+ 0: abcdefgh
+ 1: cd
+ 2: gh
+
+/(?P<Tes>)(?P<Test>)/D
+------------------------------------------------------------------
+ 0 15 Bra 0
+ 3 3 Bra 1
+ 6 3 Ket
+ 9 3 Bra 2
+ 12 3 Ket
+ 15 15 Ket
+ 18 End
+------------------------------------------------------------------
+Capturing subpattern count = 2
+Named capturing subpatterns:
+ Tes 1
+ Test 2
+No options
+No first char
+No need char
+
+/(?P<Test>)(?P<Tes>)/D
+------------------------------------------------------------------
+ 0 15 Bra 0
+ 3 3 Bra 1
+ 6 3 Ket
+ 9 3 Bra 2
+ 12 3 Ket
+ 15 15 Ket
+ 18 End
+------------------------------------------------------------------
+Capturing subpattern count = 2
+Named capturing subpatterns:
+ Tes 2
+ Test 1
+No options
+No first char
+No need char
+
+/(?P<Z>zz)(?P<A>aa)/
+Capturing subpattern count = 2
+Named capturing subpatterns:
+ A 2
+ Z 1
+No options
+First char = 'z'
+Need char = 'a'
+ zzaa\CZ
+ 0: zzaa
+ 1: zz
+ 2: aa
+ 1C zz (2)
+ zzaa\CA
+ 0: zzaa
+ 1: zz
+ 2: aa
+ 2C aa (2)
+
+/(?P<x>eks)(?P<x>eccs)/
+Failed: two named groups have the same name at offset 16
+
+/(?P<abc>abc(?P<def>def)(?P<abc>xyz))/
+Failed: two named groups have the same name at offset 31
+
+"\[((?P<elem>\d+)(,(?P>elem))*)\]"
+Capturing subpattern count = 3
+Named capturing subpatterns:
+ elem 2
+Partial matching not supported
+No options
+First char = '['
+Need char = ']'
+ [10,20,30,5,5,4,4,2,43,23,4234]
+ 0: [10,20,30,5,5,4,4,2,43,23,4234]
+ 1: 10,20,30,5,5,4,4,2,43,23,4234
+ 2: 10
+ 3: ,4234
+ *** Failers
+No match
+ []
+No match
+
+"\[((?P<elem>\d+)(,(?P>elem))*)?\]"
+Capturing subpattern count = 3
+Named capturing subpatterns:
+ elem 2
+Partial matching not supported
+No options
+First char = '['
+Need char = ']'
+ [10,20,30,5,5,4,4,2,43,23,4234]
+ 0: [10,20,30,5,5,4,4,2,43,23,4234]
+ 1: 10,20,30,5,5,4,4,2,43,23,4234
+ 2: 10
+ 3: ,4234
+ []
+ 0: []
+
+/(a(b(?2)c))?/D
+------------------------------------------------------------------
+ 0 25 Bra 0
+ 3 Brazero
+ 4 18 Bra 1
+ 7 a
+ 9 10 Bra 2
+ 12 b
+ 14 9 Recurse
+ 17 c
+ 19 10 Ket
+ 22 18 Ket
+ 25 25 Ket
+ 28 End
+------------------------------------------------------------------
+Capturing subpattern count = 2
+No options
+No first char
+No need char
+
+/(a(b(?2)c))*/D
+------------------------------------------------------------------
+ 0 25 Bra 0
+ 3 Brazero
+ 4 18 Bra 1
+ 7 a
+ 9 10 Bra 2
+ 12 b
+ 14 9 Recurse
+ 17 c
+ 19 10 Ket
+ 22 18 KetRmax
+ 25 25 Ket
+ 28 End
+------------------------------------------------------------------
+Capturing subpattern count = 2
+No options
+No first char
+No need char
+
+/(a(b(?2)c)){0,2}/D
+------------------------------------------------------------------
+ 0 53 Bra 0
+ 3 Brazero
+ 4 46 Bra 0
+ 7 18 Bra 1
+ 10 a
+ 12 10 Bra 2
+ 15 b
+ 17 12 Recurse
+ 20 c
+ 22 10 Ket
+ 25 18 Ket
+ 28 Brazero
+ 29 18 Bra 1
+ 32 a
+ 34 10 Bra 2
+ 37 b
+ 39 12 Recurse
+ 42 c
+ 44 10 Ket
+ 47 18 Ket
+ 50 46 Ket
+ 53 53 Ket
+ 56 End
+------------------------------------------------------------------
+Capturing subpattern count = 2
+No options
+No first char
+No need char
+
+/[ab]{1}+/D
+------------------------------------------------------------------
+ 0 47 Bra 0
+ 3 41 Once
+ 6 [ab]{1,1}
+ 44 41 Ket
+ 47 47 Ket
+ 50 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+No options
+No first char
+No need char
+
+/((w\/|-|with)*(free|immediate)*.*?shipping\s*[!.-]*)/i
+Capturing subpattern count = 3
+Partial matching not supported
+Options: caseless
+No first char
+Need char = 'g' (caseless)
+ Baby Bjorn Active Carrier - With free SHIPPING!!
+ 0: Baby Bjorn Active Carrier - With free SHIPPING!!
+ 1: Baby Bjorn Active Carrier - With free SHIPPING!!
+
+/((w\/|-|with)*(free|immediate)*.*?shipping\s*[!.-]*)/iS
+Capturing subpattern count = 3
+Partial matching not supported
+Options: caseless
+No first char
+Need char = 'g' (caseless)
+Study returned NULL
+ Baby Bjorn Active Carrier - With free SHIPPING!!
+ 0: Baby Bjorn Active Carrier - With free SHIPPING!!
+ 1: Baby Bjorn Active Carrier - With free SHIPPING!!
+
+/a*.*b/SD
+------------------------------------------------------------------
+ 0 9 Bra 0
+ 3 a*
+ 5 Any*
+ 7 b
+ 9 9 Ket
+ 12 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+No first char
+Need char = 'b'
+Study returned NULL
+
+/(a|b)*.?c/SD
+------------------------------------------------------------------
+ 0 21 Bra 0
+ 3 Brazero
+ 4 5 Bra 1
+ 7 a
+ 9 5 Alt
+ 12 b
+ 14 10 KetRmax
+ 17 Any?
+ 19 c
+ 21 21 Ket
+ 24 End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+No options
+No first char
+Need char = 'c'
+Study returned NULL
+
+/abc(?C255)de(?C)f/D
+------------------------------------------------------------------
+ 0 27 Bra 0
+ 3 abc
+ 9 Callout 255 10 1
+ 15 de
+ 19 Callout 0 16 1
+ 25 f
+ 27 27 Ket
+ 30 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+No options
+First char = 'a'
+Need char = 'f'
+
+/abcde/CD
+------------------------------------------------------------------
+ 0 49 Bra 0
+ 3 Callout 255 0 1
+ 9 a
+ 11 Callout 255 1 1
+ 17 b
+ 19 Callout 255 2 1
+ 25 c
+ 27 Callout 255 3 1
+ 33 d
+ 35 Callout 255 4 1
+ 41 e
+ 43 Callout 255 5 0
+ 49 49 Ket
+ 52 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options:
+First char = 'a'
+Need char = 'e'
+ abcde
+--->abcde
+ +0 ^ a
+ +1 ^^ b
+ +2 ^ ^ c
+ +3 ^ ^ d
+ +4 ^ ^ e
+ +5 ^ ^
+ 0: abcde
+ abcdfe
+--->abcdfe
+ +0 ^ a
+ +1 ^^ b
+ +2 ^ ^ c
+ +3 ^ ^ d
+ +4 ^ ^ e
+No match
+
+/a*b/CD
+------------------------------------------------------------------
+ 0 25 Bra 0
+ 3 Callout 255 0 2
+ 9 a*
+ 11 Callout 255 2 1
+ 17 b
+ 19 Callout 255 3 0
+ 25 25 Ket
+ 28 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Partial matching not supported
+Options:
+No first char
+Need char = 'b'
+ ab
+--->ab
+ +0 ^ a*
+ +2 ^^ b
+ +3 ^ ^
+ 0: ab
+ aaaab
+--->aaaab
+ +0 ^ a*
+ +2 ^ ^ b
+ +3 ^ ^
+ 0: aaaab
+ aaaacb
+--->aaaacb
+ +0 ^ a*
+ +2 ^ ^ b
+ +2 ^ ^ b
+ +2 ^ ^ b
+ +2 ^^ b
+ +2 ^ b
+ +0 ^ a*
+ +2 ^ ^ b
+ +2 ^ ^ b
+ +2 ^^ b
+ +2 ^ b
+ +0 ^ a*
+ +2 ^ ^ b
+ +2 ^^ b
+ +2 ^ b
+ +0 ^ a*
+ +2 ^^ b
+ +2 ^ b
+ +0 ^ a*
+ +2 ^ b
+ +0 ^ a*
+ +2 ^ b
+ +3 ^^
+ 0: b
+
+/a+b/CD
+------------------------------------------------------------------
+ 0 25 Bra 0
+ 3 Callout 255 0 2
+ 9 a+
+ 11 Callout 255 2 1
+ 17 b
+ 19 Callout 255 3 0
+ 25 25 Ket
+ 28 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Partial matching not supported
+Options:
+First char = 'a'
+Need char = 'b'
+ ab
+--->ab
+ +0 ^ a+
+ +2 ^^ b
+ +3 ^ ^
+ 0: ab
+ aaaab
+--->aaaab
+ +0 ^ a+
+ +2 ^ ^ b
+ +3 ^ ^
+ 0: aaaab
+ aaaacb
+--->aaaacb
+ +0 ^ a+
+ +2 ^ ^ b
+ +2 ^ ^ b
+ +2 ^ ^ b
+ +2 ^^ b
+ +0 ^ a+
+ +2 ^ ^ b
+ +2 ^ ^ b
+ +2 ^^ b
+ +0 ^ a+
+ +2 ^ ^ b
+ +2 ^^ b
+ +0 ^ a+
+ +2 ^^ b
+No match
+
+/(abc|def)x/CD
+------------------------------------------------------------------
+ 0 92 Bra 0
+ 3 Callout 255 0 9
+ 9 33 Bra 1
+ 12 Callout 255 1 1
+ 18 a
+ 20 Callout 255 2 1
+ 26 b
+ 28 Callout 255 3 1
+ 34 c
+ 36 Callout 255 4 0
+ 42 33 Alt
+ 45 Callout 255 5 1
+ 51 d
+ 53 Callout 255 6 1
+ 59 e
+ 61 Callout 255 7 1
+ 67 f
+ 69 Callout 255 8 0
+ 75 66 Ket
+ 78 Callout 255 9 1
+ 84 x
+ 86 Callout 255 10 0
+ 92 92 Ket
+ 95 End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Options:
+No first char
+Need char = 'x'
+ abcx
+--->abcx
+ +0 ^ (abc|def)
+ +1 ^ a
+ +2 ^^ b
+ +3 ^ ^ c
+ +4 ^ ^ |
+ +9 ^ ^ x
++10 ^ ^
+ 0: abcx
+ 1: abc
+ defx
+--->defx
+ +0 ^ (abc|def)
+ +1 ^ a
+ +5 ^ d
+ +6 ^^ e
+ +7 ^ ^ f
+ +8 ^ ^ )
+ +9 ^ ^ x
++10 ^ ^
+ 0: defx
+ 1: def
+ abcdefzx
+--->abcdefzx
+ +0 ^ (abc|def)
+ +1 ^ a
+ +2 ^^ b
+ +3 ^ ^ c
+ +4 ^ ^ |
+ +9 ^ ^ x
+ +5 ^ d
+ +0 ^ (abc|def)
+ +1 ^ a
+ +5 ^ d
+ +0 ^ (abc|def)
+ +1 ^ a
+ +5 ^ d
+ +0 ^ (abc|def)
+ +1 ^ a
+ +5 ^ d
+ +6 ^^ e
+ +7 ^ ^ f
+ +8 ^ ^ )
+ +9 ^ ^ x
+ +0 ^ (abc|def)
+ +1 ^ a
+ +5 ^ d
+ +0 ^ (abc|def)
+ +1 ^ a
+ +5 ^ d
+ +0 ^ (abc|def)
+ +1 ^ a
+ +5 ^ d
+ +0 ^ (abc|def)
+ +1 ^ a
+ +5 ^ d
+No match
+
+/(ab|cd){3,4}/C
+Capturing subpattern count = 1
+Options:
+No first char
+No need char
+ ababab
+--->ababab
+ +0 ^ (ab|cd){3,4}
+ +1 ^ a
+ +2 ^^ b
+ +3 ^ ^ |
+ +1 ^ ^ a
+ +2 ^ ^ b
+ +3 ^ ^ |
+ +1 ^ ^ a
+ +2 ^ ^ b
+ +3 ^ ^ |
+ +1 ^ ^ a
+ +4 ^ ^ c
++12 ^ ^
+ 0: ababab
+ 1: ab
+ abcdabcd
+--->abcdabcd
+ +0 ^ (ab|cd){3,4}
+ +1 ^ a
+ +2 ^^ b
+ +3 ^ ^ |
+ +1 ^ ^ a
+ +4 ^ ^ c
+ +5 ^ ^ d
+ +6 ^ ^ )
+ +1 ^ ^ a
+ +2 ^ ^ b
+ +3 ^ ^ |
+ +1 ^ ^ a
+ +4 ^ ^ c
+ +5 ^ ^ d
+ +6 ^ ^ )
++12 ^ ^
+ 0: abcdabcd
+ 1: cd
+ abcdcdcdcdcd
+--->abcdcdcdcdcd
+ +0 ^ (ab|cd){3,4}
+ +1 ^ a
+ +2 ^^ b
+ +3 ^ ^ |
+ +1 ^ ^ a
+ +4 ^ ^ c
+ +5 ^ ^ d
+ +6 ^ ^ )
+ +1 ^ ^ a
+ +4 ^ ^ c
+ +5 ^ ^ d
+ +6 ^ ^ )
+ +1 ^ ^ a
+ +4 ^ ^ c
+ +5 ^ ^ d
+ +6 ^ ^ )
++12 ^ ^
+ 0: abcdcdcd
+ 1: cd
+
+/([ab]{,4}c|xy)/CD
+------------------------------------------------------------------
+ 0 131 Bra 0
+ 3 Callout 255 0 14
+ 9 88 Bra 1
+ 12 Callout 255 1 4
+ 18 [ab]
+ 51 Callout 255 5 1
+ 57 {
+ 59 Callout 255 6 1
+ 65 ,
+ 67 Callout 255 7 1
+ 73 4
+ 75 Callout 255 8 1
+ 81 }
+ 83 Callout 255 9 1
+ 89 c
+ 91 Callout 255 10 0
+ 97 25 Alt
+100 Callout 255 11 1
+106 x
+108 Callout 255 12 1
+114 y
+116 Callout 255 13 0
+122 113 Ket
+125 Callout 255 14 0
+131 131 Ket
+134 End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Options:
+No first char
+No need char
+ Note: that { does NOT introduce a quantifier
+--->Note: that { does NOT introduce a quantifier
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
+ +5 ^^ {
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
+ +5 ^^ {
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
+ +5 ^^ {
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+ +0 ^ ([ab]{,4}c|xy)
+ +1 ^ [ab]
++11 ^ x
+No match
+
+/([ab]{1,4}c|xy){4,5}?123/CD
+------------------------------------------------------------------
+ 0 485 Bra 0
+ 3 Callout 255 0 21
+ 9 61 Bra 1
+ 12 Callout 255 1 9
+ 18 [ab]{1,4}
+ 56 Callout 255 10 1
+ 62 c
+ 64 Callout 255 11 0
+ 70 25 Alt
+ 73 Callout 255 12 1
+ 79 x
+ 81 Callout 255 13 1
+ 87 y
+ 89 Callout 255 14 0
+ 95 86 Ket
+ 98 61 Bra 1
+101 Callout 255 1 9
+107 [ab]{1,4}
+145 Callout 255 10 1
+151 c
+153 Callout 255 11 0
+159 25 Alt
+162 Callout 255 12 1
+168 x
+170 Callout 255 13 1
+176 y
+178 Callout 255 14 0
+184 86 Ket
+187 61 Bra 1
+190 Callout 255 1 9
+196 [ab]{1,4}
+234 Callout 255 10 1
+240 c
+242 Callout 255 11 0
+248 25 Alt
+251 Callout 255 12 1
+257 x
+259 Callout 255 13 1
+265 y
+267 Callout 255 14 0
+273 86 Ket
+276 61 Bra 1
+279 Callout 255 1 9
+285 [ab]{1,4}
+323 Callout 255 10 1
+329 c
+331 Callout 255 11 0
+337 25 Alt
+340 Callout 255 12 1
+346 x
+348 Callout 255 13 1
+354 y
+356 Callout 255 14 0
+362 86 Ket
+365 Braminzero
+366 61 Bra 1
+369 Callout 255 1 9
+375 [ab]{1,4}
+413 Callout 255 10 1
+419 c
+421 Callout 255 11 0
+427 25 Alt
+430 Callout 255 12 1
+436 x
+438 Callout 255 13 1
+444 y
+446 Callout 255 14 0
+452 86 Ket
+455 Callout 255 21 1
+461 1
+463 Callout 255 22 1
+469 2
+471 Callout 255 23 1
+477 3
+479 Callout 255 24 0
+485 485 Ket
+488 End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Partial matching not supported
+Options:
+No first char
+Need char = '3'
+ aacaacaacaacaac123
+--->aacaacaacaacaac123
+ +0 ^ ([ab]{1,4}c|xy){4,5}?
+ +1 ^ [ab]{1,4}
++10 ^ ^ c
++11 ^ ^ |
+ +1 ^ ^ [ab]{1,4}
++10 ^ ^ c
++11 ^ ^ |
+ +1 ^ ^ [ab]{1,4}
++10 ^ ^ c
++11 ^ ^ |
+ +1 ^ ^ [ab]{1,4}
++10 ^ ^ c
++11 ^ ^ |
++21 ^ ^ 1
+ +1 ^ ^ [ab]{1,4}
++10 ^ ^ c
++11 ^ ^ |
++21 ^ ^ 1
++22 ^ ^ 2
++23 ^ ^ 3
++24 ^ ^
+ 0: aacaacaacaacaac123
+ 1: aac
+
+/\b.*/I
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+No first char
+No need char
+ ab cd\>1
+ 0: cd
+
+/\b.*/Is
+Capturing subpattern count = 0
+Partial matching not supported
+Options: dotall
+No first char
+No need char
+ ab cd\>1
+ 0: cd
+
+/(?!.bcd).*/I
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+No first char
+No need char
+ Xbcd12345
+ 0: bcd12345
+
+/abcde/
+Capturing subpattern count = 0
+No options
+First char = 'a'
+Need char = 'e'
+ ab\P
+Partial match
+ abc\P
+Partial match
+ abcd\P
+Partial match
+ abcde\P
+ 0: abcde
+ the quick brown abc\P
+Partial match
+ ** Failers\P
+No match
+ the quick brown abxyz fox\P
+No match
+
+"^(0?[1-9]|[12][0-9]|3[01])/(0?[1-9]|1[012])/(20)?\d\d$"
+Capturing subpattern count = 3
+Options: anchored
+No first char
+Need char = '/'
+ 13/05/04\P
+ 0: 13/05/04
+ 1: 13
+ 2: 05
+ 13/5/2004\P
+ 0: 13/5/2004
+ 1: 13
+ 2: 5
+ 3: 20
+ 02/05/09\P
+ 0: 02/05/09
+ 1: 02
+ 2: 05
+ 1\P
+Partial match
+ 1/2\P
+Partial match
+ 1/2/0\P
+Partial match
+ 1/2/04\P
+ 0: 1/2/04
+ 1: 1
+ 2: 2
+ 0\P
+Partial match
+ 02/\P
+Partial match
+ 02/0\P
+Partial match
+ 02/1\P
+Partial match
+ ** Failers\P
+No match
+ \P
+No match
+ 123\P
+No match
+ 33/4/04\P
+No match
+ 3/13/04\P
+No match
+ 0/1/2003\P
+No match
+ 0/\P
+No match
+ 02/0/\P
+No match
+ 02/13\P
+No match
+
+/0{0,2}ABC/I
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+No first char
+Need char = 'C'
+
+/\d{3,}ABC/I
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+No first char
+Need char = 'C'
+
+/\d*ABC/I
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+No first char
+Need char = 'C'
+
+/[abc]+DE/I
+Capturing subpattern count = 0
+Partial matching not supported
+No options
+No first char
+Need char = 'E'
+
+/[abc]?123/
+Capturing subpattern count = 0
+No options
+No first char
+Need char = '3'
+ 123\P
+ 0: 123
+ a\P
+Partial match
+ b\P
+Partial match
+ c\P
+Partial match
+ c12\P
+Partial match
+ c123\P
+ 0: c123
+
+/^(?:\d){3,5}X/
+Capturing subpattern count = 0
+Options: anchored
+No first char
+Need char = 'X'
+ 1\P
+Partial match
+ 123\P
+Partial match
+ 123X
+ 0: 123X
+ 1234\P
+Partial match
+ 1234X
+ 0: 1234X
+ 12345\P
+Partial match
+ 12345X
+ 0: 12345X
+ *** Failers
+No match
+ 1X
+No match
+ 123456\P
+No match
+
+/abc/>testsavedregex
+Capturing subpattern count = 0
+No options
+First char = 'a'
+Need char = 'c'
+Compiled regex written to testsavedregex
+<testsavedregex
+Compiled regex loaded from testsavedregex
+No study data
+Capturing subpattern count = 0
+No options
+First char = 'a'
+Need char = 'c'
+ abc
+ 0: abc
+ ** Failers
+No match
+ bca
+No match
+
+/abc/F>testsavedregex
+Capturing subpattern count = 0
+No options
+First char = 'a'
+Need char = 'c'
+Compiled regex written to testsavedregex
+<testsavedregex
+Compiled regex (byte-inverted) loaded from testsavedregex
+No study data
+Capturing subpattern count = 0
+No options
+First char = 'a'
+Need char = 'c'
+ abc
+ 0: abc
+ ** Failers
+No match
+ bca
+No match
+
+/(a|b)/S>testsavedregex
+Capturing subpattern count = 1
+No options
+No first char
+No need char
+Starting byte set: a b
+Compiled regex written to testsavedregex
+Study data written to testsavedregex
+<testsavedregex
+Compiled regex loaded from testsavedregex
+Study data loaded from testsavedregex
+Capturing subpattern count = 1
+No options
+No first char
+No need char
+Starting byte set: a b
+ abc
+ 0: a
+ 1: a
+ ** Failers
+ 0: a
+ 1: a
+ def
+No match
+
+/(a|b)/SF>testsavedregex
+Capturing subpattern count = 1
+No options
+No first char
+No need char
+Starting byte set: a b
+Compiled regex written to testsavedregex
+Study data written to testsavedregex
+<testsavedregex
+Compiled regex (byte-inverted) loaded from testsavedregex
+Study data loaded from testsavedregex
+Capturing subpattern count = 1
+No options
+No first char
+No need char
+Starting byte set: a b
+ abc
+ 0: a
+ 1: a
+ ** Failers
+ 0: a
+ 1: a
+ def
+No match
+
+~<(\w+)/?>(.)*</(\1)>~smg
+Capturing subpattern count = 3
+Max back reference = 1
+Partial matching not supported
+Options: multiline dotall
+First char = '<'
+Need char = '>'
+ <!DOCTYPE seite SYSTEM "http://www.lco.lineas.de/xmlCms.dtd">\n<seite>\n<dokumenteninformation>\n<seitentitel>Partner der LCO</seitentitel>\n<sprache>de</sprache>\n<seitenbeschreibung>Partner der LINEAS Consulting\nGmbH</seitenbeschreibung>\n<schluesselworte>LINEAS Consulting GmbH Hamburg\nPartnerfirmen</schluesselworte>\n<revisit>30 days</revisit>\n<robots>index,follow</robots>\n<menueinformation>\n<aktiv>ja</aktiv>\n<menueposition>3</menueposition>\n<menuetext>Partner</menuetext>\n</menueinformation>\n<lastedited>\n<autor>LCO</autor>\n<firma>LINEAS Consulting</firma>\n<datum>15.10.2003</datum>\n</lastedited>\n</dokumenteninformation>\n<inhalt>\n\n<absatzueberschrift>Die Partnerfirmen der LINEAS Consulting\nGmbH</absatzueberschrift>\n\n<absatz><link ziel="http://www.ca.com/" zielfenster="_blank">\n<bild name="logo_ca.gif" rahmen="no"/></link> <link\nziel="http://www.ey.com/" zielfenster="_blank"><bild\nname="logo_euy.gif" rahmen="no"/></link>\n</absatz>\n\n<absatz><link ziel="http://www.cisco.de/" zielfenster="_blank">\n<bild name="logo_cisco.gif" rahmen="ja"/></link></absatz>\n\n<absatz><link ziel="http://www.atelion.de/"\nzielfenster="_blank"><bild\nname="logo_atelion.gif" rahmen="no"/></link>\n</absatz>\n\n<absatz><link ziel="http://www.line-information.de/"\nzielfenster="_blank">\n<bild name="logo_line_information.gif" rahmen="no"/></link>\n</absatz>\n\n<absatz><bild name="logo_aw.gif" rahmen="no"/></absatz>\n\n<absatz><link ziel="http://www.incognis.de/"\nzielfenster="_blank"><bild\nname="logo_incognis.gif" rahmen="no"/></link></absatz>\n\n<absatz><link ziel="http://www.addcraft.com/"\nzielfenster="_blank"><bild\nname="logo_addcraft.gif" rahmen="no"/></link></absatz>\n\n<absatz><link ziel="http://www.comendo.com/"\nzielfenster="_blank"><bild\nname="logo_comendo.gif" rahmen="no"/></link></absatz>\n\n</inhalt>\n</seite>
+ 0: <seite>\x0a<dokumenteninformation>\x0a<seitentitel>Partner der LCO</seitentitel>\x0a<sprache>de</sprache>\x0a<seitenbeschreibung>Partner der LINEAS Consulting\x0aGmbH</seitenbeschreibung>\x0a<schluesselworte>LINEAS Consulting GmbH Hamburg\x0aPartnerfirmen</schluesselworte>\x0a<revisit>30 days</revisit>\x0a<robots>index,follow</robots>\x0a<menueinformation>\x0a<aktiv>ja</aktiv>\x0a<menueposition>3</menueposition>\x0a<menuetext>Partner</menuetext>\x0a</menueinformation>\x0a<lastedited>\x0a<autor>LCO</autor>\x0a<firma>LINEAS Consulting</firma>\x0a<datum>15.10.2003</datum>\x0a</lastedited>\x0a</dokumenteninformation>\x0a<inhalt>\x0a\x0a<absatzueberschrift>Die Partnerfirmen der LINEAS Consulting\x0aGmbH</absatzueberschrift>\x0a\x0a<absatz><link ziel="http://www.ca.com/" zielfenster="_blank">\x0a<bild name="logo_ca.gif" rahmen="no"/></link> <link\x0aziel="http://www.ey.com/" zielfenster="_blank"><bild\x0aname="logo_euy.gif" rahmen="no"/></link>\x0a</absatz>\x0a\x0a<absatz><link ziel="http://www.cisco.de/" zielfenster="_blank">\x0a<bild name="logo_cisco.gif" rahmen="ja"/></link></absatz>\x0a\x0a<absatz><link ziel="http://www.atelion.de/"\x0azielfenster="_blank"><bild\x0aname="logo_atelion.gif" rahmen="no"/></link>\x0a</absatz>\x0a\x0a<absatz><link ziel="http://www.line-information.de/"\x0azielfenster="_blank">\x0a<bild name="logo_line_information.gif" rahmen="no"/></link>\x0a</absatz>\x0a\x0a<absatz><bild name="logo_aw.gif" rahmen="no"/></absatz>\x0a\x0a<absatz><link ziel="http://www.incognis.de/"\x0azielfenster="_blank"><bild\x0aname="logo_incognis.gif" rahmen="no"/></link></absatz>\x0a\x0a<absatz><link ziel="http://www.addcraft.com/"\x0azielfenster="_blank"><bild\x0aname="logo_addcraft.gif" rahmen="no"/></link></absatz>\x0a\x0a<absatz><link ziel="http://www.comendo.com/"\x0azielfenster="_blank"><bild\x0aname="logo_comendo.gif" rahmen="no"/></link></absatz>\x0a\x0a</inhalt>\x0a</seite>
+ 1: seite
+ 2: \x0a
+ 3: seite
+
+/^a/IF
+Capturing subpattern count = 0
+Options: anchored
+No first char
+No need char
+
+/ End of testinput2 /
+Capturing subpattern count = 0
+No options
+First char = ' '
+Need char = ' '
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testoutput3 b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testoutput3
new file mode 100644
index 00000000..225bd5bf
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testoutput3
@@ -0,0 +1,115 @@
+PCRE version 5.0 13-Sep-2004
+
+/^[\w]+/
+ *** Failers
+No match
+ École
+No match
+
+/^[\w]+/Lfr_FR
+ École
+ 0: École
+
+/^[\w]+/
+ *** Failers
+No match
+ École
+No match
+
+/^[\W]+/
+ École
+ 0: \xc9
+
+/^[\W]+/Lfr_FR
+ *** Failers
+ 0: ***
+ École
+No match
+
+/[\b]/
+ \b
+ 0: \x08
+ *** Failers
+No match
+ a
+No match
+
+/[\b]/Lfr_FR
+ \b
+ 0: \x08
+ *** Failers
+No match
+ a
+No match
+
+/^\w+/
+ *** Failers
+No match
+ École
+No match
+
+/^\w+/Lfr_FR
+ École
+ 0: École
+
+/(.+)\b(.+)/
+ École
+ 0: \xc9cole
+ 1: \xc9
+ 2: cole
+
+/(.+)\b(.+)/Lfr_FR
+ *** Failers
+ 0: *** Failers
+ 1: ***
+ 2: Failers
+ École
+No match
+
+/École/i
+ École
+ 0: \xc9cole
+ *** Failers
+No match
+ école
+No match
+
+/École/iLfr_FR
+ École
+ 0: École
+ école
+ 0: école
+
+/\w/IS
+Capturing subpattern count = 0
+No options
+No first char
+No need char
+Starting byte set: 0 1 2 3 4 5 6 7 8 9 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 _ 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
+
+/\w/ISLfr_FR
+Capturing subpattern count = 0
+No options
+No first char
+No need char
+Starting byte set: 0 1 2 3 4 5 6 7 8 9 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 _ 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
+ µ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö Ø Ù Ú Û Ü Ý Þ ß à á â ã ä
+ å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ø ù ú û ü ý þ ÿ
+
+/^[\xc8-\xc9]/iLfr_FR
+ École
+ 0: É
+ école
+ 0: é
+
+/^[\xc8-\xc9]/Lfr_FR
+ École
+ 0: É
+ *** Failers
+No match
+ école
+No match
+
+/ End of testinput3 /
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testoutput4 b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testoutput4
new file mode 100644
index 00000000..e8d26033
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testoutput4
@@ -0,0 +1,903 @@
+PCRE version 5.0 13-Sep-2004
+
+/-- Do not use the \x{} construct except with patterns that have the --/
+/-- /8 option set, because PCRE doesn't recognize them as UTF-8 unless --/
+No match
+/-- that option is set. However, the latest Perls recognize them always. --/
+No match
+
+/a.b/8
+ acb
+ 0: acb
+ a\x7fb
+ 0: a\x{7f}b
+ a\x{100}b
+ 0: a\x{100}b
+ *** Failers
+No match
+ a\nb
+No match
+
+/a(.{3})b/8
+ a\x{4000}xyb
+ 0: a\x{4000}xyb
+ 1: \x{4000}xy
+ a\x{4000}\x7fyb
+ 0: a\x{4000}\x{7f}yb
+ 1: \x{4000}\x{7f}y
+ a\x{4000}\x{100}yb
+ 0: a\x{4000}\x{100}yb
+ 1: \x{4000}\x{100}y
+ *** Failers
+No match
+ a\x{4000}b
+No match
+ ac\ncb
+No match
+
+/a(.*?)(.)/
+ a\xc0\x88b
+ 0: a\xc0
+ 1:
+ 2: \xc0
+
+/a(.*?)(.)/8
+ a\x{100}b
+ 0: a\x{100}
+ 1:
+ 2: \x{100}
+
+/a(.*)(.)/
+ a\xc0\x88b
+ 0: a\xc0\x88b
+ 1: \xc0\x88
+ 2: b
+
+/a(.*)(.)/8
+ a\x{100}b
+ 0: a\x{100}b
+ 1: \x{100}
+ 2: b
+
+/a(.)(.)/
+ a\xc0\x92bcd
+ 0: a\xc0\x92
+ 1: \xc0
+ 2: \x92
+
+/a(.)(.)/8
+ a\x{240}bcd
+ 0: a\x{240}b
+ 1: \x{240}
+ 2: b
+
+/a(.?)(.)/
+ a\xc0\x92bcd
+ 0: a\xc0\x92
+ 1: \xc0
+ 2: \x92
+
+/a(.?)(.)/8
+ a\x{240}bcd
+ 0: a\x{240}b
+ 1: \x{240}
+ 2: b
+
+/a(.??)(.)/
+ a\xc0\x92bcd
+ 0: a\xc0
+ 1:
+ 2: \xc0
+
+/a(.??)(.)/8
+ a\x{240}bcd
+ 0: a\x{240}
+ 1:
+ 2: \x{240}
+
+/a(.{3})b/8
+ a\x{1234}xyb
+ 0: a\x{1234}xyb
+ 1: \x{1234}xy
+ a\x{1234}\x{4321}yb
+ 0: a\x{1234}\x{4321}yb
+ 1: \x{1234}\x{4321}y
+ a\x{1234}\x{4321}\x{3412}b
+ 0: a\x{1234}\x{4321}\x{3412}b
+ 1: \x{1234}\x{4321}\x{3412}
+ *** Failers
+No match
+ a\x{1234}b
+No match
+ ac\ncb
+No match
+
+/a(.{3,})b/8
+ a\x{1234}xyb
+ 0: a\x{1234}xyb
+ 1: \x{1234}xy
+ a\x{1234}\x{4321}yb
+ 0: a\x{1234}\x{4321}yb
+ 1: \x{1234}\x{4321}y
+ a\x{1234}\x{4321}\x{3412}b
+ 0: a\x{1234}\x{4321}\x{3412}b
+ 1: \x{1234}\x{4321}\x{3412}
+ axxxxbcdefghijb
+ 0: axxxxbcdefghijb
+ 1: xxxxbcdefghij
+ a\x{1234}\x{4321}\x{3412}\x{3421}b
+ 0: a\x{1234}\x{4321}\x{3412}\x{3421}b
+ 1: \x{1234}\x{4321}\x{3412}\x{3421}
+ *** Failers
+No match
+ a\x{1234}b
+No match
+
+/a(.{3,}?)b/8
+ a\x{1234}xyb
+ 0: a\x{1234}xyb
+ 1: \x{1234}xy
+ a\x{1234}\x{4321}yb
+ 0: a\x{1234}\x{4321}yb
+ 1: \x{1234}\x{4321}y
+ a\x{1234}\x{4321}\x{3412}b
+ 0: a\x{1234}\x{4321}\x{3412}b
+ 1: \x{1234}\x{4321}\x{3412}
+ axxxxbcdefghijb
+ 0: axxxxb
+ 1: xxxx
+ a\x{1234}\x{4321}\x{3412}\x{3421}b
+ 0: a\x{1234}\x{4321}\x{3412}\x{3421}b
+ 1: \x{1234}\x{4321}\x{3412}\x{3421}
+ *** Failers
+No match
+ a\x{1234}b
+No match
+
+/a(.{3,5})b/8
+ a\x{1234}xyb
+ 0: a\x{1234}xyb
+ 1: \x{1234}xy
+ a\x{1234}\x{4321}yb
+ 0: a\x{1234}\x{4321}yb
+ 1: \x{1234}\x{4321}y
+ a\x{1234}\x{4321}\x{3412}b
+ 0: a\x{1234}\x{4321}\x{3412}b
+ 1: \x{1234}\x{4321}\x{3412}
+ axxxxbcdefghijb
+ 0: axxxxb
+ 1: xxxx
+ a\x{1234}\x{4321}\x{3412}\x{3421}b
+ 0: a\x{1234}\x{4321}\x{3412}\x{3421}b
+ 1: \x{1234}\x{4321}\x{3412}\x{3421}
+ axbxxbcdefghijb
+ 0: axbxxb
+ 1: xbxx
+ axxxxxbcdefghijb
+ 0: axxxxxb
+ 1: xxxxx
+ *** Failers
+No match
+ a\x{1234}b
+No match
+ axxxxxxbcdefghijb
+No match
+
+/a(.{3,5}?)b/8
+ a\x{1234}xyb
+ 0: a\x{1234}xyb
+ 1: \x{1234}xy
+ a\x{1234}\x{4321}yb
+ 0: a\x{1234}\x{4321}yb
+ 1: \x{1234}\x{4321}y
+ a\x{1234}\x{4321}\x{3412}b
+ 0: a\x{1234}\x{4321}\x{3412}b
+ 1: \x{1234}\x{4321}\x{3412}
+ axxxxbcdefghijb
+ 0: axxxxb
+ 1: xxxx
+ a\x{1234}\x{4321}\x{3412}\x{3421}b
+ 0: a\x{1234}\x{4321}\x{3412}\x{3421}b
+ 1: \x{1234}\x{4321}\x{3412}\x{3421}
+ axbxxbcdefghijb
+ 0: axbxxb
+ 1: xbxx
+ axxxxxbcdefghijb
+ 0: axxxxxb
+ 1: xxxxx
+ *** Failers
+No match
+ a\x{1234}b
+No match
+ axxxxxxbcdefghijb
+No match
+
+/^[a\x{c0}]/8
+ *** Failers
+No match
+ \x{100}
+No match
+
+/(?<=aXb)cd/8
+ aXbcd
+ 0: cd
+
+/(?<=a\x{100}b)cd/8
+ a\x{100}bcd
+ 0: cd
+
+/(?<=a\x{100000}b)cd/8
+ a\x{100000}bcd
+ 0: cd
+
+/(?:\x{100}){3}b/8
+ \x{100}\x{100}\x{100}b
+ 0: \x{100}\x{100}\x{100}b
+ *** Failers
+No match
+ \x{100}\x{100}b
+No match
+
+/\x{ab}/8
+ \x{ab}
+ 0: \x{ab}
+ \xc2\xab
+ 0: \x{ab}
+ *** Failers
+No match
+ \x00{ab}
+No match
+
+/(?<=(.))X/8
+ WXYZ
+ 0: X
+ 1: W
+ \x{256}XYZ
+ 0: X
+ 1: \x{256}
+ *** Failers
+No match
+ XYZ
+No match
+
+/X(\C{3})/8
+ X\x{1234}
+ 0: X\x{1234}
+ 1: \x{1234}
+
+/X(\C{4})/8
+ X\x{1234}YZ
+ 0: X\x{1234}Y
+ 1: \x{1234}Y
+
+/X\C*/8
+ XYZabcdce
+ 0: XYZabcdce
+
+/X\C*?/8
+ XYZabcde
+ 0: X
+
+/X\C{3,5}/8
+ Xabcdefg
+ 0: Xabcde
+ X\x{1234}
+ 0: X\x{1234}
+ X\x{1234}YZ
+ 0: X\x{1234}YZ
+ X\x{1234}\x{512}
+ 0: X\x{1234}\x{512}
+ X\x{1234}\x{512}YZ
+ 0: X\x{1234}\x{512}
+
+/X\C{3,5}?/8
+ Xabcdefg
+ 0: Xabc
+ X\x{1234}
+ 0: X\x{1234}
+ X\x{1234}YZ
+ 0: X\x{1234}
+ X\x{1234}\x{512}
+ 0: X\x{1234}
+
+/[^a]+/8g
+ bcd
+ 0: bcd
+ \x{100}aY\x{256}Z
+ 0: \x{100}
+ 0: Y\x{256}Z
+
+/^[^a]{2}/8
+ \x{100}bc
+ 0: \x{100}b
+
+/^[^a]{2,}/8
+ \x{100}bcAa
+ 0: \x{100}bcA
+
+/^[^a]{2,}?/8
+ \x{100}bca
+ 0: \x{100}b
+
+/[^a]+/8ig
+ bcd
+ 0: bcd
+ \x{100}aY\x{256}Z
+ 0: \x{100}
+ 0: Y\x{256}Z
+
+/^[^a]{2}/8i
+ \x{100}bc
+ 0: \x{100}b
+
+/^[^a]{2,}/8i
+ \x{100}bcAa
+ 0: \x{100}bc
+
+/^[^a]{2,}?/8i
+ \x{100}bca
+ 0: \x{100}b
+
+/\x{100}{0,0}/8
+ abcd
+ 0:
+
+/\x{100}?/8
+ abcd
+ 0:
+ \x{100}\x{100}
+ 0: \x{100}
+
+/\x{100}{0,3}/8
+ \x{100}\x{100}
+ 0: \x{100}\x{100}
+ \x{100}\x{100}\x{100}\x{100}
+ 0: \x{100}\x{100}\x{100}
+
+/\x{100}*/8
+ abce
+ 0:
+ \x{100}\x{100}\x{100}\x{100}
+ 0: \x{100}\x{100}\x{100}\x{100}
+
+/\x{100}{1,1}/8
+ abcd\x{100}\x{100}\x{100}\x{100}
+ 0: \x{100}
+
+/\x{100}{1,3}/8
+ abcd\x{100}\x{100}\x{100}\x{100}
+ 0: \x{100}\x{100}\x{100}
+
+/\x{100}+/8
+ abcd\x{100}\x{100}\x{100}\x{100}
+ 0: \x{100}\x{100}\x{100}\x{100}
+
+/\x{100}{3}/8
+ abcd\x{100}\x{100}\x{100}XX
+ 0: \x{100}\x{100}\x{100}
+
+/\x{100}{3,5}/8
+ abcd\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}XX
+ 0: \x{100}\x{100}\x{100}\x{100}\x{100}
+
+/\x{100}{3,}/8
+ abcd\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}XX
+ 0: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}
+
+/(?<=a\x{100}{2}b)X/8+
+ Xyyya\x{100}\x{100}bXzzz
+ 0: X
+ 0+ zzz
+
+/\D*/8
+ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/\D*/8
+ \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}
+ 0: \x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}\x{100}
+
+/\D/8
+ 1X2
+ 0: X
+ 1\x{100}2
+ 0: \x{100}
+
+/>\S/8
+ > >X Y
+ 0: >X
+ > >\x{100} Y
+ 0: >\x{100}
+
+/\d/8
+ \x{100}3
+ 0: 3
+
+/\s/8
+ \x{100} X
+ 0:
+
+/\D+/8
+ 12abcd34
+ 0: abcd
+ *** Failers
+ 0: *** Failers
+ 1234
+No match
+
+/\D{2,3}/8
+ 12abcd34
+ 0: abc
+ 12ab34
+ 0: ab
+ *** Failers
+ 0: ***
+ 1234
+No match
+ 12a34
+No match
+
+/\D{2,3}?/8
+ 12abcd34
+ 0: ab
+ 12ab34
+ 0: ab
+ *** Failers
+ 0: **
+ 1234
+No match
+ 12a34
+No match
+
+/\d+/8
+ 12abcd34
+ 0: 12
+ *** Failers
+No match
+
+/\d{2,3}/8
+ 12abcd34
+ 0: 12
+ 1234abcd
+ 0: 123
+ *** Failers
+No match
+ 1.4
+No match
+
+/\d{2,3}?/8
+ 12abcd34
+ 0: 12
+ 1234abcd
+ 0: 12
+ *** Failers
+No match
+ 1.4
+No match
+
+/\S+/8
+ 12abcd34
+ 0: 12abcd34
+ *** Failers
+ 0: ***
+ \ \
+No match
+
+/\S{2,3}/8
+ 12abcd34
+ 0: 12a
+ 1234abcd
+ 0: 123
+ *** Failers
+ 0: ***
+ \ \
+No match
+
+/\S{2,3}?/8
+ 12abcd34
+ 0: 12
+ 1234abcd
+ 0: 12
+ *** Failers
+ 0: **
+ \ \
+No match
+
+/>\s+</8+
+ 12> <34
+ 0: > <
+ 0+ 34
+ *** Failers
+No match
+
+/>\s{2,3}</8+
+ ab> <cd
+ 0: > <
+ 0+ cd
+ ab> <ce
+ 0: > <
+ 0+ ce
+ *** Failers
+No match
+ ab> <cd
+No match
+
+/>\s{2,3}?</8+
+ ab> <cd
+ 0: > <
+ 0+ cd
+ ab> <ce
+ 0: > <
+ 0+ ce
+ *** Failers
+No match
+ ab> <cd
+No match
+
+/\w+/8
+ 12 34
+ 0: 12
+ *** Failers
+ 0: Failers
+ +++=*!
+No match
+
+/\w{2,3}/8
+ ab cd
+ 0: ab
+ abcd ce
+ 0: abc
+ *** Failers
+ 0: Fai
+ a.b.c
+No match
+
+/\w{2,3}?/8
+ ab cd
+ 0: ab
+ abcd ce
+ 0: ab
+ *** Failers
+ 0: Fa
+ a.b.c
+No match
+
+/\W+/8
+ 12====34
+ 0: ====
+ *** Failers
+ 0: ***
+ abcd
+No match
+
+/\W{2,3}/8
+ ab====cd
+ 0: ===
+ ab==cd
+ 0: ==
+ *** Failers
+ 0: ***
+ a.b.c
+No match
+
+/\W{2,3}?/8
+ ab====cd
+ 0: ==
+ ab==cd
+ 0: ==
+ *** Failers
+ 0: **
+ a.b.c
+No match
+
+/[\x{100}]/8
+ \x{100}
+ 0: \x{100}
+ Z\x{100}
+ 0: \x{100}
+ \x{100}Z
+ 0: \x{100}
+ *** Failers
+No match
+
+/[Z\x{100}]/8
+ Z\x{100}
+ 0: Z
+ \x{100}
+ 0: \x{100}
+ \x{100}Z
+ 0: \x{100}
+ *** Failers
+No match
+
+/[\x{100}\x{200}]/8
+ ab\x{100}cd
+ 0: \x{100}
+ ab\x{200}cd
+ 0: \x{200}
+ *** Failers
+No match
+
+/[\x{100}-\x{200}]/8
+ ab\x{100}cd
+ 0: \x{100}
+ ab\x{200}cd
+ 0: \x{200}
+ ab\x{111}cd
+ 0: \x{111}
+ *** Failers
+No match
+
+/[z-\x{200}]/8
+ ab\x{100}cd
+ 0: \x{100}
+ ab\x{200}cd
+ 0: \x{200}
+ ab\x{111}cd
+ 0: \x{111}
+ abzcd
+ 0: z
+ ab|cd
+ 0: |
+ *** Failers
+No match
+
+/[Q\x{100}\x{200}]/8
+ ab\x{100}cd
+ 0: \x{100}
+ ab\x{200}cd
+ 0: \x{200}
+ Q?
+ 0: Q
+ *** Failers
+No match
+
+/[Q\x{100}-\x{200}]/8
+ ab\x{100}cd
+ 0: \x{100}
+ ab\x{200}cd
+ 0: \x{200}
+ ab\x{111}cd
+ 0: \x{111}
+ Q?
+ 0: Q
+ *** Failers
+No match
+
+/[Qz-\x{200}]/8
+ ab\x{100}cd
+ 0: \x{100}
+ ab\x{200}cd
+ 0: \x{200}
+ ab\x{111}cd
+ 0: \x{111}
+ abzcd
+ 0: z
+ ab|cd
+ 0: |
+ Q?
+ 0: Q
+ *** Failers
+No match
+
+/[\x{100}\x{200}]{1,3}/8
+ ab\x{100}cd
+ 0: \x{100}
+ ab\x{200}cd
+ 0: \x{200}
+ ab\x{200}\x{100}\x{200}\x{100}cd
+ 0: \x{200}\x{100}\x{200}
+ *** Failers
+No match
+
+/[\x{100}\x{200}]{1,3}?/8
+ ab\x{100}cd
+ 0: \x{100}
+ ab\x{200}cd
+ 0: \x{200}
+ ab\x{200}\x{100}\x{200}\x{100}cd
+ 0: \x{200}
+ *** Failers
+No match
+
+/[Q\x{100}\x{200}]{1,3}/8
+ ab\x{100}cd
+ 0: \x{100}
+ ab\x{200}cd
+ 0: \x{200}
+ ab\x{200}\x{100}\x{200}\x{100}cd
+ 0: \x{200}\x{100}\x{200}
+ *** Failers
+No match
+
+/[Q\x{100}\x{200}]{1,3}?/8
+ ab\x{100}cd
+ 0: \x{100}
+ ab\x{200}cd
+ 0: \x{200}
+ ab\x{200}\x{100}\x{200}\x{100}cd
+ 0: \x{200}
+ *** Failers
+No match
+
+/(?<=[\x{100}\x{200}])X/8
+ abc\x{200}X
+ 0: X
+ abc\x{100}X
+ 0: X
+ *** Failers
+No match
+ X
+No match
+
+/(?<=[Q\x{100}\x{200}])X/8
+ abc\x{200}X
+ 0: X
+ abc\x{100}X
+ 0: X
+ abQX
+ 0: X
+ *** Failers
+No match
+ X
+No match
+
+/(?<=[\x{100}\x{200}]{3})X/8
+ abc\x{100}\x{200}\x{100}X
+ 0: X
+ *** Failers
+No match
+ abc\x{200}X
+No match
+ X
+No match
+
+/[^\x{100}\x{200}]X/8
+ AX
+ 0: AX
+ \x{150}X
+ 0: \x{150}X
+ \x{500}X
+ 0: \x{500}X
+ *** Failers
+No match
+ \x{100}X
+No match
+ \x{200}X
+No match
+
+/[^Q\x{100}\x{200}]X/8
+ AX
+ 0: AX
+ \x{150}X
+ 0: \x{150}X
+ \x{500}X
+ 0: \x{500}X
+ *** Failers
+No match
+ \x{100}X
+No match
+ \x{200}X
+No match
+ QX
+No match
+
+/[^\x{100}-\x{200}]X/8
+ AX
+ 0: AX
+ \x{500}X
+ 0: \x{500}X
+ *** Failers
+No match
+ \x{100}X
+No match
+ \x{150}X
+No match
+ \x{200}X
+No match
+
+/a\Cb/
+ aXb
+ 0: aXb
+ a\nb
+ 0: a\x0ab
+
+/a\Cb/8
+ aXb
+ 0: aXb
+ a\nb
+ 0: a\x{0a}b
+ *** Failers
+No match
+ a\x{100}b
+No match
+
+/[z-\x{100}]/8i
+ z
+ 0: z
+ Z
+ 0: Z
+ \x{100}
+ 0: \x{100}
+ *** Failers
+No match
+ \x{102}
+No match
+ y
+No match
+
+/[\xFF]/
+ >\xff<
+ 0: \xff
+
+/[\xff]/8
+ >\x{ff}<
+ 0: \x{ff}
+
+/[^\xFF]/
+ XYZ
+ 0: X
+
+/[^\xff]/8
+ XYZ
+ 0: X
+ \x{123}
+ 0: \x{123}
+
+/^[ac]*b/8
+ xb
+No match
+
+/^[ac\x{100}]*b/8
+ xb
+No match
+
+/^[^x]*b/8i
+ xb
+No match
+
+/^[^x]*b/8
+ xb
+No match
+
+/^\d*b/8
+ xb
+No match
+
+/(|a)/g8
+ catac
+ 0:
+ 1:
+ 0:
+ 1:
+ 0: a
+ 1: a
+ 0:
+ 1:
+ 0:
+ 1:
+ 0: a
+ 1: a
+ 0:
+ 1:
+ 0:
+ 1:
+ a\x{256}a
+ 0:
+ 1:
+ 0: a
+ 1: a
+ 0:
+ 1:
+ 0:
+ 1:
+ 0: a
+ 1: a
+ 0:
+ 1:
+
+/^\x{85}$/8i
+ \x{85}
+ 0: \x{85}
+
+/ End of testinput4 /
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testoutput5 b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testoutput5
new file mode 100644
index 00000000..b010957b
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testoutput5
@@ -0,0 +1,1075 @@
+PCRE version 5.0 13-Sep-2004
+
+/\x{100}/8DM
+Memory allocation (code space): 10
+------------------------------------------------------------------
+ 0 6 Bra 0
+ 3 \x{100}
+ 6 6 Ket
+ 9 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8
+First char = 196
+Need char = 128
+
+/\x{1000}/8DM
+Memory allocation (code space): 11
+------------------------------------------------------------------
+ 0 7 Bra 0
+ 3 \x{1000}
+ 7 7 Ket
+ 10 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8
+First char = 225
+Need char = 128
+
+/\x{10000}/8DM
+Memory allocation (code space): 12
+------------------------------------------------------------------
+ 0 8 Bra 0
+ 3 \x{10000}
+ 8 8 Ket
+ 11 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8
+First char = 240
+Need char = 128
+
+/\x{100000}/8DM
+Memory allocation (code space): 12
+------------------------------------------------------------------
+ 0 8 Bra 0
+ 3 \x{100000}
+ 8 8 Ket
+ 11 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8
+First char = 244
+Need char = 128
+
+/\x{1000000}/8DM
+Memory allocation (code space): 13
+------------------------------------------------------------------
+ 0 9 Bra 0
+ 3 \x{1000000}
+ 9 9 Ket
+ 12 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8
+First char = 249
+Need char = 128
+
+/\x{4000000}/8DM
+Memory allocation (code space): 14
+------------------------------------------------------------------
+ 0 10 Bra 0
+ 3 \x{4000000}
+ 10 10 Ket
+ 13 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8
+First char = 252
+Need char = 128
+
+/\x{7fffFFFF}/8DM
+Memory allocation (code space): 14
+------------------------------------------------------------------
+ 0 10 Bra 0
+ 3 \x{7fffffff}
+ 10 10 Ket
+ 13 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8
+First char = 253
+Need char = 191
+
+/[\x{ff}]/8DM
+Memory allocation (code space): 10
+------------------------------------------------------------------
+ 0 6 Bra 0
+ 3 \x{ff}
+ 6 6 Ket
+ 9 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8
+First char = 195
+Need char = 191
+
+/[\x{100}]/8DM
+Memory allocation (code space): 47
+------------------------------------------------------------------
+ 0 11 Bra 0
+ 3 [\x{100}]
+ 11 11 Ket
+ 14 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8
+No first char
+No need char
+
+/\x{ffffffff}/8
+Failed: character value in \x{...} sequence is too large at offset 11
+
+/\x{100000000}/8
+Failed: character value in \x{...} sequence is too large at offset 12
+
+/^\x{100}a\x{1234}/8
+ \x{100}a\x{1234}bcd
+ 0: \x{100}a\x{1234}
+
+/\x80/8D
+------------------------------------------------------------------
+ 0 6 Bra 0
+ 3 \x{80}
+ 6 6 Ket
+ 9 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8
+First char = 194
+Need char = 128
+
+/\xff/8D
+------------------------------------------------------------------
+ 0 6 Bra 0
+ 3 \x{ff}
+ 6 6 Ket
+ 9 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8
+First char = 195
+Need char = 191
+
+/\x{0041}\x{2262}\x{0391}\x{002e}/D8
+------------------------------------------------------------------
+ 0 14 Bra 0
+ 3 A\x{2262}\x{391}.
+ 14 14 Ket
+ 17 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8
+First char = 'A'
+Need char = '.'
+ \x{0041}\x{2262}\x{0391}\x{002e}
+ 0: A\x{2262}\x{391}.
+
+/\x{D55c}\x{ad6d}\x{C5B4}/D8
+------------------------------------------------------------------
+ 0 15 Bra 0
+ 3 \x{d55c}\x{ad6d}\x{c5b4}
+ 15 15 Ket
+ 18 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8
+First char = 237
+Need char = 180
+ \x{D55c}\x{ad6d}\x{C5B4}
+ 0: \x{d55c}\x{ad6d}\x{c5b4}
+
+/\x{65e5}\x{672c}\x{8a9e}/D8
+------------------------------------------------------------------
+ 0 15 Bra 0
+ 3 \x{65e5}\x{672c}\x{8a9e}
+ 15 15 Ket
+ 18 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8
+First char = 230
+Need char = 158
+ \x{65e5}\x{672c}\x{8a9e}
+ 0: \x{65e5}\x{672c}\x{8a9e}
+
+/\x{80}/D8
+------------------------------------------------------------------
+ 0 6 Bra 0
+ 3 \x{80}
+ 6 6 Ket
+ 9 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8
+First char = 194
+Need char = 128
+
+/\x{084}/D8
+------------------------------------------------------------------
+ 0 6 Bra 0
+ 3 \x{84}
+ 6 6 Ket
+ 9 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8
+First char = 194
+Need char = 132
+
+/\x{104}/D8
+------------------------------------------------------------------
+ 0 6 Bra 0
+ 3 \x{104}
+ 6 6 Ket
+ 9 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8
+First char = 196
+Need char = 132
+
+/\x{861}/D8
+------------------------------------------------------------------
+ 0 7 Bra 0
+ 3 \x{861}
+ 7 7 Ket
+ 10 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8
+First char = 224
+Need char = 161
+
+/\x{212ab}/D8
+------------------------------------------------------------------
+ 0 8 Bra 0
+ 3 \x{212ab}
+ 8 8 Ket
+ 11 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8
+First char = 240
+Need char = 171
+
+/.{3,5}X/D8
+------------------------------------------------------------------
+ 0 13 Bra 0
+ 3 Any{3}
+ 7 Any{0,2}
+ 11 X
+ 13 13 Ket
+ 16 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Partial matching not supported
+Options: utf8
+No first char
+Need char = 'X'
+ \x{212ab}\x{212ab}\x{212ab}\x{861}X
+ 0: \x{212ab}\x{212ab}\x{212ab}\x{861}X
+
+
+/.{3,5}?/D8
+------------------------------------------------------------------
+ 0 11 Bra 0
+ 3 Any{3}
+ 7 Any{0,2}?
+ 11 11 Ket
+ 14 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Partial matching not supported
+Options: utf8
+No first char
+No need char
+ \x{212ab}\x{212ab}\x{212ab}\x{861}
+ 0: \x{212ab}\x{212ab}\x{212ab}
+
+/-- These tests are here rather than in testinput4 because Perl 5.6 has --/
+/-- some problems with UTF-8 support, in the area of \x{..} where the --/
+No match
+/-- value is < 255. It grumbles about invalid UTF-8 strings. --/
+No match
+
+/^[a\x{c0}]b/8
+ \x{c0}b
+ 0: \x{c0}b
+
+/^([a\x{c0}]*?)aa/8
+ a\x{c0}aaaa/
+ 0: a\x{c0}aa
+ 1: a\x{c0}
+
+/^([a\x{c0}]*?)aa/8
+ a\x{c0}aaaa/
+ 0: a\x{c0}aa
+ 1: a\x{c0}
+ a\x{c0}a\x{c0}aaa/
+ 0: a\x{c0}a\x{c0}aa
+ 1: a\x{c0}a\x{c0}
+
+/^([a\x{c0}]*)aa/8
+ a\x{c0}aaaa/
+ 0: a\x{c0}aaaa
+ 1: a\x{c0}aa
+ a\x{c0}a\x{c0}aaa/
+ 0: a\x{c0}a\x{c0}aaa
+ 1: a\x{c0}a\x{c0}a
+
+/^([a\x{c0}]*)a\x{c0}/8
+ a\x{c0}aaaa/
+ 0: a\x{c0}
+ 1:
+ a\x{c0}a\x{c0}aaa/
+ 0: a\x{c0}a\x{c0}
+ 1: a\x{c0}
+
+/-- --/
+
+/(?<=\C)X/8
+Failed: \C not allowed in lookbehind assertion at offset 6
+
+/-- This one is here not because it's different to Perl, but because the --/
+/-- way the captured single-byte is displayed. (In Perl it becomes a --/
+No match
+/-- character, and you can't tell the difference.) --/
+No match
+
+/X(\C)(.*)/8
+ X\x{1234}
+ 0: X\x{1234}
+ 1: \xe1
+ 2: \x88\xb4
+ X\nabc
+ 0: X\x{0a}abc
+ 1: \x{0a}
+ 2: abc
+
+/^[ab]/8D
+------------------------------------------------------------------
+ 0 37 Bra 0
+ 3 ^
+ 4 [ab]
+ 37 37 Ket
+ 40 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: anchored utf8
+No first char
+No need char
+ bar
+ 0: b
+ *** Failers
+No match
+ c
+No match
+ \x{ff}
+No match
+ \x{100}
+No match
+
+/^[^ab]/8D
+------------------------------------------------------------------
+ 0 37 Bra 0
+ 3 ^
+ 4 [\x00-`c-\xff] (neg)
+ 37 37 Ket
+ 40 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: anchored utf8
+No first char
+No need char
+ c
+ 0: c
+ \x{ff}
+ 0: \x{ff}
+ \x{100}
+ 0: \x{100}
+ *** Failers
+ 0: *
+ aaa
+No match
+
+/[^ab\xC0-\xF0]/8SD
+------------------------------------------------------------------
+ 0 36 Bra 0
+ 3 [\x00-`c-\xbf\xf1-\xff] (neg)
+ 36 36 Ket
+ 39 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8
+No first char
+No need char
+Starting byte set: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0a
+ \x0b \x0c \x0d \x0e \x0f \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19
+ \x1a \x1b \x1c \x1d \x1e \x1f \x20 ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4
+ 5 6 7 8 9 : ; < = > ? @ 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 [ \ ] ^ _ ` c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ \x7f
+ \xc2 \xc3 \xc4 \xc5 \xc6 \xc7 \xc8 \xc9 \xca \xcb \xcc \xcd \xce \xcf \xd0
+ \xd1 \xd2 \xd3 \xd4 \xd5 \xd6 \xd7 \xd8 \xd9 \xda \xdb \xdc \xdd \xde \xdf
+ \xe0 \xe1 \xe2 \xe3 \xe4 \xe5 \xe6 \xe7 \xe8 \xe9 \xea \xeb \xec \xed \xee
+ \xef \xf0 \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb \xfc \xfd
+ \xfe \xff
+ \x{f1}
+ 0: \x{f1}
+ \x{bf}
+ 0: \x{bf}
+ \x{100}
+ 0: \x{100}
+ \x{1000}
+ 0: \x{1000}
+ *** Failers
+ 0: *
+ \x{c0}
+No match
+ \x{f0}
+No match
+
+/Ä€{3,4}/8SD
+------------------------------------------------------------------
+ 0 13 Bra 0
+ 3 \x{100}{3}
+ 8 \x{100}{,1}
+ 13 13 Ket
+ 16 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Partial matching not supported
+Options: utf8
+First char = 196
+Need char = 128
+Study returned NULL
+ \x{100}\x{100}\x{100}\x{100\x{100}
+ 0: \x{100}\x{100}\x{100}
+
+/(\x{100}+|x)/8SD
+------------------------------------------------------------------
+ 0 17 Bra 0
+ 3 6 Bra 1
+ 6 \x{100}+
+ 9 5 Alt
+ 12 x
+ 14 11 Ket
+ 17 17 Ket
+ 20 End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Partial matching not supported
+Options: utf8
+No first char
+No need char
+Starting byte set: x \xc4
+
+/(\x{100}*a|x)/8SD
+------------------------------------------------------------------
+ 0 19 Bra 0
+ 3 8 Bra 1
+ 6 \x{100}*
+ 9 a
+ 11 5 Alt
+ 14 x
+ 16 13 Ket
+ 19 19 Ket
+ 22 End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Partial matching not supported
+Options: utf8
+No first char
+No need char
+Starting byte set: a x \xc4
+
+/(\x{100}{0,2}a|x)/8SD
+------------------------------------------------------------------
+ 0 21 Bra 0
+ 3 10 Bra 1
+ 6 \x{100}{,2}
+ 11 a
+ 13 5 Alt
+ 16 x
+ 18 15 Ket
+ 21 21 Ket
+ 24 End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Partial matching not supported
+Options: utf8
+No first char
+No need char
+Starting byte set: a x \xc4
+
+/(\x{100}{1,2}a|x)/8SD
+------------------------------------------------------------------
+ 0 24 Bra 0
+ 3 13 Bra 1
+ 6 \x{100}
+ 9 \x{100}{,1}
+ 14 a
+ 16 5 Alt
+ 19 x
+ 21 18 Ket
+ 24 24 Ket
+ 27 End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Partial matching not supported
+Options: utf8
+No first char
+No need char
+Starting byte set: x \xc4
+
+/\x{100}*(\d+|"(?1)")/8
+ 1234
+ 0: 1234
+ 1: 1234
+ "1234"
+ 0: "1234"
+ 1: "1234"
+ \x{100}1234
+ 0: \x{100}1234
+ 1: 1234
+ "\x{100}1234"
+ 0: \x{100}1234
+ 1: 1234
+ \x{100}\x{100}12ab
+ 0: \x{100}\x{100}12
+ 1: 12
+ \x{100}\x{100}"12"
+ 0: \x{100}\x{100}"12"
+ 1: "12"
+ *** Failers
+No match
+ \x{100}\x{100}abcd
+No match
+
+/\x{100}/8D
+------------------------------------------------------------------
+ 0 6 Bra 0
+ 3 \x{100}
+ 6 6 Ket
+ 9 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8
+First char = 196
+Need char = 128
+
+/\x{100}*/8D
+------------------------------------------------------------------
+ 0 6 Bra 0
+ 3 \x{100}*
+ 6 6 Ket
+ 9 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Partial matching not supported
+Options: utf8
+No first char
+No need char
+
+/a\x{100}*/8D
+------------------------------------------------------------------
+ 0 8 Bra 0
+ 3 a
+ 5 \x{100}*
+ 8 8 Ket
+ 11 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Partial matching not supported
+Options: utf8
+First char = 'a'
+No need char
+
+/ab\x{100}*/8D
+------------------------------------------------------------------
+ 0 10 Bra 0
+ 3 ab
+ 7 \x{100}*
+ 10 10 Ket
+ 13 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Partial matching not supported
+Options: utf8
+First char = 'a'
+Need char = 'b'
+
+/a\x{100}\x{101}*/8D
+------------------------------------------------------------------
+ 0 11 Bra 0
+ 3 a\x{100}
+ 8 \x{101}*
+ 11 11 Ket
+ 14 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Partial matching not supported
+Options: utf8
+First char = 'a'
+Need char = 128
+
+/a\x{100}\x{101}+/8D
+------------------------------------------------------------------
+ 0 11 Bra 0
+ 3 a\x{100}
+ 8 \x{101}+
+ 11 11 Ket
+ 14 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Partial matching not supported
+Options: utf8
+First char = 'a'
+Need char = 129
+
+/\x{100}*A/8D
+------------------------------------------------------------------
+ 0 8 Bra 0
+ 3 \x{100}*
+ 6 A
+ 8 8 Ket
+ 11 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Partial matching not supported
+Options: utf8
+No first char
+Need char = 'A'
+ A
+ 0: A
+
+/\x{100}*\d(?R)/8D
+------------------------------------------------------------------
+ 0 10 Bra 0
+ 3 \x{100}*
+ 6 \d
+ 7 0 Recurse
+ 10 10 Ket
+ 13 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Partial matching not supported
+Options: utf8
+No first char
+No need char
+
+/[^\x{c4}]/D
+------------------------------------------------------------------
+ 0 36 Bra 0
+ 3 [\x01-35-bd-z|~-\xff] (neg)
+ 36 36 Ket
+ 39 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+No options
+No first char
+No need char
+
+/[^\x{c4}]/8D
+------------------------------------------------------------------
+ 0 36 Bra 0
+ 3 [\x00-\xc3\xc5-\xff] (neg)
+ 36 36 Ket
+ 39 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8
+No first char
+No need char
+
+/[\x{100}]/8DM
+Memory allocation (code space): 47
+------------------------------------------------------------------
+ 0 11 Bra 0
+ 3 [\x{100}]
+ 11 11 Ket
+ 14 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8
+No first char
+No need char
+ \x{100}
+ 0: \x{100}
+ Z\x{100}
+ 0: \x{100}
+ \x{100}Z
+ 0: \x{100}
+ *** Failers
+No match
+
+/[Z\x{100}]/8DM
+Memory allocation (code space): 47
+------------------------------------------------------------------
+ 0 43 Bra 0
+ 3 [Z\x{100}]
+ 43 43 Ket
+ 46 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8
+No first char
+No need char
+ Z\x{100}
+ 0: Z
+ \x{100}
+ 0: \x{100}
+ \x{100}Z
+ 0: \x{100}
+ *** Failers
+No match
+
+/[\x{200}-\x{100}]/8
+Failed: range out of order in character class at offset 15
+
+/[Ä€-Ä„]/8
+ \x{100}
+ 0: \x{100}
+ \x{104}
+ 0: \x{104}
+ *** Failers
+No match
+ \x{105}
+No match
+ \x{ff}
+No match
+
+/[z-\x{100}]/8D
+------------------------------------------------------------------
+ 0 12 Bra 0
+ 3 [z-\x{100}]
+ 12 12 Ket
+ 15 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8
+No first char
+No need char
+
+/[z\Qa-d]Ä€\E]/8D
+------------------------------------------------------------------
+ 0 43 Bra 0
+ 3 [\-\]adz\x{100}]
+ 43 43 Ket
+ 46 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8
+No first char
+No need char
+ \x{100}
+ 0: \x{100}
+ Ā
+ 0: \x{100}
+
+/[\xFF]/D
+------------------------------------------------------------------
+ 0 5 Bra 0
+ 3 \xff
+ 5 5 Ket
+ 8 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+No options
+First char = 255
+No need char
+ >\xff<
+ 0: \xff
+
+/[\xff]/D8
+------------------------------------------------------------------
+ 0 6 Bra 0
+ 3 \x{ff}
+ 6 6 Ket
+ 9 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8
+First char = 195
+Need char = 191
+ >\x{ff}<
+ 0: \x{ff}
+
+/[^\xFF]/D
+------------------------------------------------------------------
+ 0 5 Bra 0
+ 3 [^\xff]
+ 5 5 Ket
+ 8 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+No options
+No first char
+No need char
+
+/[^\xff]/8D
+------------------------------------------------------------------
+ 0 36 Bra 0
+ 3 [\x00-\xfe] (neg)
+ 36 36 Ket
+ 39 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8
+No first char
+No need char
+
+/[Ä-Ü]/8
+ Ö # Matches without Study
+ 0: \x{d6}
+ \x{d6}
+ 0: \x{d6}
+
+/[Ä-Ü]/8S
+ Ö <-- Same with Study
+ 0: \x{d6}
+ \x{d6}
+ 0: \x{d6}
+
+/[\x{c4}-\x{dc}]/8
+ Ö # Matches without Study
+ 0: \x{d6}
+ \x{d6}
+ 0: \x{d6}
+
+/[\x{c4}-\x{dc}]/8S
+ Ö <-- Same with Study
+ 0: \x{d6}
+ \x{d6}
+ 0: \x{d6}
+
+/[Ã]/8
+Failed: invalid UTF-8 string at offset 2
+
+/Ã/8
+Failed: invalid UTF-8 string at offset 0
+
+/ÃÃÃxxx/8
+Failed: invalid UTF-8 string at offset 1
+
+/ÃÃÃxxx/8?D
+------------------------------------------------------------------
+ 0 15 Bra 0
+ 3 \X{c0}\X{c0}\X{c0}xxx
+ 15 15 Ket
+ 18 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8 no_utf8_check
+First char = 195
+Need char = 'x'
+
+/abc/8
+ Ã]
+Error -10
+ Ã
+Error -10
+ ÃÃÃ
+Error -10
+ ÃÃÃ\?
+No match
+
+/anything/8
+ \xc0\x80
+Error -10
+ \xc1\x8f
+Error -10
+ \xe0\x9f\x80
+Error -10
+ \xf0\x8f\x80\x80
+Error -10
+ \xf8\x87\x80\x80\x80
+Error -10
+ \xfc\x83\x80\x80\x80\x80
+Error -10
+ \xfe\x80\x80\x80\x80\x80
+Error -10
+ \xff\x80\x80\x80\x80\x80
+Error -10
+ \xc3\x8f
+No match
+ \xe0\xaf\x80
+No match
+ \xe1\x80\x80
+No match
+ \xf0\x9f\x80\x80
+No match
+ \xf1\x8f\x80\x80
+No match
+ \xf8\x88\x80\x80\x80
+No match
+ \xf9\x87\x80\x80\x80
+No match
+ \xfc\x84\x80\x80\x80\x80
+No match
+ \xfd\x83\x80\x80\x80\x80
+No match
+
+/\x{100}abc(xyz(?1))/8D
+------------------------------------------------------------------
+ 0 27 Bra 0
+ 3 \x{100}abc
+ 12 12 Bra 1
+ 15 xyz
+ 21 12 Recurse
+ 24 12 Ket
+ 27 27 Ket
+ 30 End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Options: utf8
+First char = 196
+Need char = 'z'
+
+/[^\x{100}]abc(xyz(?1))/8D
+------------------------------------------------------------------
+ 0 32 Bra 0
+ 3 [^\x{100}]
+ 11 abc
+ 17 12 Bra 1
+ 20 xyz
+ 26 17 Recurse
+ 29 12 Ket
+ 32 32 Ket
+ 35 End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Options: utf8
+No first char
+Need char = 'z'
+
+/[ab\x{100}]abc(xyz(?1))/8D
+------------------------------------------------------------------
+ 0 64 Bra 0
+ 3 [ab\x{100}]
+ 43 abc
+ 49 12 Bra 1
+ 52 xyz
+ 58 49 Recurse
+ 61 12 Ket
+ 64 64 Ket
+ 67 End
+------------------------------------------------------------------
+Capturing subpattern count = 1
+Options: utf8
+No first char
+Need char = 'z'
+
+/(\x{100}(b(?2)c))?/D8
+------------------------------------------------------------------
+ 0 26 Bra 0
+ 3 Brazero
+ 4 19 Bra 1
+ 7 \x{100}
+ 10 10 Bra 2
+ 13 b
+ 15 10 Recurse
+ 18 c
+ 20 10 Ket
+ 23 19 Ket
+ 26 26 Ket
+ 29 End
+------------------------------------------------------------------
+Capturing subpattern count = 2
+Options: utf8
+No first char
+No need char
+
+/(\x{100}(b(?2)c)){0,2}/D8
+------------------------------------------------------------------
+ 0 55 Bra 0
+ 3 Brazero
+ 4 48 Bra 0
+ 7 19 Bra 1
+ 10 \x{100}
+ 13 10 Bra 2
+ 16 b
+ 18 13 Recurse
+ 21 c
+ 23 10 Ket
+ 26 19 Ket
+ 29 Brazero
+ 30 19 Bra 1
+ 33 \x{100}
+ 36 10 Bra 2
+ 39 b
+ 41 13 Recurse
+ 44 c
+ 46 10 Ket
+ 49 19 Ket
+ 52 48 Ket
+ 55 55 Ket
+ 58 End
+------------------------------------------------------------------
+Capturing subpattern count = 2
+Options: utf8
+No first char
+No need char
+
+/(\x{100}(b(?1)c))?/D8
+------------------------------------------------------------------
+ 0 26 Bra 0
+ 3 Brazero
+ 4 19 Bra 1
+ 7 \x{100}
+ 10 10 Bra 2
+ 13 b
+ 15 4 Recurse
+ 18 c
+ 20 10 Ket
+ 23 19 Ket
+ 26 26 Ket
+ 29 End
+------------------------------------------------------------------
+Capturing subpattern count = 2
+Options: utf8
+No first char
+No need char
+
+/(\x{100}(b(?1)c)){0,2}/D8
+------------------------------------------------------------------
+ 0 55 Bra 0
+ 3 Brazero
+ 4 48 Bra 0
+ 7 19 Bra 1
+ 10 \x{100}
+ 13 10 Bra 2
+ 16 b
+ 18 7 Recurse
+ 21 c
+ 23 10 Ket
+ 26 19 Ket
+ 29 Brazero
+ 30 19 Bra 1
+ 33 \x{100}
+ 36 10 Bra 2
+ 39 b
+ 41 7 Recurse
+ 44 c
+ 46 10 Ket
+ 49 19 Ket
+ 52 48 Ket
+ 55 55 Ket
+ 58 End
+------------------------------------------------------------------
+Capturing subpattern count = 2
+Options: utf8
+No first char
+No need char
+
+/\W/8
+ A.B
+ 0: .
+ A\x{100}B
+ 0: \x{100}
+
+/\w/8
+ \x{100}X
+ 0: X
+
+/ End of testinput5 /
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testoutput6 b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testoutput6
new file mode 100644
index 00000000..732e5aa0
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/testdata/testoutput6
@@ -0,0 +1,1013 @@
+PCRE version 5.0 13-Sep-2004
+
+/^\pC\pL\pM\pN\pP\pS\pZ</8
+ \x7f\x{c0}\x{30f}\x{660}\x{66c}\x{f01}\x{1680}<
+ 0: \x{7f}\x{c0}\x{30f}\x{660}\x{66c}\x{f01}\x{1680}<
+ \np\x{300}9!\$ <
+ 0: \x{0a}p\x{300}9!$ <
+ ** Failers
+No match
+ ap\x{300}9!\$ <
+No match
+
+/^\PC/8
+ X
+ 0: X
+ ** Failers
+ 0: *
+ \x7f
+No match
+
+/^\PL/8
+ 9
+ 0: 9
+ ** Failers
+ 0: *
+ \x{c0}
+No match
+
+/^\PM/8
+ X
+ 0: X
+ ** Failers
+ 0: *
+ \x{30f}
+No match
+
+/^\PN/8
+ X
+ 0: X
+ ** Failers
+ 0: *
+ \x{660}
+No match
+
+/^\PP/8
+ X
+ 0: X
+ ** Failers
+No match
+ \x{66c}
+No match
+
+/^\PS/8
+ X
+ 0: X
+ ** Failers
+ 0: *
+ \x{f01}
+No match
+
+/^\PZ/8
+ X
+ 0: X
+ ** Failers
+ 0: *
+ \x{1680}
+No match
+
+/^\p{Cc}/8
+ \x{017}
+ 0: \x{17}
+ \x{09f}
+ 0: \x{9f}
+ ** Failers
+No match
+ \x{0600}
+No match
+
+/^\p{Cf}/8
+ \x{601}
+ 0: \x{601}
+ ** Failers
+No match
+ \x{09f}
+No match
+
+/^\p{Cn}/8
+ ** Failers
+No match
+ \x{09f}
+No match
+
+/^\p{Co}/8
+ \x{f8ff}
+ 0: \x{f8ff}
+ ** Failers
+No match
+ \x{09f}
+No match
+
+/^\p{Cs}/8
+ \x{dfff}
+ 0: \x{dfff}
+ ** Failers
+No match
+ \x{09f}
+No match
+
+/^\p{Ll}/8
+ a
+ 0: a
+ ** Failers
+No match
+ Z
+No match
+ \x{dfff}
+No match
+
+/^\p{Lm}/8
+ \x{2b0}
+ 0: \x{2b0}
+ ** Failers
+No match
+ a
+No match
+
+/^\p{Lo}/8
+ \x{1bb}
+ 0: \x{1bb}
+ ** Failers
+No match
+ a
+No match
+ \x{2b0}
+No match
+
+/^\p{Lt}/8
+ \x{1c5}
+ 0: \x{1c5}
+ ** Failers
+No match
+ a
+No match
+ \x{2b0}
+No match
+
+/^\p{Lu}/8
+ A
+ 0: A
+ ** Failers
+No match
+ \x{2b0}
+No match
+
+/^\p{Mc}/8
+ \x{903}
+ 0: \x{903}
+ ** Failers
+No match
+ X
+No match
+ \x{300}
+No match
+
+/^\p{Me}/8
+ \x{488}
+ 0: \x{488}
+ ** Failers
+No match
+ X
+No match
+ \x{903}
+No match
+ \x{300}
+No match
+
+/^\p{Mn}/8
+ \x{300}
+ 0: \x{300}
+ ** Failers
+No match
+ X
+No match
+ \x{903}
+No match
+
+/^\p{Nd}+/8
+ 0123456789\x{660}\x{661}\x{662}\x{663}\x{664}\x{665}\x{666}\x{667}\x{668}\x{669}\x{66a}
+ 0: 0123456789\x{660}\x{661}\x{662}\x{663}\x{664}\x{665}\x{666}\x{667}\x{668}\x{669}
+ \x{6f0}\x{6f1}\x{6f2}\x{6f3}\x{6f4}\x{6f5}\x{6f6}\x{6f7}\x{6f8}\x{6f9}\x{6fa}
+ 0: \x{6f0}\x{6f1}\x{6f2}\x{6f3}\x{6f4}\x{6f5}\x{6f6}\x{6f7}\x{6f8}\x{6f9}
+ \x{966}\x{967}\x{968}\x{969}\x{96a}\x{96b}\x{96c}\x{96d}\x{96e}\x{96f}\x{970}
+ 0: \x{966}\x{967}\x{968}\x{969}\x{96a}\x{96b}\x{96c}\x{96d}\x{96e}\x{96f}
+ ** Failers
+No match
+ X
+No match
+
+/^\p{Nl}/8
+ \x{16ee}
+ 0: \x{16ee}
+ ** Failers
+No match
+ X
+No match
+ \x{966}
+No match
+
+/^\p{No}/8
+ \x{b2}
+ 0: \x{b2}
+ \x{b3}
+ 0: \x{b3}
+ ** Failers
+No match
+ X
+No match
+ \x{16ee}
+No match
+
+/^\p{Pc}/8
+ \x5f
+ 0: _
+ \x{203f}
+ 0: \x{203f}
+ ** Failers
+No match
+ X
+No match
+ -
+No match
+ \x{58a}
+No match
+
+/^\p{Pd}/8
+ -
+ 0: -
+ \x{58a}
+ 0: \x{58a}
+ ** Failers
+No match
+ X
+No match
+ \x{203f}
+No match
+
+/^\p{Pe}/8
+ )
+ 0: )
+ ]
+ 0: ]
+ }
+ 0: }
+ \x{f3b}
+ 0: \x{f3b}
+ ** Failers
+No match
+ X
+No match
+ \x{203f}
+No match
+ (
+No match
+ [
+No match
+ {
+No match
+ \x{f3c}
+No match
+
+/^\p{Pf}/8
+ \x{bb}
+ 0: \x{bb}
+ \x{2019}
+ 0: \x{2019}
+ ** Failers
+No match
+ X
+No match
+ \x{203f}
+No match
+
+/^\p{Pi}/8
+ \x{ab}
+ 0: \x{ab}
+ \x{2018}
+ 0: \x{2018}
+ ** Failers
+No match
+ X
+No match
+ \x{203f}
+No match
+
+/^\p{Po}/8
+ !
+ 0: !
+ \x{37e}
+ 0: \x{37e}
+ ** Failers
+ 0: *
+ X
+No match
+ \x{203f}
+No match
+
+/^\p{Ps}/8
+ (
+ 0: (
+ [
+ 0: [
+ {
+ 0: {
+ \x{f3c}
+ 0: \x{f3c}
+ ** Failers
+No match
+ X
+No match
+ )
+No match
+ ]
+No match
+ }
+No match
+ \x{f3b}
+No match
+
+/^\p{Sc}+/8
+ $\x{a2}\x{a3}\x{a4}\x{a5}\x{a6}
+ 0: $\x{a2}\x{a3}\x{a4}\x{a5}
+ \x{9f2}
+ 0: \x{9f2}
+ ** Failers
+No match
+ X
+No match
+ \x{2c2}
+No match
+
+/^\p{Sk}/8
+ \x{2c2}
+ 0: \x{2c2}
+ ** Failers
+No match
+ X
+No match
+ \x{9f2}
+No match
+
+/^\p{Sm}+/8
+ +<|~\x{ac}\x{2044}
+ 0: +<|~\x{ac}\x{2044}
+ ** Failers
+No match
+ X
+No match
+ \x{9f2}
+No match
+
+/^\p{So}/8
+ \x{a6}
+ 0: \x{a6}
+ \x{482}
+ 0: \x{482}
+ ** Failers
+No match
+ X
+No match
+ \x{9f2}
+No match
+
+/^\p{Zl}/8
+ \x{2028}
+ 0: \x{2028}
+ ** Failers
+No match
+ X
+No match
+ \x{2029}
+No match
+
+/^\p{Zp}/8
+ \x{2029}
+ 0: \x{2029}
+ ** Failers
+No match
+ X
+No match
+ \x{2028}
+No match
+
+/^\p{Zs}/8
+ \ \
+ 0:
+ \x{a0}
+ 0: \x{a0}
+ \x{1680}
+ 0: \x{1680}
+ \x{180e}
+ 0: \x{180e}
+ \x{2000}
+ 0: \x{2000}
+ \x{2001}
+ 0: \x{2001}
+ ** Failers
+No match
+ \x{2028}
+No match
+ \x{200d}
+No match
+
+/\p{Nd}+(..)/8
+ \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}AB
+ 1: AB
+
+/\p{Nd}+?(..)/8
+ \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}
+ 1: \x{661}\x{662}
+
+/\p{Nd}{2,}(..)/8
+ \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}AB
+ 1: AB
+
+/\p{Nd}{2,}?(..)/8
+ \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}A
+ 1: \x{662}A
+
+/\p{Nd}*(..)/8
+ \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}AB
+ 1: AB
+
+/\p{Nd}*?(..)/8
+ \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}
+ 1: \x{660}\x{661}
+
+/\p{Nd}{2}(..)/8
+ \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}A
+ 1: \x{662}A
+
+/\p{Nd}{2,3}(..)/8
+ \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}AB
+ 1: AB
+
+/\p{Nd}{2,3}?(..)/8
+ \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}A
+ 1: \x{662}A
+
+/\p{Nd}?(..)/8
+ \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}
+ 1: \x{661}\x{662}
+
+/\p{Nd}??(..)/8
+ \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}
+ 1: \x{660}\x{661}
+
+/\p{Nd}*+(..)/8
+ \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}AB
+ 1: AB
+
+/\p{Nd}*+(...)/8
+ \x{660}\x{661}\x{662}ABC
+ 0: \x{660}\x{661}\x{662}ABC
+ 1: ABC
+
+/\p{Nd}*+(....)/8
+ ** Failers
+ 0: ** F
+ 1: ** F
+ \x{660}\x{661}\x{662}ABC
+No match
+
+/\p{Lu}/8i
+ A
+ 0: A
+ a\x{10a0}B
+ 0: \x{10a0}
+ ** Failers
+ 0: F
+ a
+No match
+ \x{1d00}
+No match
+
+/\p{^Lu}/8i
+ 1234
+ 0: 1
+ ** Failers
+ 0: *
+ ABC
+No match
+
+/\P{Lu}/8i
+ 1234
+ 0: 1
+ ** Failers
+ 0: *
+ ABC
+No match
+
+/(?<=A\p{Nd})XYZ/8
+ A2XYZ
+ 0: XYZ
+ 123A5XYZPQR
+ 0: XYZ
+ ABA\x{660}XYZpqr
+ 0: XYZ
+ ** Failers
+No match
+ AXYZ
+No match
+ XYZ
+No match
+
+/(?<!\pL)XYZ/8
+ 1XYZ
+ 0: XYZ
+ AB=XYZ..
+ 0: XYZ
+ XYZ
+ 0: XYZ
+ ** Failers
+No match
+ WXYZ
+No match
+
+/[\p{L}]/D
+------------------------------------------------------------------
+ 0 10 Bra 0
+ 3 [\p{L}]
+ 10 10 Ket
+ 13 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+No options
+No first char
+No need char
+
+/[\p{^L}]/D
+------------------------------------------------------------------
+ 0 10 Bra 0
+ 3 [\P{L}]
+ 10 10 Ket
+ 13 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+No options
+No first char
+No need char
+
+/[\P{L}]/D
+------------------------------------------------------------------
+ 0 10 Bra 0
+ 3 [\P{L}]
+ 10 10 Ket
+ 13 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+No options
+No first char
+No need char
+
+/[\P{^L}]/D
+------------------------------------------------------------------
+ 0 10 Bra 0
+ 3 [\p{L}]
+ 10 10 Ket
+ 13 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+No options
+No first char
+No need char
+
+/[abc\p{L}\x{0660}]/8D
+------------------------------------------------------------------
+ 0 45 Bra 0
+ 3 [a-c\p{L}\x{660}]
+ 45 45 Ket
+ 48 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8
+No first char
+No need char
+
+/[\p{Nd}]/8DM
+Memory allocation (code space): 46
+------------------------------------------------------------------
+ 0 10 Bra 0
+ 3 [\p{Nd}]
+ 10 10 Ket
+ 13 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8
+No first char
+No need char
+ 1234
+ 0: 1
+
+/[\p{Nd}+-]+/8DM
+Memory allocation (code space): 47
+------------------------------------------------------------------
+ 0 43 Bra 0
+ 3 [+\-\p{Nd}]+
+ 43 43 Ket
+ 46 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Partial matching not supported
+Options: utf8
+No first char
+No need char
+ 1234
+ 0: 1234
+ 12-34
+ 0: 12-34
+ 12+\x{661}-34
+ 0: 12+\x{661}-34
+ ** Failers
+No match
+ abcd
+No match
+
+/[\P{Nd}]+/8
+ abcd
+ 0: abcd
+ ** Failers
+ 0: ** Failers
+ 1234
+No match
+
+/\D+/8
+ 11111111111111111111111111111111111111111111111111111111111111111111111
+No match
+ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/\P{Nd}+/8
+ 11111111111111111111111111111111111111111111111111111111111111111111111
+No match
+ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/[\D]+/8
+ 11111111111111111111111111111111111111111111111111111111111111111111111
+No match
+ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/[\P{Nd}]+/8
+ 11111111111111111111111111111111111111111111111111111111111111111111111
+No match
+ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/[\D\P{Nd}]+/8
+ 11111111111111111111111111111111111111111111111111111111111111111111111
+No match
+ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+
+/\pL/8
+ a
+ 0: a
+ A
+ 0: A
+
+/\pL/8i
+ a
+ 0: a
+ A
+ 0: A
+
+/\p{Lu}/8
+ A
+ 0: A
+ aZ
+ 0: Z
+ ** Failers
+ 0: F
+ abc
+No match
+
+/\p{Lu}/8i
+ A
+ 0: A
+ aZ
+ 0: Z
+ ** Failers
+ 0: F
+ abc
+No match
+
+/\p{Ll}/8
+ a
+ 0: a
+ Az
+ 0: z
+ ** Failers
+ 0: a
+ ABC
+No match
+
+/\p{Ll}/8i
+ a
+ 0: a
+ Az
+ 0: z
+ ** Failers
+ 0: a
+ ABC
+No match
+
+/^\x{c0}$/8i
+ \x{c0}
+ 0: \x{c0}
+ \x{e0}
+ 0: \x{e0}
+
+/^\x{e0}$/8i
+ \x{c0}
+ 0: \x{c0}
+ \x{e0}
+ 0: \x{e0}
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8
+ A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+ 0: A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+ ** Failers
+No match
+ a\x{391}\x{10427}\x{ff3a}\x{1fb0}
+No match
+ A\x{3b1}\x{10427}\x{ff3a}\x{1fb0}
+No match
+ A\x{391}\x{1044F}\x{ff3a}\x{1fb0}
+No match
+ A\x{391}\x{10427}\x{ff5a}\x{1fb0}
+No match
+ A\x{391}\x{10427}\x{ff3a}\x{1fb8}
+No match
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8i
+ A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+ 0: A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+ a\x{391}\x{10427}\x{ff3a}\x{1fb0}
+ 0: a\x{391}\x{10427}\x{ff3a}\x{1fb0}
+ A\x{3b1}\x{10427}\x{ff3a}\x{1fb0}
+ 0: A\x{3b1}\x{10427}\x{ff3a}\x{1fb0}
+ A\x{391}\x{1044F}\x{ff3a}\x{1fb0}
+ 0: A\x{391}\x{1044f}\x{ff3a}\x{1fb0}
+ A\x{391}\x{10427}\x{ff5a}\x{1fb0}
+ 0: A\x{391}\x{10427}\x{ff5a}\x{1fb0}
+ A\x{391}\x{10427}\x{ff3a}\x{1fb8}
+ 0: A\x{391}\x{10427}\x{ff3a}\x{1fb8}
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8iD
+------------------------------------------------------------------
+ 0 21 Bra 0
+ 3 NC A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+ 21 21 Ket
+ 24 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: caseless utf8
+First char = 'A' (caseless)
+No need char
+
+/A\x{391}\x{10427}\x{ff3a}\x{1fb0}/8D
+------------------------------------------------------------------
+ 0 21 Bra 0
+ 3 A\x{391}\x{10427}\x{ff3a}\x{1fb0}
+ 21 21 Ket
+ 24 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8
+First char = 'A'
+Need char = 176
+
+/AB\x{1fb0}/8D
+------------------------------------------------------------------
+ 0 11 Bra 0
+ 3 AB\x{1fb0}
+ 11 11 Ket
+ 14 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: utf8
+First char = 'A'
+Need char = 176
+
+/AB\x{1fb0}/8Di
+------------------------------------------------------------------
+ 0 11 Bra 0
+ 3 NC AB\x{1fb0}
+ 11 11 Ket
+ 14 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: caseless utf8
+First char = 'A' (caseless)
+Need char = 'B' (caseless)
+
+/\x{391}+/8i
+ \x{391}\x{3b1}\x{3b1}\x{3b1}\x{391}
+ 0: \x{391}\x{3b1}\x{3b1}\x{3b1}\x{391}
+
+/\x{391}{3,5}(.)/8i
+ \x{391}\x{3b1}\x{3b1}\x{3b1}\x{391}X
+ 0: \x{391}\x{3b1}\x{3b1}\x{3b1}\x{391}X
+ 1: X
+
+/\x{391}{3,5}?(.)/8i
+ \x{391}\x{3b1}\x{3b1}\x{3b1}\x{391}X
+ 0: \x{391}\x{3b1}\x{3b1}\x{3b1}
+ 1: \x{3b1}
+
+/[\x{391}\x{ff3a}]/8i
+ \x{391}
+ 0: \x{391}
+ \x{ff3a}
+ 0: \x{ff3a}
+ \x{3b1}
+ 0: \x{3b1}
+ \x{ff5a}
+ 0: \x{ff5a}
+
+/[\x{c0}\x{391}]/8i
+ \x{c0}
+ 0: \x{c0}
+ \x{e0}
+ 0: \x{e0}
+
+/[\x{105}-\x{109}]/8iD
+------------------------------------------------------------------
+ 0 13 Bra 0
+ 3 [\x{104}-\x{109}]
+ 13 13 Ket
+ 16 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: caseless utf8
+No first char
+No need char
+ \x{104}
+ 0: \x{104}
+ \x{105}
+ 0: \x{105}
+ \x{109}
+ 0: \x{109}
+ ** Failers
+No match
+ \x{100}
+No match
+ \x{10a}
+No match
+
+/[z-\x{100}]/8iD
+------------------------------------------------------------------
+ 0 20 Bra 0
+ 3 [Z\x{39c}\x{178}z-\x{101}]
+ 20 20 Ket
+ 23 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: caseless utf8
+No first char
+No need char
+ Z
+ 0: Z
+ z
+ 0: z
+ \x{39c}
+ 0: \x{39c}
+ \x{178}
+ 0: \x{178}
+ |
+ 0: |
+ \x{80}
+ 0: \x{80}
+ \x{ff}
+ 0: \x{ff}
+ \x{100}
+ 0: \x{100}
+ \x{101}
+ 0: \x{101}
+ ** Failers
+No match
+ \x{102}
+No match
+ Y
+No match
+ y
+No match
+
+/[z-\x{100}]/8Di
+------------------------------------------------------------------
+ 0 20 Bra 0
+ 3 [Z\x{39c}\x{178}z-\x{101}]
+ 20 20 Ket
+ 23 End
+------------------------------------------------------------------
+Capturing subpattern count = 0
+Options: caseless utf8
+No first char
+No need char
+
+/^\X/8
+ A
+ 0: A
+ A\x{300}BC
+ 0: A\x{300}
+ A\x{300}\x{301}\x{302}BC
+ 0: A\x{300}\x{301}\x{302}
+ *** Failers
+ 0: *
+ \x{300}
+No match
+
+/^[\X]/8
+ X123
+ 0: X
+ *** Failers
+No match
+ AXYZ
+No match
+
+/^(\X*)C/8
+ A\x{300}\x{301}\x{302}BCA\x{300}\x{301}
+ 0: A\x{300}\x{301}\x{302}BC
+ 1: A\x{300}\x{301}\x{302}B
+ A\x{300}\x{301}\x{302}BCA\x{300}\x{301}C
+ 0: A\x{300}\x{301}\x{302}BCA\x{300}\x{301}C
+ 1: A\x{300}\x{301}\x{302}BCA\x{300}\x{301}
+
+/^(\X*?)C/8
+ A\x{300}\x{301}\x{302}BCA\x{300}\x{301}
+ 0: A\x{300}\x{301}\x{302}BC
+ 1: A\x{300}\x{301}\x{302}B
+ A\x{300}\x{301}\x{302}BCA\x{300}\x{301}C
+ 0: A\x{300}\x{301}\x{302}BC
+ 1: A\x{300}\x{301}\x{302}B
+
+/^(\X*)(.)/8
+ A\x{300}\x{301}\x{302}BCA\x{300}\x{301}
+ 0: A\x{300}\x{301}\x{302}BCA
+ 1: A\x{300}\x{301}\x{302}BC
+ 2: A
+ A\x{300}\x{301}\x{302}BCA\x{300}\x{301}C
+ 0: A\x{300}\x{301}\x{302}BCA\x{300}\x{301}C
+ 1: A\x{300}\x{301}\x{302}BCA\x{300}\x{301}
+ 2: C
+
+/^(\X*?)(.)/8
+ A\x{300}\x{301}\x{302}BCA\x{300}\x{301}
+ 0: A
+ 1:
+ 2: A
+ A\x{300}\x{301}\x{302}BCA\x{300}\x{301}C
+ 0: A
+ 1:
+ 2: A
+
+/^\X(.)/8
+ *** Failers
+ 0: **
+ 1: *
+ A\x{300}\x{301}\x{302}
+No match
+
+/^\X{2,3}(.)/8
+ A\x{300}\x{301}B\x{300}X
+ 0: A\x{300}\x{301}B\x{300}X
+ 1: X
+ A\x{300}\x{301}B\x{300}C\x{300}\x{301}
+ 0: A\x{300}\x{301}B\x{300}C
+ 1: C
+ A\x{300}\x{301}B\x{300}C\x{300}\x{301}X
+ 0: A\x{300}\x{301}B\x{300}C\x{300}\x{301}X
+ 1: X
+ A\x{300}\x{301}B\x{300}C\x{300}\x{301}DA\x{300}X
+ 0: A\x{300}\x{301}B\x{300}C\x{300}\x{301}D
+ 1: D
+
+/^\X{2,3}?(.)/8
+ A\x{300}\x{301}B\x{300}X
+ 0: A\x{300}\x{301}B\x{300}X
+ 1: X
+ A\x{300}\x{301}B\x{300}C\x{300}\x{301}
+ 0: A\x{300}\x{301}B\x{300}C
+ 1: C
+ A\x{300}\x{301}B\x{300}C\x{300}\x{301}X
+ 0: A\x{300}\x{301}B\x{300}C
+ 1: C
+ A\x{300}\x{301}B\x{300}C\x{300}\x{301}DA\x{300}X
+ 0: A\x{300}\x{301}B\x{300}C
+ 1: C
+
+/ End of testinput6 /
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/ucp.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/ucp.c
new file mode 100644
index 00000000..3d69653b
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/ucp.c
@@ -0,0 +1,151 @@
+/*************************************************
+* libucp - Unicode Property Table handler *
+*************************************************/
+
+/* This function provides a fast way of obtaining the basic Unicode properties
+of a character, using a compact binary tree that occupies less than 100K bytes.
+
+ Copyright (c) 2004 University of Cambridge
+
+-------------------------------------------------------------------------------
+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.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+-------------------------------------------------------------------------------
+*/
+
+
+#include "ucp.h" /* Exported interface */
+#include "ucpinternal.h" /* Internal table details */
+#include "ucptable.c" /* The table itself */
+
+
+
+/*************************************************
+* Search table and return data *
+*************************************************/
+
+/* Two values are returned: the category is ucp_C, ucp_L, etc. The detailed
+character type is ucp_Lu, ucp_Nd, etc.
+
+Arguments:
+ c the character value
+ type_ptr the detailed character type is returned here
+ case_ptr for letters, the opposite case is returned here, if there
+ is one, else zero
+
+Returns: the character type category or -1 if not found
+*/
+
+static int
+ucp_findchar(const int c, int *type_ptr, int *case_ptr)
+{
+cnode *node = ucp_table;
+register int cc = c;
+int case_offset;
+
+for (;;)
+ {
+ register int d = node->f1 | ((node->f0 & f0_chhmask) << 16);
+ if (cc == d) break;
+ if (cc < d)
+ {
+ if ((node->f0 & f0_leftexists) == 0) return -1;
+ node ++;
+ }
+ else
+ {
+ register int roffset = (node->f2 & f2_rightmask) >> f2_rightshift;
+ if (roffset == 0) return -1;
+ node += 1 << (roffset - 1);
+ }
+ }
+
+switch ((*type_ptr = ((node->f0 & f0_typemask) >> f0_typeshift)))
+ {
+ case ucp_Cc:
+ case ucp_Cf:
+ case ucp_Cn:
+ case ucp_Co:
+ case ucp_Cs:
+ return ucp_C;
+ break;
+
+ case ucp_Ll:
+ case ucp_Lu:
+ case_offset = node->f2 & f2_casemask;
+ if ((case_offset & 0x0100) != 0) case_offset |= 0xfffff000;
+ *case_ptr = (case_offset == 0)? 0 : cc + case_offset;
+ return ucp_L;
+
+ case ucp_Lm:
+ case ucp_Lo:
+ case ucp_Lt:
+ *case_ptr = 0;
+ return ucp_L;
+ break;
+
+ case ucp_Mc:
+ case ucp_Me:
+ case ucp_Mn:
+ return ucp_M;
+ break;
+
+ case ucp_Nd:
+ case ucp_Nl:
+ case ucp_No:
+ return ucp_N;
+ break;
+
+ case ucp_Pc:
+ case ucp_Pd:
+ case ucp_Pe:
+ case ucp_Pf:
+ case ucp_Pi:
+ case ucp_Ps:
+ case ucp_Po:
+ return ucp_P;
+ break;
+
+ case ucp_Sc:
+ case ucp_Sk:
+ case ucp_Sm:
+ case ucp_So:
+ return ucp_S;
+ break;
+
+ case ucp_Zl:
+ case ucp_Zp:
+ case ucp_Zs:
+ return ucp_Z;
+ break;
+
+ default: /* "Should never happen" */
+ return -1;
+ break;
+ }
+}
+
+/* End of ucp.c */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/ucp.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/ucp.h
new file mode 100644
index 00000000..c013978e
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/ucp.h
@@ -0,0 +1,58 @@
+/*************************************************
+* libucp - Unicode Property Table handler *
+*************************************************/
+
+/* These are the character categories that are returned by ucp_findchar */
+
+enum {
+ ucp_C, /* Other */
+ ucp_L, /* Letter */
+ ucp_M, /* Mark */
+ ucp_N, /* Number */
+ ucp_P, /* Punctuation */
+ ucp_S, /* Symbol */
+ ucp_Z /* Separator */
+};
+
+/* These are the detailed character types that are returned by ucp_findchar */
+
+enum {
+ ucp_Cc, /* Control */
+ ucp_Cf, /* Format */
+ ucp_Cn, /* Unassigned */
+ ucp_Co, /* Private use */
+ ucp_Cs, /* Surrogate */
+ ucp_Ll, /* Lower case letter */
+ ucp_Lm, /* Modifier letter */
+ ucp_Lo, /* Other letter */
+ ucp_Lt, /* Title case letter */
+ ucp_Lu, /* Upper case letter */
+ ucp_Mc, /* Spacing mark */
+ ucp_Me, /* Enclosing mark */
+ ucp_Mn, /* Non-spacing mark */
+ ucp_Nd, /* Decimal number */
+ ucp_Nl, /* Letter number */
+ ucp_No, /* Other number */
+ ucp_Pc, /* Connector punctuation */
+ ucp_Pd, /* Dash punctuation */
+ ucp_Pe, /* Close punctuation */
+ ucp_Pf, /* Final punctuation */
+ ucp_Pi, /* Initial punctuation */
+ ucp_Po, /* Other punctuation */
+ ucp_Ps, /* Open punctuation */
+ ucp_Sc, /* Currency symbol */
+ ucp_Sk, /* Modifier symbol */
+ ucp_Sm, /* Mathematical symbol */
+ ucp_So, /* Other symbol */
+ ucp_Zl, /* Line separator */
+ ucp_Zp, /* Paragraph separator */
+ ucp_Zs /* Space separator */
+};
+
+/* For use in PCRE we make this function static so that there is no conflict if
+PCRE is linked with an application that makes use of an external version -
+assuming an external version is ever released... */
+
+static int ucp_findchar(const int, int *, int *);
+
+/* End of ucp.h */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/ucpinternal.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/ucpinternal.h
new file mode 100644
index 00000000..faefb030
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/ucpinternal.h
@@ -0,0 +1,91 @@
+/*************************************************
+* libucp - Unicode Property Table handler *
+*************************************************/
+
+/* Internal header file defining the layout of compact nodes in the tree. */
+
+typedef struct cnode {
+ unsigned short int f0;
+ unsigned short int f1;
+ unsigned short int f2;
+} cnode;
+
+/* Things for the f0 field */
+
+#define f0_leftexists 0x8000 /* Left child exists */
+#define f0_typemask 0x3f00 /* Type bits */
+#define f0_typeshift 8 /* Type shift */
+#define f0_chhmask 0x00ff /* Character high bits */
+
+/* Things for the f2 field */
+
+#define f2_rightmask 0xf000 /* Mask for right offset bits */
+#define f2_rightshift 12 /* Shift for right offset */
+#define f2_casemask 0x0fff /* Mask for case offset */
+
+/* The tree consists of a vector of structures of type cnode, with the root
+node as the first element. The three short ints (16-bits) are used as follows:
+
+(f0) (1) The 0x8000 bit of f0 is set if a left child exists. The child's node
+ is the next node in the vector.
+ (2) The 0x4000 bits of f0 is spare.
+ (3) The 0x3f00 bits of f0 contain the character type; this is a number
+ defined by the enumeration in ucp.h (e.g. ucp_Lu).
+ (4) The bottom 8 bits of f0 contain the most significant byte of the
+ character's 24-bit codepoint.
+
+(f1) (1) The f1 field contains the two least significant bytes of the
+ codepoint.
+
+(f2) (1) The 0xf000 bits of f2 contain zero if there is no right child of this
+ node. Otherwise, they contain one plus the exponent of the power of
+ two of the offset to the right node (e.g. a value of 3 means 8). The
+ units of the offset are node items.
+
+ (2) The 0x0fff bits of f2 contain the signed offset from this character to
+ its alternate cased value. They are zero if there is no such
+ character.
+
+
+-----------------------------------------------------------------------------
+||.|.| type (6) | ms char (8) || ls char (16) ||....| case offset (12) ||
+-----------------------------------------------------------------------------
+ | | |
+ | |-> spare |
+ | exponent of right
+ |-> left child exists child offset
+
+
+The upper/lower casing information is set only for characters that come in
+pairs. There are (at present) four non-one-to-one mappings in the Unicode data.
+These are ignored. They are:
+
+ 1FBE Greek Prosgegrammeni (lower, with upper -> capital iota)
+ 2126 Ohm
+ 212A Kelvin
+ 212B Angstrom
+
+Certainly for the last three, having an alternate case would seem to be a
+mistake. I don't know any Greek, so cannot comment on the first one.
+
+
+When searching the tree, proceed as follows:
+
+(1) Start at the first node.
+
+(2) Extract the character value from f1 and the bottom 8 bits of f0;
+
+(3) Compare with the character being sought. If equal, we are done.
+
+(4) If the test character is smaller, inspect the f0_leftexists flag. If it is
+ not set, the character is not in the tree. If it is set, move to the next
+ node, and go to (2).
+
+(5) If the test character is bigger, extract the f2_rightmask bits from f2, and
+ shift them right by f2_rightshift. If the result is zero, the character is
+ not in the tree. Otherwise, calculate the number of nodes to skip by
+ shifting the value 1 left by this number minus one. Go to (2).
+*/
+
+
+/* End of internal.h */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/ucptable.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/ucptable.c
new file mode 100644
index 00000000..7fb3a123
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/ucptable.c
@@ -0,0 +1,15105 @@
+/* This source module is automatically generated from the Unicode
+property table. See internal.h for a description of the layout. */
+
+static cnode ucp_table[] = {
+ { 0x9a00, 0x2f1f, 0xe000 },
+ { 0x8700, 0x1558, 0xd000 },
+ { 0x8700, 0x0a99, 0xc000 },
+ { 0x8500, 0x0435, 0xbfe0 },
+ { 0x8500, 0x01ff, 0xafff },
+ { 0x8500, 0x00ff, 0x9079 },
+ { 0x8000, 0x007f, 0x8000 },
+ { 0x9500, 0x003f, 0x7000 },
+ { 0x8000, 0x001f, 0x6000 },
+ { 0x8000, 0x000f, 0x5000 },
+ { 0x8000, 0x0007, 0x4000 },
+ { 0x8000, 0x0003, 0x3000 },
+ { 0x8000, 0x0001, 0x2000 },
+ { 0x0000, 0x0000, 0x0000 },
+ { 0x0000, 0x0002, 0x0000 },
+ { 0x8000, 0x0005, 0x2000 },
+ { 0x0000, 0x0004, 0x0000 },
+ { 0x0000, 0x0006, 0x0000 },
+ { 0x8000, 0x000b, 0x3000 },
+ { 0x8000, 0x0009, 0x2000 },
+ { 0x0000, 0x0008, 0x0000 },
+ { 0x0000, 0x000a, 0x0000 },
+ { 0x8000, 0x000d, 0x2000 },
+ { 0x0000, 0x000c, 0x0000 },
+ { 0x0000, 0x000e, 0x0000 },
+ { 0x8000, 0x0017, 0x4000 },
+ { 0x8000, 0x0013, 0x3000 },
+ { 0x8000, 0x0011, 0x2000 },
+ { 0x0000, 0x0010, 0x0000 },
+ { 0x0000, 0x0012, 0x0000 },
+ { 0x8000, 0x0015, 0x2000 },
+ { 0x0000, 0x0014, 0x0000 },
+ { 0x0000, 0x0016, 0x0000 },
+ { 0x8000, 0x001b, 0x3000 },
+ { 0x8000, 0x0019, 0x2000 },
+ { 0x0000, 0x0018, 0x0000 },
+ { 0x0000, 0x001a, 0x0000 },
+ { 0x8000, 0x001d, 0x2000 },
+ { 0x0000, 0x001c, 0x0000 },
+ { 0x0000, 0x001e, 0x0000 },
+ { 0x9500, 0x002f, 0x5000 },
+ { 0x9500, 0x0027, 0x4000 },
+ { 0x9500, 0x0023, 0x3000 },
+ { 0x9500, 0x0021, 0x2000 },
+ { 0x1d00, 0x0020, 0x0000 },
+ { 0x1500, 0x0022, 0x0000 },
+ { 0x9500, 0x0025, 0x2000 },
+ { 0x1700, 0x0024, 0x0000 },
+ { 0x1500, 0x0026, 0x0000 },
+ { 0x9900, 0x002b, 0x3000 },
+ { 0x9200, 0x0029, 0x2000 },
+ { 0x1600, 0x0028, 0x0000 },
+ { 0x1500, 0x002a, 0x0000 },
+ { 0x9100, 0x002d, 0x2000 },
+ { 0x1500, 0x002c, 0x0000 },
+ { 0x1500, 0x002e, 0x0000 },
+ { 0x8d00, 0x0037, 0x4000 },
+ { 0x8d00, 0x0033, 0x3000 },
+ { 0x8d00, 0x0031, 0x2000 },
+ { 0x0d00, 0x0030, 0x0000 },
+ { 0x0d00, 0x0032, 0x0000 },
+ { 0x8d00, 0x0035, 0x2000 },
+ { 0x0d00, 0x0034, 0x0000 },
+ { 0x0d00, 0x0036, 0x0000 },
+ { 0x9500, 0x003b, 0x3000 },
+ { 0x8d00, 0x0039, 0x2000 },
+ { 0x0d00, 0x0038, 0x0000 },
+ { 0x1500, 0x003a, 0x0000 },
+ { 0x9900, 0x003d, 0x2000 },
+ { 0x1900, 0x003c, 0x0000 },
+ { 0x1900, 0x003e, 0x0000 },
+ { 0x9000, 0x005f, 0x6000 },
+ { 0x8900, 0x004f, 0x5020 },
+ { 0x8900, 0x0047, 0x4020 },
+ { 0x8900, 0x0043, 0x3020 },
+ { 0x8900, 0x0041, 0x2020 },
+ { 0x1500, 0x0040, 0x0000 },
+ { 0x0900, 0x0042, 0x0020 },
+ { 0x8900, 0x0045, 0x2020 },
+ { 0x0900, 0x0044, 0x0020 },
+ { 0x0900, 0x0046, 0x0020 },
+ { 0x8900, 0x004b, 0x3020 },
+ { 0x8900, 0x0049, 0x2020 },
+ { 0x0900, 0x0048, 0x0020 },
+ { 0x0900, 0x004a, 0x0020 },
+ { 0x8900, 0x004d, 0x2020 },
+ { 0x0900, 0x004c, 0x0020 },
+ { 0x0900, 0x004e, 0x0020 },
+ { 0x8900, 0x0057, 0x4020 },
+ { 0x8900, 0x0053, 0x3020 },
+ { 0x8900, 0x0051, 0x2020 },
+ { 0x0900, 0x0050, 0x0020 },
+ { 0x0900, 0x0052, 0x0020 },
+ { 0x8900, 0x0055, 0x2020 },
+ { 0x0900, 0x0054, 0x0020 },
+ { 0x0900, 0x0056, 0x0020 },
+ { 0x9600, 0x005b, 0x3000 },
+ { 0x8900, 0x0059, 0x2020 },
+ { 0x0900, 0x0058, 0x0020 },
+ { 0x0900, 0x005a, 0x0020 },
+ { 0x9200, 0x005d, 0x2000 },
+ { 0x1500, 0x005c, 0x0000 },
+ { 0x1800, 0x005e, 0x0000 },
+ { 0x8500, 0x006f, 0x5fe0 },
+ { 0x8500, 0x0067, 0x4fe0 },
+ { 0x8500, 0x0063, 0x3fe0 },
+ { 0x8500, 0x0061, 0x2fe0 },
+ { 0x1800, 0x0060, 0x0000 },
+ { 0x0500, 0x0062, 0x0fe0 },
+ { 0x8500, 0x0065, 0x2fe0 },
+ { 0x0500, 0x0064, 0x0fe0 },
+ { 0x0500, 0x0066, 0x0fe0 },
+ { 0x8500, 0x006b, 0x3fe0 },
+ { 0x8500, 0x0069, 0x2fe0 },
+ { 0x0500, 0x0068, 0x0fe0 },
+ { 0x0500, 0x006a, 0x0fe0 },
+ { 0x8500, 0x006d, 0x2fe0 },
+ { 0x0500, 0x006c, 0x0fe0 },
+ { 0x0500, 0x006e, 0x0fe0 },
+ { 0x8500, 0x0077, 0x4fe0 },
+ { 0x8500, 0x0073, 0x3fe0 },
+ { 0x8500, 0x0071, 0x2fe0 },
+ { 0x0500, 0x0070, 0x0fe0 },
+ { 0x0500, 0x0072, 0x0fe0 },
+ { 0x8500, 0x0075, 0x2fe0 },
+ { 0x0500, 0x0074, 0x0fe0 },
+ { 0x0500, 0x0076, 0x0fe0 },
+ { 0x9600, 0x007b, 0x3000 },
+ { 0x8500, 0x0079, 0x2fe0 },
+ { 0x0500, 0x0078, 0x0fe0 },
+ { 0x0500, 0x007a, 0x0fe0 },
+ { 0x9200, 0x007d, 0x2000 },
+ { 0x1900, 0x007c, 0x0000 },
+ { 0x1900, 0x007e, 0x0000 },
+ { 0x9500, 0x00bf, 0x7000 },
+ { 0x8000, 0x009f, 0x6000 },
+ { 0x8000, 0x008f, 0x5000 },
+ { 0x8000, 0x0087, 0x4000 },
+ { 0x8000, 0x0083, 0x3000 },
+ { 0x8000, 0x0081, 0x2000 },
+ { 0x0000, 0x0080, 0x0000 },
+ { 0x0000, 0x0082, 0x0000 },
+ { 0x8000, 0x0085, 0x2000 },
+ { 0x0000, 0x0084, 0x0000 },
+ { 0x0000, 0x0086, 0x0000 },
+ { 0x8000, 0x008b, 0x3000 },
+ { 0x8000, 0x0089, 0x2000 },
+ { 0x0000, 0x0088, 0x0000 },
+ { 0x0000, 0x008a, 0x0000 },
+ { 0x8000, 0x008d, 0x2000 },
+ { 0x0000, 0x008c, 0x0000 },
+ { 0x0000, 0x008e, 0x0000 },
+ { 0x8000, 0x0097, 0x4000 },
+ { 0x8000, 0x0093, 0x3000 },
+ { 0x8000, 0x0091, 0x2000 },
+ { 0x0000, 0x0090, 0x0000 },
+ { 0x0000, 0x0092, 0x0000 },
+ { 0x8000, 0x0095, 0x2000 },
+ { 0x0000, 0x0094, 0x0000 },
+ { 0x0000, 0x0096, 0x0000 },
+ { 0x8000, 0x009b, 0x3000 },
+ { 0x8000, 0x0099, 0x2000 },
+ { 0x0000, 0x0098, 0x0000 },
+ { 0x0000, 0x009a, 0x0000 },
+ { 0x8000, 0x009d, 0x2000 },
+ { 0x0000, 0x009c, 0x0000 },
+ { 0x0000, 0x009e, 0x0000 },
+ { 0x9800, 0x00af, 0x5000 },
+ { 0x9a00, 0x00a7, 0x4000 },
+ { 0x9700, 0x00a3, 0x3000 },
+ { 0x9500, 0x00a1, 0x2000 },
+ { 0x1d00, 0x00a0, 0x0000 },
+ { 0x1700, 0x00a2, 0x0000 },
+ { 0x9700, 0x00a5, 0x2000 },
+ { 0x1700, 0x00a4, 0x0000 },
+ { 0x1a00, 0x00a6, 0x0000 },
+ { 0x9400, 0x00ab, 0x3000 },
+ { 0x9a00, 0x00a9, 0x2000 },
+ { 0x1800, 0x00a8, 0x0000 },
+ { 0x0500, 0x00aa, 0x0000 },
+ { 0x8100, 0x00ad, 0x2000 },
+ { 0x1900, 0x00ac, 0x0000 },
+ { 0x1a00, 0x00ae, 0x0000 },
+ { 0x9500, 0x00b7, 0x4000 },
+ { 0x8f00, 0x00b3, 0x3000 },
+ { 0x9900, 0x00b1, 0x2000 },
+ { 0x1a00, 0x00b0, 0x0000 },
+ { 0x0f00, 0x00b2, 0x0000 },
+ { 0x8500, 0x00b5, 0x22e7 },
+ { 0x1800, 0x00b4, 0x0000 },
+ { 0x1a00, 0x00b6, 0x0000 },
+ { 0x9300, 0x00bb, 0x3000 },
+ { 0x8f00, 0x00b9, 0x2000 },
+ { 0x1800, 0x00b8, 0x0000 },
+ { 0x0500, 0x00ba, 0x0000 },
+ { 0x8f00, 0x00bd, 0x2000 },
+ { 0x0f00, 0x00bc, 0x0000 },
+ { 0x0f00, 0x00be, 0x0000 },
+ { 0x8500, 0x00df, 0x6000 },
+ { 0x8900, 0x00cf, 0x5020 },
+ { 0x8900, 0x00c7, 0x4020 },
+ { 0x8900, 0x00c3, 0x3020 },
+ { 0x8900, 0x00c1, 0x2020 },
+ { 0x0900, 0x00c0, 0x0020 },
+ { 0x0900, 0x00c2, 0x0020 },
+ { 0x8900, 0x00c5, 0x2020 },
+ { 0x0900, 0x00c4, 0x0020 },
+ { 0x0900, 0x00c6, 0x0020 },
+ { 0x8900, 0x00cb, 0x3020 },
+ { 0x8900, 0x00c9, 0x2020 },
+ { 0x0900, 0x00c8, 0x0020 },
+ { 0x0900, 0x00ca, 0x0020 },
+ { 0x8900, 0x00cd, 0x2020 },
+ { 0x0900, 0x00cc, 0x0020 },
+ { 0x0900, 0x00ce, 0x0020 },
+ { 0x9900, 0x00d7, 0x4000 },
+ { 0x8900, 0x00d3, 0x3020 },
+ { 0x8900, 0x00d1, 0x2020 },
+ { 0x0900, 0x00d0, 0x0020 },
+ { 0x0900, 0x00d2, 0x0020 },
+ { 0x8900, 0x00d5, 0x2020 },
+ { 0x0900, 0x00d4, 0x0020 },
+ { 0x0900, 0x00d6, 0x0020 },
+ { 0x8900, 0x00db, 0x3020 },
+ { 0x8900, 0x00d9, 0x2020 },
+ { 0x0900, 0x00d8, 0x0020 },
+ { 0x0900, 0x00da, 0x0020 },
+ { 0x8900, 0x00dd, 0x2020 },
+ { 0x0900, 0x00dc, 0x0020 },
+ { 0x0900, 0x00de, 0x0020 },
+ { 0x8500, 0x00ef, 0x5fe0 },
+ { 0x8500, 0x00e7, 0x4fe0 },
+ { 0x8500, 0x00e3, 0x3fe0 },
+ { 0x8500, 0x00e1, 0x2fe0 },
+ { 0x0500, 0x00e0, 0x0fe0 },
+ { 0x0500, 0x00e2, 0x0fe0 },
+ { 0x8500, 0x00e5, 0x2fe0 },
+ { 0x0500, 0x00e4, 0x0fe0 },
+ { 0x0500, 0x00e6, 0x0fe0 },
+ { 0x8500, 0x00eb, 0x3fe0 },
+ { 0x8500, 0x00e9, 0x2fe0 },
+ { 0x0500, 0x00e8, 0x0fe0 },
+ { 0x0500, 0x00ea, 0x0fe0 },
+ { 0x8500, 0x00ed, 0x2fe0 },
+ { 0x0500, 0x00ec, 0x0fe0 },
+ { 0x0500, 0x00ee, 0x0fe0 },
+ { 0x9900, 0x00f7, 0x4000 },
+ { 0x8500, 0x00f3, 0x3fe0 },
+ { 0x8500, 0x00f1, 0x2fe0 },
+ { 0x0500, 0x00f0, 0x0fe0 },
+ { 0x0500, 0x00f2, 0x0fe0 },
+ { 0x8500, 0x00f5, 0x2fe0 },
+ { 0x0500, 0x00f4, 0x0fe0 },
+ { 0x0500, 0x00f6, 0x0fe0 },
+ { 0x8500, 0x00fb, 0x3fe0 },
+ { 0x8500, 0x00f9, 0x2fe0 },
+ { 0x0500, 0x00f8, 0x0fe0 },
+ { 0x0500, 0x00fa, 0x0fe0 },
+ { 0x8500, 0x00fd, 0x2fe0 },
+ { 0x0500, 0x00fc, 0x0fe0 },
+ { 0x0500, 0x00fe, 0x0fe0 },
+ { 0x8500, 0x017f, 0x8ed4 },
+ { 0x8900, 0x013f, 0x7001 },
+ { 0x8500, 0x011f, 0x6fff },
+ { 0x8500, 0x010f, 0x5fff },
+ { 0x8500, 0x0107, 0x4fff },
+ { 0x8500, 0x0103, 0x3fff },
+ { 0x8500, 0x0101, 0x2fff },
+ { 0x0900, 0x0100, 0x0001 },
+ { 0x0900, 0x0102, 0x0001 },
+ { 0x8500, 0x0105, 0x2fff },
+ { 0x0900, 0x0104, 0x0001 },
+ { 0x0900, 0x0106, 0x0001 },
+ { 0x8500, 0x010b, 0x3fff },
+ { 0x8500, 0x0109, 0x2fff },
+ { 0x0900, 0x0108, 0x0001 },
+ { 0x0900, 0x010a, 0x0001 },
+ { 0x8500, 0x010d, 0x2fff },
+ { 0x0900, 0x010c, 0x0001 },
+ { 0x0900, 0x010e, 0x0001 },
+ { 0x8500, 0x0117, 0x4fff },
+ { 0x8500, 0x0113, 0x3fff },
+ { 0x8500, 0x0111, 0x2fff },
+ { 0x0900, 0x0110, 0x0001 },
+ { 0x0900, 0x0112, 0x0001 },
+ { 0x8500, 0x0115, 0x2fff },
+ { 0x0900, 0x0114, 0x0001 },
+ { 0x0900, 0x0116, 0x0001 },
+ { 0x8500, 0x011b, 0x3fff },
+ { 0x8500, 0x0119, 0x2fff },
+ { 0x0900, 0x0118, 0x0001 },
+ { 0x0900, 0x011a, 0x0001 },
+ { 0x8500, 0x011d, 0x2fff },
+ { 0x0900, 0x011c, 0x0001 },
+ { 0x0900, 0x011e, 0x0001 },
+ { 0x8500, 0x012f, 0x5fff },
+ { 0x8500, 0x0127, 0x4fff },
+ { 0x8500, 0x0123, 0x3fff },
+ { 0x8500, 0x0121, 0x2fff },
+ { 0x0900, 0x0120, 0x0001 },
+ { 0x0900, 0x0122, 0x0001 },
+ { 0x8500, 0x0125, 0x2fff },
+ { 0x0900, 0x0124, 0x0001 },
+ { 0x0900, 0x0126, 0x0001 },
+ { 0x8500, 0x012b, 0x3fff },
+ { 0x8500, 0x0129, 0x2fff },
+ { 0x0900, 0x0128, 0x0001 },
+ { 0x0900, 0x012a, 0x0001 },
+ { 0x8500, 0x012d, 0x2fff },
+ { 0x0900, 0x012c, 0x0001 },
+ { 0x0900, 0x012e, 0x0001 },
+ { 0x8500, 0x0137, 0x4fff },
+ { 0x8500, 0x0133, 0x3fff },
+ { 0x8500, 0x0131, 0x2f18 },
+ { 0x0900, 0x0130, 0x0f39 },
+ { 0x0900, 0x0132, 0x0001 },
+ { 0x8500, 0x0135, 0x2fff },
+ { 0x0900, 0x0134, 0x0001 },
+ { 0x0900, 0x0136, 0x0001 },
+ { 0x8900, 0x013b, 0x3001 },
+ { 0x8900, 0x0139, 0x2001 },
+ { 0x0500, 0x0138, 0x0000 },
+ { 0x0500, 0x013a, 0x0fff },
+ { 0x8900, 0x013d, 0x2001 },
+ { 0x0500, 0x013c, 0x0fff },
+ { 0x0500, 0x013e, 0x0fff },
+ { 0x8500, 0x015f, 0x6fff },
+ { 0x8500, 0x014f, 0x5fff },
+ { 0x8900, 0x0147, 0x4001 },
+ { 0x8900, 0x0143, 0x3001 },
+ { 0x8900, 0x0141, 0x2001 },
+ { 0x0500, 0x0140, 0x0fff },
+ { 0x0500, 0x0142, 0x0fff },
+ { 0x8900, 0x0145, 0x2001 },
+ { 0x0500, 0x0144, 0x0fff },
+ { 0x0500, 0x0146, 0x0fff },
+ { 0x8500, 0x014b, 0x3fff },
+ { 0x8500, 0x0149, 0x2000 },
+ { 0x0500, 0x0148, 0x0fff },
+ { 0x0900, 0x014a, 0x0001 },
+ { 0x8500, 0x014d, 0x2fff },
+ { 0x0900, 0x014c, 0x0001 },
+ { 0x0900, 0x014e, 0x0001 },
+ { 0x8500, 0x0157, 0x4fff },
+ { 0x8500, 0x0153, 0x3fff },
+ { 0x8500, 0x0151, 0x2fff },
+ { 0x0900, 0x0150, 0x0001 },
+ { 0x0900, 0x0152, 0x0001 },
+ { 0x8500, 0x0155, 0x2fff },
+ { 0x0900, 0x0154, 0x0001 },
+ { 0x0900, 0x0156, 0x0001 },
+ { 0x8500, 0x015b, 0x3fff },
+ { 0x8500, 0x0159, 0x2fff },
+ { 0x0900, 0x0158, 0x0001 },
+ { 0x0900, 0x015a, 0x0001 },
+ { 0x8500, 0x015d, 0x2fff },
+ { 0x0900, 0x015c, 0x0001 },
+ { 0x0900, 0x015e, 0x0001 },
+ { 0x8500, 0x016f, 0x5fff },
+ { 0x8500, 0x0167, 0x4fff },
+ { 0x8500, 0x0163, 0x3fff },
+ { 0x8500, 0x0161, 0x2fff },
+ { 0x0900, 0x0160, 0x0001 },
+ { 0x0900, 0x0162, 0x0001 },
+ { 0x8500, 0x0165, 0x2fff },
+ { 0x0900, 0x0164, 0x0001 },
+ { 0x0900, 0x0166, 0x0001 },
+ { 0x8500, 0x016b, 0x3fff },
+ { 0x8500, 0x0169, 0x2fff },
+ { 0x0900, 0x0168, 0x0001 },
+ { 0x0900, 0x016a, 0x0001 },
+ { 0x8500, 0x016d, 0x2fff },
+ { 0x0900, 0x016c, 0x0001 },
+ { 0x0900, 0x016e, 0x0001 },
+ { 0x8500, 0x0177, 0x4fff },
+ { 0x8500, 0x0173, 0x3fff },
+ { 0x8500, 0x0171, 0x2fff },
+ { 0x0900, 0x0170, 0x0001 },
+ { 0x0900, 0x0172, 0x0001 },
+ { 0x8500, 0x0175, 0x2fff },
+ { 0x0900, 0x0174, 0x0001 },
+ { 0x0900, 0x0176, 0x0001 },
+ { 0x8900, 0x017b, 0x3001 },
+ { 0x8900, 0x0179, 0x2001 },
+ { 0x0900, 0x0178, 0x0f87 },
+ { 0x0500, 0x017a, 0x0fff },
+ { 0x8900, 0x017d, 0x2001 },
+ { 0x0500, 0x017c, 0x0fff },
+ { 0x0500, 0x017e, 0x0fff },
+ { 0x8500, 0x01bf, 0x7038 },
+ { 0x8900, 0x019f, 0x60d6 },
+ { 0x8900, 0x018f, 0x50ca },
+ { 0x8900, 0x0187, 0x4001 },
+ { 0x8500, 0x0183, 0x3fff },
+ { 0x8900, 0x0181, 0x20d2 },
+ { 0x0500, 0x0180, 0x0000 },
+ { 0x0900, 0x0182, 0x0001 },
+ { 0x8500, 0x0185, 0x2fff },
+ { 0x0900, 0x0184, 0x0001 },
+ { 0x0900, 0x0186, 0x00ce },
+ { 0x8900, 0x018b, 0x3001 },
+ { 0x8900, 0x0189, 0x20cd },
+ { 0x0500, 0x0188, 0x0fff },
+ { 0x0900, 0x018a, 0x00cd },
+ { 0x8500, 0x018d, 0x2000 },
+ { 0x0500, 0x018c, 0x0fff },
+ { 0x0900, 0x018e, 0x004f },
+ { 0x8900, 0x0197, 0x40d1 },
+ { 0x8900, 0x0193, 0x30cd },
+ { 0x8900, 0x0191, 0x2001 },
+ { 0x0900, 0x0190, 0x00cb },
+ { 0x0500, 0x0192, 0x0fff },
+ { 0x8500, 0x0195, 0x2061 },
+ { 0x0900, 0x0194, 0x00cf },
+ { 0x0900, 0x0196, 0x00d3 },
+ { 0x8500, 0x019b, 0x3000 },
+ { 0x8500, 0x0199, 0x2fff },
+ { 0x0900, 0x0198, 0x0001 },
+ { 0x0500, 0x019a, 0x0000 },
+ { 0x8900, 0x019d, 0x20d5 },
+ { 0x0900, 0x019c, 0x00d3 },
+ { 0x0500, 0x019e, 0x0082 },
+ { 0x8900, 0x01af, 0x5001 },
+ { 0x8900, 0x01a7, 0x4001 },
+ { 0x8500, 0x01a3, 0x3fff },
+ { 0x8500, 0x01a1, 0x2fff },
+ { 0x0900, 0x01a0, 0x0001 },
+ { 0x0900, 0x01a2, 0x0001 },
+ { 0x8500, 0x01a5, 0x2fff },
+ { 0x0900, 0x01a4, 0x0001 },
+ { 0x0900, 0x01a6, 0x00da },
+ { 0x8500, 0x01ab, 0x3000 },
+ { 0x8900, 0x01a9, 0x20da },
+ { 0x0500, 0x01a8, 0x0fff },
+ { 0x0500, 0x01aa, 0x0000 },
+ { 0x8500, 0x01ad, 0x2fff },
+ { 0x0900, 0x01ac, 0x0001 },
+ { 0x0900, 0x01ae, 0x00da },
+ { 0x8900, 0x01b7, 0x40db },
+ { 0x8900, 0x01b3, 0x3001 },
+ { 0x8900, 0x01b1, 0x20d9 },
+ { 0x0500, 0x01b0, 0x0fff },
+ { 0x0900, 0x01b2, 0x00d9 },
+ { 0x8900, 0x01b5, 0x2001 },
+ { 0x0500, 0x01b4, 0x0fff },
+ { 0x0500, 0x01b6, 0x0fff },
+ { 0x8700, 0x01bb, 0x3000 },
+ { 0x8500, 0x01b9, 0x2fff },
+ { 0x0900, 0x01b8, 0x0001 },
+ { 0x0500, 0x01ba, 0x0000 },
+ { 0x8500, 0x01bd, 0x2fff },
+ { 0x0900, 0x01bc, 0x0001 },
+ { 0x0500, 0x01be, 0x0000 },
+ { 0x8500, 0x01df, 0x6fff },
+ { 0x8900, 0x01cf, 0x5001 },
+ { 0x8900, 0x01c7, 0x4002 },
+ { 0x8700, 0x01c3, 0x3000 },
+ { 0x8700, 0x01c1, 0x2000 },
+ { 0x0700, 0x01c0, 0x0000 },
+ { 0x0700, 0x01c2, 0x0000 },
+ { 0x8800, 0x01c5, 0x2000 },
+ { 0x0900, 0x01c4, 0x0002 },
+ { 0x0500, 0x01c6, 0x0ffe },
+ { 0x8800, 0x01cb, 0x3000 },
+ { 0x8500, 0x01c9, 0x2ffe },
+ { 0x0800, 0x01c8, 0x0000 },
+ { 0x0900, 0x01ca, 0x0002 },
+ { 0x8900, 0x01cd, 0x2001 },
+ { 0x0500, 0x01cc, 0x0ffe },
+ { 0x0500, 0x01ce, 0x0fff },
+ { 0x8900, 0x01d7, 0x4001 },
+ { 0x8900, 0x01d3, 0x3001 },
+ { 0x8900, 0x01d1, 0x2001 },
+ { 0x0500, 0x01d0, 0x0fff },
+ { 0x0500, 0x01d2, 0x0fff },
+ { 0x8900, 0x01d5, 0x2001 },
+ { 0x0500, 0x01d4, 0x0fff },
+ { 0x0500, 0x01d6, 0x0fff },
+ { 0x8900, 0x01db, 0x3001 },
+ { 0x8900, 0x01d9, 0x2001 },
+ { 0x0500, 0x01d8, 0x0fff },
+ { 0x0500, 0x01da, 0x0fff },
+ { 0x8500, 0x01dd, 0x2fb1 },
+ { 0x0500, 0x01dc, 0x0fff },
+ { 0x0900, 0x01de, 0x0001 },
+ { 0x8500, 0x01ef, 0x5fff },
+ { 0x8500, 0x01e7, 0x4fff },
+ { 0x8500, 0x01e3, 0x3fff },
+ { 0x8500, 0x01e1, 0x2fff },
+ { 0x0900, 0x01e0, 0x0001 },
+ { 0x0900, 0x01e2, 0x0001 },
+ { 0x8500, 0x01e5, 0x2fff },
+ { 0x0900, 0x01e4, 0x0001 },
+ { 0x0900, 0x01e6, 0x0001 },
+ { 0x8500, 0x01eb, 0x3fff },
+ { 0x8500, 0x01e9, 0x2fff },
+ { 0x0900, 0x01e8, 0x0001 },
+ { 0x0900, 0x01ea, 0x0001 },
+ { 0x8500, 0x01ed, 0x2fff },
+ { 0x0900, 0x01ec, 0x0001 },
+ { 0x0900, 0x01ee, 0x0001 },
+ { 0x8900, 0x01f7, 0x4fc8 },
+ { 0x8500, 0x01f3, 0x3ffe },
+ { 0x8900, 0x01f1, 0x2002 },
+ { 0x0500, 0x01f0, 0x0000 },
+ { 0x0800, 0x01f2, 0x0000 },
+ { 0x8500, 0x01f5, 0x2fff },
+ { 0x0900, 0x01f4, 0x0001 },
+ { 0x0900, 0x01f6, 0x0f9f },
+ { 0x8500, 0x01fb, 0x3fff },
+ { 0x8500, 0x01f9, 0x2fff },
+ { 0x0900, 0x01f8, 0x0001 },
+ { 0x0900, 0x01fa, 0x0001 },
+ { 0x8500, 0x01fd, 0x2fff },
+ { 0x0900, 0x01fc, 0x0001 },
+ { 0x0900, 0x01fe, 0x0001 },
+ { 0x8c00, 0x0318, 0x9000 },
+ { 0x8500, 0x0298, 0x8000 },
+ { 0x8500, 0x0258, 0x7000 },
+ { 0x8500, 0x021f, 0x6fff },
+ { 0x8500, 0x020f, 0x5fff },
+ { 0x8500, 0x0207, 0x4fff },
+ { 0x8500, 0x0203, 0x3fff },
+ { 0x8500, 0x0201, 0x2fff },
+ { 0x0900, 0x0200, 0x0001 },
+ { 0x0900, 0x0202, 0x0001 },
+ { 0x8500, 0x0205, 0x2fff },
+ { 0x0900, 0x0204, 0x0001 },
+ { 0x0900, 0x0206, 0x0001 },
+ { 0x8500, 0x020b, 0x3fff },
+ { 0x8500, 0x0209, 0x2fff },
+ { 0x0900, 0x0208, 0x0001 },
+ { 0x0900, 0x020a, 0x0001 },
+ { 0x8500, 0x020d, 0x2fff },
+ { 0x0900, 0x020c, 0x0001 },
+ { 0x0900, 0x020e, 0x0001 },
+ { 0x8500, 0x0217, 0x4fff },
+ { 0x8500, 0x0213, 0x3fff },
+ { 0x8500, 0x0211, 0x2fff },
+ { 0x0900, 0x0210, 0x0001 },
+ { 0x0900, 0x0212, 0x0001 },
+ { 0x8500, 0x0215, 0x2fff },
+ { 0x0900, 0x0214, 0x0001 },
+ { 0x0900, 0x0216, 0x0001 },
+ { 0x8500, 0x021b, 0x3fff },
+ { 0x8500, 0x0219, 0x2fff },
+ { 0x0900, 0x0218, 0x0001 },
+ { 0x0900, 0x021a, 0x0001 },
+ { 0x8500, 0x021d, 0x2fff },
+ { 0x0900, 0x021c, 0x0001 },
+ { 0x0900, 0x021e, 0x0001 },
+ { 0x8500, 0x022f, 0x5fff },
+ { 0x8500, 0x0227, 0x4fff },
+ { 0x8500, 0x0223, 0x3fff },
+ { 0x8500, 0x0221, 0x2000 },
+ { 0x0900, 0x0220, 0x0f7e },
+ { 0x0900, 0x0222, 0x0001 },
+ { 0x8500, 0x0225, 0x2fff },
+ { 0x0900, 0x0224, 0x0001 },
+ { 0x0900, 0x0226, 0x0001 },
+ { 0x8500, 0x022b, 0x3fff },
+ { 0x8500, 0x0229, 0x2fff },
+ { 0x0900, 0x0228, 0x0001 },
+ { 0x0900, 0x022a, 0x0001 },
+ { 0x8500, 0x022d, 0x2fff },
+ { 0x0900, 0x022c, 0x0001 },
+ { 0x0900, 0x022e, 0x0001 },
+ { 0x8500, 0x0250, 0x4000 },
+ { 0x8500, 0x0233, 0x3fff },
+ { 0x8500, 0x0231, 0x2fff },
+ { 0x0900, 0x0230, 0x0001 },
+ { 0x0900, 0x0232, 0x0001 },
+ { 0x8500, 0x0235, 0x2000 },
+ { 0x0500, 0x0234, 0x0000 },
+ { 0x0500, 0x0236, 0x0000 },
+ { 0x8500, 0x0254, 0x3f32 },
+ { 0x8500, 0x0252, 0x2000 },
+ { 0x0500, 0x0251, 0x0000 },
+ { 0x0500, 0x0253, 0x0f2e },
+ { 0x8500, 0x0256, 0x2f33 },
+ { 0x0500, 0x0255, 0x0000 },
+ { 0x0500, 0x0257, 0x0f33 },
+ { 0x8500, 0x0278, 0x6000 },
+ { 0x8500, 0x0268, 0x5f2f },
+ { 0x8500, 0x0260, 0x4f33 },
+ { 0x8500, 0x025c, 0x3000 },
+ { 0x8500, 0x025a, 0x2000 },
+ { 0x0500, 0x0259, 0x0f36 },
+ { 0x0500, 0x025b, 0x0f35 },
+ { 0x8500, 0x025e, 0x2000 },
+ { 0x0500, 0x025d, 0x0000 },
+ { 0x0500, 0x025f, 0x0000 },
+ { 0x8500, 0x0264, 0x3000 },
+ { 0x8500, 0x0262, 0x2000 },
+ { 0x0500, 0x0261, 0x0000 },
+ { 0x0500, 0x0263, 0x0f31 },
+ { 0x8500, 0x0266, 0x2000 },
+ { 0x0500, 0x0265, 0x0000 },
+ { 0x0500, 0x0267, 0x0000 },
+ { 0x8500, 0x0270, 0x4000 },
+ { 0x8500, 0x026c, 0x3000 },
+ { 0x8500, 0x026a, 0x2000 },
+ { 0x0500, 0x0269, 0x0f2d },
+ { 0x0500, 0x026b, 0x0000 },
+ { 0x8500, 0x026e, 0x2000 },
+ { 0x0500, 0x026d, 0x0000 },
+ { 0x0500, 0x026f, 0x0f2d },
+ { 0x8500, 0x0274, 0x3000 },
+ { 0x8500, 0x0272, 0x2f2b },
+ { 0x0500, 0x0271, 0x0000 },
+ { 0x0500, 0x0273, 0x0000 },
+ { 0x8500, 0x0276, 0x2000 },
+ { 0x0500, 0x0275, 0x0f2a },
+ { 0x0500, 0x0277, 0x0000 },
+ { 0x8500, 0x0288, 0x5f26 },
+ { 0x8500, 0x0280, 0x4f26 },
+ { 0x8500, 0x027c, 0x3000 },
+ { 0x8500, 0x027a, 0x2000 },
+ { 0x0500, 0x0279, 0x0000 },
+ { 0x0500, 0x027b, 0x0000 },
+ { 0x8500, 0x027e, 0x2000 },
+ { 0x0500, 0x027d, 0x0000 },
+ { 0x0500, 0x027f, 0x0000 },
+ { 0x8500, 0x0284, 0x3000 },
+ { 0x8500, 0x0282, 0x2000 },
+ { 0x0500, 0x0281, 0x0000 },
+ { 0x0500, 0x0283, 0x0f26 },
+ { 0x8500, 0x0286, 0x2000 },
+ { 0x0500, 0x0285, 0x0000 },
+ { 0x0500, 0x0287, 0x0000 },
+ { 0x8500, 0x0290, 0x4000 },
+ { 0x8500, 0x028c, 0x3000 },
+ { 0x8500, 0x028a, 0x2f27 },
+ { 0x0500, 0x0289, 0x0000 },
+ { 0x0500, 0x028b, 0x0f27 },
+ { 0x8500, 0x028e, 0x2000 },
+ { 0x0500, 0x028d, 0x0000 },
+ { 0x0500, 0x028f, 0x0000 },
+ { 0x8500, 0x0294, 0x3000 },
+ { 0x8500, 0x0292, 0x2f25 },
+ { 0x0500, 0x0291, 0x0000 },
+ { 0x0500, 0x0293, 0x0000 },
+ { 0x8500, 0x0296, 0x2000 },
+ { 0x0500, 0x0295, 0x0000 },
+ { 0x0500, 0x0297, 0x0000 },
+ { 0x9800, 0x02d8, 0x7000 },
+ { 0x8600, 0x02b8, 0x6000 },
+ { 0x8500, 0x02a8, 0x5000 },
+ { 0x8500, 0x02a0, 0x4000 },
+ { 0x8500, 0x029c, 0x3000 },
+ { 0x8500, 0x029a, 0x2000 },
+ { 0x0500, 0x0299, 0x0000 },
+ { 0x0500, 0x029b, 0x0000 },
+ { 0x8500, 0x029e, 0x2000 },
+ { 0x0500, 0x029d, 0x0000 },
+ { 0x0500, 0x029f, 0x0000 },
+ { 0x8500, 0x02a4, 0x3000 },
+ { 0x8500, 0x02a2, 0x2000 },
+ { 0x0500, 0x02a1, 0x0000 },
+ { 0x0500, 0x02a3, 0x0000 },
+ { 0x8500, 0x02a6, 0x2000 },
+ { 0x0500, 0x02a5, 0x0000 },
+ { 0x0500, 0x02a7, 0x0000 },
+ { 0x8600, 0x02b0, 0x4000 },
+ { 0x8500, 0x02ac, 0x3000 },
+ { 0x8500, 0x02aa, 0x2000 },
+ { 0x0500, 0x02a9, 0x0000 },
+ { 0x0500, 0x02ab, 0x0000 },
+ { 0x8500, 0x02ae, 0x2000 },
+ { 0x0500, 0x02ad, 0x0000 },
+ { 0x0500, 0x02af, 0x0000 },
+ { 0x8600, 0x02b4, 0x3000 },
+ { 0x8600, 0x02b2, 0x2000 },
+ { 0x0600, 0x02b1, 0x0000 },
+ { 0x0600, 0x02b3, 0x0000 },
+ { 0x8600, 0x02b6, 0x2000 },
+ { 0x0600, 0x02b5, 0x0000 },
+ { 0x0600, 0x02b7, 0x0000 },
+ { 0x8600, 0x02c8, 0x5000 },
+ { 0x8600, 0x02c0, 0x4000 },
+ { 0x8600, 0x02bc, 0x3000 },
+ { 0x8600, 0x02ba, 0x2000 },
+ { 0x0600, 0x02b9, 0x0000 },
+ { 0x0600, 0x02bb, 0x0000 },
+ { 0x8600, 0x02be, 0x2000 },
+ { 0x0600, 0x02bd, 0x0000 },
+ { 0x0600, 0x02bf, 0x0000 },
+ { 0x9800, 0x02c4, 0x3000 },
+ { 0x9800, 0x02c2, 0x2000 },
+ { 0x0600, 0x02c1, 0x0000 },
+ { 0x1800, 0x02c3, 0x0000 },
+ { 0x8600, 0x02c6, 0x2000 },
+ { 0x1800, 0x02c5, 0x0000 },
+ { 0x0600, 0x02c7, 0x0000 },
+ { 0x8600, 0x02d0, 0x4000 },
+ { 0x8600, 0x02cc, 0x3000 },
+ { 0x8600, 0x02ca, 0x2000 },
+ { 0x0600, 0x02c9, 0x0000 },
+ { 0x0600, 0x02cb, 0x0000 },
+ { 0x8600, 0x02ce, 0x2000 },
+ { 0x0600, 0x02cd, 0x0000 },
+ { 0x0600, 0x02cf, 0x0000 },
+ { 0x9800, 0x02d4, 0x3000 },
+ { 0x9800, 0x02d2, 0x2000 },
+ { 0x0600, 0x02d1, 0x0000 },
+ { 0x1800, 0x02d3, 0x0000 },
+ { 0x9800, 0x02d6, 0x2000 },
+ { 0x1800, 0x02d5, 0x0000 },
+ { 0x1800, 0x02d7, 0x0000 },
+ { 0x9800, 0x02f8, 0x6000 },
+ { 0x9800, 0x02e8, 0x5000 },
+ { 0x8600, 0x02e0, 0x4000 },
+ { 0x9800, 0x02dc, 0x3000 },
+ { 0x9800, 0x02da, 0x2000 },
+ { 0x1800, 0x02d9, 0x0000 },
+ { 0x1800, 0x02db, 0x0000 },
+ { 0x9800, 0x02de, 0x2000 },
+ { 0x1800, 0x02dd, 0x0000 },
+ { 0x1800, 0x02df, 0x0000 },
+ { 0x8600, 0x02e4, 0x3000 },
+ { 0x8600, 0x02e2, 0x2000 },
+ { 0x0600, 0x02e1, 0x0000 },
+ { 0x0600, 0x02e3, 0x0000 },
+ { 0x9800, 0x02e6, 0x2000 },
+ { 0x1800, 0x02e5, 0x0000 },
+ { 0x1800, 0x02e7, 0x0000 },
+ { 0x9800, 0x02f0, 0x4000 },
+ { 0x9800, 0x02ec, 0x3000 },
+ { 0x9800, 0x02ea, 0x2000 },
+ { 0x1800, 0x02e9, 0x0000 },
+ { 0x1800, 0x02eb, 0x0000 },
+ { 0x8600, 0x02ee, 0x2000 },
+ { 0x1800, 0x02ed, 0x0000 },
+ { 0x1800, 0x02ef, 0x0000 },
+ { 0x9800, 0x02f4, 0x3000 },
+ { 0x9800, 0x02f2, 0x2000 },
+ { 0x1800, 0x02f1, 0x0000 },
+ { 0x1800, 0x02f3, 0x0000 },
+ { 0x9800, 0x02f6, 0x2000 },
+ { 0x1800, 0x02f5, 0x0000 },
+ { 0x1800, 0x02f7, 0x0000 },
+ { 0x8c00, 0x0308, 0x5000 },
+ { 0x8c00, 0x0300, 0x4000 },
+ { 0x9800, 0x02fc, 0x3000 },
+ { 0x9800, 0x02fa, 0x2000 },
+ { 0x1800, 0x02f9, 0x0000 },
+ { 0x1800, 0x02fb, 0x0000 },
+ { 0x9800, 0x02fe, 0x2000 },
+ { 0x1800, 0x02fd, 0x0000 },
+ { 0x1800, 0x02ff, 0x0000 },
+ { 0x8c00, 0x0304, 0x3000 },
+ { 0x8c00, 0x0302, 0x2000 },
+ { 0x0c00, 0x0301, 0x0000 },
+ { 0x0c00, 0x0303, 0x0000 },
+ { 0x8c00, 0x0306, 0x2000 },
+ { 0x0c00, 0x0305, 0x0000 },
+ { 0x0c00, 0x0307, 0x0000 },
+ { 0x8c00, 0x0310, 0x4000 },
+ { 0x8c00, 0x030c, 0x3000 },
+ { 0x8c00, 0x030a, 0x2000 },
+ { 0x0c00, 0x0309, 0x0000 },
+ { 0x0c00, 0x030b, 0x0000 },
+ { 0x8c00, 0x030e, 0x2000 },
+ { 0x0c00, 0x030d, 0x0000 },
+ { 0x0c00, 0x030f, 0x0000 },
+ { 0x8c00, 0x0314, 0x3000 },
+ { 0x8c00, 0x0312, 0x2000 },
+ { 0x0c00, 0x0311, 0x0000 },
+ { 0x0c00, 0x0313, 0x0000 },
+ { 0x8c00, 0x0316, 0x2000 },
+ { 0x0c00, 0x0315, 0x0000 },
+ { 0x0c00, 0x0317, 0x0000 },
+ { 0x8500, 0x03b0, 0x8000 },
+ { 0x8c00, 0x035d, 0x7000 },
+ { 0x8c00, 0x0338, 0x6000 },
+ { 0x8c00, 0x0328, 0x5000 },
+ { 0x8c00, 0x0320, 0x4000 },
+ { 0x8c00, 0x031c, 0x3000 },
+ { 0x8c00, 0x031a, 0x2000 },
+ { 0x0c00, 0x0319, 0x0000 },
+ { 0x0c00, 0x031b, 0x0000 },
+ { 0x8c00, 0x031e, 0x2000 },
+ { 0x0c00, 0x031d, 0x0000 },
+ { 0x0c00, 0x031f, 0x0000 },
+ { 0x8c00, 0x0324, 0x3000 },
+ { 0x8c00, 0x0322, 0x2000 },
+ { 0x0c00, 0x0321, 0x0000 },
+ { 0x0c00, 0x0323, 0x0000 },
+ { 0x8c00, 0x0326, 0x2000 },
+ { 0x0c00, 0x0325, 0x0000 },
+ { 0x0c00, 0x0327, 0x0000 },
+ { 0x8c00, 0x0330, 0x4000 },
+ { 0x8c00, 0x032c, 0x3000 },
+ { 0x8c00, 0x032a, 0x2000 },
+ { 0x0c00, 0x0329, 0x0000 },
+ { 0x0c00, 0x032b, 0x0000 },
+ { 0x8c00, 0x032e, 0x2000 },
+ { 0x0c00, 0x032d, 0x0000 },
+ { 0x0c00, 0x032f, 0x0000 },
+ { 0x8c00, 0x0334, 0x3000 },
+ { 0x8c00, 0x0332, 0x2000 },
+ { 0x0c00, 0x0331, 0x0000 },
+ { 0x0c00, 0x0333, 0x0000 },
+ { 0x8c00, 0x0336, 0x2000 },
+ { 0x0c00, 0x0335, 0x0000 },
+ { 0x0c00, 0x0337, 0x0000 },
+ { 0x8c00, 0x0348, 0x5000 },
+ { 0x8c00, 0x0340, 0x4000 },
+ { 0x8c00, 0x033c, 0x3000 },
+ { 0x8c00, 0x033a, 0x2000 },
+ { 0x0c00, 0x0339, 0x0000 },
+ { 0x0c00, 0x033b, 0x0000 },
+ { 0x8c00, 0x033e, 0x2000 },
+ { 0x0c00, 0x033d, 0x0000 },
+ { 0x0c00, 0x033f, 0x0000 },
+ { 0x8c00, 0x0344, 0x3000 },
+ { 0x8c00, 0x0342, 0x2000 },
+ { 0x0c00, 0x0341, 0x0000 },
+ { 0x0c00, 0x0343, 0x0000 },
+ { 0x8c00, 0x0346, 0x2000 },
+ { 0x0c00, 0x0345, 0x0000 },
+ { 0x0c00, 0x0347, 0x0000 },
+ { 0x8c00, 0x0350, 0x4000 },
+ { 0x8c00, 0x034c, 0x3000 },
+ { 0x8c00, 0x034a, 0x2000 },
+ { 0x0c00, 0x0349, 0x0000 },
+ { 0x0c00, 0x034b, 0x0000 },
+ { 0x8c00, 0x034e, 0x2000 },
+ { 0x0c00, 0x034d, 0x0000 },
+ { 0x0c00, 0x034f, 0x0000 },
+ { 0x8c00, 0x0354, 0x3000 },
+ { 0x8c00, 0x0352, 0x2000 },
+ { 0x0c00, 0x0351, 0x0000 },
+ { 0x0c00, 0x0353, 0x0000 },
+ { 0x8c00, 0x0356, 0x2000 },
+ { 0x0c00, 0x0355, 0x0000 },
+ { 0x0c00, 0x0357, 0x0000 },
+ { 0x8900, 0x038f, 0x603f },
+ { 0x8c00, 0x036d, 0x5000 },
+ { 0x8c00, 0x0365, 0x4000 },
+ { 0x8c00, 0x0361, 0x3000 },
+ { 0x8c00, 0x035f, 0x2000 },
+ { 0x0c00, 0x035e, 0x0000 },
+ { 0x0c00, 0x0360, 0x0000 },
+ { 0x8c00, 0x0363, 0x2000 },
+ { 0x0c00, 0x0362, 0x0000 },
+ { 0x0c00, 0x0364, 0x0000 },
+ { 0x8c00, 0x0369, 0x3000 },
+ { 0x8c00, 0x0367, 0x2000 },
+ { 0x0c00, 0x0366, 0x0000 },
+ { 0x0c00, 0x0368, 0x0000 },
+ { 0x8c00, 0x036b, 0x2000 },
+ { 0x0c00, 0x036a, 0x0000 },
+ { 0x0c00, 0x036c, 0x0000 },
+ { 0x9800, 0x0385, 0x4000 },
+ { 0x9800, 0x0375, 0x3000 },
+ { 0x8c00, 0x036f, 0x2000 },
+ { 0x0c00, 0x036e, 0x0000 },
+ { 0x1800, 0x0374, 0x0000 },
+ { 0x9500, 0x037e, 0x2000 },
+ { 0x0600, 0x037a, 0x0000 },
+ { 0x1800, 0x0384, 0x0000 },
+ { 0x8900, 0x0389, 0x3025 },
+ { 0x9500, 0x0387, 0x2000 },
+ { 0x0900, 0x0386, 0x0026 },
+ { 0x0900, 0x0388, 0x0025 },
+ { 0x8900, 0x038c, 0x2040 },
+ { 0x0900, 0x038a, 0x0025 },
+ { 0x0900, 0x038e, 0x003f },
+ { 0x8900, 0x039f, 0x5020 },
+ { 0x8900, 0x0397, 0x4020 },
+ { 0x8900, 0x0393, 0x3020 },
+ { 0x8900, 0x0391, 0x2020 },
+ { 0x0500, 0x0390, 0x0000 },
+ { 0x0900, 0x0392, 0x0020 },
+ { 0x8900, 0x0395, 0x2020 },
+ { 0x0900, 0x0394, 0x0020 },
+ { 0x0900, 0x0396, 0x0020 },
+ { 0x8900, 0x039b, 0x3020 },
+ { 0x8900, 0x0399, 0x2020 },
+ { 0x0900, 0x0398, 0x0020 },
+ { 0x0900, 0x039a, 0x0020 },
+ { 0x8900, 0x039d, 0x2020 },
+ { 0x0900, 0x039c, 0x0020 },
+ { 0x0900, 0x039e, 0x0020 },
+ { 0x8900, 0x03a8, 0x4020 },
+ { 0x8900, 0x03a4, 0x3020 },
+ { 0x8900, 0x03a1, 0x2020 },
+ { 0x0900, 0x03a0, 0x0020 },
+ { 0x0900, 0x03a3, 0x0020 },
+ { 0x8900, 0x03a6, 0x2020 },
+ { 0x0900, 0x03a5, 0x0020 },
+ { 0x0900, 0x03a7, 0x0020 },
+ { 0x8500, 0x03ac, 0x3fda },
+ { 0x8900, 0x03aa, 0x2020 },
+ { 0x0900, 0x03a9, 0x0020 },
+ { 0x0900, 0x03ab, 0x0020 },
+ { 0x8500, 0x03ae, 0x2fdb },
+ { 0x0500, 0x03ad, 0x0fdb },
+ { 0x0500, 0x03af, 0x0fdb },
+ { 0x8500, 0x03f1, 0x7fb0 },
+ { 0x8500, 0x03d1, 0x6fc7 },
+ { 0x8500, 0x03c0, 0x5fe0 },
+ { 0x8500, 0x03b8, 0x4fe0 },
+ { 0x8500, 0x03b4, 0x3fe0 },
+ { 0x8500, 0x03b2, 0x2fe0 },
+ { 0x0500, 0x03b1, 0x0fe0 },
+ { 0x0500, 0x03b3, 0x0fe0 },
+ { 0x8500, 0x03b6, 0x2fe0 },
+ { 0x0500, 0x03b5, 0x0fe0 },
+ { 0x0500, 0x03b7, 0x0fe0 },
+ { 0x8500, 0x03bc, 0x3fe0 },
+ { 0x8500, 0x03ba, 0x2fe0 },
+ { 0x0500, 0x03b9, 0x0fe0 },
+ { 0x0500, 0x03bb, 0x0fe0 },
+ { 0x8500, 0x03be, 0x2fe0 },
+ { 0x0500, 0x03bd, 0x0fe0 },
+ { 0x0500, 0x03bf, 0x0fe0 },
+ { 0x8500, 0x03c8, 0x4fe0 },
+ { 0x8500, 0x03c4, 0x3fe0 },
+ { 0x8500, 0x03c2, 0x2fe1 },
+ { 0x0500, 0x03c1, 0x0fe0 },
+ { 0x0500, 0x03c3, 0x0fe0 },
+ { 0x8500, 0x03c6, 0x2fe0 },
+ { 0x0500, 0x03c5, 0x0fe0 },
+ { 0x0500, 0x03c7, 0x0fe0 },
+ { 0x8500, 0x03cc, 0x3fc0 },
+ { 0x8500, 0x03ca, 0x2fe0 },
+ { 0x0500, 0x03c9, 0x0fe0 },
+ { 0x0500, 0x03cb, 0x0fe0 },
+ { 0x8500, 0x03ce, 0x2fc1 },
+ { 0x0500, 0x03cd, 0x0fc1 },
+ { 0x0500, 0x03d0, 0x0fc2 },
+ { 0x8500, 0x03e1, 0x5fff },
+ { 0x8500, 0x03d9, 0x4fff },
+ { 0x8500, 0x03d5, 0x3fd1 },
+ { 0x8900, 0x03d3, 0x2000 },
+ { 0x0900, 0x03d2, 0x0000 },
+ { 0x0900, 0x03d4, 0x0000 },
+ { 0x8500, 0x03d7, 0x2000 },
+ { 0x0500, 0x03d6, 0x0fca },
+ { 0x0900, 0x03d8, 0x0001 },
+ { 0x8500, 0x03dd, 0x3fff },
+ { 0x8500, 0x03db, 0x2fff },
+ { 0x0900, 0x03da, 0x0001 },
+ { 0x0900, 0x03dc, 0x0001 },
+ { 0x8500, 0x03df, 0x2fff },
+ { 0x0900, 0x03de, 0x0001 },
+ { 0x0900, 0x03e0, 0x0001 },
+ { 0x8500, 0x03e9, 0x4fff },
+ { 0x8500, 0x03e5, 0x3fff },
+ { 0x8500, 0x03e3, 0x2fff },
+ { 0x0900, 0x03e2, 0x0001 },
+ { 0x0900, 0x03e4, 0x0001 },
+ { 0x8500, 0x03e7, 0x2fff },
+ { 0x0900, 0x03e6, 0x0001 },
+ { 0x0900, 0x03e8, 0x0001 },
+ { 0x8500, 0x03ed, 0x3fff },
+ { 0x8500, 0x03eb, 0x2fff },
+ { 0x0900, 0x03ea, 0x0001 },
+ { 0x0900, 0x03ec, 0x0001 },
+ { 0x8500, 0x03ef, 0x2fff },
+ { 0x0900, 0x03ee, 0x0001 },
+ { 0x0500, 0x03f0, 0x0faa },
+ { 0x8900, 0x0415, 0x6020 },
+ { 0x8900, 0x0405, 0x5050 },
+ { 0x8900, 0x03f9, 0x4ff9 },
+ { 0x8500, 0x03f5, 0x3fa0 },
+ { 0x8500, 0x03f3, 0x2000 },
+ { 0x0500, 0x03f2, 0x0007 },
+ { 0x0900, 0x03f4, 0x0fc4 },
+ { 0x8900, 0x03f7, 0x2001 },
+ { 0x1900, 0x03f6, 0x0000 },
+ { 0x0500, 0x03f8, 0x0fff },
+ { 0x8900, 0x0401, 0x3050 },
+ { 0x8500, 0x03fb, 0x2fff },
+ { 0x0900, 0x03fa, 0x0001 },
+ { 0x0900, 0x0400, 0x0050 },
+ { 0x8900, 0x0403, 0x2050 },
+ { 0x0900, 0x0402, 0x0050 },
+ { 0x0900, 0x0404, 0x0050 },
+ { 0x8900, 0x040d, 0x4050 },
+ { 0x8900, 0x0409, 0x3050 },
+ { 0x8900, 0x0407, 0x2050 },
+ { 0x0900, 0x0406, 0x0050 },
+ { 0x0900, 0x0408, 0x0050 },
+ { 0x8900, 0x040b, 0x2050 },
+ { 0x0900, 0x040a, 0x0050 },
+ { 0x0900, 0x040c, 0x0050 },
+ { 0x8900, 0x0411, 0x3020 },
+ { 0x8900, 0x040f, 0x2050 },
+ { 0x0900, 0x040e, 0x0050 },
+ { 0x0900, 0x0410, 0x0020 },
+ { 0x8900, 0x0413, 0x2020 },
+ { 0x0900, 0x0412, 0x0020 },
+ { 0x0900, 0x0414, 0x0020 },
+ { 0x8900, 0x0425, 0x5020 },
+ { 0x8900, 0x041d, 0x4020 },
+ { 0x8900, 0x0419, 0x3020 },
+ { 0x8900, 0x0417, 0x2020 },
+ { 0x0900, 0x0416, 0x0020 },
+ { 0x0900, 0x0418, 0x0020 },
+ { 0x8900, 0x041b, 0x2020 },
+ { 0x0900, 0x041a, 0x0020 },
+ { 0x0900, 0x041c, 0x0020 },
+ { 0x8900, 0x0421, 0x3020 },
+ { 0x8900, 0x041f, 0x2020 },
+ { 0x0900, 0x041e, 0x0020 },
+ { 0x0900, 0x0420, 0x0020 },
+ { 0x8900, 0x0423, 0x2020 },
+ { 0x0900, 0x0422, 0x0020 },
+ { 0x0900, 0x0424, 0x0020 },
+ { 0x8900, 0x042d, 0x4020 },
+ { 0x8900, 0x0429, 0x3020 },
+ { 0x8900, 0x0427, 0x2020 },
+ { 0x0900, 0x0426, 0x0020 },
+ { 0x0900, 0x0428, 0x0020 },
+ { 0x8900, 0x042b, 0x2020 },
+ { 0x0900, 0x042a, 0x0020 },
+ { 0x0900, 0x042c, 0x0020 },
+ { 0x8500, 0x0431, 0x3fe0 },
+ { 0x8900, 0x042f, 0x2020 },
+ { 0x0900, 0x042e, 0x0020 },
+ { 0x0500, 0x0430, 0x0fe0 },
+ { 0x8500, 0x0433, 0x2fe0 },
+ { 0x0500, 0x0432, 0x0fe0 },
+ { 0x0500, 0x0434, 0x0fe0 },
+ { 0x8700, 0x06a4, 0xa000 },
+ { 0x8500, 0x0563, 0x9fd0 },
+ { 0x8900, 0x04b6, 0x8001 },
+ { 0x8500, 0x0475, 0x7fff },
+ { 0x8500, 0x0455, 0x6fb0 },
+ { 0x8500, 0x0445, 0x5fe0 },
+ { 0x8500, 0x043d, 0x4fe0 },
+ { 0x8500, 0x0439, 0x3fe0 },
+ { 0x8500, 0x0437, 0x2fe0 },
+ { 0x0500, 0x0436, 0x0fe0 },
+ { 0x0500, 0x0438, 0x0fe0 },
+ { 0x8500, 0x043b, 0x2fe0 },
+ { 0x0500, 0x043a, 0x0fe0 },
+ { 0x0500, 0x043c, 0x0fe0 },
+ { 0x8500, 0x0441, 0x3fe0 },
+ { 0x8500, 0x043f, 0x2fe0 },
+ { 0x0500, 0x043e, 0x0fe0 },
+ { 0x0500, 0x0440, 0x0fe0 },
+ { 0x8500, 0x0443, 0x2fe0 },
+ { 0x0500, 0x0442, 0x0fe0 },
+ { 0x0500, 0x0444, 0x0fe0 },
+ { 0x8500, 0x044d, 0x4fe0 },
+ { 0x8500, 0x0449, 0x3fe0 },
+ { 0x8500, 0x0447, 0x2fe0 },
+ { 0x0500, 0x0446, 0x0fe0 },
+ { 0x0500, 0x0448, 0x0fe0 },
+ { 0x8500, 0x044b, 0x2fe0 },
+ { 0x0500, 0x044a, 0x0fe0 },
+ { 0x0500, 0x044c, 0x0fe0 },
+ { 0x8500, 0x0451, 0x3fb0 },
+ { 0x8500, 0x044f, 0x2fe0 },
+ { 0x0500, 0x044e, 0x0fe0 },
+ { 0x0500, 0x0450, 0x0fb0 },
+ { 0x8500, 0x0453, 0x2fb0 },
+ { 0x0500, 0x0452, 0x0fb0 },
+ { 0x0500, 0x0454, 0x0fb0 },
+ { 0x8500, 0x0465, 0x5fff },
+ { 0x8500, 0x045d, 0x4fb0 },
+ { 0x8500, 0x0459, 0x3fb0 },
+ { 0x8500, 0x0457, 0x2fb0 },
+ { 0x0500, 0x0456, 0x0fb0 },
+ { 0x0500, 0x0458, 0x0fb0 },
+ { 0x8500, 0x045b, 0x2fb0 },
+ { 0x0500, 0x045a, 0x0fb0 },
+ { 0x0500, 0x045c, 0x0fb0 },
+ { 0x8500, 0x0461, 0x3fff },
+ { 0x8500, 0x045f, 0x2fb0 },
+ { 0x0500, 0x045e, 0x0fb0 },
+ { 0x0900, 0x0460, 0x0001 },
+ { 0x8500, 0x0463, 0x2fff },
+ { 0x0900, 0x0462, 0x0001 },
+ { 0x0900, 0x0464, 0x0001 },
+ { 0x8500, 0x046d, 0x4fff },
+ { 0x8500, 0x0469, 0x3fff },
+ { 0x8500, 0x0467, 0x2fff },
+ { 0x0900, 0x0466, 0x0001 },
+ { 0x0900, 0x0468, 0x0001 },
+ { 0x8500, 0x046b, 0x2fff },
+ { 0x0900, 0x046a, 0x0001 },
+ { 0x0900, 0x046c, 0x0001 },
+ { 0x8500, 0x0471, 0x3fff },
+ { 0x8500, 0x046f, 0x2fff },
+ { 0x0900, 0x046e, 0x0001 },
+ { 0x0900, 0x0470, 0x0001 },
+ { 0x8500, 0x0473, 0x2fff },
+ { 0x0900, 0x0472, 0x0001 },
+ { 0x0900, 0x0474, 0x0001 },
+ { 0x8900, 0x0496, 0x6001 },
+ { 0x8c00, 0x0485, 0x5000 },
+ { 0x8500, 0x047d, 0x4fff },
+ { 0x8500, 0x0479, 0x3fff },
+ { 0x8500, 0x0477, 0x2fff },
+ { 0x0900, 0x0476, 0x0001 },
+ { 0x0900, 0x0478, 0x0001 },
+ { 0x8500, 0x047b, 0x2fff },
+ { 0x0900, 0x047a, 0x0001 },
+ { 0x0900, 0x047c, 0x0001 },
+ { 0x8500, 0x0481, 0x3fff },
+ { 0x8500, 0x047f, 0x2fff },
+ { 0x0900, 0x047e, 0x0001 },
+ { 0x0900, 0x0480, 0x0001 },
+ { 0x8c00, 0x0483, 0x2000 },
+ { 0x1a00, 0x0482, 0x0000 },
+ { 0x0c00, 0x0484, 0x0000 },
+ { 0x8900, 0x048e, 0x4001 },
+ { 0x8900, 0x048a, 0x3001 },
+ { 0x8b00, 0x0488, 0x2000 },
+ { 0x0c00, 0x0486, 0x0000 },
+ { 0x0b00, 0x0489, 0x0000 },
+ { 0x8900, 0x048c, 0x2001 },
+ { 0x0500, 0x048b, 0x0fff },
+ { 0x0500, 0x048d, 0x0fff },
+ { 0x8900, 0x0492, 0x3001 },
+ { 0x8900, 0x0490, 0x2001 },
+ { 0x0500, 0x048f, 0x0fff },
+ { 0x0500, 0x0491, 0x0fff },
+ { 0x8900, 0x0494, 0x2001 },
+ { 0x0500, 0x0493, 0x0fff },
+ { 0x0500, 0x0495, 0x0fff },
+ { 0x8900, 0x04a6, 0x5001 },
+ { 0x8900, 0x049e, 0x4001 },
+ { 0x8900, 0x049a, 0x3001 },
+ { 0x8900, 0x0498, 0x2001 },
+ { 0x0500, 0x0497, 0x0fff },
+ { 0x0500, 0x0499, 0x0fff },
+ { 0x8900, 0x049c, 0x2001 },
+ { 0x0500, 0x049b, 0x0fff },
+ { 0x0500, 0x049d, 0x0fff },
+ { 0x8900, 0x04a2, 0x3001 },
+ { 0x8900, 0x04a0, 0x2001 },
+ { 0x0500, 0x049f, 0x0fff },
+ { 0x0500, 0x04a1, 0x0fff },
+ { 0x8900, 0x04a4, 0x2001 },
+ { 0x0500, 0x04a3, 0x0fff },
+ { 0x0500, 0x04a5, 0x0fff },
+ { 0x8900, 0x04ae, 0x4001 },
+ { 0x8900, 0x04aa, 0x3001 },
+ { 0x8900, 0x04a8, 0x2001 },
+ { 0x0500, 0x04a7, 0x0fff },
+ { 0x0500, 0x04a9, 0x0fff },
+ { 0x8900, 0x04ac, 0x2001 },
+ { 0x0500, 0x04ab, 0x0fff },
+ { 0x0500, 0x04ad, 0x0fff },
+ { 0x8900, 0x04b2, 0x3001 },
+ { 0x8900, 0x04b0, 0x2001 },
+ { 0x0500, 0x04af, 0x0fff },
+ { 0x0500, 0x04b1, 0x0fff },
+ { 0x8900, 0x04b4, 0x2001 },
+ { 0x0500, 0x04b3, 0x0fff },
+ { 0x0500, 0x04b5, 0x0fff },
+ { 0x8500, 0x04f9, 0x7fff },
+ { 0x8500, 0x04d7, 0x6fff },
+ { 0x8500, 0x04c6, 0x5fff },
+ { 0x8900, 0x04be, 0x4001 },
+ { 0x8900, 0x04ba, 0x3001 },
+ { 0x8900, 0x04b8, 0x2001 },
+ { 0x0500, 0x04b7, 0x0fff },
+ { 0x0500, 0x04b9, 0x0fff },
+ { 0x8900, 0x04bc, 0x2001 },
+ { 0x0500, 0x04bb, 0x0fff },
+ { 0x0500, 0x04bd, 0x0fff },
+ { 0x8500, 0x04c2, 0x3fff },
+ { 0x8900, 0x04c0, 0x2000 },
+ { 0x0500, 0x04bf, 0x0fff },
+ { 0x0900, 0x04c1, 0x0001 },
+ { 0x8500, 0x04c4, 0x2fff },
+ { 0x0900, 0x04c3, 0x0001 },
+ { 0x0900, 0x04c5, 0x0001 },
+ { 0x8500, 0x04ce, 0x4fff },
+ { 0x8500, 0x04ca, 0x3fff },
+ { 0x8500, 0x04c8, 0x2fff },
+ { 0x0900, 0x04c7, 0x0001 },
+ { 0x0900, 0x04c9, 0x0001 },
+ { 0x8500, 0x04cc, 0x2fff },
+ { 0x0900, 0x04cb, 0x0001 },
+ { 0x0900, 0x04cd, 0x0001 },
+ { 0x8500, 0x04d3, 0x3fff },
+ { 0x8500, 0x04d1, 0x2fff },
+ { 0x0900, 0x04d0, 0x0001 },
+ { 0x0900, 0x04d2, 0x0001 },
+ { 0x8500, 0x04d5, 0x2fff },
+ { 0x0900, 0x04d4, 0x0001 },
+ { 0x0900, 0x04d6, 0x0001 },
+ { 0x8500, 0x04e7, 0x5fff },
+ { 0x8500, 0x04df, 0x4fff },
+ { 0x8500, 0x04db, 0x3fff },
+ { 0x8500, 0x04d9, 0x2fff },
+ { 0x0900, 0x04d8, 0x0001 },
+ { 0x0900, 0x04da, 0x0001 },
+ { 0x8500, 0x04dd, 0x2fff },
+ { 0x0900, 0x04dc, 0x0001 },
+ { 0x0900, 0x04de, 0x0001 },
+ { 0x8500, 0x04e3, 0x3fff },
+ { 0x8500, 0x04e1, 0x2fff },
+ { 0x0900, 0x04e0, 0x0001 },
+ { 0x0900, 0x04e2, 0x0001 },
+ { 0x8500, 0x04e5, 0x2fff },
+ { 0x0900, 0x04e4, 0x0001 },
+ { 0x0900, 0x04e6, 0x0001 },
+ { 0x8500, 0x04ef, 0x4fff },
+ { 0x8500, 0x04eb, 0x3fff },
+ { 0x8500, 0x04e9, 0x2fff },
+ { 0x0900, 0x04e8, 0x0001 },
+ { 0x0900, 0x04ea, 0x0001 },
+ { 0x8500, 0x04ed, 0x2fff },
+ { 0x0900, 0x04ec, 0x0001 },
+ { 0x0900, 0x04ee, 0x0001 },
+ { 0x8500, 0x04f3, 0x3fff },
+ { 0x8500, 0x04f1, 0x2fff },
+ { 0x0900, 0x04f0, 0x0001 },
+ { 0x0900, 0x04f2, 0x0001 },
+ { 0x8500, 0x04f5, 0x2fff },
+ { 0x0900, 0x04f4, 0x0001 },
+ { 0x0900, 0x04f8, 0x0001 },
+ { 0x8900, 0x0540, 0x6030 },
+ { 0x8500, 0x050f, 0x5fff },
+ { 0x8500, 0x0507, 0x4fff },
+ { 0x8500, 0x0503, 0x3fff },
+ { 0x8500, 0x0501, 0x2fff },
+ { 0x0900, 0x0500, 0x0001 },
+ { 0x0900, 0x0502, 0x0001 },
+ { 0x8500, 0x0505, 0x2fff },
+ { 0x0900, 0x0504, 0x0001 },
+ { 0x0900, 0x0506, 0x0001 },
+ { 0x8500, 0x050b, 0x3fff },
+ { 0x8500, 0x0509, 0x2fff },
+ { 0x0900, 0x0508, 0x0001 },
+ { 0x0900, 0x050a, 0x0001 },
+ { 0x8500, 0x050d, 0x2fff },
+ { 0x0900, 0x050c, 0x0001 },
+ { 0x0900, 0x050e, 0x0001 },
+ { 0x8900, 0x0538, 0x4030 },
+ { 0x8900, 0x0534, 0x3030 },
+ { 0x8900, 0x0532, 0x2030 },
+ { 0x0900, 0x0531, 0x0030 },
+ { 0x0900, 0x0533, 0x0030 },
+ { 0x8900, 0x0536, 0x2030 },
+ { 0x0900, 0x0535, 0x0030 },
+ { 0x0900, 0x0537, 0x0030 },
+ { 0x8900, 0x053c, 0x3030 },
+ { 0x8900, 0x053a, 0x2030 },
+ { 0x0900, 0x0539, 0x0030 },
+ { 0x0900, 0x053b, 0x0030 },
+ { 0x8900, 0x053e, 0x2030 },
+ { 0x0900, 0x053d, 0x0030 },
+ { 0x0900, 0x053f, 0x0030 },
+ { 0x8900, 0x0550, 0x5030 },
+ { 0x8900, 0x0548, 0x4030 },
+ { 0x8900, 0x0544, 0x3030 },
+ { 0x8900, 0x0542, 0x2030 },
+ { 0x0900, 0x0541, 0x0030 },
+ { 0x0900, 0x0543, 0x0030 },
+ { 0x8900, 0x0546, 0x2030 },
+ { 0x0900, 0x0545, 0x0030 },
+ { 0x0900, 0x0547, 0x0030 },
+ { 0x8900, 0x054c, 0x3030 },
+ { 0x8900, 0x054a, 0x2030 },
+ { 0x0900, 0x0549, 0x0030 },
+ { 0x0900, 0x054b, 0x0030 },
+ { 0x8900, 0x054e, 0x2030 },
+ { 0x0900, 0x054d, 0x0030 },
+ { 0x0900, 0x054f, 0x0030 },
+ { 0x9500, 0x055a, 0x4000 },
+ { 0x8900, 0x0554, 0x3030 },
+ { 0x8900, 0x0552, 0x2030 },
+ { 0x0900, 0x0551, 0x0030 },
+ { 0x0900, 0x0553, 0x0030 },
+ { 0x8900, 0x0556, 0x2030 },
+ { 0x0900, 0x0555, 0x0030 },
+ { 0x0600, 0x0559, 0x0000 },
+ { 0x9500, 0x055e, 0x3000 },
+ { 0x9500, 0x055c, 0x2000 },
+ { 0x1500, 0x055b, 0x0000 },
+ { 0x1500, 0x055d, 0x0000 },
+ { 0x8500, 0x0561, 0x2fd0 },
+ { 0x1500, 0x055f, 0x0000 },
+ { 0x0500, 0x0562, 0x0fd0 },
+ { 0x9a00, 0x060f, 0x8000 },
+ { 0x8c00, 0x05ab, 0x7000 },
+ { 0x8500, 0x0583, 0x6fd0 },
+ { 0x8500, 0x0573, 0x5fd0 },
+ { 0x8500, 0x056b, 0x4fd0 },
+ { 0x8500, 0x0567, 0x3fd0 },
+ { 0x8500, 0x0565, 0x2fd0 },
+ { 0x0500, 0x0564, 0x0fd0 },
+ { 0x0500, 0x0566, 0x0fd0 },
+ { 0x8500, 0x0569, 0x2fd0 },
+ { 0x0500, 0x0568, 0x0fd0 },
+ { 0x0500, 0x056a, 0x0fd0 },
+ { 0x8500, 0x056f, 0x3fd0 },
+ { 0x8500, 0x056d, 0x2fd0 },
+ { 0x0500, 0x056c, 0x0fd0 },
+ { 0x0500, 0x056e, 0x0fd0 },
+ { 0x8500, 0x0571, 0x2fd0 },
+ { 0x0500, 0x0570, 0x0fd0 },
+ { 0x0500, 0x0572, 0x0fd0 },
+ { 0x8500, 0x057b, 0x4fd0 },
+ { 0x8500, 0x0577, 0x3fd0 },
+ { 0x8500, 0x0575, 0x2fd0 },
+ { 0x0500, 0x0574, 0x0fd0 },
+ { 0x0500, 0x0576, 0x0fd0 },
+ { 0x8500, 0x0579, 0x2fd0 },
+ { 0x0500, 0x0578, 0x0fd0 },
+ { 0x0500, 0x057a, 0x0fd0 },
+ { 0x8500, 0x057f, 0x3fd0 },
+ { 0x8500, 0x057d, 0x2fd0 },
+ { 0x0500, 0x057c, 0x0fd0 },
+ { 0x0500, 0x057e, 0x0fd0 },
+ { 0x8500, 0x0581, 0x2fd0 },
+ { 0x0500, 0x0580, 0x0fd0 },
+ { 0x0500, 0x0582, 0x0fd0 },
+ { 0x8c00, 0x059a, 0x5000 },
+ { 0x8c00, 0x0592, 0x4000 },
+ { 0x8500, 0x0587, 0x3000 },
+ { 0x8500, 0x0585, 0x2fd0 },
+ { 0x0500, 0x0584, 0x0fd0 },
+ { 0x0500, 0x0586, 0x0fd0 },
+ { 0x9100, 0x058a, 0x2000 },
+ { 0x1500, 0x0589, 0x0000 },
+ { 0x0c00, 0x0591, 0x0000 },
+ { 0x8c00, 0x0596, 0x3000 },
+ { 0x8c00, 0x0594, 0x2000 },
+ { 0x0c00, 0x0593, 0x0000 },
+ { 0x0c00, 0x0595, 0x0000 },
+ { 0x8c00, 0x0598, 0x2000 },
+ { 0x0c00, 0x0597, 0x0000 },
+ { 0x0c00, 0x0599, 0x0000 },
+ { 0x8c00, 0x05a3, 0x4000 },
+ { 0x8c00, 0x059e, 0x3000 },
+ { 0x8c00, 0x059c, 0x2000 },
+ { 0x0c00, 0x059b, 0x0000 },
+ { 0x0c00, 0x059d, 0x0000 },
+ { 0x8c00, 0x05a0, 0x2000 },
+ { 0x0c00, 0x059f, 0x0000 },
+ { 0x0c00, 0x05a1, 0x0000 },
+ { 0x8c00, 0x05a7, 0x3000 },
+ { 0x8c00, 0x05a5, 0x2000 },
+ { 0x0c00, 0x05a4, 0x0000 },
+ { 0x0c00, 0x05a6, 0x0000 },
+ { 0x8c00, 0x05a9, 0x2000 },
+ { 0x0c00, 0x05a8, 0x0000 },
+ { 0x0c00, 0x05aa, 0x0000 },
+ { 0x8700, 0x05d7, 0x6000 },
+ { 0x8c00, 0x05bc, 0x5000 },
+ { 0x8c00, 0x05b3, 0x4000 },
+ { 0x8c00, 0x05af, 0x3000 },
+ { 0x8c00, 0x05ad, 0x2000 },
+ { 0x0c00, 0x05ac, 0x0000 },
+ { 0x0c00, 0x05ae, 0x0000 },
+ { 0x8c00, 0x05b1, 0x2000 },
+ { 0x0c00, 0x05b0, 0x0000 },
+ { 0x0c00, 0x05b2, 0x0000 },
+ { 0x8c00, 0x05b7, 0x3000 },
+ { 0x8c00, 0x05b5, 0x2000 },
+ { 0x0c00, 0x05b4, 0x0000 },
+ { 0x0c00, 0x05b6, 0x0000 },
+ { 0x8c00, 0x05b9, 0x2000 },
+ { 0x0c00, 0x05b8, 0x0000 },
+ { 0x0c00, 0x05bb, 0x0000 },
+ { 0x8c00, 0x05c4, 0x4000 },
+ { 0x9500, 0x05c0, 0x3000 },
+ { 0x9500, 0x05be, 0x2000 },
+ { 0x0c00, 0x05bd, 0x0000 },
+ { 0x0c00, 0x05bf, 0x0000 },
+ { 0x8c00, 0x05c2, 0x2000 },
+ { 0x0c00, 0x05c1, 0x0000 },
+ { 0x1500, 0x05c3, 0x0000 },
+ { 0x8700, 0x05d3, 0x3000 },
+ { 0x8700, 0x05d1, 0x2000 },
+ { 0x0700, 0x05d0, 0x0000 },
+ { 0x0700, 0x05d2, 0x0000 },
+ { 0x8700, 0x05d5, 0x2000 },
+ { 0x0700, 0x05d4, 0x0000 },
+ { 0x0700, 0x05d6, 0x0000 },
+ { 0x8700, 0x05e7, 0x5000 },
+ { 0x8700, 0x05df, 0x4000 },
+ { 0x8700, 0x05db, 0x3000 },
+ { 0x8700, 0x05d9, 0x2000 },
+ { 0x0700, 0x05d8, 0x0000 },
+ { 0x0700, 0x05da, 0x0000 },
+ { 0x8700, 0x05dd, 0x2000 },
+ { 0x0700, 0x05dc, 0x0000 },
+ { 0x0700, 0x05de, 0x0000 },
+ { 0x8700, 0x05e3, 0x3000 },
+ { 0x8700, 0x05e1, 0x2000 },
+ { 0x0700, 0x05e0, 0x0000 },
+ { 0x0700, 0x05e2, 0x0000 },
+ { 0x8700, 0x05e5, 0x2000 },
+ { 0x0700, 0x05e4, 0x0000 },
+ { 0x0700, 0x05e6, 0x0000 },
+ { 0x9500, 0x05f4, 0x4000 },
+ { 0x8700, 0x05f0, 0x3000 },
+ { 0x8700, 0x05e9, 0x2000 },
+ { 0x0700, 0x05e8, 0x0000 },
+ { 0x0700, 0x05ea, 0x0000 },
+ { 0x8700, 0x05f2, 0x2000 },
+ { 0x0700, 0x05f1, 0x0000 },
+ { 0x1500, 0x05f3, 0x0000 },
+ { 0x8100, 0x0603, 0x3000 },
+ { 0x8100, 0x0601, 0x2000 },
+ { 0x0100, 0x0600, 0x0000 },
+ { 0x0100, 0x0602, 0x0000 },
+ { 0x9500, 0x060d, 0x2000 },
+ { 0x1500, 0x060c, 0x0000 },
+ { 0x1a00, 0x060e, 0x0000 },
+ { 0x8d00, 0x0664, 0x7000 },
+ { 0x8700, 0x0638, 0x6000 },
+ { 0x8700, 0x0628, 0x5000 },
+ { 0x9500, 0x061f, 0x4000 },
+ { 0x8c00, 0x0613, 0x3000 },
+ { 0x8c00, 0x0611, 0x2000 },
+ { 0x0c00, 0x0610, 0x0000 },
+ { 0x0c00, 0x0612, 0x0000 },
+ { 0x8c00, 0x0615, 0x2000 },
+ { 0x0c00, 0x0614, 0x0000 },
+ { 0x1500, 0x061b, 0x0000 },
+ { 0x8700, 0x0624, 0x3000 },
+ { 0x8700, 0x0622, 0x2000 },
+ { 0x0700, 0x0621, 0x0000 },
+ { 0x0700, 0x0623, 0x0000 },
+ { 0x8700, 0x0626, 0x2000 },
+ { 0x0700, 0x0625, 0x0000 },
+ { 0x0700, 0x0627, 0x0000 },
+ { 0x8700, 0x0630, 0x4000 },
+ { 0x8700, 0x062c, 0x3000 },
+ { 0x8700, 0x062a, 0x2000 },
+ { 0x0700, 0x0629, 0x0000 },
+ { 0x0700, 0x062b, 0x0000 },
+ { 0x8700, 0x062e, 0x2000 },
+ { 0x0700, 0x062d, 0x0000 },
+ { 0x0700, 0x062f, 0x0000 },
+ { 0x8700, 0x0634, 0x3000 },
+ { 0x8700, 0x0632, 0x2000 },
+ { 0x0700, 0x0631, 0x0000 },
+ { 0x0700, 0x0633, 0x0000 },
+ { 0x8700, 0x0636, 0x2000 },
+ { 0x0700, 0x0635, 0x0000 },
+ { 0x0700, 0x0637, 0x0000 },
+ { 0x8c00, 0x064d, 0x5000 },
+ { 0x8700, 0x0645, 0x4000 },
+ { 0x8700, 0x0641, 0x3000 },
+ { 0x8700, 0x063a, 0x2000 },
+ { 0x0700, 0x0639, 0x0000 },
+ { 0x0600, 0x0640, 0x0000 },
+ { 0x8700, 0x0643, 0x2000 },
+ { 0x0700, 0x0642, 0x0000 },
+ { 0x0700, 0x0644, 0x0000 },
+ { 0x8700, 0x0649, 0x3000 },
+ { 0x8700, 0x0647, 0x2000 },
+ { 0x0700, 0x0646, 0x0000 },
+ { 0x0700, 0x0648, 0x0000 },
+ { 0x8c00, 0x064b, 0x2000 },
+ { 0x0700, 0x064a, 0x0000 },
+ { 0x0c00, 0x064c, 0x0000 },
+ { 0x8c00, 0x0655, 0x4000 },
+ { 0x8c00, 0x0651, 0x3000 },
+ { 0x8c00, 0x064f, 0x2000 },
+ { 0x0c00, 0x064e, 0x0000 },
+ { 0x0c00, 0x0650, 0x0000 },
+ { 0x8c00, 0x0653, 0x2000 },
+ { 0x0c00, 0x0652, 0x0000 },
+ { 0x0c00, 0x0654, 0x0000 },
+ { 0x8d00, 0x0660, 0x3000 },
+ { 0x8c00, 0x0657, 0x2000 },
+ { 0x0c00, 0x0656, 0x0000 },
+ { 0x0c00, 0x0658, 0x0000 },
+ { 0x8d00, 0x0662, 0x2000 },
+ { 0x0d00, 0x0661, 0x0000 },
+ { 0x0d00, 0x0663, 0x0000 },
+ { 0x8700, 0x0684, 0x6000 },
+ { 0x8700, 0x0674, 0x5000 },
+ { 0x9500, 0x066c, 0x4000 },
+ { 0x8d00, 0x0668, 0x3000 },
+ { 0x8d00, 0x0666, 0x2000 },
+ { 0x0d00, 0x0665, 0x0000 },
+ { 0x0d00, 0x0667, 0x0000 },
+ { 0x9500, 0x066a, 0x2000 },
+ { 0x0d00, 0x0669, 0x0000 },
+ { 0x1500, 0x066b, 0x0000 },
+ { 0x8c00, 0x0670, 0x3000 },
+ { 0x8700, 0x066e, 0x2000 },
+ { 0x1500, 0x066d, 0x0000 },
+ { 0x0700, 0x066f, 0x0000 },
+ { 0x8700, 0x0672, 0x2000 },
+ { 0x0700, 0x0671, 0x0000 },
+ { 0x0700, 0x0673, 0x0000 },
+ { 0x8700, 0x067c, 0x4000 },
+ { 0x8700, 0x0678, 0x3000 },
+ { 0x8700, 0x0676, 0x2000 },
+ { 0x0700, 0x0675, 0x0000 },
+ { 0x0700, 0x0677, 0x0000 },
+ { 0x8700, 0x067a, 0x2000 },
+ { 0x0700, 0x0679, 0x0000 },
+ { 0x0700, 0x067b, 0x0000 },
+ { 0x8700, 0x0680, 0x3000 },
+ { 0x8700, 0x067e, 0x2000 },
+ { 0x0700, 0x067d, 0x0000 },
+ { 0x0700, 0x067f, 0x0000 },
+ { 0x8700, 0x0682, 0x2000 },
+ { 0x0700, 0x0681, 0x0000 },
+ { 0x0700, 0x0683, 0x0000 },
+ { 0x8700, 0x0694, 0x5000 },
+ { 0x8700, 0x068c, 0x4000 },
+ { 0x8700, 0x0688, 0x3000 },
+ { 0x8700, 0x0686, 0x2000 },
+ { 0x0700, 0x0685, 0x0000 },
+ { 0x0700, 0x0687, 0x0000 },
+ { 0x8700, 0x068a, 0x2000 },
+ { 0x0700, 0x0689, 0x0000 },
+ { 0x0700, 0x068b, 0x0000 },
+ { 0x8700, 0x0690, 0x3000 },
+ { 0x8700, 0x068e, 0x2000 },
+ { 0x0700, 0x068d, 0x0000 },
+ { 0x0700, 0x068f, 0x0000 },
+ { 0x8700, 0x0692, 0x2000 },
+ { 0x0700, 0x0691, 0x0000 },
+ { 0x0700, 0x0693, 0x0000 },
+ { 0x8700, 0x069c, 0x4000 },
+ { 0x8700, 0x0698, 0x3000 },
+ { 0x8700, 0x0696, 0x2000 },
+ { 0x0700, 0x0695, 0x0000 },
+ { 0x0700, 0x0697, 0x0000 },
+ { 0x8700, 0x069a, 0x2000 },
+ { 0x0700, 0x0699, 0x0000 },
+ { 0x0700, 0x069b, 0x0000 },
+ { 0x8700, 0x06a0, 0x3000 },
+ { 0x8700, 0x069e, 0x2000 },
+ { 0x0700, 0x069d, 0x0000 },
+ { 0x0700, 0x069f, 0x0000 },
+ { 0x8700, 0x06a2, 0x2000 },
+ { 0x0700, 0x06a1, 0x0000 },
+ { 0x0700, 0x06a3, 0x0000 },
+ { 0x8700, 0x0926, 0x9000 },
+ { 0x8700, 0x0725, 0x8000 },
+ { 0x8c00, 0x06e4, 0x7000 },
+ { 0x8700, 0x06c4, 0x6000 },
+ { 0x8700, 0x06b4, 0x5000 },
+ { 0x8700, 0x06ac, 0x4000 },
+ { 0x8700, 0x06a8, 0x3000 },
+ { 0x8700, 0x06a6, 0x2000 },
+ { 0x0700, 0x06a5, 0x0000 },
+ { 0x0700, 0x06a7, 0x0000 },
+ { 0x8700, 0x06aa, 0x2000 },
+ { 0x0700, 0x06a9, 0x0000 },
+ { 0x0700, 0x06ab, 0x0000 },
+ { 0x8700, 0x06b0, 0x3000 },
+ { 0x8700, 0x06ae, 0x2000 },
+ { 0x0700, 0x06ad, 0x0000 },
+ { 0x0700, 0x06af, 0x0000 },
+ { 0x8700, 0x06b2, 0x2000 },
+ { 0x0700, 0x06b1, 0x0000 },
+ { 0x0700, 0x06b3, 0x0000 },
+ { 0x8700, 0x06bc, 0x4000 },
+ { 0x8700, 0x06b8, 0x3000 },
+ { 0x8700, 0x06b6, 0x2000 },
+ { 0x0700, 0x06b5, 0x0000 },
+ { 0x0700, 0x06b7, 0x0000 },
+ { 0x8700, 0x06ba, 0x2000 },
+ { 0x0700, 0x06b9, 0x0000 },
+ { 0x0700, 0x06bb, 0x0000 },
+ { 0x8700, 0x06c0, 0x3000 },
+ { 0x8700, 0x06be, 0x2000 },
+ { 0x0700, 0x06bd, 0x0000 },
+ { 0x0700, 0x06bf, 0x0000 },
+ { 0x8700, 0x06c2, 0x2000 },
+ { 0x0700, 0x06c1, 0x0000 },
+ { 0x0700, 0x06c3, 0x0000 },
+ { 0x9500, 0x06d4, 0x5000 },
+ { 0x8700, 0x06cc, 0x4000 },
+ { 0x8700, 0x06c8, 0x3000 },
+ { 0x8700, 0x06c6, 0x2000 },
+ { 0x0700, 0x06c5, 0x0000 },
+ { 0x0700, 0x06c7, 0x0000 },
+ { 0x8700, 0x06ca, 0x2000 },
+ { 0x0700, 0x06c9, 0x0000 },
+ { 0x0700, 0x06cb, 0x0000 },
+ { 0x8700, 0x06d0, 0x3000 },
+ { 0x8700, 0x06ce, 0x2000 },
+ { 0x0700, 0x06cd, 0x0000 },
+ { 0x0700, 0x06cf, 0x0000 },
+ { 0x8700, 0x06d2, 0x2000 },
+ { 0x0700, 0x06d1, 0x0000 },
+ { 0x0700, 0x06d3, 0x0000 },
+ { 0x8c00, 0x06dc, 0x4000 },
+ { 0x8c00, 0x06d8, 0x3000 },
+ { 0x8c00, 0x06d6, 0x2000 },
+ { 0x0700, 0x06d5, 0x0000 },
+ { 0x0c00, 0x06d7, 0x0000 },
+ { 0x8c00, 0x06da, 0x2000 },
+ { 0x0c00, 0x06d9, 0x0000 },
+ { 0x0c00, 0x06db, 0x0000 },
+ { 0x8c00, 0x06e0, 0x3000 },
+ { 0x8b00, 0x06de, 0x2000 },
+ { 0x0100, 0x06dd, 0x0000 },
+ { 0x0c00, 0x06df, 0x0000 },
+ { 0x8c00, 0x06e2, 0x2000 },
+ { 0x0c00, 0x06e1, 0x0000 },
+ { 0x0c00, 0x06e3, 0x0000 },
+ { 0x9500, 0x0704, 0x6000 },
+ { 0x8d00, 0x06f4, 0x5000 },
+ { 0x8c00, 0x06ec, 0x4000 },
+ { 0x8c00, 0x06e8, 0x3000 },
+ { 0x8600, 0x06e6, 0x2000 },
+ { 0x0600, 0x06e5, 0x0000 },
+ { 0x0c00, 0x06e7, 0x0000 },
+ { 0x8c00, 0x06ea, 0x2000 },
+ { 0x1a00, 0x06e9, 0x0000 },
+ { 0x0c00, 0x06eb, 0x0000 },
+ { 0x8d00, 0x06f0, 0x3000 },
+ { 0x8700, 0x06ee, 0x2000 },
+ { 0x0c00, 0x06ed, 0x0000 },
+ { 0x0700, 0x06ef, 0x0000 },
+ { 0x8d00, 0x06f2, 0x2000 },
+ { 0x0d00, 0x06f1, 0x0000 },
+ { 0x0d00, 0x06f3, 0x0000 },
+ { 0x8700, 0x06fc, 0x4000 },
+ { 0x8d00, 0x06f8, 0x3000 },
+ { 0x8d00, 0x06f6, 0x2000 },
+ { 0x0d00, 0x06f5, 0x0000 },
+ { 0x0d00, 0x06f7, 0x0000 },
+ { 0x8700, 0x06fa, 0x2000 },
+ { 0x0d00, 0x06f9, 0x0000 },
+ { 0x0700, 0x06fb, 0x0000 },
+ { 0x9500, 0x0700, 0x3000 },
+ { 0x9a00, 0x06fe, 0x2000 },
+ { 0x1a00, 0x06fd, 0x0000 },
+ { 0x0700, 0x06ff, 0x0000 },
+ { 0x9500, 0x0702, 0x2000 },
+ { 0x1500, 0x0701, 0x0000 },
+ { 0x1500, 0x0703, 0x0000 },
+ { 0x8700, 0x0715, 0x5000 },
+ { 0x9500, 0x070c, 0x4000 },
+ { 0x9500, 0x0708, 0x3000 },
+ { 0x9500, 0x0706, 0x2000 },
+ { 0x1500, 0x0705, 0x0000 },
+ { 0x1500, 0x0707, 0x0000 },
+ { 0x9500, 0x070a, 0x2000 },
+ { 0x1500, 0x0709, 0x0000 },
+ { 0x1500, 0x070b, 0x0000 },
+ { 0x8c00, 0x0711, 0x3000 },
+ { 0x8100, 0x070f, 0x2000 },
+ { 0x1500, 0x070d, 0x0000 },
+ { 0x0700, 0x0710, 0x0000 },
+ { 0x8700, 0x0713, 0x2000 },
+ { 0x0700, 0x0712, 0x0000 },
+ { 0x0700, 0x0714, 0x0000 },
+ { 0x8700, 0x071d, 0x4000 },
+ { 0x8700, 0x0719, 0x3000 },
+ { 0x8700, 0x0717, 0x2000 },
+ { 0x0700, 0x0716, 0x0000 },
+ { 0x0700, 0x0718, 0x0000 },
+ { 0x8700, 0x071b, 0x2000 },
+ { 0x0700, 0x071a, 0x0000 },
+ { 0x0700, 0x071c, 0x0000 },
+ { 0x8700, 0x0721, 0x3000 },
+ { 0x8700, 0x071f, 0x2000 },
+ { 0x0700, 0x071e, 0x0000 },
+ { 0x0700, 0x0720, 0x0000 },
+ { 0x8700, 0x0723, 0x2000 },
+ { 0x0700, 0x0722, 0x0000 },
+ { 0x0700, 0x0724, 0x0000 },
+ { 0x8700, 0x0797, 0x7000 },
+ { 0x8c00, 0x0745, 0x6000 },
+ { 0x8c00, 0x0735, 0x5000 },
+ { 0x8700, 0x072d, 0x4000 },
+ { 0x8700, 0x0729, 0x3000 },
+ { 0x8700, 0x0727, 0x2000 },
+ { 0x0700, 0x0726, 0x0000 },
+ { 0x0700, 0x0728, 0x0000 },
+ { 0x8700, 0x072b, 0x2000 },
+ { 0x0700, 0x072a, 0x0000 },
+ { 0x0700, 0x072c, 0x0000 },
+ { 0x8c00, 0x0731, 0x3000 },
+ { 0x8700, 0x072f, 0x2000 },
+ { 0x0700, 0x072e, 0x0000 },
+ { 0x0c00, 0x0730, 0x0000 },
+ { 0x8c00, 0x0733, 0x2000 },
+ { 0x0c00, 0x0732, 0x0000 },
+ { 0x0c00, 0x0734, 0x0000 },
+ { 0x8c00, 0x073d, 0x4000 },
+ { 0x8c00, 0x0739, 0x3000 },
+ { 0x8c00, 0x0737, 0x2000 },
+ { 0x0c00, 0x0736, 0x0000 },
+ { 0x0c00, 0x0738, 0x0000 },
+ { 0x8c00, 0x073b, 0x2000 },
+ { 0x0c00, 0x073a, 0x0000 },
+ { 0x0c00, 0x073c, 0x0000 },
+ { 0x8c00, 0x0741, 0x3000 },
+ { 0x8c00, 0x073f, 0x2000 },
+ { 0x0c00, 0x073e, 0x0000 },
+ { 0x0c00, 0x0740, 0x0000 },
+ { 0x8c00, 0x0743, 0x2000 },
+ { 0x0c00, 0x0742, 0x0000 },
+ { 0x0c00, 0x0744, 0x0000 },
+ { 0x8700, 0x0787, 0x5000 },
+ { 0x8700, 0x074f, 0x4000 },
+ { 0x8c00, 0x0749, 0x3000 },
+ { 0x8c00, 0x0747, 0x2000 },
+ { 0x0c00, 0x0746, 0x0000 },
+ { 0x0c00, 0x0748, 0x0000 },
+ { 0x8700, 0x074d, 0x2000 },
+ { 0x0c00, 0x074a, 0x0000 },
+ { 0x0700, 0x074e, 0x0000 },
+ { 0x8700, 0x0783, 0x3000 },
+ { 0x8700, 0x0781, 0x2000 },
+ { 0x0700, 0x0780, 0x0000 },
+ { 0x0700, 0x0782, 0x0000 },
+ { 0x8700, 0x0785, 0x2000 },
+ { 0x0700, 0x0784, 0x0000 },
+ { 0x0700, 0x0786, 0x0000 },
+ { 0x8700, 0x078f, 0x4000 },
+ { 0x8700, 0x078b, 0x3000 },
+ { 0x8700, 0x0789, 0x2000 },
+ { 0x0700, 0x0788, 0x0000 },
+ { 0x0700, 0x078a, 0x0000 },
+ { 0x8700, 0x078d, 0x2000 },
+ { 0x0700, 0x078c, 0x0000 },
+ { 0x0700, 0x078e, 0x0000 },
+ { 0x8700, 0x0793, 0x3000 },
+ { 0x8700, 0x0791, 0x2000 },
+ { 0x0700, 0x0790, 0x0000 },
+ { 0x0700, 0x0792, 0x0000 },
+ { 0x8700, 0x0795, 0x2000 },
+ { 0x0700, 0x0794, 0x0000 },
+ { 0x0700, 0x0796, 0x0000 },
+ { 0x8700, 0x0906, 0x6000 },
+ { 0x8c00, 0x07a7, 0x5000 },
+ { 0x8700, 0x079f, 0x4000 },
+ { 0x8700, 0x079b, 0x3000 },
+ { 0x8700, 0x0799, 0x2000 },
+ { 0x0700, 0x0798, 0x0000 },
+ { 0x0700, 0x079a, 0x0000 },
+ { 0x8700, 0x079d, 0x2000 },
+ { 0x0700, 0x079c, 0x0000 },
+ { 0x0700, 0x079e, 0x0000 },
+ { 0x8700, 0x07a3, 0x3000 },
+ { 0x8700, 0x07a1, 0x2000 },
+ { 0x0700, 0x07a0, 0x0000 },
+ { 0x0700, 0x07a2, 0x0000 },
+ { 0x8700, 0x07a5, 0x2000 },
+ { 0x0700, 0x07a4, 0x0000 },
+ { 0x0c00, 0x07a6, 0x0000 },
+ { 0x8c00, 0x07af, 0x4000 },
+ { 0x8c00, 0x07ab, 0x3000 },
+ { 0x8c00, 0x07a9, 0x2000 },
+ { 0x0c00, 0x07a8, 0x0000 },
+ { 0x0c00, 0x07aa, 0x0000 },
+ { 0x8c00, 0x07ad, 0x2000 },
+ { 0x0c00, 0x07ac, 0x0000 },
+ { 0x0c00, 0x07ae, 0x0000 },
+ { 0x8c00, 0x0902, 0x3000 },
+ { 0x8700, 0x07b1, 0x2000 },
+ { 0x0c00, 0x07b0, 0x0000 },
+ { 0x0c00, 0x0901, 0x0000 },
+ { 0x8700, 0x0904, 0x2000 },
+ { 0x0a00, 0x0903, 0x0000 },
+ { 0x0700, 0x0905, 0x0000 },
+ { 0x8700, 0x0916, 0x5000 },
+ { 0x8700, 0x090e, 0x4000 },
+ { 0x8700, 0x090a, 0x3000 },
+ { 0x8700, 0x0908, 0x2000 },
+ { 0x0700, 0x0907, 0x0000 },
+ { 0x0700, 0x0909, 0x0000 },
+ { 0x8700, 0x090c, 0x2000 },
+ { 0x0700, 0x090b, 0x0000 },
+ { 0x0700, 0x090d, 0x0000 },
+ { 0x8700, 0x0912, 0x3000 },
+ { 0x8700, 0x0910, 0x2000 },
+ { 0x0700, 0x090f, 0x0000 },
+ { 0x0700, 0x0911, 0x0000 },
+ { 0x8700, 0x0914, 0x2000 },
+ { 0x0700, 0x0913, 0x0000 },
+ { 0x0700, 0x0915, 0x0000 },
+ { 0x8700, 0x091e, 0x4000 },
+ { 0x8700, 0x091a, 0x3000 },
+ { 0x8700, 0x0918, 0x2000 },
+ { 0x0700, 0x0917, 0x0000 },
+ { 0x0700, 0x0919, 0x0000 },
+ { 0x8700, 0x091c, 0x2000 },
+ { 0x0700, 0x091b, 0x0000 },
+ { 0x0700, 0x091d, 0x0000 },
+ { 0x8700, 0x0922, 0x3000 },
+ { 0x8700, 0x0920, 0x2000 },
+ { 0x0700, 0x091f, 0x0000 },
+ { 0x0700, 0x0921, 0x0000 },
+ { 0x8700, 0x0924, 0x2000 },
+ { 0x0700, 0x0923, 0x0000 },
+ { 0x0700, 0x0925, 0x0000 },
+ { 0x8c00, 0x09cd, 0x8000 },
+ { 0x8d00, 0x096d, 0x7000 },
+ { 0x8c00, 0x0948, 0x6000 },
+ { 0x8700, 0x0936, 0x5000 },
+ { 0x8700, 0x092e, 0x4000 },
+ { 0x8700, 0x092a, 0x3000 },
+ { 0x8700, 0x0928, 0x2000 },
+ { 0x0700, 0x0927, 0x0000 },
+ { 0x0700, 0x0929, 0x0000 },
+ { 0x8700, 0x092c, 0x2000 },
+ { 0x0700, 0x092b, 0x0000 },
+ { 0x0700, 0x092d, 0x0000 },
+ { 0x8700, 0x0932, 0x3000 },
+ { 0x8700, 0x0930, 0x2000 },
+ { 0x0700, 0x092f, 0x0000 },
+ { 0x0700, 0x0931, 0x0000 },
+ { 0x8700, 0x0934, 0x2000 },
+ { 0x0700, 0x0933, 0x0000 },
+ { 0x0700, 0x0935, 0x0000 },
+ { 0x8a00, 0x0940, 0x4000 },
+ { 0x8c00, 0x093c, 0x3000 },
+ { 0x8700, 0x0938, 0x2000 },
+ { 0x0700, 0x0937, 0x0000 },
+ { 0x0700, 0x0939, 0x0000 },
+ { 0x8a00, 0x093e, 0x2000 },
+ { 0x0700, 0x093d, 0x0000 },
+ { 0x0a00, 0x093f, 0x0000 },
+ { 0x8c00, 0x0944, 0x3000 },
+ { 0x8c00, 0x0942, 0x2000 },
+ { 0x0c00, 0x0941, 0x0000 },
+ { 0x0c00, 0x0943, 0x0000 },
+ { 0x8c00, 0x0946, 0x2000 },
+ { 0x0c00, 0x0945, 0x0000 },
+ { 0x0c00, 0x0947, 0x0000 },
+ { 0x8700, 0x095d, 0x5000 },
+ { 0x8c00, 0x0952, 0x4000 },
+ { 0x8a00, 0x094c, 0x3000 },
+ { 0x8a00, 0x094a, 0x2000 },
+ { 0x0a00, 0x0949, 0x0000 },
+ { 0x0a00, 0x094b, 0x0000 },
+ { 0x8700, 0x0950, 0x2000 },
+ { 0x0c00, 0x094d, 0x0000 },
+ { 0x0c00, 0x0951, 0x0000 },
+ { 0x8700, 0x0959, 0x3000 },
+ { 0x8c00, 0x0954, 0x2000 },
+ { 0x0c00, 0x0953, 0x0000 },
+ { 0x0700, 0x0958, 0x0000 },
+ { 0x8700, 0x095b, 0x2000 },
+ { 0x0700, 0x095a, 0x0000 },
+ { 0x0700, 0x095c, 0x0000 },
+ { 0x9500, 0x0965, 0x4000 },
+ { 0x8700, 0x0961, 0x3000 },
+ { 0x8700, 0x095f, 0x2000 },
+ { 0x0700, 0x095e, 0x0000 },
+ { 0x0700, 0x0960, 0x0000 },
+ { 0x8c00, 0x0963, 0x2000 },
+ { 0x0c00, 0x0962, 0x0000 },
+ { 0x1500, 0x0964, 0x0000 },
+ { 0x8d00, 0x0969, 0x3000 },
+ { 0x8d00, 0x0967, 0x2000 },
+ { 0x0d00, 0x0966, 0x0000 },
+ { 0x0d00, 0x0968, 0x0000 },
+ { 0x8d00, 0x096b, 0x2000 },
+ { 0x0d00, 0x096a, 0x0000 },
+ { 0x0d00, 0x096c, 0x0000 },
+ { 0x8700, 0x09a2, 0x6000 },
+ { 0x8700, 0x0990, 0x5000 },
+ { 0x8700, 0x0986, 0x4000 },
+ { 0x8c00, 0x0981, 0x3000 },
+ { 0x8d00, 0x096f, 0x2000 },
+ { 0x0d00, 0x096e, 0x0000 },
+ { 0x1500, 0x0970, 0x0000 },
+ { 0x8a00, 0x0983, 0x2000 },
+ { 0x0a00, 0x0982, 0x0000 },
+ { 0x0700, 0x0985, 0x0000 },
+ { 0x8700, 0x098a, 0x3000 },
+ { 0x8700, 0x0988, 0x2000 },
+ { 0x0700, 0x0987, 0x0000 },
+ { 0x0700, 0x0989, 0x0000 },
+ { 0x8700, 0x098c, 0x2000 },
+ { 0x0700, 0x098b, 0x0000 },
+ { 0x0700, 0x098f, 0x0000 },
+ { 0x8700, 0x099a, 0x4000 },
+ { 0x8700, 0x0996, 0x3000 },
+ { 0x8700, 0x0994, 0x2000 },
+ { 0x0700, 0x0993, 0x0000 },
+ { 0x0700, 0x0995, 0x0000 },
+ { 0x8700, 0x0998, 0x2000 },
+ { 0x0700, 0x0997, 0x0000 },
+ { 0x0700, 0x0999, 0x0000 },
+ { 0x8700, 0x099e, 0x3000 },
+ { 0x8700, 0x099c, 0x2000 },
+ { 0x0700, 0x099b, 0x0000 },
+ { 0x0700, 0x099d, 0x0000 },
+ { 0x8700, 0x09a0, 0x2000 },
+ { 0x0700, 0x099f, 0x0000 },
+ { 0x0700, 0x09a1, 0x0000 },
+ { 0x8700, 0x09b7, 0x5000 },
+ { 0x8700, 0x09ab, 0x4000 },
+ { 0x8700, 0x09a6, 0x3000 },
+ { 0x8700, 0x09a4, 0x2000 },
+ { 0x0700, 0x09a3, 0x0000 },
+ { 0x0700, 0x09a5, 0x0000 },
+ { 0x8700, 0x09a8, 0x2000 },
+ { 0x0700, 0x09a7, 0x0000 },
+ { 0x0700, 0x09aa, 0x0000 },
+ { 0x8700, 0x09af, 0x3000 },
+ { 0x8700, 0x09ad, 0x2000 },
+ { 0x0700, 0x09ac, 0x0000 },
+ { 0x0700, 0x09ae, 0x0000 },
+ { 0x8700, 0x09b2, 0x2000 },
+ { 0x0700, 0x09b0, 0x0000 },
+ { 0x0700, 0x09b6, 0x0000 },
+ { 0x8c00, 0x09c1, 0x4000 },
+ { 0x8700, 0x09bd, 0x3000 },
+ { 0x8700, 0x09b9, 0x2000 },
+ { 0x0700, 0x09b8, 0x0000 },
+ { 0x0c00, 0x09bc, 0x0000 },
+ { 0x8a00, 0x09bf, 0x2000 },
+ { 0x0a00, 0x09be, 0x0000 },
+ { 0x0a00, 0x09c0, 0x0000 },
+ { 0x8a00, 0x09c7, 0x3000 },
+ { 0x8c00, 0x09c3, 0x2000 },
+ { 0x0c00, 0x09c2, 0x0000 },
+ { 0x0c00, 0x09c4, 0x0000 },
+ { 0x8a00, 0x09cb, 0x2000 },
+ { 0x0a00, 0x09c8, 0x0000 },
+ { 0x0a00, 0x09cc, 0x0000 },
+ { 0x8700, 0x0a2b, 0x7000 },
+ { 0x8a00, 0x0a03, 0x6000 },
+ { 0x8d00, 0x09ed, 0x5000 },
+ { 0x8c00, 0x09e3, 0x4000 },
+ { 0x8700, 0x09df, 0x3000 },
+ { 0x8700, 0x09dc, 0x2000 },
+ { 0x0a00, 0x09d7, 0x0000 },
+ { 0x0700, 0x09dd, 0x0000 },
+ { 0x8700, 0x09e1, 0x2000 },
+ { 0x0700, 0x09e0, 0x0000 },
+ { 0x0c00, 0x09e2, 0x0000 },
+ { 0x8d00, 0x09e9, 0x3000 },
+ { 0x8d00, 0x09e7, 0x2000 },
+ { 0x0d00, 0x09e6, 0x0000 },
+ { 0x0d00, 0x09e8, 0x0000 },
+ { 0x8d00, 0x09eb, 0x2000 },
+ { 0x0d00, 0x09ea, 0x0000 },
+ { 0x0d00, 0x09ec, 0x0000 },
+ { 0x8f00, 0x09f5, 0x4000 },
+ { 0x8700, 0x09f1, 0x3000 },
+ { 0x8d00, 0x09ef, 0x2000 },
+ { 0x0d00, 0x09ee, 0x0000 },
+ { 0x0700, 0x09f0, 0x0000 },
+ { 0x9700, 0x09f3, 0x2000 },
+ { 0x1700, 0x09f2, 0x0000 },
+ { 0x0f00, 0x09f4, 0x0000 },
+ { 0x8f00, 0x09f9, 0x3000 },
+ { 0x8f00, 0x09f7, 0x2000 },
+ { 0x0f00, 0x09f6, 0x0000 },
+ { 0x0f00, 0x09f8, 0x0000 },
+ { 0x8c00, 0x0a01, 0x2000 },
+ { 0x1a00, 0x09fa, 0x0000 },
+ { 0x0c00, 0x0a02, 0x0000 },
+ { 0x8700, 0x0a1a, 0x5000 },
+ { 0x8700, 0x0a10, 0x4000 },
+ { 0x8700, 0x0a08, 0x3000 },
+ { 0x8700, 0x0a06, 0x2000 },
+ { 0x0700, 0x0a05, 0x0000 },
+ { 0x0700, 0x0a07, 0x0000 },
+ { 0x8700, 0x0a0a, 0x2000 },
+ { 0x0700, 0x0a09, 0x0000 },
+ { 0x0700, 0x0a0f, 0x0000 },
+ { 0x8700, 0x0a16, 0x3000 },
+ { 0x8700, 0x0a14, 0x2000 },
+ { 0x0700, 0x0a13, 0x0000 },
+ { 0x0700, 0x0a15, 0x0000 },
+ { 0x8700, 0x0a18, 0x2000 },
+ { 0x0700, 0x0a17, 0x0000 },
+ { 0x0700, 0x0a19, 0x0000 },
+ { 0x8700, 0x0a22, 0x4000 },
+ { 0x8700, 0x0a1e, 0x3000 },
+ { 0x8700, 0x0a1c, 0x2000 },
+ { 0x0700, 0x0a1b, 0x0000 },
+ { 0x0700, 0x0a1d, 0x0000 },
+ { 0x8700, 0x0a20, 0x2000 },
+ { 0x0700, 0x0a1f, 0x0000 },
+ { 0x0700, 0x0a21, 0x0000 },
+ { 0x8700, 0x0a26, 0x3000 },
+ { 0x8700, 0x0a24, 0x2000 },
+ { 0x0700, 0x0a23, 0x0000 },
+ { 0x0700, 0x0a25, 0x0000 },
+ { 0x8700, 0x0a28, 0x2000 },
+ { 0x0700, 0x0a27, 0x0000 },
+ { 0x0700, 0x0a2a, 0x0000 },
+ { 0x8d00, 0x0a6a, 0x6000 },
+ { 0x8c00, 0x0a41, 0x5000 },
+ { 0x8700, 0x0a35, 0x4000 },
+ { 0x8700, 0x0a2f, 0x3000 },
+ { 0x8700, 0x0a2d, 0x2000 },
+ { 0x0700, 0x0a2c, 0x0000 },
+ { 0x0700, 0x0a2e, 0x0000 },
+ { 0x8700, 0x0a32, 0x2000 },
+ { 0x0700, 0x0a30, 0x0000 },
+ { 0x0700, 0x0a33, 0x0000 },
+ { 0x8c00, 0x0a3c, 0x3000 },
+ { 0x8700, 0x0a38, 0x2000 },
+ { 0x0700, 0x0a36, 0x0000 },
+ { 0x0700, 0x0a39, 0x0000 },
+ { 0x8a00, 0x0a3f, 0x2000 },
+ { 0x0a00, 0x0a3e, 0x0000 },
+ { 0x0a00, 0x0a40, 0x0000 },
+ { 0x8700, 0x0a5a, 0x4000 },
+ { 0x8c00, 0x0a4b, 0x3000 },
+ { 0x8c00, 0x0a47, 0x2000 },
+ { 0x0c00, 0x0a42, 0x0000 },
+ { 0x0c00, 0x0a48, 0x0000 },
+ { 0x8c00, 0x0a4d, 0x2000 },
+ { 0x0c00, 0x0a4c, 0x0000 },
+ { 0x0700, 0x0a59, 0x0000 },
+ { 0x8d00, 0x0a66, 0x3000 },
+ { 0x8700, 0x0a5c, 0x2000 },
+ { 0x0700, 0x0a5b, 0x0000 },
+ { 0x0700, 0x0a5e, 0x0000 },
+ { 0x8d00, 0x0a68, 0x2000 },
+ { 0x0d00, 0x0a67, 0x0000 },
+ { 0x0d00, 0x0a69, 0x0000 },
+ { 0x8700, 0x0a87, 0x5000 },
+ { 0x8700, 0x0a72, 0x4000 },
+ { 0x8d00, 0x0a6e, 0x3000 },
+ { 0x8d00, 0x0a6c, 0x2000 },
+ { 0x0d00, 0x0a6b, 0x0000 },
+ { 0x0d00, 0x0a6d, 0x0000 },
+ { 0x8c00, 0x0a70, 0x2000 },
+ { 0x0d00, 0x0a6f, 0x0000 },
+ { 0x0c00, 0x0a71, 0x0000 },
+ { 0x8c00, 0x0a82, 0x3000 },
+ { 0x8700, 0x0a74, 0x2000 },
+ { 0x0700, 0x0a73, 0x0000 },
+ { 0x0c00, 0x0a81, 0x0000 },
+ { 0x8700, 0x0a85, 0x2000 },
+ { 0x0a00, 0x0a83, 0x0000 },
+ { 0x0700, 0x0a86, 0x0000 },
+ { 0x8700, 0x0a90, 0x4000 },
+ { 0x8700, 0x0a8b, 0x3000 },
+ { 0x8700, 0x0a89, 0x2000 },
+ { 0x0700, 0x0a88, 0x0000 },
+ { 0x0700, 0x0a8a, 0x0000 },
+ { 0x8700, 0x0a8d, 0x2000 },
+ { 0x0700, 0x0a8c, 0x0000 },
+ { 0x0700, 0x0a8f, 0x0000 },
+ { 0x8700, 0x0a95, 0x3000 },
+ { 0x8700, 0x0a93, 0x2000 },
+ { 0x0700, 0x0a91, 0x0000 },
+ { 0x0700, 0x0a94, 0x0000 },
+ { 0x8700, 0x0a97, 0x2000 },
+ { 0x0700, 0x0a96, 0x0000 },
+ { 0x0700, 0x0a98, 0x0000 },
+ { 0x8700, 0x10ef, 0xb000 },
+ { 0x8700, 0x0dc6, 0xa000 },
+ { 0x8700, 0x0c31, 0x9000 },
+ { 0x8700, 0x0b5f, 0x8000 },
+ { 0x8a00, 0x0b03, 0x7000 },
+ { 0x8a00, 0x0abe, 0x6000 },
+ { 0x8700, 0x0aaa, 0x5000 },
+ { 0x8700, 0x0aa1, 0x4000 },
+ { 0x8700, 0x0a9d, 0x3000 },
+ { 0x8700, 0x0a9b, 0x2000 },
+ { 0x0700, 0x0a9a, 0x0000 },
+ { 0x0700, 0x0a9c, 0x0000 },
+ { 0x8700, 0x0a9f, 0x2000 },
+ { 0x0700, 0x0a9e, 0x0000 },
+ { 0x0700, 0x0aa0, 0x0000 },
+ { 0x8700, 0x0aa5, 0x3000 },
+ { 0x8700, 0x0aa3, 0x2000 },
+ { 0x0700, 0x0aa2, 0x0000 },
+ { 0x0700, 0x0aa4, 0x0000 },
+ { 0x8700, 0x0aa7, 0x2000 },
+ { 0x0700, 0x0aa6, 0x0000 },
+ { 0x0700, 0x0aa8, 0x0000 },
+ { 0x8700, 0x0ab3, 0x4000 },
+ { 0x8700, 0x0aae, 0x3000 },
+ { 0x8700, 0x0aac, 0x2000 },
+ { 0x0700, 0x0aab, 0x0000 },
+ { 0x0700, 0x0aad, 0x0000 },
+ { 0x8700, 0x0ab0, 0x2000 },
+ { 0x0700, 0x0aaf, 0x0000 },
+ { 0x0700, 0x0ab2, 0x0000 },
+ { 0x8700, 0x0ab8, 0x3000 },
+ { 0x8700, 0x0ab6, 0x2000 },
+ { 0x0700, 0x0ab5, 0x0000 },
+ { 0x0700, 0x0ab7, 0x0000 },
+ { 0x8c00, 0x0abc, 0x2000 },
+ { 0x0700, 0x0ab9, 0x0000 },
+ { 0x0700, 0x0abd, 0x0000 },
+ { 0x8700, 0x0ae1, 0x5000 },
+ { 0x8c00, 0x0ac7, 0x4000 },
+ { 0x8c00, 0x0ac2, 0x3000 },
+ { 0x8a00, 0x0ac0, 0x2000 },
+ { 0x0a00, 0x0abf, 0x0000 },
+ { 0x0c00, 0x0ac1, 0x0000 },
+ { 0x8c00, 0x0ac4, 0x2000 },
+ { 0x0c00, 0x0ac3, 0x0000 },
+ { 0x0c00, 0x0ac5, 0x0000 },
+ { 0x8a00, 0x0acc, 0x3000 },
+ { 0x8a00, 0x0ac9, 0x2000 },
+ { 0x0c00, 0x0ac8, 0x0000 },
+ { 0x0a00, 0x0acb, 0x0000 },
+ { 0x8700, 0x0ad0, 0x2000 },
+ { 0x0c00, 0x0acd, 0x0000 },
+ { 0x0700, 0x0ae0, 0x0000 },
+ { 0x8d00, 0x0aeb, 0x4000 },
+ { 0x8d00, 0x0ae7, 0x3000 },
+ { 0x8c00, 0x0ae3, 0x2000 },
+ { 0x0c00, 0x0ae2, 0x0000 },
+ { 0x0d00, 0x0ae6, 0x0000 },
+ { 0x8d00, 0x0ae9, 0x2000 },
+ { 0x0d00, 0x0ae8, 0x0000 },
+ { 0x0d00, 0x0aea, 0x0000 },
+ { 0x8d00, 0x0aef, 0x3000 },
+ { 0x8d00, 0x0aed, 0x2000 },
+ { 0x0d00, 0x0aec, 0x0000 },
+ { 0x0d00, 0x0aee, 0x0000 },
+ { 0x8c00, 0x0b01, 0x2000 },
+ { 0x1700, 0x0af1, 0x0000 },
+ { 0x0a00, 0x0b02, 0x0000 },
+ { 0x8700, 0x0b28, 0x6000 },
+ { 0x8700, 0x0b18, 0x5000 },
+ { 0x8700, 0x0b0c, 0x4000 },
+ { 0x8700, 0x0b08, 0x3000 },
+ { 0x8700, 0x0b06, 0x2000 },
+ { 0x0700, 0x0b05, 0x0000 },
+ { 0x0700, 0x0b07, 0x0000 },
+ { 0x8700, 0x0b0a, 0x2000 },
+ { 0x0700, 0x0b09, 0x0000 },
+ { 0x0700, 0x0b0b, 0x0000 },
+ { 0x8700, 0x0b14, 0x3000 },
+ { 0x8700, 0x0b10, 0x2000 },
+ { 0x0700, 0x0b0f, 0x0000 },
+ { 0x0700, 0x0b13, 0x0000 },
+ { 0x8700, 0x0b16, 0x2000 },
+ { 0x0700, 0x0b15, 0x0000 },
+ { 0x0700, 0x0b17, 0x0000 },
+ { 0x8700, 0x0b20, 0x4000 },
+ { 0x8700, 0x0b1c, 0x3000 },
+ { 0x8700, 0x0b1a, 0x2000 },
+ { 0x0700, 0x0b19, 0x0000 },
+ { 0x0700, 0x0b1b, 0x0000 },
+ { 0x8700, 0x0b1e, 0x2000 },
+ { 0x0700, 0x0b1d, 0x0000 },
+ { 0x0700, 0x0b1f, 0x0000 },
+ { 0x8700, 0x0b24, 0x3000 },
+ { 0x8700, 0x0b22, 0x2000 },
+ { 0x0700, 0x0b21, 0x0000 },
+ { 0x0700, 0x0b23, 0x0000 },
+ { 0x8700, 0x0b26, 0x2000 },
+ { 0x0700, 0x0b25, 0x0000 },
+ { 0x0700, 0x0b27, 0x0000 },
+ { 0x8700, 0x0b3d, 0x5000 },
+ { 0x8700, 0x0b32, 0x4000 },
+ { 0x8700, 0x0b2d, 0x3000 },
+ { 0x8700, 0x0b2b, 0x2000 },
+ { 0x0700, 0x0b2a, 0x0000 },
+ { 0x0700, 0x0b2c, 0x0000 },
+ { 0x8700, 0x0b2f, 0x2000 },
+ { 0x0700, 0x0b2e, 0x0000 },
+ { 0x0700, 0x0b30, 0x0000 },
+ { 0x8700, 0x0b37, 0x3000 },
+ { 0x8700, 0x0b35, 0x2000 },
+ { 0x0700, 0x0b33, 0x0000 },
+ { 0x0700, 0x0b36, 0x0000 },
+ { 0x8700, 0x0b39, 0x2000 },
+ { 0x0700, 0x0b38, 0x0000 },
+ { 0x0c00, 0x0b3c, 0x0000 },
+ { 0x8a00, 0x0b48, 0x4000 },
+ { 0x8c00, 0x0b41, 0x3000 },
+ { 0x8c00, 0x0b3f, 0x2000 },
+ { 0x0a00, 0x0b3e, 0x0000 },
+ { 0x0a00, 0x0b40, 0x0000 },
+ { 0x8c00, 0x0b43, 0x2000 },
+ { 0x0c00, 0x0b42, 0x0000 },
+ { 0x0a00, 0x0b47, 0x0000 },
+ { 0x8c00, 0x0b56, 0x3000 },
+ { 0x8a00, 0x0b4c, 0x2000 },
+ { 0x0a00, 0x0b4b, 0x0000 },
+ { 0x0c00, 0x0b4d, 0x0000 },
+ { 0x8700, 0x0b5c, 0x2000 },
+ { 0x0a00, 0x0b57, 0x0000 },
+ { 0x0700, 0x0b5d, 0x0000 },
+ { 0x8d00, 0x0be7, 0x7000 },
+ { 0x8700, 0x0b9c, 0x6000 },
+ { 0x8700, 0x0b83, 0x5000 },
+ { 0x8d00, 0x0b6b, 0x4000 },
+ { 0x8d00, 0x0b67, 0x3000 },
+ { 0x8700, 0x0b61, 0x2000 },
+ { 0x0700, 0x0b60, 0x0000 },
+ { 0x0d00, 0x0b66, 0x0000 },
+ { 0x8d00, 0x0b69, 0x2000 },
+ { 0x0d00, 0x0b68, 0x0000 },
+ { 0x0d00, 0x0b6a, 0x0000 },
+ { 0x8d00, 0x0b6f, 0x3000 },
+ { 0x8d00, 0x0b6d, 0x2000 },
+ { 0x0d00, 0x0b6c, 0x0000 },
+ { 0x0d00, 0x0b6e, 0x0000 },
+ { 0x8700, 0x0b71, 0x2000 },
+ { 0x1a00, 0x0b70, 0x0000 },
+ { 0x0c00, 0x0b82, 0x0000 },
+ { 0x8700, 0x0b8f, 0x4000 },
+ { 0x8700, 0x0b88, 0x3000 },
+ { 0x8700, 0x0b86, 0x2000 },
+ { 0x0700, 0x0b85, 0x0000 },
+ { 0x0700, 0x0b87, 0x0000 },
+ { 0x8700, 0x0b8a, 0x2000 },
+ { 0x0700, 0x0b89, 0x0000 },
+ { 0x0700, 0x0b8e, 0x0000 },
+ { 0x8700, 0x0b94, 0x3000 },
+ { 0x8700, 0x0b92, 0x2000 },
+ { 0x0700, 0x0b90, 0x0000 },
+ { 0x0700, 0x0b93, 0x0000 },
+ { 0x8700, 0x0b99, 0x2000 },
+ { 0x0700, 0x0b95, 0x0000 },
+ { 0x0700, 0x0b9a, 0x0000 },
+ { 0x8700, 0x0bb7, 0x5000 },
+ { 0x8700, 0x0bae, 0x4000 },
+ { 0x8700, 0x0ba4, 0x3000 },
+ { 0x8700, 0x0b9f, 0x2000 },
+ { 0x0700, 0x0b9e, 0x0000 },
+ { 0x0700, 0x0ba3, 0x0000 },
+ { 0x8700, 0x0ba9, 0x2000 },
+ { 0x0700, 0x0ba8, 0x0000 },
+ { 0x0700, 0x0baa, 0x0000 },
+ { 0x8700, 0x0bb2, 0x3000 },
+ { 0x8700, 0x0bb0, 0x2000 },
+ { 0x0700, 0x0baf, 0x0000 },
+ { 0x0700, 0x0bb1, 0x0000 },
+ { 0x8700, 0x0bb4, 0x2000 },
+ { 0x0700, 0x0bb3, 0x0000 },
+ { 0x0700, 0x0bb5, 0x0000 },
+ { 0x8a00, 0x0bc6, 0x4000 },
+ { 0x8a00, 0x0bbf, 0x3000 },
+ { 0x8700, 0x0bb9, 0x2000 },
+ { 0x0700, 0x0bb8, 0x0000 },
+ { 0x0a00, 0x0bbe, 0x0000 },
+ { 0x8a00, 0x0bc1, 0x2000 },
+ { 0x0c00, 0x0bc0, 0x0000 },
+ { 0x0a00, 0x0bc2, 0x0000 },
+ { 0x8a00, 0x0bcb, 0x3000 },
+ { 0x8a00, 0x0bc8, 0x2000 },
+ { 0x0a00, 0x0bc7, 0x0000 },
+ { 0x0a00, 0x0bca, 0x0000 },
+ { 0x8c00, 0x0bcd, 0x2000 },
+ { 0x0a00, 0x0bcc, 0x0000 },
+ { 0x0a00, 0x0bd7, 0x0000 },
+ { 0x8700, 0x0c0f, 0x6000 },
+ { 0x9a00, 0x0bf7, 0x5000 },
+ { 0x8d00, 0x0bef, 0x4000 },
+ { 0x8d00, 0x0beb, 0x3000 },
+ { 0x8d00, 0x0be9, 0x2000 },
+ { 0x0d00, 0x0be8, 0x0000 },
+ { 0x0d00, 0x0bea, 0x0000 },
+ { 0x8d00, 0x0bed, 0x2000 },
+ { 0x0d00, 0x0bec, 0x0000 },
+ { 0x0d00, 0x0bee, 0x0000 },
+ { 0x9a00, 0x0bf3, 0x3000 },
+ { 0x8f00, 0x0bf1, 0x2000 },
+ { 0x0f00, 0x0bf0, 0x0000 },
+ { 0x0f00, 0x0bf2, 0x0000 },
+ { 0x9a00, 0x0bf5, 0x2000 },
+ { 0x1a00, 0x0bf4, 0x0000 },
+ { 0x1a00, 0x0bf6, 0x0000 },
+ { 0x8700, 0x0c06, 0x4000 },
+ { 0x8a00, 0x0c01, 0x3000 },
+ { 0x9700, 0x0bf9, 0x2000 },
+ { 0x1a00, 0x0bf8, 0x0000 },
+ { 0x1a00, 0x0bfa, 0x0000 },
+ { 0x8a00, 0x0c03, 0x2000 },
+ { 0x0a00, 0x0c02, 0x0000 },
+ { 0x0700, 0x0c05, 0x0000 },
+ { 0x8700, 0x0c0a, 0x3000 },
+ { 0x8700, 0x0c08, 0x2000 },
+ { 0x0700, 0x0c07, 0x0000 },
+ { 0x0700, 0x0c09, 0x0000 },
+ { 0x8700, 0x0c0c, 0x2000 },
+ { 0x0700, 0x0c0b, 0x0000 },
+ { 0x0700, 0x0c0e, 0x0000 },
+ { 0x8700, 0x0c20, 0x5000 },
+ { 0x8700, 0x0c18, 0x4000 },
+ { 0x8700, 0x0c14, 0x3000 },
+ { 0x8700, 0x0c12, 0x2000 },
+ { 0x0700, 0x0c10, 0x0000 },
+ { 0x0700, 0x0c13, 0x0000 },
+ { 0x8700, 0x0c16, 0x2000 },
+ { 0x0700, 0x0c15, 0x0000 },
+ { 0x0700, 0x0c17, 0x0000 },
+ { 0x8700, 0x0c1c, 0x3000 },
+ { 0x8700, 0x0c1a, 0x2000 },
+ { 0x0700, 0x0c19, 0x0000 },
+ { 0x0700, 0x0c1b, 0x0000 },
+ { 0x8700, 0x0c1e, 0x2000 },
+ { 0x0700, 0x0c1d, 0x0000 },
+ { 0x0700, 0x0c1f, 0x0000 },
+ { 0x8700, 0x0c28, 0x4000 },
+ { 0x8700, 0x0c24, 0x3000 },
+ { 0x8700, 0x0c22, 0x2000 },
+ { 0x0700, 0x0c21, 0x0000 },
+ { 0x0700, 0x0c23, 0x0000 },
+ { 0x8700, 0x0c26, 0x2000 },
+ { 0x0700, 0x0c25, 0x0000 },
+ { 0x0700, 0x0c27, 0x0000 },
+ { 0x8700, 0x0c2d, 0x3000 },
+ { 0x8700, 0x0c2b, 0x2000 },
+ { 0x0700, 0x0c2a, 0x0000 },
+ { 0x0700, 0x0c2c, 0x0000 },
+ { 0x8700, 0x0c2f, 0x2000 },
+ { 0x0700, 0x0c2e, 0x0000 },
+ { 0x0700, 0x0c30, 0x0000 },
+ { 0x8700, 0x0d0e, 0x8000 },
+ { 0x8700, 0x0ca1, 0x7000 },
+ { 0x8d00, 0x0c6c, 0x6000 },
+ { 0x8c00, 0x0c47, 0x5000 },
+ { 0x8c00, 0x0c3e, 0x4000 },
+ { 0x8700, 0x0c36, 0x3000 },
+ { 0x8700, 0x0c33, 0x2000 },
+ { 0x0700, 0x0c32, 0x0000 },
+ { 0x0700, 0x0c35, 0x0000 },
+ { 0x8700, 0x0c38, 0x2000 },
+ { 0x0700, 0x0c37, 0x0000 },
+ { 0x0700, 0x0c39, 0x0000 },
+ { 0x8a00, 0x0c42, 0x3000 },
+ { 0x8c00, 0x0c40, 0x2000 },
+ { 0x0c00, 0x0c3f, 0x0000 },
+ { 0x0a00, 0x0c41, 0x0000 },
+ { 0x8a00, 0x0c44, 0x2000 },
+ { 0x0a00, 0x0c43, 0x0000 },
+ { 0x0c00, 0x0c46, 0x0000 },
+ { 0x8700, 0x0c60, 0x4000 },
+ { 0x8c00, 0x0c4c, 0x3000 },
+ { 0x8c00, 0x0c4a, 0x2000 },
+ { 0x0c00, 0x0c48, 0x0000 },
+ { 0x0c00, 0x0c4b, 0x0000 },
+ { 0x8c00, 0x0c55, 0x2000 },
+ { 0x0c00, 0x0c4d, 0x0000 },
+ { 0x0c00, 0x0c56, 0x0000 },
+ { 0x8d00, 0x0c68, 0x3000 },
+ { 0x8d00, 0x0c66, 0x2000 },
+ { 0x0700, 0x0c61, 0x0000 },
+ { 0x0d00, 0x0c67, 0x0000 },
+ { 0x8d00, 0x0c6a, 0x2000 },
+ { 0x0d00, 0x0c69, 0x0000 },
+ { 0x0d00, 0x0c6b, 0x0000 },
+ { 0x8700, 0x0c90, 0x5000 },
+ { 0x8700, 0x0c87, 0x4000 },
+ { 0x8a00, 0x0c82, 0x3000 },
+ { 0x8d00, 0x0c6e, 0x2000 },
+ { 0x0d00, 0x0c6d, 0x0000 },
+ { 0x0d00, 0x0c6f, 0x0000 },
+ { 0x8700, 0x0c85, 0x2000 },
+ { 0x0a00, 0x0c83, 0x0000 },
+ { 0x0700, 0x0c86, 0x0000 },
+ { 0x8700, 0x0c8b, 0x3000 },
+ { 0x8700, 0x0c89, 0x2000 },
+ { 0x0700, 0x0c88, 0x0000 },
+ { 0x0700, 0x0c8a, 0x0000 },
+ { 0x8700, 0x0c8e, 0x2000 },
+ { 0x0700, 0x0c8c, 0x0000 },
+ { 0x0700, 0x0c8f, 0x0000 },
+ { 0x8700, 0x0c99, 0x4000 },
+ { 0x8700, 0x0c95, 0x3000 },
+ { 0x8700, 0x0c93, 0x2000 },
+ { 0x0700, 0x0c92, 0x0000 },
+ { 0x0700, 0x0c94, 0x0000 },
+ { 0x8700, 0x0c97, 0x2000 },
+ { 0x0700, 0x0c96, 0x0000 },
+ { 0x0700, 0x0c98, 0x0000 },
+ { 0x8700, 0x0c9d, 0x3000 },
+ { 0x8700, 0x0c9b, 0x2000 },
+ { 0x0700, 0x0c9a, 0x0000 },
+ { 0x0700, 0x0c9c, 0x0000 },
+ { 0x8700, 0x0c9f, 0x2000 },
+ { 0x0700, 0x0c9e, 0x0000 },
+ { 0x0700, 0x0ca0, 0x0000 },
+ { 0x8c00, 0x0cc6, 0x6000 },
+ { 0x8700, 0x0cb2, 0x5000 },
+ { 0x8700, 0x0caa, 0x4000 },
+ { 0x8700, 0x0ca5, 0x3000 },
+ { 0x8700, 0x0ca3, 0x2000 },
+ { 0x0700, 0x0ca2, 0x0000 },
+ { 0x0700, 0x0ca4, 0x0000 },
+ { 0x8700, 0x0ca7, 0x2000 },
+ { 0x0700, 0x0ca6, 0x0000 },
+ { 0x0700, 0x0ca8, 0x0000 },
+ { 0x8700, 0x0cae, 0x3000 },
+ { 0x8700, 0x0cac, 0x2000 },
+ { 0x0700, 0x0cab, 0x0000 },
+ { 0x0700, 0x0cad, 0x0000 },
+ { 0x8700, 0x0cb0, 0x2000 },
+ { 0x0700, 0x0caf, 0x0000 },
+ { 0x0700, 0x0cb1, 0x0000 },
+ { 0x8700, 0x0cbd, 0x4000 },
+ { 0x8700, 0x0cb7, 0x3000 },
+ { 0x8700, 0x0cb5, 0x2000 },
+ { 0x0700, 0x0cb3, 0x0000 },
+ { 0x0700, 0x0cb6, 0x0000 },
+ { 0x8700, 0x0cb9, 0x2000 },
+ { 0x0700, 0x0cb8, 0x0000 },
+ { 0x0c00, 0x0cbc, 0x0000 },
+ { 0x8a00, 0x0cc1, 0x3000 },
+ { 0x8c00, 0x0cbf, 0x2000 },
+ { 0x0a00, 0x0cbe, 0x0000 },
+ { 0x0a00, 0x0cc0, 0x0000 },
+ { 0x8a00, 0x0cc3, 0x2000 },
+ { 0x0a00, 0x0cc2, 0x0000 },
+ { 0x0a00, 0x0cc4, 0x0000 },
+ { 0x8d00, 0x0cea, 0x5000 },
+ { 0x8a00, 0x0cd6, 0x4000 },
+ { 0x8a00, 0x0ccb, 0x3000 },
+ { 0x8a00, 0x0cc8, 0x2000 },
+ { 0x0a00, 0x0cc7, 0x0000 },
+ { 0x0a00, 0x0cca, 0x0000 },
+ { 0x8c00, 0x0ccd, 0x2000 },
+ { 0x0c00, 0x0ccc, 0x0000 },
+ { 0x0a00, 0x0cd5, 0x0000 },
+ { 0x8d00, 0x0ce6, 0x3000 },
+ { 0x8700, 0x0ce0, 0x2000 },
+ { 0x0700, 0x0cde, 0x0000 },
+ { 0x0700, 0x0ce1, 0x0000 },
+ { 0x8d00, 0x0ce8, 0x2000 },
+ { 0x0d00, 0x0ce7, 0x0000 },
+ { 0x0d00, 0x0ce9, 0x0000 },
+ { 0x8700, 0x0d05, 0x4000 },
+ { 0x8d00, 0x0cee, 0x3000 },
+ { 0x8d00, 0x0cec, 0x2000 },
+ { 0x0d00, 0x0ceb, 0x0000 },
+ { 0x0d00, 0x0ced, 0x0000 },
+ { 0x8a00, 0x0d02, 0x2000 },
+ { 0x0d00, 0x0cef, 0x0000 },
+ { 0x0a00, 0x0d03, 0x0000 },
+ { 0x8700, 0x0d09, 0x3000 },
+ { 0x8700, 0x0d07, 0x2000 },
+ { 0x0700, 0x0d06, 0x0000 },
+ { 0x0700, 0x0d08, 0x0000 },
+ { 0x8700, 0x0d0b, 0x2000 },
+ { 0x0700, 0x0d0a, 0x0000 },
+ { 0x0700, 0x0d0c, 0x0000 },
+ { 0x8d00, 0x0d6c, 0x7000 },
+ { 0x8700, 0x0d30, 0x6000 },
+ { 0x8700, 0x0d1f, 0x5000 },
+ { 0x8700, 0x0d17, 0x4000 },
+ { 0x8700, 0x0d13, 0x3000 },
+ { 0x8700, 0x0d10, 0x2000 },
+ { 0x0700, 0x0d0f, 0x0000 },
+ { 0x0700, 0x0d12, 0x0000 },
+ { 0x8700, 0x0d15, 0x2000 },
+ { 0x0700, 0x0d14, 0x0000 },
+ { 0x0700, 0x0d16, 0x0000 },
+ { 0x8700, 0x0d1b, 0x3000 },
+ { 0x8700, 0x0d19, 0x2000 },
+ { 0x0700, 0x0d18, 0x0000 },
+ { 0x0700, 0x0d1a, 0x0000 },
+ { 0x8700, 0x0d1d, 0x2000 },
+ { 0x0700, 0x0d1c, 0x0000 },
+ { 0x0700, 0x0d1e, 0x0000 },
+ { 0x8700, 0x0d27, 0x4000 },
+ { 0x8700, 0x0d23, 0x3000 },
+ { 0x8700, 0x0d21, 0x2000 },
+ { 0x0700, 0x0d20, 0x0000 },
+ { 0x0700, 0x0d22, 0x0000 },
+ { 0x8700, 0x0d25, 0x2000 },
+ { 0x0700, 0x0d24, 0x0000 },
+ { 0x0700, 0x0d26, 0x0000 },
+ { 0x8700, 0x0d2c, 0x3000 },
+ { 0x8700, 0x0d2a, 0x2000 },
+ { 0x0700, 0x0d28, 0x0000 },
+ { 0x0700, 0x0d2b, 0x0000 },
+ { 0x8700, 0x0d2e, 0x2000 },
+ { 0x0700, 0x0d2d, 0x0000 },
+ { 0x0700, 0x0d2f, 0x0000 },
+ { 0x8a00, 0x0d46, 0x5000 },
+ { 0x8700, 0x0d38, 0x4000 },
+ { 0x8700, 0x0d34, 0x3000 },
+ { 0x8700, 0x0d32, 0x2000 },
+ { 0x0700, 0x0d31, 0x0000 },
+ { 0x0700, 0x0d33, 0x0000 },
+ { 0x8700, 0x0d36, 0x2000 },
+ { 0x0700, 0x0d35, 0x0000 },
+ { 0x0700, 0x0d37, 0x0000 },
+ { 0x8a00, 0x0d40, 0x3000 },
+ { 0x8a00, 0x0d3e, 0x2000 },
+ { 0x0700, 0x0d39, 0x0000 },
+ { 0x0a00, 0x0d3f, 0x0000 },
+ { 0x8c00, 0x0d42, 0x2000 },
+ { 0x0c00, 0x0d41, 0x0000 },
+ { 0x0c00, 0x0d43, 0x0000 },
+ { 0x8700, 0x0d60, 0x4000 },
+ { 0x8a00, 0x0d4b, 0x3000 },
+ { 0x8a00, 0x0d48, 0x2000 },
+ { 0x0a00, 0x0d47, 0x0000 },
+ { 0x0a00, 0x0d4a, 0x0000 },
+ { 0x8c00, 0x0d4d, 0x2000 },
+ { 0x0a00, 0x0d4c, 0x0000 },
+ { 0x0a00, 0x0d57, 0x0000 },
+ { 0x8d00, 0x0d68, 0x3000 },
+ { 0x8d00, 0x0d66, 0x2000 },
+ { 0x0700, 0x0d61, 0x0000 },
+ { 0x0d00, 0x0d67, 0x0000 },
+ { 0x8d00, 0x0d6a, 0x2000 },
+ { 0x0d00, 0x0d69, 0x0000 },
+ { 0x0d00, 0x0d6b, 0x0000 },
+ { 0x8700, 0x0da2, 0x6000 },
+ { 0x8700, 0x0d8f, 0x5000 },
+ { 0x8700, 0x0d87, 0x4000 },
+ { 0x8a00, 0x0d82, 0x3000 },
+ { 0x8d00, 0x0d6e, 0x2000 },
+ { 0x0d00, 0x0d6d, 0x0000 },
+ { 0x0d00, 0x0d6f, 0x0000 },
+ { 0x8700, 0x0d85, 0x2000 },
+ { 0x0a00, 0x0d83, 0x0000 },
+ { 0x0700, 0x0d86, 0x0000 },
+ { 0x8700, 0x0d8b, 0x3000 },
+ { 0x8700, 0x0d89, 0x2000 },
+ { 0x0700, 0x0d88, 0x0000 },
+ { 0x0700, 0x0d8a, 0x0000 },
+ { 0x8700, 0x0d8d, 0x2000 },
+ { 0x0700, 0x0d8c, 0x0000 },
+ { 0x0700, 0x0d8e, 0x0000 },
+ { 0x8700, 0x0d9a, 0x4000 },
+ { 0x8700, 0x0d93, 0x3000 },
+ { 0x8700, 0x0d91, 0x2000 },
+ { 0x0700, 0x0d90, 0x0000 },
+ { 0x0700, 0x0d92, 0x0000 },
+ { 0x8700, 0x0d95, 0x2000 },
+ { 0x0700, 0x0d94, 0x0000 },
+ { 0x0700, 0x0d96, 0x0000 },
+ { 0x8700, 0x0d9e, 0x3000 },
+ { 0x8700, 0x0d9c, 0x2000 },
+ { 0x0700, 0x0d9b, 0x0000 },
+ { 0x0700, 0x0d9d, 0x0000 },
+ { 0x8700, 0x0da0, 0x2000 },
+ { 0x0700, 0x0d9f, 0x0000 },
+ { 0x0700, 0x0da1, 0x0000 },
+ { 0x8700, 0x0db3, 0x5000 },
+ { 0x8700, 0x0daa, 0x4000 },
+ { 0x8700, 0x0da6, 0x3000 },
+ { 0x8700, 0x0da4, 0x2000 },
+ { 0x0700, 0x0da3, 0x0000 },
+ { 0x0700, 0x0da5, 0x0000 },
+ { 0x8700, 0x0da8, 0x2000 },
+ { 0x0700, 0x0da7, 0x0000 },
+ { 0x0700, 0x0da9, 0x0000 },
+ { 0x8700, 0x0dae, 0x3000 },
+ { 0x8700, 0x0dac, 0x2000 },
+ { 0x0700, 0x0dab, 0x0000 },
+ { 0x0700, 0x0dad, 0x0000 },
+ { 0x8700, 0x0db0, 0x2000 },
+ { 0x0700, 0x0daf, 0x0000 },
+ { 0x0700, 0x0db1, 0x0000 },
+ { 0x8700, 0x0dbb, 0x4000 },
+ { 0x8700, 0x0db7, 0x3000 },
+ { 0x8700, 0x0db5, 0x2000 },
+ { 0x0700, 0x0db4, 0x0000 },
+ { 0x0700, 0x0db6, 0x0000 },
+ { 0x8700, 0x0db9, 0x2000 },
+ { 0x0700, 0x0db8, 0x0000 },
+ { 0x0700, 0x0dba, 0x0000 },
+ { 0x8700, 0x0dc2, 0x3000 },
+ { 0x8700, 0x0dc0, 0x2000 },
+ { 0x0700, 0x0dbd, 0x0000 },
+ { 0x0700, 0x0dc1, 0x0000 },
+ { 0x8700, 0x0dc4, 0x2000 },
+ { 0x0700, 0x0dc3, 0x0000 },
+ { 0x0700, 0x0dc5, 0x0000 },
+ { 0x8700, 0x0f55, 0x9000 },
+ { 0x8700, 0x0ea5, 0x8000 },
+ { 0x8700, 0x0e2d, 0x7000 },
+ { 0x8700, 0x0e0d, 0x6000 },
+ { 0x8a00, 0x0ddf, 0x5000 },
+ { 0x8c00, 0x0dd6, 0x4000 },
+ { 0x8a00, 0x0dd1, 0x3000 },
+ { 0x8a00, 0x0dcf, 0x2000 },
+ { 0x0c00, 0x0dca, 0x0000 },
+ { 0x0a00, 0x0dd0, 0x0000 },
+ { 0x8c00, 0x0dd3, 0x2000 },
+ { 0x0c00, 0x0dd2, 0x0000 },
+ { 0x0c00, 0x0dd4, 0x0000 },
+ { 0x8a00, 0x0ddb, 0x3000 },
+ { 0x8a00, 0x0dd9, 0x2000 },
+ { 0x0a00, 0x0dd8, 0x0000 },
+ { 0x0a00, 0x0dda, 0x0000 },
+ { 0x8a00, 0x0ddd, 0x2000 },
+ { 0x0a00, 0x0ddc, 0x0000 },
+ { 0x0a00, 0x0dde, 0x0000 },
+ { 0x8700, 0x0e05, 0x4000 },
+ { 0x8700, 0x0e01, 0x3000 },
+ { 0x8a00, 0x0df3, 0x2000 },
+ { 0x0a00, 0x0df2, 0x0000 },
+ { 0x1500, 0x0df4, 0x0000 },
+ { 0x8700, 0x0e03, 0x2000 },
+ { 0x0700, 0x0e02, 0x0000 },
+ { 0x0700, 0x0e04, 0x0000 },
+ { 0x8700, 0x0e09, 0x3000 },
+ { 0x8700, 0x0e07, 0x2000 },
+ { 0x0700, 0x0e06, 0x0000 },
+ { 0x0700, 0x0e08, 0x0000 },
+ { 0x8700, 0x0e0b, 0x2000 },
+ { 0x0700, 0x0e0a, 0x0000 },
+ { 0x0700, 0x0e0c, 0x0000 },
+ { 0x8700, 0x0e1d, 0x5000 },
+ { 0x8700, 0x0e15, 0x4000 },
+ { 0x8700, 0x0e11, 0x3000 },
+ { 0x8700, 0x0e0f, 0x2000 },
+ { 0x0700, 0x0e0e, 0x0000 },
+ { 0x0700, 0x0e10, 0x0000 },
+ { 0x8700, 0x0e13, 0x2000 },
+ { 0x0700, 0x0e12, 0x0000 },
+ { 0x0700, 0x0e14, 0x0000 },
+ { 0x8700, 0x0e19, 0x3000 },
+ { 0x8700, 0x0e17, 0x2000 },
+ { 0x0700, 0x0e16, 0x0000 },
+ { 0x0700, 0x0e18, 0x0000 },
+ { 0x8700, 0x0e1b, 0x2000 },
+ { 0x0700, 0x0e1a, 0x0000 },
+ { 0x0700, 0x0e1c, 0x0000 },
+ { 0x8700, 0x0e25, 0x4000 },
+ { 0x8700, 0x0e21, 0x3000 },
+ { 0x8700, 0x0e1f, 0x2000 },
+ { 0x0700, 0x0e1e, 0x0000 },
+ { 0x0700, 0x0e20, 0x0000 },
+ { 0x8700, 0x0e23, 0x2000 },
+ { 0x0700, 0x0e22, 0x0000 },
+ { 0x0700, 0x0e24, 0x0000 },
+ { 0x8700, 0x0e29, 0x3000 },
+ { 0x8700, 0x0e27, 0x2000 },
+ { 0x0700, 0x0e26, 0x0000 },
+ { 0x0700, 0x0e28, 0x0000 },
+ { 0x8700, 0x0e2b, 0x2000 },
+ { 0x0700, 0x0e2a, 0x0000 },
+ { 0x0700, 0x0e2c, 0x0000 },
+ { 0x8d00, 0x0e51, 0x6000 },
+ { 0x8700, 0x0e41, 0x5000 },
+ { 0x8c00, 0x0e35, 0x4000 },
+ { 0x8c00, 0x0e31, 0x3000 },
+ { 0x8700, 0x0e2f, 0x2000 },
+ { 0x0700, 0x0e2e, 0x0000 },
+ { 0x0700, 0x0e30, 0x0000 },
+ { 0x8700, 0x0e33, 0x2000 },
+ { 0x0700, 0x0e32, 0x0000 },
+ { 0x0c00, 0x0e34, 0x0000 },
+ { 0x8c00, 0x0e39, 0x3000 },
+ { 0x8c00, 0x0e37, 0x2000 },
+ { 0x0c00, 0x0e36, 0x0000 },
+ { 0x0c00, 0x0e38, 0x0000 },
+ { 0x9700, 0x0e3f, 0x2000 },
+ { 0x0c00, 0x0e3a, 0x0000 },
+ { 0x0700, 0x0e40, 0x0000 },
+ { 0x8c00, 0x0e49, 0x4000 },
+ { 0x8700, 0x0e45, 0x3000 },
+ { 0x8700, 0x0e43, 0x2000 },
+ { 0x0700, 0x0e42, 0x0000 },
+ { 0x0700, 0x0e44, 0x0000 },
+ { 0x8c00, 0x0e47, 0x2000 },
+ { 0x0600, 0x0e46, 0x0000 },
+ { 0x0c00, 0x0e48, 0x0000 },
+ { 0x8c00, 0x0e4d, 0x3000 },
+ { 0x8c00, 0x0e4b, 0x2000 },
+ { 0x0c00, 0x0e4a, 0x0000 },
+ { 0x0c00, 0x0e4c, 0x0000 },
+ { 0x9500, 0x0e4f, 0x2000 },
+ { 0x0c00, 0x0e4e, 0x0000 },
+ { 0x0d00, 0x0e50, 0x0000 },
+ { 0x8700, 0x0e8a, 0x5000 },
+ { 0x8d00, 0x0e59, 0x4000 },
+ { 0x8d00, 0x0e55, 0x3000 },
+ { 0x8d00, 0x0e53, 0x2000 },
+ { 0x0d00, 0x0e52, 0x0000 },
+ { 0x0d00, 0x0e54, 0x0000 },
+ { 0x8d00, 0x0e57, 0x2000 },
+ { 0x0d00, 0x0e56, 0x0000 },
+ { 0x0d00, 0x0e58, 0x0000 },
+ { 0x8700, 0x0e82, 0x3000 },
+ { 0x9500, 0x0e5b, 0x2000 },
+ { 0x1500, 0x0e5a, 0x0000 },
+ { 0x0700, 0x0e81, 0x0000 },
+ { 0x8700, 0x0e87, 0x2000 },
+ { 0x0700, 0x0e84, 0x0000 },
+ { 0x0700, 0x0e88, 0x0000 },
+ { 0x8700, 0x0e9b, 0x4000 },
+ { 0x8700, 0x0e96, 0x3000 },
+ { 0x8700, 0x0e94, 0x2000 },
+ { 0x0700, 0x0e8d, 0x0000 },
+ { 0x0700, 0x0e95, 0x0000 },
+ { 0x8700, 0x0e99, 0x2000 },
+ { 0x0700, 0x0e97, 0x0000 },
+ { 0x0700, 0x0e9a, 0x0000 },
+ { 0x8700, 0x0e9f, 0x3000 },
+ { 0x8700, 0x0e9d, 0x2000 },
+ { 0x0700, 0x0e9c, 0x0000 },
+ { 0x0700, 0x0e9e, 0x0000 },
+ { 0x8700, 0x0ea2, 0x2000 },
+ { 0x0700, 0x0ea1, 0x0000 },
+ { 0x0700, 0x0ea3, 0x0000 },
+ { 0x9a00, 0x0f14, 0x7000 },
+ { 0x8d00, 0x0ed0, 0x6000 },
+ { 0x8c00, 0x0eb9, 0x5000 },
+ { 0x8c00, 0x0eb1, 0x4000 },
+ { 0x8700, 0x0ead, 0x3000 },
+ { 0x8700, 0x0eaa, 0x2000 },
+ { 0x0700, 0x0ea7, 0x0000 },
+ { 0x0700, 0x0eab, 0x0000 },
+ { 0x8700, 0x0eaf, 0x2000 },
+ { 0x0700, 0x0eae, 0x0000 },
+ { 0x0700, 0x0eb0, 0x0000 },
+ { 0x8c00, 0x0eb5, 0x3000 },
+ { 0x8700, 0x0eb3, 0x2000 },
+ { 0x0700, 0x0eb2, 0x0000 },
+ { 0x0c00, 0x0eb4, 0x0000 },
+ { 0x8c00, 0x0eb7, 0x2000 },
+ { 0x0c00, 0x0eb6, 0x0000 },
+ { 0x0c00, 0x0eb8, 0x0000 },
+ { 0x8700, 0x0ec4, 0x4000 },
+ { 0x8700, 0x0ec0, 0x3000 },
+ { 0x8c00, 0x0ebc, 0x2000 },
+ { 0x0c00, 0x0ebb, 0x0000 },
+ { 0x0700, 0x0ebd, 0x0000 },
+ { 0x8700, 0x0ec2, 0x2000 },
+ { 0x0700, 0x0ec1, 0x0000 },
+ { 0x0700, 0x0ec3, 0x0000 },
+ { 0x8c00, 0x0eca, 0x3000 },
+ { 0x8c00, 0x0ec8, 0x2000 },
+ { 0x0600, 0x0ec6, 0x0000 },
+ { 0x0c00, 0x0ec9, 0x0000 },
+ { 0x8c00, 0x0ecc, 0x2000 },
+ { 0x0c00, 0x0ecb, 0x0000 },
+ { 0x0c00, 0x0ecd, 0x0000 },
+ { 0x9500, 0x0f04, 0x5000 },
+ { 0x8d00, 0x0ed8, 0x4000 },
+ { 0x8d00, 0x0ed4, 0x3000 },
+ { 0x8d00, 0x0ed2, 0x2000 },
+ { 0x0d00, 0x0ed1, 0x0000 },
+ { 0x0d00, 0x0ed3, 0x0000 },
+ { 0x8d00, 0x0ed6, 0x2000 },
+ { 0x0d00, 0x0ed5, 0x0000 },
+ { 0x0d00, 0x0ed7, 0x0000 },
+ { 0x8700, 0x0f00, 0x3000 },
+ { 0x8700, 0x0edc, 0x2000 },
+ { 0x0d00, 0x0ed9, 0x0000 },
+ { 0x0700, 0x0edd, 0x0000 },
+ { 0x9a00, 0x0f02, 0x2000 },
+ { 0x1a00, 0x0f01, 0x0000 },
+ { 0x1a00, 0x0f03, 0x0000 },
+ { 0x9500, 0x0f0c, 0x4000 },
+ { 0x9500, 0x0f08, 0x3000 },
+ { 0x9500, 0x0f06, 0x2000 },
+ { 0x1500, 0x0f05, 0x0000 },
+ { 0x1500, 0x0f07, 0x0000 },
+ { 0x9500, 0x0f0a, 0x2000 },
+ { 0x1500, 0x0f09, 0x0000 },
+ { 0x1500, 0x0f0b, 0x0000 },
+ { 0x9500, 0x0f10, 0x3000 },
+ { 0x9500, 0x0f0e, 0x2000 },
+ { 0x1500, 0x0f0d, 0x0000 },
+ { 0x1500, 0x0f0f, 0x0000 },
+ { 0x9500, 0x0f12, 0x2000 },
+ { 0x1500, 0x0f11, 0x0000 },
+ { 0x1a00, 0x0f13, 0x0000 },
+ { 0x9a00, 0x0f34, 0x6000 },
+ { 0x8d00, 0x0f24, 0x5000 },
+ { 0x9a00, 0x0f1c, 0x4000 },
+ { 0x8c00, 0x0f18, 0x3000 },
+ { 0x9a00, 0x0f16, 0x2000 },
+ { 0x1a00, 0x0f15, 0x0000 },
+ { 0x1a00, 0x0f17, 0x0000 },
+ { 0x9a00, 0x0f1a, 0x2000 },
+ { 0x0c00, 0x0f19, 0x0000 },
+ { 0x1a00, 0x0f1b, 0x0000 },
+ { 0x8d00, 0x0f20, 0x3000 },
+ { 0x9a00, 0x0f1e, 0x2000 },
+ { 0x1a00, 0x0f1d, 0x0000 },
+ { 0x1a00, 0x0f1f, 0x0000 },
+ { 0x8d00, 0x0f22, 0x2000 },
+ { 0x0d00, 0x0f21, 0x0000 },
+ { 0x0d00, 0x0f23, 0x0000 },
+ { 0x8f00, 0x0f2c, 0x4000 },
+ { 0x8d00, 0x0f28, 0x3000 },
+ { 0x8d00, 0x0f26, 0x2000 },
+ { 0x0d00, 0x0f25, 0x0000 },
+ { 0x0d00, 0x0f27, 0x0000 },
+ { 0x8f00, 0x0f2a, 0x2000 },
+ { 0x0d00, 0x0f29, 0x0000 },
+ { 0x0f00, 0x0f2b, 0x0000 },
+ { 0x8f00, 0x0f30, 0x3000 },
+ { 0x8f00, 0x0f2e, 0x2000 },
+ { 0x0f00, 0x0f2d, 0x0000 },
+ { 0x0f00, 0x0f2f, 0x0000 },
+ { 0x8f00, 0x0f32, 0x2000 },
+ { 0x0f00, 0x0f31, 0x0000 },
+ { 0x0f00, 0x0f33, 0x0000 },
+ { 0x8700, 0x0f44, 0x5000 },
+ { 0x9600, 0x0f3c, 0x4000 },
+ { 0x9a00, 0x0f38, 0x3000 },
+ { 0x9a00, 0x0f36, 0x2000 },
+ { 0x0c00, 0x0f35, 0x0000 },
+ { 0x0c00, 0x0f37, 0x0000 },
+ { 0x9600, 0x0f3a, 0x2000 },
+ { 0x0c00, 0x0f39, 0x0000 },
+ { 0x1200, 0x0f3b, 0x0000 },
+ { 0x8700, 0x0f40, 0x3000 },
+ { 0x8a00, 0x0f3e, 0x2000 },
+ { 0x1200, 0x0f3d, 0x0000 },
+ { 0x0a00, 0x0f3f, 0x0000 },
+ { 0x8700, 0x0f42, 0x2000 },
+ { 0x0700, 0x0f41, 0x0000 },
+ { 0x0700, 0x0f43, 0x0000 },
+ { 0x8700, 0x0f4d, 0x4000 },
+ { 0x8700, 0x0f49, 0x3000 },
+ { 0x8700, 0x0f46, 0x2000 },
+ { 0x0700, 0x0f45, 0x0000 },
+ { 0x0700, 0x0f47, 0x0000 },
+ { 0x8700, 0x0f4b, 0x2000 },
+ { 0x0700, 0x0f4a, 0x0000 },
+ { 0x0700, 0x0f4c, 0x0000 },
+ { 0x8700, 0x0f51, 0x3000 },
+ { 0x8700, 0x0f4f, 0x2000 },
+ { 0x0700, 0x0f4e, 0x0000 },
+ { 0x0700, 0x0f50, 0x0000 },
+ { 0x8700, 0x0f53, 0x2000 },
+ { 0x0700, 0x0f52, 0x0000 },
+ { 0x0700, 0x0f54, 0x0000 },
+ { 0x8700, 0x1013, 0x8000 },
+ { 0x8c00, 0x0fa0, 0x7000 },
+ { 0x8c00, 0x0f7b, 0x6000 },
+ { 0x8700, 0x0f65, 0x5000 },
+ { 0x8700, 0x0f5d, 0x4000 },
+ { 0x8700, 0x0f59, 0x3000 },
+ { 0x8700, 0x0f57, 0x2000 },
+ { 0x0700, 0x0f56, 0x0000 },
+ { 0x0700, 0x0f58, 0x0000 },
+ { 0x8700, 0x0f5b, 0x2000 },
+ { 0x0700, 0x0f5a, 0x0000 },
+ { 0x0700, 0x0f5c, 0x0000 },
+ { 0x8700, 0x0f61, 0x3000 },
+ { 0x8700, 0x0f5f, 0x2000 },
+ { 0x0700, 0x0f5e, 0x0000 },
+ { 0x0700, 0x0f60, 0x0000 },
+ { 0x8700, 0x0f63, 0x2000 },
+ { 0x0700, 0x0f62, 0x0000 },
+ { 0x0700, 0x0f64, 0x0000 },
+ { 0x8c00, 0x0f73, 0x4000 },
+ { 0x8700, 0x0f69, 0x3000 },
+ { 0x8700, 0x0f67, 0x2000 },
+ { 0x0700, 0x0f66, 0x0000 },
+ { 0x0700, 0x0f68, 0x0000 },
+ { 0x8c00, 0x0f71, 0x2000 },
+ { 0x0700, 0x0f6a, 0x0000 },
+ { 0x0c00, 0x0f72, 0x0000 },
+ { 0x8c00, 0x0f77, 0x3000 },
+ { 0x8c00, 0x0f75, 0x2000 },
+ { 0x0c00, 0x0f74, 0x0000 },
+ { 0x0c00, 0x0f76, 0x0000 },
+ { 0x8c00, 0x0f79, 0x2000 },
+ { 0x0c00, 0x0f78, 0x0000 },
+ { 0x0c00, 0x0f7a, 0x0000 },
+ { 0x8700, 0x0f8b, 0x5000 },
+ { 0x8c00, 0x0f83, 0x4000 },
+ { 0x8a00, 0x0f7f, 0x3000 },
+ { 0x8c00, 0x0f7d, 0x2000 },
+ { 0x0c00, 0x0f7c, 0x0000 },
+ { 0x0c00, 0x0f7e, 0x0000 },
+ { 0x8c00, 0x0f81, 0x2000 },
+ { 0x0c00, 0x0f80, 0x0000 },
+ { 0x0c00, 0x0f82, 0x0000 },
+ { 0x8c00, 0x0f87, 0x3000 },
+ { 0x9500, 0x0f85, 0x2000 },
+ { 0x0c00, 0x0f84, 0x0000 },
+ { 0x0c00, 0x0f86, 0x0000 },
+ { 0x8700, 0x0f89, 0x2000 },
+ { 0x0700, 0x0f88, 0x0000 },
+ { 0x0700, 0x0f8a, 0x0000 },
+ { 0x8c00, 0x0f97, 0x4000 },
+ { 0x8c00, 0x0f93, 0x3000 },
+ { 0x8c00, 0x0f91, 0x2000 },
+ { 0x0c00, 0x0f90, 0x0000 },
+ { 0x0c00, 0x0f92, 0x0000 },
+ { 0x8c00, 0x0f95, 0x2000 },
+ { 0x0c00, 0x0f94, 0x0000 },
+ { 0x0c00, 0x0f96, 0x0000 },
+ { 0x8c00, 0x0f9c, 0x3000 },
+ { 0x8c00, 0x0f9a, 0x2000 },
+ { 0x0c00, 0x0f99, 0x0000 },
+ { 0x0c00, 0x0f9b, 0x0000 },
+ { 0x8c00, 0x0f9e, 0x2000 },
+ { 0x0c00, 0x0f9d, 0x0000 },
+ { 0x0c00, 0x0f9f, 0x0000 },
+ { 0x9a00, 0x0fc1, 0x6000 },
+ { 0x8c00, 0x0fb0, 0x5000 },
+ { 0x8c00, 0x0fa8, 0x4000 },
+ { 0x8c00, 0x0fa4, 0x3000 },
+ { 0x8c00, 0x0fa2, 0x2000 },
+ { 0x0c00, 0x0fa1, 0x0000 },
+ { 0x0c00, 0x0fa3, 0x0000 },
+ { 0x8c00, 0x0fa6, 0x2000 },
+ { 0x0c00, 0x0fa5, 0x0000 },
+ { 0x0c00, 0x0fa7, 0x0000 },
+ { 0x8c00, 0x0fac, 0x3000 },
+ { 0x8c00, 0x0faa, 0x2000 },
+ { 0x0c00, 0x0fa9, 0x0000 },
+ { 0x0c00, 0x0fab, 0x0000 },
+ { 0x8c00, 0x0fae, 0x2000 },
+ { 0x0c00, 0x0fad, 0x0000 },
+ { 0x0c00, 0x0faf, 0x0000 },
+ { 0x8c00, 0x0fb8, 0x4000 },
+ { 0x8c00, 0x0fb4, 0x3000 },
+ { 0x8c00, 0x0fb2, 0x2000 },
+ { 0x0c00, 0x0fb1, 0x0000 },
+ { 0x0c00, 0x0fb3, 0x0000 },
+ { 0x8c00, 0x0fb6, 0x2000 },
+ { 0x0c00, 0x0fb5, 0x0000 },
+ { 0x0c00, 0x0fb7, 0x0000 },
+ { 0x8c00, 0x0fbc, 0x3000 },
+ { 0x8c00, 0x0fba, 0x2000 },
+ { 0x0c00, 0x0fb9, 0x0000 },
+ { 0x0c00, 0x0fbb, 0x0000 },
+ { 0x9a00, 0x0fbf, 0x2000 },
+ { 0x1a00, 0x0fbe, 0x0000 },
+ { 0x1a00, 0x0fc0, 0x0000 },
+ { 0x8700, 0x1003, 0x5000 },
+ { 0x9a00, 0x0fc9, 0x4000 },
+ { 0x9a00, 0x0fc5, 0x3000 },
+ { 0x9a00, 0x0fc3, 0x2000 },
+ { 0x1a00, 0x0fc2, 0x0000 },
+ { 0x1a00, 0x0fc4, 0x0000 },
+ { 0x9a00, 0x0fc7, 0x2000 },
+ { 0x0c00, 0x0fc6, 0x0000 },
+ { 0x1a00, 0x0fc8, 0x0000 },
+ { 0x9a00, 0x0fcf, 0x3000 },
+ { 0x9a00, 0x0fcb, 0x2000 },
+ { 0x1a00, 0x0fca, 0x0000 },
+ { 0x1a00, 0x0fcc, 0x0000 },
+ { 0x8700, 0x1001, 0x2000 },
+ { 0x0700, 0x1000, 0x0000 },
+ { 0x0700, 0x1002, 0x0000 },
+ { 0x8700, 0x100b, 0x4000 },
+ { 0x8700, 0x1007, 0x3000 },
+ { 0x8700, 0x1005, 0x2000 },
+ { 0x0700, 0x1004, 0x0000 },
+ { 0x0700, 0x1006, 0x0000 },
+ { 0x8700, 0x1009, 0x2000 },
+ { 0x0700, 0x1008, 0x0000 },
+ { 0x0700, 0x100a, 0x0000 },
+ { 0x8700, 0x100f, 0x3000 },
+ { 0x8700, 0x100d, 0x2000 },
+ { 0x0700, 0x100c, 0x0000 },
+ { 0x0700, 0x100e, 0x0000 },
+ { 0x8700, 0x1011, 0x2000 },
+ { 0x0700, 0x1010, 0x0000 },
+ { 0x0700, 0x1012, 0x0000 },
+ { 0x8900, 0x10a5, 0x7000 },
+ { 0x8c00, 0x1039, 0x6000 },
+ { 0x8700, 0x1024, 0x5000 },
+ { 0x8700, 0x101b, 0x4000 },
+ { 0x8700, 0x1017, 0x3000 },
+ { 0x8700, 0x1015, 0x2000 },
+ { 0x0700, 0x1014, 0x0000 },
+ { 0x0700, 0x1016, 0x0000 },
+ { 0x8700, 0x1019, 0x2000 },
+ { 0x0700, 0x1018, 0x0000 },
+ { 0x0700, 0x101a, 0x0000 },
+ { 0x8700, 0x101f, 0x3000 },
+ { 0x8700, 0x101d, 0x2000 },
+ { 0x0700, 0x101c, 0x0000 },
+ { 0x0700, 0x101e, 0x0000 },
+ { 0x8700, 0x1021, 0x2000 },
+ { 0x0700, 0x1020, 0x0000 },
+ { 0x0700, 0x1023, 0x0000 },
+ { 0x8c00, 0x102e, 0x4000 },
+ { 0x8700, 0x1029, 0x3000 },
+ { 0x8700, 0x1026, 0x2000 },
+ { 0x0700, 0x1025, 0x0000 },
+ { 0x0700, 0x1027, 0x0000 },
+ { 0x8a00, 0x102c, 0x2000 },
+ { 0x0700, 0x102a, 0x0000 },
+ { 0x0c00, 0x102d, 0x0000 },
+ { 0x8c00, 0x1032, 0x3000 },
+ { 0x8c00, 0x1030, 0x2000 },
+ { 0x0c00, 0x102f, 0x0000 },
+ { 0x0a00, 0x1031, 0x0000 },
+ { 0x8c00, 0x1037, 0x2000 },
+ { 0x0c00, 0x1036, 0x0000 },
+ { 0x0a00, 0x1038, 0x0000 },
+ { 0x9500, 0x104f, 0x5000 },
+ { 0x8d00, 0x1047, 0x4000 },
+ { 0x8d00, 0x1043, 0x3000 },
+ { 0x8d00, 0x1041, 0x2000 },
+ { 0x0d00, 0x1040, 0x0000 },
+ { 0x0d00, 0x1042, 0x0000 },
+ { 0x8d00, 0x1045, 0x2000 },
+ { 0x0d00, 0x1044, 0x0000 },
+ { 0x0d00, 0x1046, 0x0000 },
+ { 0x9500, 0x104b, 0x3000 },
+ { 0x8d00, 0x1049, 0x2000 },
+ { 0x0d00, 0x1048, 0x0000 },
+ { 0x1500, 0x104a, 0x0000 },
+ { 0x9500, 0x104d, 0x2000 },
+ { 0x1500, 0x104c, 0x0000 },
+ { 0x1500, 0x104e, 0x0000 },
+ { 0x8a00, 0x1057, 0x4000 },
+ { 0x8700, 0x1053, 0x3000 },
+ { 0x8700, 0x1051, 0x2000 },
+ { 0x0700, 0x1050, 0x0000 },
+ { 0x0700, 0x1052, 0x0000 },
+ { 0x8700, 0x1055, 0x2000 },
+ { 0x0700, 0x1054, 0x0000 },
+ { 0x0a00, 0x1056, 0x0000 },
+ { 0x8900, 0x10a1, 0x3000 },
+ { 0x8c00, 0x1059, 0x2000 },
+ { 0x0c00, 0x1058, 0x0000 },
+ { 0x0900, 0x10a0, 0x0000 },
+ { 0x8900, 0x10a3, 0x2000 },
+ { 0x0900, 0x10a2, 0x0000 },
+ { 0x0900, 0x10a4, 0x0000 },
+ { 0x8900, 0x10c5, 0x6000 },
+ { 0x8900, 0x10b5, 0x5000 },
+ { 0x8900, 0x10ad, 0x4000 },
+ { 0x8900, 0x10a9, 0x3000 },
+ { 0x8900, 0x10a7, 0x2000 },
+ { 0x0900, 0x10a6, 0x0000 },
+ { 0x0900, 0x10a8, 0x0000 },
+ { 0x8900, 0x10ab, 0x2000 },
+ { 0x0900, 0x10aa, 0x0000 },
+ { 0x0900, 0x10ac, 0x0000 },
+ { 0x8900, 0x10b1, 0x3000 },
+ { 0x8900, 0x10af, 0x2000 },
+ { 0x0900, 0x10ae, 0x0000 },
+ { 0x0900, 0x10b0, 0x0000 },
+ { 0x8900, 0x10b3, 0x2000 },
+ { 0x0900, 0x10b2, 0x0000 },
+ { 0x0900, 0x10b4, 0x0000 },
+ { 0x8900, 0x10bd, 0x4000 },
+ { 0x8900, 0x10b9, 0x3000 },
+ { 0x8900, 0x10b7, 0x2000 },
+ { 0x0900, 0x10b6, 0x0000 },
+ { 0x0900, 0x10b8, 0x0000 },
+ { 0x8900, 0x10bb, 0x2000 },
+ { 0x0900, 0x10ba, 0x0000 },
+ { 0x0900, 0x10bc, 0x0000 },
+ { 0x8900, 0x10c1, 0x3000 },
+ { 0x8900, 0x10bf, 0x2000 },
+ { 0x0900, 0x10be, 0x0000 },
+ { 0x0900, 0x10c0, 0x0000 },
+ { 0x8900, 0x10c3, 0x2000 },
+ { 0x0900, 0x10c2, 0x0000 },
+ { 0x0900, 0x10c4, 0x0000 },
+ { 0x8700, 0x10df, 0x5000 },
+ { 0x8700, 0x10d7, 0x4000 },
+ { 0x8700, 0x10d3, 0x3000 },
+ { 0x8700, 0x10d1, 0x2000 },
+ { 0x0700, 0x10d0, 0x0000 },
+ { 0x0700, 0x10d2, 0x0000 },
+ { 0x8700, 0x10d5, 0x2000 },
+ { 0x0700, 0x10d4, 0x0000 },
+ { 0x0700, 0x10d6, 0x0000 },
+ { 0x8700, 0x10db, 0x3000 },
+ { 0x8700, 0x10d9, 0x2000 },
+ { 0x0700, 0x10d8, 0x0000 },
+ { 0x0700, 0x10da, 0x0000 },
+ { 0x8700, 0x10dd, 0x2000 },
+ { 0x0700, 0x10dc, 0x0000 },
+ { 0x0700, 0x10de, 0x0000 },
+ { 0x8700, 0x10e7, 0x4000 },
+ { 0x8700, 0x10e3, 0x3000 },
+ { 0x8700, 0x10e1, 0x2000 },
+ { 0x0700, 0x10e0, 0x0000 },
+ { 0x0700, 0x10e2, 0x0000 },
+ { 0x8700, 0x10e5, 0x2000 },
+ { 0x0700, 0x10e4, 0x0000 },
+ { 0x0700, 0x10e6, 0x0000 },
+ { 0x8700, 0x10eb, 0x3000 },
+ { 0x8700, 0x10e9, 0x2000 },
+ { 0x0700, 0x10e8, 0x0000 },
+ { 0x0700, 0x10ea, 0x0000 },
+ { 0x8700, 0x10ed, 0x2000 },
+ { 0x0700, 0x10ec, 0x0000 },
+ { 0x0700, 0x10ee, 0x0000 },
+ { 0x8700, 0x1322, 0xa000 },
+ { 0x8700, 0x1205, 0x9000 },
+ { 0x8700, 0x117a, 0x8000 },
+ { 0x8700, 0x1135, 0x7000 },
+ { 0x8700, 0x1115, 0x6000 },
+ { 0x8700, 0x1105, 0x5000 },
+ { 0x8700, 0x10f7, 0x4000 },
+ { 0x8700, 0x10f3, 0x3000 },
+ { 0x8700, 0x10f1, 0x2000 },
+ { 0x0700, 0x10f0, 0x0000 },
+ { 0x0700, 0x10f2, 0x0000 },
+ { 0x8700, 0x10f5, 0x2000 },
+ { 0x0700, 0x10f4, 0x0000 },
+ { 0x0700, 0x10f6, 0x0000 },
+ { 0x8700, 0x1101, 0x3000 },
+ { 0x9500, 0x10fb, 0x2000 },
+ { 0x0700, 0x10f8, 0x0000 },
+ { 0x0700, 0x1100, 0x0000 },
+ { 0x8700, 0x1103, 0x2000 },
+ { 0x0700, 0x1102, 0x0000 },
+ { 0x0700, 0x1104, 0x0000 },
+ { 0x8700, 0x110d, 0x4000 },
+ { 0x8700, 0x1109, 0x3000 },
+ { 0x8700, 0x1107, 0x2000 },
+ { 0x0700, 0x1106, 0x0000 },
+ { 0x0700, 0x1108, 0x0000 },
+ { 0x8700, 0x110b, 0x2000 },
+ { 0x0700, 0x110a, 0x0000 },
+ { 0x0700, 0x110c, 0x0000 },
+ { 0x8700, 0x1111, 0x3000 },
+ { 0x8700, 0x110f, 0x2000 },
+ { 0x0700, 0x110e, 0x0000 },
+ { 0x0700, 0x1110, 0x0000 },
+ { 0x8700, 0x1113, 0x2000 },
+ { 0x0700, 0x1112, 0x0000 },
+ { 0x0700, 0x1114, 0x0000 },
+ { 0x8700, 0x1125, 0x5000 },
+ { 0x8700, 0x111d, 0x4000 },
+ { 0x8700, 0x1119, 0x3000 },
+ { 0x8700, 0x1117, 0x2000 },
+ { 0x0700, 0x1116, 0x0000 },
+ { 0x0700, 0x1118, 0x0000 },
+ { 0x8700, 0x111b, 0x2000 },
+ { 0x0700, 0x111a, 0x0000 },
+ { 0x0700, 0x111c, 0x0000 },
+ { 0x8700, 0x1121, 0x3000 },
+ { 0x8700, 0x111f, 0x2000 },
+ { 0x0700, 0x111e, 0x0000 },
+ { 0x0700, 0x1120, 0x0000 },
+ { 0x8700, 0x1123, 0x2000 },
+ { 0x0700, 0x1122, 0x0000 },
+ { 0x0700, 0x1124, 0x0000 },
+ { 0x8700, 0x112d, 0x4000 },
+ { 0x8700, 0x1129, 0x3000 },
+ { 0x8700, 0x1127, 0x2000 },
+ { 0x0700, 0x1126, 0x0000 },
+ { 0x0700, 0x1128, 0x0000 },
+ { 0x8700, 0x112b, 0x2000 },
+ { 0x0700, 0x112a, 0x0000 },
+ { 0x0700, 0x112c, 0x0000 },
+ { 0x8700, 0x1131, 0x3000 },
+ { 0x8700, 0x112f, 0x2000 },
+ { 0x0700, 0x112e, 0x0000 },
+ { 0x0700, 0x1130, 0x0000 },
+ { 0x8700, 0x1133, 0x2000 },
+ { 0x0700, 0x1132, 0x0000 },
+ { 0x0700, 0x1134, 0x0000 },
+ { 0x8700, 0x1155, 0x6000 },
+ { 0x8700, 0x1145, 0x5000 },
+ { 0x8700, 0x113d, 0x4000 },
+ { 0x8700, 0x1139, 0x3000 },
+ { 0x8700, 0x1137, 0x2000 },
+ { 0x0700, 0x1136, 0x0000 },
+ { 0x0700, 0x1138, 0x0000 },
+ { 0x8700, 0x113b, 0x2000 },
+ { 0x0700, 0x113a, 0x0000 },
+ { 0x0700, 0x113c, 0x0000 },
+ { 0x8700, 0x1141, 0x3000 },
+ { 0x8700, 0x113f, 0x2000 },
+ { 0x0700, 0x113e, 0x0000 },
+ { 0x0700, 0x1140, 0x0000 },
+ { 0x8700, 0x1143, 0x2000 },
+ { 0x0700, 0x1142, 0x0000 },
+ { 0x0700, 0x1144, 0x0000 },
+ { 0x8700, 0x114d, 0x4000 },
+ { 0x8700, 0x1149, 0x3000 },
+ { 0x8700, 0x1147, 0x2000 },
+ { 0x0700, 0x1146, 0x0000 },
+ { 0x0700, 0x1148, 0x0000 },
+ { 0x8700, 0x114b, 0x2000 },
+ { 0x0700, 0x114a, 0x0000 },
+ { 0x0700, 0x114c, 0x0000 },
+ { 0x8700, 0x1151, 0x3000 },
+ { 0x8700, 0x114f, 0x2000 },
+ { 0x0700, 0x114e, 0x0000 },
+ { 0x0700, 0x1150, 0x0000 },
+ { 0x8700, 0x1153, 0x2000 },
+ { 0x0700, 0x1152, 0x0000 },
+ { 0x0700, 0x1154, 0x0000 },
+ { 0x8700, 0x116a, 0x5000 },
+ { 0x8700, 0x1162, 0x4000 },
+ { 0x8700, 0x1159, 0x3000 },
+ { 0x8700, 0x1157, 0x2000 },
+ { 0x0700, 0x1156, 0x0000 },
+ { 0x0700, 0x1158, 0x0000 },
+ { 0x8700, 0x1160, 0x2000 },
+ { 0x0700, 0x115f, 0x0000 },
+ { 0x0700, 0x1161, 0x0000 },
+ { 0x8700, 0x1166, 0x3000 },
+ { 0x8700, 0x1164, 0x2000 },
+ { 0x0700, 0x1163, 0x0000 },
+ { 0x0700, 0x1165, 0x0000 },
+ { 0x8700, 0x1168, 0x2000 },
+ { 0x0700, 0x1167, 0x0000 },
+ { 0x0700, 0x1169, 0x0000 },
+ { 0x8700, 0x1172, 0x4000 },
+ { 0x8700, 0x116e, 0x3000 },
+ { 0x8700, 0x116c, 0x2000 },
+ { 0x0700, 0x116b, 0x0000 },
+ { 0x0700, 0x116d, 0x0000 },
+ { 0x8700, 0x1170, 0x2000 },
+ { 0x0700, 0x116f, 0x0000 },
+ { 0x0700, 0x1171, 0x0000 },
+ { 0x8700, 0x1176, 0x3000 },
+ { 0x8700, 0x1174, 0x2000 },
+ { 0x0700, 0x1173, 0x0000 },
+ { 0x0700, 0x1175, 0x0000 },
+ { 0x8700, 0x1178, 0x2000 },
+ { 0x0700, 0x1177, 0x0000 },
+ { 0x0700, 0x1179, 0x0000 },
+ { 0x8700, 0x11bf, 0x7000 },
+ { 0x8700, 0x119a, 0x6000 },
+ { 0x8700, 0x118a, 0x5000 },
+ { 0x8700, 0x1182, 0x4000 },
+ { 0x8700, 0x117e, 0x3000 },
+ { 0x8700, 0x117c, 0x2000 },
+ { 0x0700, 0x117b, 0x0000 },
+ { 0x0700, 0x117d, 0x0000 },
+ { 0x8700, 0x1180, 0x2000 },
+ { 0x0700, 0x117f, 0x0000 },
+ { 0x0700, 0x1181, 0x0000 },
+ { 0x8700, 0x1186, 0x3000 },
+ { 0x8700, 0x1184, 0x2000 },
+ { 0x0700, 0x1183, 0x0000 },
+ { 0x0700, 0x1185, 0x0000 },
+ { 0x8700, 0x1188, 0x2000 },
+ { 0x0700, 0x1187, 0x0000 },
+ { 0x0700, 0x1189, 0x0000 },
+ { 0x8700, 0x1192, 0x4000 },
+ { 0x8700, 0x118e, 0x3000 },
+ { 0x8700, 0x118c, 0x2000 },
+ { 0x0700, 0x118b, 0x0000 },
+ { 0x0700, 0x118d, 0x0000 },
+ { 0x8700, 0x1190, 0x2000 },
+ { 0x0700, 0x118f, 0x0000 },
+ { 0x0700, 0x1191, 0x0000 },
+ { 0x8700, 0x1196, 0x3000 },
+ { 0x8700, 0x1194, 0x2000 },
+ { 0x0700, 0x1193, 0x0000 },
+ { 0x0700, 0x1195, 0x0000 },
+ { 0x8700, 0x1198, 0x2000 },
+ { 0x0700, 0x1197, 0x0000 },
+ { 0x0700, 0x1199, 0x0000 },
+ { 0x8700, 0x11af, 0x5000 },
+ { 0x8700, 0x11a2, 0x4000 },
+ { 0x8700, 0x119e, 0x3000 },
+ { 0x8700, 0x119c, 0x2000 },
+ { 0x0700, 0x119b, 0x0000 },
+ { 0x0700, 0x119d, 0x0000 },
+ { 0x8700, 0x11a0, 0x2000 },
+ { 0x0700, 0x119f, 0x0000 },
+ { 0x0700, 0x11a1, 0x0000 },
+ { 0x8700, 0x11ab, 0x3000 },
+ { 0x8700, 0x11a9, 0x2000 },
+ { 0x0700, 0x11a8, 0x0000 },
+ { 0x0700, 0x11aa, 0x0000 },
+ { 0x8700, 0x11ad, 0x2000 },
+ { 0x0700, 0x11ac, 0x0000 },
+ { 0x0700, 0x11ae, 0x0000 },
+ { 0x8700, 0x11b7, 0x4000 },
+ { 0x8700, 0x11b3, 0x3000 },
+ { 0x8700, 0x11b1, 0x2000 },
+ { 0x0700, 0x11b0, 0x0000 },
+ { 0x0700, 0x11b2, 0x0000 },
+ { 0x8700, 0x11b5, 0x2000 },
+ { 0x0700, 0x11b4, 0x0000 },
+ { 0x0700, 0x11b6, 0x0000 },
+ { 0x8700, 0x11bb, 0x3000 },
+ { 0x8700, 0x11b9, 0x2000 },
+ { 0x0700, 0x11b8, 0x0000 },
+ { 0x0700, 0x11ba, 0x0000 },
+ { 0x8700, 0x11bd, 0x2000 },
+ { 0x0700, 0x11bc, 0x0000 },
+ { 0x0700, 0x11be, 0x0000 },
+ { 0x8700, 0x11df, 0x6000 },
+ { 0x8700, 0x11cf, 0x5000 },
+ { 0x8700, 0x11c7, 0x4000 },
+ { 0x8700, 0x11c3, 0x3000 },
+ { 0x8700, 0x11c1, 0x2000 },
+ { 0x0700, 0x11c0, 0x0000 },
+ { 0x0700, 0x11c2, 0x0000 },
+ { 0x8700, 0x11c5, 0x2000 },
+ { 0x0700, 0x11c4, 0x0000 },
+ { 0x0700, 0x11c6, 0x0000 },
+ { 0x8700, 0x11cb, 0x3000 },
+ { 0x8700, 0x11c9, 0x2000 },
+ { 0x0700, 0x11c8, 0x0000 },
+ { 0x0700, 0x11ca, 0x0000 },
+ { 0x8700, 0x11cd, 0x2000 },
+ { 0x0700, 0x11cc, 0x0000 },
+ { 0x0700, 0x11ce, 0x0000 },
+ { 0x8700, 0x11d7, 0x4000 },
+ { 0x8700, 0x11d3, 0x3000 },
+ { 0x8700, 0x11d1, 0x2000 },
+ { 0x0700, 0x11d0, 0x0000 },
+ { 0x0700, 0x11d2, 0x0000 },
+ { 0x8700, 0x11d5, 0x2000 },
+ { 0x0700, 0x11d4, 0x0000 },
+ { 0x0700, 0x11d6, 0x0000 },
+ { 0x8700, 0x11db, 0x3000 },
+ { 0x8700, 0x11d9, 0x2000 },
+ { 0x0700, 0x11d8, 0x0000 },
+ { 0x0700, 0x11da, 0x0000 },
+ { 0x8700, 0x11dd, 0x2000 },
+ { 0x0700, 0x11dc, 0x0000 },
+ { 0x0700, 0x11de, 0x0000 },
+ { 0x8700, 0x11ef, 0x5000 },
+ { 0x8700, 0x11e7, 0x4000 },
+ { 0x8700, 0x11e3, 0x3000 },
+ { 0x8700, 0x11e1, 0x2000 },
+ { 0x0700, 0x11e0, 0x0000 },
+ { 0x0700, 0x11e2, 0x0000 },
+ { 0x8700, 0x11e5, 0x2000 },
+ { 0x0700, 0x11e4, 0x0000 },
+ { 0x0700, 0x11e6, 0x0000 },
+ { 0x8700, 0x11eb, 0x3000 },
+ { 0x8700, 0x11e9, 0x2000 },
+ { 0x0700, 0x11e8, 0x0000 },
+ { 0x0700, 0x11ea, 0x0000 },
+ { 0x8700, 0x11ed, 0x2000 },
+ { 0x0700, 0x11ec, 0x0000 },
+ { 0x0700, 0x11ee, 0x0000 },
+ { 0x8700, 0x11f7, 0x4000 },
+ { 0x8700, 0x11f3, 0x3000 },
+ { 0x8700, 0x11f1, 0x2000 },
+ { 0x0700, 0x11f0, 0x0000 },
+ { 0x0700, 0x11f2, 0x0000 },
+ { 0x8700, 0x11f5, 0x2000 },
+ { 0x0700, 0x11f4, 0x0000 },
+ { 0x0700, 0x11f6, 0x0000 },
+ { 0x8700, 0x1201, 0x3000 },
+ { 0x8700, 0x11f9, 0x2000 },
+ { 0x0700, 0x11f8, 0x0000 },
+ { 0x0700, 0x1200, 0x0000 },
+ { 0x8700, 0x1203, 0x2000 },
+ { 0x0700, 0x1202, 0x0000 },
+ { 0x0700, 0x1204, 0x0000 },
+ { 0x8700, 0x1292, 0x8000 },
+ { 0x8700, 0x1246, 0x7000 },
+ { 0x8700, 0x1226, 0x6000 },
+ { 0x8700, 0x1216, 0x5000 },
+ { 0x8700, 0x120e, 0x4000 },
+ { 0x8700, 0x120a, 0x3000 },
+ { 0x8700, 0x1208, 0x2000 },
+ { 0x0700, 0x1206, 0x0000 },
+ { 0x0700, 0x1209, 0x0000 },
+ { 0x8700, 0x120c, 0x2000 },
+ { 0x0700, 0x120b, 0x0000 },
+ { 0x0700, 0x120d, 0x0000 },
+ { 0x8700, 0x1212, 0x3000 },
+ { 0x8700, 0x1210, 0x2000 },
+ { 0x0700, 0x120f, 0x0000 },
+ { 0x0700, 0x1211, 0x0000 },
+ { 0x8700, 0x1214, 0x2000 },
+ { 0x0700, 0x1213, 0x0000 },
+ { 0x0700, 0x1215, 0x0000 },
+ { 0x8700, 0x121e, 0x4000 },
+ { 0x8700, 0x121a, 0x3000 },
+ { 0x8700, 0x1218, 0x2000 },
+ { 0x0700, 0x1217, 0x0000 },
+ { 0x0700, 0x1219, 0x0000 },
+ { 0x8700, 0x121c, 0x2000 },
+ { 0x0700, 0x121b, 0x0000 },
+ { 0x0700, 0x121d, 0x0000 },
+ { 0x8700, 0x1222, 0x3000 },
+ { 0x8700, 0x1220, 0x2000 },
+ { 0x0700, 0x121f, 0x0000 },
+ { 0x0700, 0x1221, 0x0000 },
+ { 0x8700, 0x1224, 0x2000 },
+ { 0x0700, 0x1223, 0x0000 },
+ { 0x0700, 0x1225, 0x0000 },
+ { 0x8700, 0x1236, 0x5000 },
+ { 0x8700, 0x122e, 0x4000 },
+ { 0x8700, 0x122a, 0x3000 },
+ { 0x8700, 0x1228, 0x2000 },
+ { 0x0700, 0x1227, 0x0000 },
+ { 0x0700, 0x1229, 0x0000 },
+ { 0x8700, 0x122c, 0x2000 },
+ { 0x0700, 0x122b, 0x0000 },
+ { 0x0700, 0x122d, 0x0000 },
+ { 0x8700, 0x1232, 0x3000 },
+ { 0x8700, 0x1230, 0x2000 },
+ { 0x0700, 0x122f, 0x0000 },
+ { 0x0700, 0x1231, 0x0000 },
+ { 0x8700, 0x1234, 0x2000 },
+ { 0x0700, 0x1233, 0x0000 },
+ { 0x0700, 0x1235, 0x0000 },
+ { 0x8700, 0x123e, 0x4000 },
+ { 0x8700, 0x123a, 0x3000 },
+ { 0x8700, 0x1238, 0x2000 },
+ { 0x0700, 0x1237, 0x0000 },
+ { 0x0700, 0x1239, 0x0000 },
+ { 0x8700, 0x123c, 0x2000 },
+ { 0x0700, 0x123b, 0x0000 },
+ { 0x0700, 0x123d, 0x0000 },
+ { 0x8700, 0x1242, 0x3000 },
+ { 0x8700, 0x1240, 0x2000 },
+ { 0x0700, 0x123f, 0x0000 },
+ { 0x0700, 0x1241, 0x0000 },
+ { 0x8700, 0x1244, 0x2000 },
+ { 0x0700, 0x1243, 0x0000 },
+ { 0x0700, 0x1245, 0x0000 },
+ { 0x8700, 0x126e, 0x6000 },
+ { 0x8700, 0x125c, 0x5000 },
+ { 0x8700, 0x1252, 0x4000 },
+ { 0x8700, 0x124c, 0x3000 },
+ { 0x8700, 0x124a, 0x2000 },
+ { 0x0700, 0x1248, 0x0000 },
+ { 0x0700, 0x124b, 0x0000 },
+ { 0x8700, 0x1250, 0x2000 },
+ { 0x0700, 0x124d, 0x0000 },
+ { 0x0700, 0x1251, 0x0000 },
+ { 0x8700, 0x1256, 0x3000 },
+ { 0x8700, 0x1254, 0x2000 },
+ { 0x0700, 0x1253, 0x0000 },
+ { 0x0700, 0x1255, 0x0000 },
+ { 0x8700, 0x125a, 0x2000 },
+ { 0x0700, 0x1258, 0x0000 },
+ { 0x0700, 0x125b, 0x0000 },
+ { 0x8700, 0x1266, 0x4000 },
+ { 0x8700, 0x1262, 0x3000 },
+ { 0x8700, 0x1260, 0x2000 },
+ { 0x0700, 0x125d, 0x0000 },
+ { 0x0700, 0x1261, 0x0000 },
+ { 0x8700, 0x1264, 0x2000 },
+ { 0x0700, 0x1263, 0x0000 },
+ { 0x0700, 0x1265, 0x0000 },
+ { 0x8700, 0x126a, 0x3000 },
+ { 0x8700, 0x1268, 0x2000 },
+ { 0x0700, 0x1267, 0x0000 },
+ { 0x0700, 0x1269, 0x0000 },
+ { 0x8700, 0x126c, 0x2000 },
+ { 0x0700, 0x126b, 0x0000 },
+ { 0x0700, 0x126d, 0x0000 },
+ { 0x8700, 0x127e, 0x5000 },
+ { 0x8700, 0x1276, 0x4000 },
+ { 0x8700, 0x1272, 0x3000 },
+ { 0x8700, 0x1270, 0x2000 },
+ { 0x0700, 0x126f, 0x0000 },
+ { 0x0700, 0x1271, 0x0000 },
+ { 0x8700, 0x1274, 0x2000 },
+ { 0x0700, 0x1273, 0x0000 },
+ { 0x0700, 0x1275, 0x0000 },
+ { 0x8700, 0x127a, 0x3000 },
+ { 0x8700, 0x1278, 0x2000 },
+ { 0x0700, 0x1277, 0x0000 },
+ { 0x0700, 0x1279, 0x0000 },
+ { 0x8700, 0x127c, 0x2000 },
+ { 0x0700, 0x127b, 0x0000 },
+ { 0x0700, 0x127d, 0x0000 },
+ { 0x8700, 0x1286, 0x4000 },
+ { 0x8700, 0x1282, 0x3000 },
+ { 0x8700, 0x1280, 0x2000 },
+ { 0x0700, 0x127f, 0x0000 },
+ { 0x0700, 0x1281, 0x0000 },
+ { 0x8700, 0x1284, 0x2000 },
+ { 0x0700, 0x1283, 0x0000 },
+ { 0x0700, 0x1285, 0x0000 },
+ { 0x8700, 0x128c, 0x3000 },
+ { 0x8700, 0x128a, 0x2000 },
+ { 0x0700, 0x1288, 0x0000 },
+ { 0x0700, 0x128b, 0x0000 },
+ { 0x8700, 0x1290, 0x2000 },
+ { 0x0700, 0x128d, 0x0000 },
+ { 0x0700, 0x1291, 0x0000 },
+ { 0x8700, 0x12dc, 0x7000 },
+ { 0x8700, 0x12b4, 0x6000 },
+ { 0x8700, 0x12a2, 0x5000 },
+ { 0x8700, 0x129a, 0x4000 },
+ { 0x8700, 0x1296, 0x3000 },
+ { 0x8700, 0x1294, 0x2000 },
+ { 0x0700, 0x1293, 0x0000 },
+ { 0x0700, 0x1295, 0x0000 },
+ { 0x8700, 0x1298, 0x2000 },
+ { 0x0700, 0x1297, 0x0000 },
+ { 0x0700, 0x1299, 0x0000 },
+ { 0x8700, 0x129e, 0x3000 },
+ { 0x8700, 0x129c, 0x2000 },
+ { 0x0700, 0x129b, 0x0000 },
+ { 0x0700, 0x129d, 0x0000 },
+ { 0x8700, 0x12a0, 0x2000 },
+ { 0x0700, 0x129f, 0x0000 },
+ { 0x0700, 0x12a1, 0x0000 },
+ { 0x8700, 0x12aa, 0x4000 },
+ { 0x8700, 0x12a6, 0x3000 },
+ { 0x8700, 0x12a4, 0x2000 },
+ { 0x0700, 0x12a3, 0x0000 },
+ { 0x0700, 0x12a5, 0x0000 },
+ { 0x8700, 0x12a8, 0x2000 },
+ { 0x0700, 0x12a7, 0x0000 },
+ { 0x0700, 0x12a9, 0x0000 },
+ { 0x8700, 0x12ae, 0x3000 },
+ { 0x8700, 0x12ac, 0x2000 },
+ { 0x0700, 0x12ab, 0x0000 },
+ { 0x0700, 0x12ad, 0x0000 },
+ { 0x8700, 0x12b2, 0x2000 },
+ { 0x0700, 0x12b0, 0x0000 },
+ { 0x0700, 0x12b3, 0x0000 },
+ { 0x8700, 0x12ca, 0x5000 },
+ { 0x8700, 0x12be, 0x4000 },
+ { 0x8700, 0x12ba, 0x3000 },
+ { 0x8700, 0x12b8, 0x2000 },
+ { 0x0700, 0x12b5, 0x0000 },
+ { 0x0700, 0x12b9, 0x0000 },
+ { 0x8700, 0x12bc, 0x2000 },
+ { 0x0700, 0x12bb, 0x0000 },
+ { 0x0700, 0x12bd, 0x0000 },
+ { 0x8700, 0x12c4, 0x3000 },
+ { 0x8700, 0x12c2, 0x2000 },
+ { 0x0700, 0x12c0, 0x0000 },
+ { 0x0700, 0x12c3, 0x0000 },
+ { 0x8700, 0x12c8, 0x2000 },
+ { 0x0700, 0x12c5, 0x0000 },
+ { 0x0700, 0x12c9, 0x0000 },
+ { 0x8700, 0x12d3, 0x4000 },
+ { 0x8700, 0x12ce, 0x3000 },
+ { 0x8700, 0x12cc, 0x2000 },
+ { 0x0700, 0x12cb, 0x0000 },
+ { 0x0700, 0x12cd, 0x0000 },
+ { 0x8700, 0x12d1, 0x2000 },
+ { 0x0700, 0x12d0, 0x0000 },
+ { 0x0700, 0x12d2, 0x0000 },
+ { 0x8700, 0x12d8, 0x3000 },
+ { 0x8700, 0x12d5, 0x2000 },
+ { 0x0700, 0x12d4, 0x0000 },
+ { 0x0700, 0x12d6, 0x0000 },
+ { 0x8700, 0x12da, 0x2000 },
+ { 0x0700, 0x12d9, 0x0000 },
+ { 0x0700, 0x12db, 0x0000 },
+ { 0x8700, 0x12fd, 0x6000 },
+ { 0x8700, 0x12ec, 0x5000 },
+ { 0x8700, 0x12e4, 0x4000 },
+ { 0x8700, 0x12e0, 0x3000 },
+ { 0x8700, 0x12de, 0x2000 },
+ { 0x0700, 0x12dd, 0x0000 },
+ { 0x0700, 0x12df, 0x0000 },
+ { 0x8700, 0x12e2, 0x2000 },
+ { 0x0700, 0x12e1, 0x0000 },
+ { 0x0700, 0x12e3, 0x0000 },
+ { 0x8700, 0x12e8, 0x3000 },
+ { 0x8700, 0x12e6, 0x2000 },
+ { 0x0700, 0x12e5, 0x0000 },
+ { 0x0700, 0x12e7, 0x0000 },
+ { 0x8700, 0x12ea, 0x2000 },
+ { 0x0700, 0x12e9, 0x0000 },
+ { 0x0700, 0x12eb, 0x0000 },
+ { 0x8700, 0x12f5, 0x4000 },
+ { 0x8700, 0x12f1, 0x3000 },
+ { 0x8700, 0x12ee, 0x2000 },
+ { 0x0700, 0x12ed, 0x0000 },
+ { 0x0700, 0x12f0, 0x0000 },
+ { 0x8700, 0x12f3, 0x2000 },
+ { 0x0700, 0x12f2, 0x0000 },
+ { 0x0700, 0x12f4, 0x0000 },
+ { 0x8700, 0x12f9, 0x3000 },
+ { 0x8700, 0x12f7, 0x2000 },
+ { 0x0700, 0x12f6, 0x0000 },
+ { 0x0700, 0x12f8, 0x0000 },
+ { 0x8700, 0x12fb, 0x2000 },
+ { 0x0700, 0x12fa, 0x0000 },
+ { 0x0700, 0x12fc, 0x0000 },
+ { 0x8700, 0x130d, 0x5000 },
+ { 0x8700, 0x1305, 0x4000 },
+ { 0x8700, 0x1301, 0x3000 },
+ { 0x8700, 0x12ff, 0x2000 },
+ { 0x0700, 0x12fe, 0x0000 },
+ { 0x0700, 0x1300, 0x0000 },
+ { 0x8700, 0x1303, 0x2000 },
+ { 0x0700, 0x1302, 0x0000 },
+ { 0x0700, 0x1304, 0x0000 },
+ { 0x8700, 0x1309, 0x3000 },
+ { 0x8700, 0x1307, 0x2000 },
+ { 0x0700, 0x1306, 0x0000 },
+ { 0x0700, 0x1308, 0x0000 },
+ { 0x8700, 0x130b, 0x2000 },
+ { 0x0700, 0x130a, 0x0000 },
+ { 0x0700, 0x130c, 0x0000 },
+ { 0x8700, 0x1319, 0x4000 },
+ { 0x8700, 0x1313, 0x3000 },
+ { 0x8700, 0x1310, 0x2000 },
+ { 0x0700, 0x130e, 0x0000 },
+ { 0x0700, 0x1312, 0x0000 },
+ { 0x8700, 0x1315, 0x2000 },
+ { 0x0700, 0x1314, 0x0000 },
+ { 0x0700, 0x1318, 0x0000 },
+ { 0x8700, 0x131d, 0x3000 },
+ { 0x8700, 0x131b, 0x2000 },
+ { 0x0700, 0x131a, 0x0000 },
+ { 0x0700, 0x131c, 0x0000 },
+ { 0x8700, 0x1320, 0x2000 },
+ { 0x0700, 0x131e, 0x0000 },
+ { 0x0700, 0x1321, 0x0000 },
+ { 0x8700, 0x1458, 0x9000 },
+ { 0x8700, 0x13cc, 0x8000 },
+ { 0x8d00, 0x1369, 0x7000 },
+ { 0x8700, 0x1342, 0x6000 },
+ { 0x8700, 0x1332, 0x5000 },
+ { 0x8700, 0x132a, 0x4000 },
+ { 0x8700, 0x1326, 0x3000 },
+ { 0x8700, 0x1324, 0x2000 },
+ { 0x0700, 0x1323, 0x0000 },
+ { 0x0700, 0x1325, 0x0000 },
+ { 0x8700, 0x1328, 0x2000 },
+ { 0x0700, 0x1327, 0x0000 },
+ { 0x0700, 0x1329, 0x0000 },
+ { 0x8700, 0x132e, 0x3000 },
+ { 0x8700, 0x132c, 0x2000 },
+ { 0x0700, 0x132b, 0x0000 },
+ { 0x0700, 0x132d, 0x0000 },
+ { 0x8700, 0x1330, 0x2000 },
+ { 0x0700, 0x132f, 0x0000 },
+ { 0x0700, 0x1331, 0x0000 },
+ { 0x8700, 0x133a, 0x4000 },
+ { 0x8700, 0x1336, 0x3000 },
+ { 0x8700, 0x1334, 0x2000 },
+ { 0x0700, 0x1333, 0x0000 },
+ { 0x0700, 0x1335, 0x0000 },
+ { 0x8700, 0x1338, 0x2000 },
+ { 0x0700, 0x1337, 0x0000 },
+ { 0x0700, 0x1339, 0x0000 },
+ { 0x8700, 0x133e, 0x3000 },
+ { 0x8700, 0x133c, 0x2000 },
+ { 0x0700, 0x133b, 0x0000 },
+ { 0x0700, 0x133d, 0x0000 },
+ { 0x8700, 0x1340, 0x2000 },
+ { 0x0700, 0x133f, 0x0000 },
+ { 0x0700, 0x1341, 0x0000 },
+ { 0x8700, 0x1353, 0x5000 },
+ { 0x8700, 0x134b, 0x4000 },
+ { 0x8700, 0x1346, 0x3000 },
+ { 0x8700, 0x1344, 0x2000 },
+ { 0x0700, 0x1343, 0x0000 },
+ { 0x0700, 0x1345, 0x0000 },
+ { 0x8700, 0x1349, 0x2000 },
+ { 0x0700, 0x1348, 0x0000 },
+ { 0x0700, 0x134a, 0x0000 },
+ { 0x8700, 0x134f, 0x3000 },
+ { 0x8700, 0x134d, 0x2000 },
+ { 0x0700, 0x134c, 0x0000 },
+ { 0x0700, 0x134e, 0x0000 },
+ { 0x8700, 0x1351, 0x2000 },
+ { 0x0700, 0x1350, 0x0000 },
+ { 0x0700, 0x1352, 0x0000 },
+ { 0x9500, 0x1361, 0x4000 },
+ { 0x8700, 0x1357, 0x3000 },
+ { 0x8700, 0x1355, 0x2000 },
+ { 0x0700, 0x1354, 0x0000 },
+ { 0x0700, 0x1356, 0x0000 },
+ { 0x8700, 0x1359, 0x2000 },
+ { 0x0700, 0x1358, 0x0000 },
+ { 0x0700, 0x135a, 0x0000 },
+ { 0x9500, 0x1365, 0x3000 },
+ { 0x9500, 0x1363, 0x2000 },
+ { 0x1500, 0x1362, 0x0000 },
+ { 0x1500, 0x1364, 0x0000 },
+ { 0x9500, 0x1367, 0x2000 },
+ { 0x1500, 0x1366, 0x0000 },
+ { 0x1500, 0x1368, 0x0000 },
+ { 0x8700, 0x13ac, 0x6000 },
+ { 0x8f00, 0x1379, 0x5000 },
+ { 0x8d00, 0x1371, 0x4000 },
+ { 0x8d00, 0x136d, 0x3000 },
+ { 0x8d00, 0x136b, 0x2000 },
+ { 0x0d00, 0x136a, 0x0000 },
+ { 0x0d00, 0x136c, 0x0000 },
+ { 0x8d00, 0x136f, 0x2000 },
+ { 0x0d00, 0x136e, 0x0000 },
+ { 0x0d00, 0x1370, 0x0000 },
+ { 0x8f00, 0x1375, 0x3000 },
+ { 0x8f00, 0x1373, 0x2000 },
+ { 0x0f00, 0x1372, 0x0000 },
+ { 0x0f00, 0x1374, 0x0000 },
+ { 0x8f00, 0x1377, 0x2000 },
+ { 0x0f00, 0x1376, 0x0000 },
+ { 0x0f00, 0x1378, 0x0000 },
+ { 0x8700, 0x13a4, 0x4000 },
+ { 0x8700, 0x13a0, 0x3000 },
+ { 0x8f00, 0x137b, 0x2000 },
+ { 0x0f00, 0x137a, 0x0000 },
+ { 0x0f00, 0x137c, 0x0000 },
+ { 0x8700, 0x13a2, 0x2000 },
+ { 0x0700, 0x13a1, 0x0000 },
+ { 0x0700, 0x13a3, 0x0000 },
+ { 0x8700, 0x13a8, 0x3000 },
+ { 0x8700, 0x13a6, 0x2000 },
+ { 0x0700, 0x13a5, 0x0000 },
+ { 0x0700, 0x13a7, 0x0000 },
+ { 0x8700, 0x13aa, 0x2000 },
+ { 0x0700, 0x13a9, 0x0000 },
+ { 0x0700, 0x13ab, 0x0000 },
+ { 0x8700, 0x13bc, 0x5000 },
+ { 0x8700, 0x13b4, 0x4000 },
+ { 0x8700, 0x13b0, 0x3000 },
+ { 0x8700, 0x13ae, 0x2000 },
+ { 0x0700, 0x13ad, 0x0000 },
+ { 0x0700, 0x13af, 0x0000 },
+ { 0x8700, 0x13b2, 0x2000 },
+ { 0x0700, 0x13b1, 0x0000 },
+ { 0x0700, 0x13b3, 0x0000 },
+ { 0x8700, 0x13b8, 0x3000 },
+ { 0x8700, 0x13b6, 0x2000 },
+ { 0x0700, 0x13b5, 0x0000 },
+ { 0x0700, 0x13b7, 0x0000 },
+ { 0x8700, 0x13ba, 0x2000 },
+ { 0x0700, 0x13b9, 0x0000 },
+ { 0x0700, 0x13bb, 0x0000 },
+ { 0x8700, 0x13c4, 0x4000 },
+ { 0x8700, 0x13c0, 0x3000 },
+ { 0x8700, 0x13be, 0x2000 },
+ { 0x0700, 0x13bd, 0x0000 },
+ { 0x0700, 0x13bf, 0x0000 },
+ { 0x8700, 0x13c2, 0x2000 },
+ { 0x0700, 0x13c1, 0x0000 },
+ { 0x0700, 0x13c3, 0x0000 },
+ { 0x8700, 0x13c8, 0x3000 },
+ { 0x8700, 0x13c6, 0x2000 },
+ { 0x0700, 0x13c5, 0x0000 },
+ { 0x0700, 0x13c7, 0x0000 },
+ { 0x8700, 0x13ca, 0x2000 },
+ { 0x0700, 0x13c9, 0x0000 },
+ { 0x0700, 0x13cb, 0x0000 },
+ { 0x8700, 0x1418, 0x7000 },
+ { 0x8700, 0x13ec, 0x6000 },
+ { 0x8700, 0x13dc, 0x5000 },
+ { 0x8700, 0x13d4, 0x4000 },
+ { 0x8700, 0x13d0, 0x3000 },
+ { 0x8700, 0x13ce, 0x2000 },
+ { 0x0700, 0x13cd, 0x0000 },
+ { 0x0700, 0x13cf, 0x0000 },
+ { 0x8700, 0x13d2, 0x2000 },
+ { 0x0700, 0x13d1, 0x0000 },
+ { 0x0700, 0x13d3, 0x0000 },
+ { 0x8700, 0x13d8, 0x3000 },
+ { 0x8700, 0x13d6, 0x2000 },
+ { 0x0700, 0x13d5, 0x0000 },
+ { 0x0700, 0x13d7, 0x0000 },
+ { 0x8700, 0x13da, 0x2000 },
+ { 0x0700, 0x13d9, 0x0000 },
+ { 0x0700, 0x13db, 0x0000 },
+ { 0x8700, 0x13e4, 0x4000 },
+ { 0x8700, 0x13e0, 0x3000 },
+ { 0x8700, 0x13de, 0x2000 },
+ { 0x0700, 0x13dd, 0x0000 },
+ { 0x0700, 0x13df, 0x0000 },
+ { 0x8700, 0x13e2, 0x2000 },
+ { 0x0700, 0x13e1, 0x0000 },
+ { 0x0700, 0x13e3, 0x0000 },
+ { 0x8700, 0x13e8, 0x3000 },
+ { 0x8700, 0x13e6, 0x2000 },
+ { 0x0700, 0x13e5, 0x0000 },
+ { 0x0700, 0x13e7, 0x0000 },
+ { 0x8700, 0x13ea, 0x2000 },
+ { 0x0700, 0x13e9, 0x0000 },
+ { 0x0700, 0x13eb, 0x0000 },
+ { 0x8700, 0x1408, 0x5000 },
+ { 0x8700, 0x13f4, 0x4000 },
+ { 0x8700, 0x13f0, 0x3000 },
+ { 0x8700, 0x13ee, 0x2000 },
+ { 0x0700, 0x13ed, 0x0000 },
+ { 0x0700, 0x13ef, 0x0000 },
+ { 0x8700, 0x13f2, 0x2000 },
+ { 0x0700, 0x13f1, 0x0000 },
+ { 0x0700, 0x13f3, 0x0000 },
+ { 0x8700, 0x1404, 0x3000 },
+ { 0x8700, 0x1402, 0x2000 },
+ { 0x0700, 0x1401, 0x0000 },
+ { 0x0700, 0x1403, 0x0000 },
+ { 0x8700, 0x1406, 0x2000 },
+ { 0x0700, 0x1405, 0x0000 },
+ { 0x0700, 0x1407, 0x0000 },
+ { 0x8700, 0x1410, 0x4000 },
+ { 0x8700, 0x140c, 0x3000 },
+ { 0x8700, 0x140a, 0x2000 },
+ { 0x0700, 0x1409, 0x0000 },
+ { 0x0700, 0x140b, 0x0000 },
+ { 0x8700, 0x140e, 0x2000 },
+ { 0x0700, 0x140d, 0x0000 },
+ { 0x0700, 0x140f, 0x0000 },
+ { 0x8700, 0x1414, 0x3000 },
+ { 0x8700, 0x1412, 0x2000 },
+ { 0x0700, 0x1411, 0x0000 },
+ { 0x0700, 0x1413, 0x0000 },
+ { 0x8700, 0x1416, 0x2000 },
+ { 0x0700, 0x1415, 0x0000 },
+ { 0x0700, 0x1417, 0x0000 },
+ { 0x8700, 0x1438, 0x6000 },
+ { 0x8700, 0x1428, 0x5000 },
+ { 0x8700, 0x1420, 0x4000 },
+ { 0x8700, 0x141c, 0x3000 },
+ { 0x8700, 0x141a, 0x2000 },
+ { 0x0700, 0x1419, 0x0000 },
+ { 0x0700, 0x141b, 0x0000 },
+ { 0x8700, 0x141e, 0x2000 },
+ { 0x0700, 0x141d, 0x0000 },
+ { 0x0700, 0x141f, 0x0000 },
+ { 0x8700, 0x1424, 0x3000 },
+ { 0x8700, 0x1422, 0x2000 },
+ { 0x0700, 0x1421, 0x0000 },
+ { 0x0700, 0x1423, 0x0000 },
+ { 0x8700, 0x1426, 0x2000 },
+ { 0x0700, 0x1425, 0x0000 },
+ { 0x0700, 0x1427, 0x0000 },
+ { 0x8700, 0x1430, 0x4000 },
+ { 0x8700, 0x142c, 0x3000 },
+ { 0x8700, 0x142a, 0x2000 },
+ { 0x0700, 0x1429, 0x0000 },
+ { 0x0700, 0x142b, 0x0000 },
+ { 0x8700, 0x142e, 0x2000 },
+ { 0x0700, 0x142d, 0x0000 },
+ { 0x0700, 0x142f, 0x0000 },
+ { 0x8700, 0x1434, 0x3000 },
+ { 0x8700, 0x1432, 0x2000 },
+ { 0x0700, 0x1431, 0x0000 },
+ { 0x0700, 0x1433, 0x0000 },
+ { 0x8700, 0x1436, 0x2000 },
+ { 0x0700, 0x1435, 0x0000 },
+ { 0x0700, 0x1437, 0x0000 },
+ { 0x8700, 0x1448, 0x5000 },
+ { 0x8700, 0x1440, 0x4000 },
+ { 0x8700, 0x143c, 0x3000 },
+ { 0x8700, 0x143a, 0x2000 },
+ { 0x0700, 0x1439, 0x0000 },
+ { 0x0700, 0x143b, 0x0000 },
+ { 0x8700, 0x143e, 0x2000 },
+ { 0x0700, 0x143d, 0x0000 },
+ { 0x0700, 0x143f, 0x0000 },
+ { 0x8700, 0x1444, 0x3000 },
+ { 0x8700, 0x1442, 0x2000 },
+ { 0x0700, 0x1441, 0x0000 },
+ { 0x0700, 0x1443, 0x0000 },
+ { 0x8700, 0x1446, 0x2000 },
+ { 0x0700, 0x1445, 0x0000 },
+ { 0x0700, 0x1447, 0x0000 },
+ { 0x8700, 0x1450, 0x4000 },
+ { 0x8700, 0x144c, 0x3000 },
+ { 0x8700, 0x144a, 0x2000 },
+ { 0x0700, 0x1449, 0x0000 },
+ { 0x0700, 0x144b, 0x0000 },
+ { 0x8700, 0x144e, 0x2000 },
+ { 0x0700, 0x144d, 0x0000 },
+ { 0x0700, 0x144f, 0x0000 },
+ { 0x8700, 0x1454, 0x3000 },
+ { 0x8700, 0x1452, 0x2000 },
+ { 0x0700, 0x1451, 0x0000 },
+ { 0x0700, 0x1453, 0x0000 },
+ { 0x8700, 0x1456, 0x2000 },
+ { 0x0700, 0x1455, 0x0000 },
+ { 0x0700, 0x1457, 0x0000 },
+ { 0x8700, 0x14d8, 0x8000 },
+ { 0x8700, 0x1498, 0x7000 },
+ { 0x8700, 0x1478, 0x6000 },
+ { 0x8700, 0x1468, 0x5000 },
+ { 0x8700, 0x1460, 0x4000 },
+ { 0x8700, 0x145c, 0x3000 },
+ { 0x8700, 0x145a, 0x2000 },
+ { 0x0700, 0x1459, 0x0000 },
+ { 0x0700, 0x145b, 0x0000 },
+ { 0x8700, 0x145e, 0x2000 },
+ { 0x0700, 0x145d, 0x0000 },
+ { 0x0700, 0x145f, 0x0000 },
+ { 0x8700, 0x1464, 0x3000 },
+ { 0x8700, 0x1462, 0x2000 },
+ { 0x0700, 0x1461, 0x0000 },
+ { 0x0700, 0x1463, 0x0000 },
+ { 0x8700, 0x1466, 0x2000 },
+ { 0x0700, 0x1465, 0x0000 },
+ { 0x0700, 0x1467, 0x0000 },
+ { 0x8700, 0x1470, 0x4000 },
+ { 0x8700, 0x146c, 0x3000 },
+ { 0x8700, 0x146a, 0x2000 },
+ { 0x0700, 0x1469, 0x0000 },
+ { 0x0700, 0x146b, 0x0000 },
+ { 0x8700, 0x146e, 0x2000 },
+ { 0x0700, 0x146d, 0x0000 },
+ { 0x0700, 0x146f, 0x0000 },
+ { 0x8700, 0x1474, 0x3000 },
+ { 0x8700, 0x1472, 0x2000 },
+ { 0x0700, 0x1471, 0x0000 },
+ { 0x0700, 0x1473, 0x0000 },
+ { 0x8700, 0x1476, 0x2000 },
+ { 0x0700, 0x1475, 0x0000 },
+ { 0x0700, 0x1477, 0x0000 },
+ { 0x8700, 0x1488, 0x5000 },
+ { 0x8700, 0x1480, 0x4000 },
+ { 0x8700, 0x147c, 0x3000 },
+ { 0x8700, 0x147a, 0x2000 },
+ { 0x0700, 0x1479, 0x0000 },
+ { 0x0700, 0x147b, 0x0000 },
+ { 0x8700, 0x147e, 0x2000 },
+ { 0x0700, 0x147d, 0x0000 },
+ { 0x0700, 0x147f, 0x0000 },
+ { 0x8700, 0x1484, 0x3000 },
+ { 0x8700, 0x1482, 0x2000 },
+ { 0x0700, 0x1481, 0x0000 },
+ { 0x0700, 0x1483, 0x0000 },
+ { 0x8700, 0x1486, 0x2000 },
+ { 0x0700, 0x1485, 0x0000 },
+ { 0x0700, 0x1487, 0x0000 },
+ { 0x8700, 0x1490, 0x4000 },
+ { 0x8700, 0x148c, 0x3000 },
+ { 0x8700, 0x148a, 0x2000 },
+ { 0x0700, 0x1489, 0x0000 },
+ { 0x0700, 0x148b, 0x0000 },
+ { 0x8700, 0x148e, 0x2000 },
+ { 0x0700, 0x148d, 0x0000 },
+ { 0x0700, 0x148f, 0x0000 },
+ { 0x8700, 0x1494, 0x3000 },
+ { 0x8700, 0x1492, 0x2000 },
+ { 0x0700, 0x1491, 0x0000 },
+ { 0x0700, 0x1493, 0x0000 },
+ { 0x8700, 0x1496, 0x2000 },
+ { 0x0700, 0x1495, 0x0000 },
+ { 0x0700, 0x1497, 0x0000 },
+ { 0x8700, 0x14b8, 0x6000 },
+ { 0x8700, 0x14a8, 0x5000 },
+ { 0x8700, 0x14a0, 0x4000 },
+ { 0x8700, 0x149c, 0x3000 },
+ { 0x8700, 0x149a, 0x2000 },
+ { 0x0700, 0x1499, 0x0000 },
+ { 0x0700, 0x149b, 0x0000 },
+ { 0x8700, 0x149e, 0x2000 },
+ { 0x0700, 0x149d, 0x0000 },
+ { 0x0700, 0x149f, 0x0000 },
+ { 0x8700, 0x14a4, 0x3000 },
+ { 0x8700, 0x14a2, 0x2000 },
+ { 0x0700, 0x14a1, 0x0000 },
+ { 0x0700, 0x14a3, 0x0000 },
+ { 0x8700, 0x14a6, 0x2000 },
+ { 0x0700, 0x14a5, 0x0000 },
+ { 0x0700, 0x14a7, 0x0000 },
+ { 0x8700, 0x14b0, 0x4000 },
+ { 0x8700, 0x14ac, 0x3000 },
+ { 0x8700, 0x14aa, 0x2000 },
+ { 0x0700, 0x14a9, 0x0000 },
+ { 0x0700, 0x14ab, 0x0000 },
+ { 0x8700, 0x14ae, 0x2000 },
+ { 0x0700, 0x14ad, 0x0000 },
+ { 0x0700, 0x14af, 0x0000 },
+ { 0x8700, 0x14b4, 0x3000 },
+ { 0x8700, 0x14b2, 0x2000 },
+ { 0x0700, 0x14b1, 0x0000 },
+ { 0x0700, 0x14b3, 0x0000 },
+ { 0x8700, 0x14b6, 0x2000 },
+ { 0x0700, 0x14b5, 0x0000 },
+ { 0x0700, 0x14b7, 0x0000 },
+ { 0x8700, 0x14c8, 0x5000 },
+ { 0x8700, 0x14c0, 0x4000 },
+ { 0x8700, 0x14bc, 0x3000 },
+ { 0x8700, 0x14ba, 0x2000 },
+ { 0x0700, 0x14b9, 0x0000 },
+ { 0x0700, 0x14bb, 0x0000 },
+ { 0x8700, 0x14be, 0x2000 },
+ { 0x0700, 0x14bd, 0x0000 },
+ { 0x0700, 0x14bf, 0x0000 },
+ { 0x8700, 0x14c4, 0x3000 },
+ { 0x8700, 0x14c2, 0x2000 },
+ { 0x0700, 0x14c1, 0x0000 },
+ { 0x0700, 0x14c3, 0x0000 },
+ { 0x8700, 0x14c6, 0x2000 },
+ { 0x0700, 0x14c5, 0x0000 },
+ { 0x0700, 0x14c7, 0x0000 },
+ { 0x8700, 0x14d0, 0x4000 },
+ { 0x8700, 0x14cc, 0x3000 },
+ { 0x8700, 0x14ca, 0x2000 },
+ { 0x0700, 0x14c9, 0x0000 },
+ { 0x0700, 0x14cb, 0x0000 },
+ { 0x8700, 0x14ce, 0x2000 },
+ { 0x0700, 0x14cd, 0x0000 },
+ { 0x0700, 0x14cf, 0x0000 },
+ { 0x8700, 0x14d4, 0x3000 },
+ { 0x8700, 0x14d2, 0x2000 },
+ { 0x0700, 0x14d1, 0x0000 },
+ { 0x0700, 0x14d3, 0x0000 },
+ { 0x8700, 0x14d6, 0x2000 },
+ { 0x0700, 0x14d5, 0x0000 },
+ { 0x0700, 0x14d7, 0x0000 },
+ { 0x8700, 0x1518, 0x7000 },
+ { 0x8700, 0x14f8, 0x6000 },
+ { 0x8700, 0x14e8, 0x5000 },
+ { 0x8700, 0x14e0, 0x4000 },
+ { 0x8700, 0x14dc, 0x3000 },
+ { 0x8700, 0x14da, 0x2000 },
+ { 0x0700, 0x14d9, 0x0000 },
+ { 0x0700, 0x14db, 0x0000 },
+ { 0x8700, 0x14de, 0x2000 },
+ { 0x0700, 0x14dd, 0x0000 },
+ { 0x0700, 0x14df, 0x0000 },
+ { 0x8700, 0x14e4, 0x3000 },
+ { 0x8700, 0x14e2, 0x2000 },
+ { 0x0700, 0x14e1, 0x0000 },
+ { 0x0700, 0x14e3, 0x0000 },
+ { 0x8700, 0x14e6, 0x2000 },
+ { 0x0700, 0x14e5, 0x0000 },
+ { 0x0700, 0x14e7, 0x0000 },
+ { 0x8700, 0x14f0, 0x4000 },
+ { 0x8700, 0x14ec, 0x3000 },
+ { 0x8700, 0x14ea, 0x2000 },
+ { 0x0700, 0x14e9, 0x0000 },
+ { 0x0700, 0x14eb, 0x0000 },
+ { 0x8700, 0x14ee, 0x2000 },
+ { 0x0700, 0x14ed, 0x0000 },
+ { 0x0700, 0x14ef, 0x0000 },
+ { 0x8700, 0x14f4, 0x3000 },
+ { 0x8700, 0x14f2, 0x2000 },
+ { 0x0700, 0x14f1, 0x0000 },
+ { 0x0700, 0x14f3, 0x0000 },
+ { 0x8700, 0x14f6, 0x2000 },
+ { 0x0700, 0x14f5, 0x0000 },
+ { 0x0700, 0x14f7, 0x0000 },
+ { 0x8700, 0x1508, 0x5000 },
+ { 0x8700, 0x1500, 0x4000 },
+ { 0x8700, 0x14fc, 0x3000 },
+ { 0x8700, 0x14fa, 0x2000 },
+ { 0x0700, 0x14f9, 0x0000 },
+ { 0x0700, 0x14fb, 0x0000 },
+ { 0x8700, 0x14fe, 0x2000 },
+ { 0x0700, 0x14fd, 0x0000 },
+ { 0x0700, 0x14ff, 0x0000 },
+ { 0x8700, 0x1504, 0x3000 },
+ { 0x8700, 0x1502, 0x2000 },
+ { 0x0700, 0x1501, 0x0000 },
+ { 0x0700, 0x1503, 0x0000 },
+ { 0x8700, 0x1506, 0x2000 },
+ { 0x0700, 0x1505, 0x0000 },
+ { 0x0700, 0x1507, 0x0000 },
+ { 0x8700, 0x1510, 0x4000 },
+ { 0x8700, 0x150c, 0x3000 },
+ { 0x8700, 0x150a, 0x2000 },
+ { 0x0700, 0x1509, 0x0000 },
+ { 0x0700, 0x150b, 0x0000 },
+ { 0x8700, 0x150e, 0x2000 },
+ { 0x0700, 0x150d, 0x0000 },
+ { 0x0700, 0x150f, 0x0000 },
+ { 0x8700, 0x1514, 0x3000 },
+ { 0x8700, 0x1512, 0x2000 },
+ { 0x0700, 0x1511, 0x0000 },
+ { 0x0700, 0x1513, 0x0000 },
+ { 0x8700, 0x1516, 0x2000 },
+ { 0x0700, 0x1515, 0x0000 },
+ { 0x0700, 0x1517, 0x0000 },
+ { 0x8700, 0x1538, 0x6000 },
+ { 0x8700, 0x1528, 0x5000 },
+ { 0x8700, 0x1520, 0x4000 },
+ { 0x8700, 0x151c, 0x3000 },
+ { 0x8700, 0x151a, 0x2000 },
+ { 0x0700, 0x1519, 0x0000 },
+ { 0x0700, 0x151b, 0x0000 },
+ { 0x8700, 0x151e, 0x2000 },
+ { 0x0700, 0x151d, 0x0000 },
+ { 0x0700, 0x151f, 0x0000 },
+ { 0x8700, 0x1524, 0x3000 },
+ { 0x8700, 0x1522, 0x2000 },
+ { 0x0700, 0x1521, 0x0000 },
+ { 0x0700, 0x1523, 0x0000 },
+ { 0x8700, 0x1526, 0x2000 },
+ { 0x0700, 0x1525, 0x0000 },
+ { 0x0700, 0x1527, 0x0000 },
+ { 0x8700, 0x1530, 0x4000 },
+ { 0x8700, 0x152c, 0x3000 },
+ { 0x8700, 0x152a, 0x2000 },
+ { 0x0700, 0x1529, 0x0000 },
+ { 0x0700, 0x152b, 0x0000 },
+ { 0x8700, 0x152e, 0x2000 },
+ { 0x0700, 0x152d, 0x0000 },
+ { 0x0700, 0x152f, 0x0000 },
+ { 0x8700, 0x1534, 0x3000 },
+ { 0x8700, 0x1532, 0x2000 },
+ { 0x0700, 0x1531, 0x0000 },
+ { 0x0700, 0x1533, 0x0000 },
+ { 0x8700, 0x1536, 0x2000 },
+ { 0x0700, 0x1535, 0x0000 },
+ { 0x0700, 0x1537, 0x0000 },
+ { 0x8700, 0x1548, 0x5000 },
+ { 0x8700, 0x1540, 0x4000 },
+ { 0x8700, 0x153c, 0x3000 },
+ { 0x8700, 0x153a, 0x2000 },
+ { 0x0700, 0x1539, 0x0000 },
+ { 0x0700, 0x153b, 0x0000 },
+ { 0x8700, 0x153e, 0x2000 },
+ { 0x0700, 0x153d, 0x0000 },
+ { 0x0700, 0x153f, 0x0000 },
+ { 0x8700, 0x1544, 0x3000 },
+ { 0x8700, 0x1542, 0x2000 },
+ { 0x0700, 0x1541, 0x0000 },
+ { 0x0700, 0x1543, 0x0000 },
+ { 0x8700, 0x1546, 0x2000 },
+ { 0x0700, 0x1545, 0x0000 },
+ { 0x0700, 0x1547, 0x0000 },
+ { 0x8700, 0x1550, 0x4000 },
+ { 0x8700, 0x154c, 0x3000 },
+ { 0x8700, 0x154a, 0x2000 },
+ { 0x0700, 0x1549, 0x0000 },
+ { 0x0700, 0x154b, 0x0000 },
+ { 0x8700, 0x154e, 0x2000 },
+ { 0x0700, 0x154d, 0x0000 },
+ { 0x0700, 0x154f, 0x0000 },
+ { 0x8700, 0x1554, 0x3000 },
+ { 0x8700, 0x1552, 0x2000 },
+ { 0x0700, 0x1551, 0x0000 },
+ { 0x0700, 0x1553, 0x0000 },
+ { 0x8700, 0x1556, 0x2000 },
+ { 0x0700, 0x1555, 0x0000 },
+ { 0x0700, 0x1557, 0x0000 },
+ { 0x9900, 0x22ae, 0xc000 },
+ { 0x8900, 0x1e24, 0xb001 },
+ { 0x8700, 0x17a2, 0xa000 },
+ { 0x8700, 0x1658, 0x9000 },
+ { 0x8700, 0x15d8, 0x8000 },
+ { 0x8700, 0x1598, 0x7000 },
+ { 0x8700, 0x1578, 0x6000 },
+ { 0x8700, 0x1568, 0x5000 },
+ { 0x8700, 0x1560, 0x4000 },
+ { 0x8700, 0x155c, 0x3000 },
+ { 0x8700, 0x155a, 0x2000 },
+ { 0x0700, 0x1559, 0x0000 },
+ { 0x0700, 0x155b, 0x0000 },
+ { 0x8700, 0x155e, 0x2000 },
+ { 0x0700, 0x155d, 0x0000 },
+ { 0x0700, 0x155f, 0x0000 },
+ { 0x8700, 0x1564, 0x3000 },
+ { 0x8700, 0x1562, 0x2000 },
+ { 0x0700, 0x1561, 0x0000 },
+ { 0x0700, 0x1563, 0x0000 },
+ { 0x8700, 0x1566, 0x2000 },
+ { 0x0700, 0x1565, 0x0000 },
+ { 0x0700, 0x1567, 0x0000 },
+ { 0x8700, 0x1570, 0x4000 },
+ { 0x8700, 0x156c, 0x3000 },
+ { 0x8700, 0x156a, 0x2000 },
+ { 0x0700, 0x1569, 0x0000 },
+ { 0x0700, 0x156b, 0x0000 },
+ { 0x8700, 0x156e, 0x2000 },
+ { 0x0700, 0x156d, 0x0000 },
+ { 0x0700, 0x156f, 0x0000 },
+ { 0x8700, 0x1574, 0x3000 },
+ { 0x8700, 0x1572, 0x2000 },
+ { 0x0700, 0x1571, 0x0000 },
+ { 0x0700, 0x1573, 0x0000 },
+ { 0x8700, 0x1576, 0x2000 },
+ { 0x0700, 0x1575, 0x0000 },
+ { 0x0700, 0x1577, 0x0000 },
+ { 0x8700, 0x1588, 0x5000 },
+ { 0x8700, 0x1580, 0x4000 },
+ { 0x8700, 0x157c, 0x3000 },
+ { 0x8700, 0x157a, 0x2000 },
+ { 0x0700, 0x1579, 0x0000 },
+ { 0x0700, 0x157b, 0x0000 },
+ { 0x8700, 0x157e, 0x2000 },
+ { 0x0700, 0x157d, 0x0000 },
+ { 0x0700, 0x157f, 0x0000 },
+ { 0x8700, 0x1584, 0x3000 },
+ { 0x8700, 0x1582, 0x2000 },
+ { 0x0700, 0x1581, 0x0000 },
+ { 0x0700, 0x1583, 0x0000 },
+ { 0x8700, 0x1586, 0x2000 },
+ { 0x0700, 0x1585, 0x0000 },
+ { 0x0700, 0x1587, 0x0000 },
+ { 0x8700, 0x1590, 0x4000 },
+ { 0x8700, 0x158c, 0x3000 },
+ { 0x8700, 0x158a, 0x2000 },
+ { 0x0700, 0x1589, 0x0000 },
+ { 0x0700, 0x158b, 0x0000 },
+ { 0x8700, 0x158e, 0x2000 },
+ { 0x0700, 0x158d, 0x0000 },
+ { 0x0700, 0x158f, 0x0000 },
+ { 0x8700, 0x1594, 0x3000 },
+ { 0x8700, 0x1592, 0x2000 },
+ { 0x0700, 0x1591, 0x0000 },
+ { 0x0700, 0x1593, 0x0000 },
+ { 0x8700, 0x1596, 0x2000 },
+ { 0x0700, 0x1595, 0x0000 },
+ { 0x0700, 0x1597, 0x0000 },
+ { 0x8700, 0x15b8, 0x6000 },
+ { 0x8700, 0x15a8, 0x5000 },
+ { 0x8700, 0x15a0, 0x4000 },
+ { 0x8700, 0x159c, 0x3000 },
+ { 0x8700, 0x159a, 0x2000 },
+ { 0x0700, 0x1599, 0x0000 },
+ { 0x0700, 0x159b, 0x0000 },
+ { 0x8700, 0x159e, 0x2000 },
+ { 0x0700, 0x159d, 0x0000 },
+ { 0x0700, 0x159f, 0x0000 },
+ { 0x8700, 0x15a4, 0x3000 },
+ { 0x8700, 0x15a2, 0x2000 },
+ { 0x0700, 0x15a1, 0x0000 },
+ { 0x0700, 0x15a3, 0x0000 },
+ { 0x8700, 0x15a6, 0x2000 },
+ { 0x0700, 0x15a5, 0x0000 },
+ { 0x0700, 0x15a7, 0x0000 },
+ { 0x8700, 0x15b0, 0x4000 },
+ { 0x8700, 0x15ac, 0x3000 },
+ { 0x8700, 0x15aa, 0x2000 },
+ { 0x0700, 0x15a9, 0x0000 },
+ { 0x0700, 0x15ab, 0x0000 },
+ { 0x8700, 0x15ae, 0x2000 },
+ { 0x0700, 0x15ad, 0x0000 },
+ { 0x0700, 0x15af, 0x0000 },
+ { 0x8700, 0x15b4, 0x3000 },
+ { 0x8700, 0x15b2, 0x2000 },
+ { 0x0700, 0x15b1, 0x0000 },
+ { 0x0700, 0x15b3, 0x0000 },
+ { 0x8700, 0x15b6, 0x2000 },
+ { 0x0700, 0x15b5, 0x0000 },
+ { 0x0700, 0x15b7, 0x0000 },
+ { 0x8700, 0x15c8, 0x5000 },
+ { 0x8700, 0x15c0, 0x4000 },
+ { 0x8700, 0x15bc, 0x3000 },
+ { 0x8700, 0x15ba, 0x2000 },
+ { 0x0700, 0x15b9, 0x0000 },
+ { 0x0700, 0x15bb, 0x0000 },
+ { 0x8700, 0x15be, 0x2000 },
+ { 0x0700, 0x15bd, 0x0000 },
+ { 0x0700, 0x15bf, 0x0000 },
+ { 0x8700, 0x15c4, 0x3000 },
+ { 0x8700, 0x15c2, 0x2000 },
+ { 0x0700, 0x15c1, 0x0000 },
+ { 0x0700, 0x15c3, 0x0000 },
+ { 0x8700, 0x15c6, 0x2000 },
+ { 0x0700, 0x15c5, 0x0000 },
+ { 0x0700, 0x15c7, 0x0000 },
+ { 0x8700, 0x15d0, 0x4000 },
+ { 0x8700, 0x15cc, 0x3000 },
+ { 0x8700, 0x15ca, 0x2000 },
+ { 0x0700, 0x15c9, 0x0000 },
+ { 0x0700, 0x15cb, 0x0000 },
+ { 0x8700, 0x15ce, 0x2000 },
+ { 0x0700, 0x15cd, 0x0000 },
+ { 0x0700, 0x15cf, 0x0000 },
+ { 0x8700, 0x15d4, 0x3000 },
+ { 0x8700, 0x15d2, 0x2000 },
+ { 0x0700, 0x15d1, 0x0000 },
+ { 0x0700, 0x15d3, 0x0000 },
+ { 0x8700, 0x15d6, 0x2000 },
+ { 0x0700, 0x15d5, 0x0000 },
+ { 0x0700, 0x15d7, 0x0000 },
+ { 0x8700, 0x1618, 0x7000 },
+ { 0x8700, 0x15f8, 0x6000 },
+ { 0x8700, 0x15e8, 0x5000 },
+ { 0x8700, 0x15e0, 0x4000 },
+ { 0x8700, 0x15dc, 0x3000 },
+ { 0x8700, 0x15da, 0x2000 },
+ { 0x0700, 0x15d9, 0x0000 },
+ { 0x0700, 0x15db, 0x0000 },
+ { 0x8700, 0x15de, 0x2000 },
+ { 0x0700, 0x15dd, 0x0000 },
+ { 0x0700, 0x15df, 0x0000 },
+ { 0x8700, 0x15e4, 0x3000 },
+ { 0x8700, 0x15e2, 0x2000 },
+ { 0x0700, 0x15e1, 0x0000 },
+ { 0x0700, 0x15e3, 0x0000 },
+ { 0x8700, 0x15e6, 0x2000 },
+ { 0x0700, 0x15e5, 0x0000 },
+ { 0x0700, 0x15e7, 0x0000 },
+ { 0x8700, 0x15f0, 0x4000 },
+ { 0x8700, 0x15ec, 0x3000 },
+ { 0x8700, 0x15ea, 0x2000 },
+ { 0x0700, 0x15e9, 0x0000 },
+ { 0x0700, 0x15eb, 0x0000 },
+ { 0x8700, 0x15ee, 0x2000 },
+ { 0x0700, 0x15ed, 0x0000 },
+ { 0x0700, 0x15ef, 0x0000 },
+ { 0x8700, 0x15f4, 0x3000 },
+ { 0x8700, 0x15f2, 0x2000 },
+ { 0x0700, 0x15f1, 0x0000 },
+ { 0x0700, 0x15f3, 0x0000 },
+ { 0x8700, 0x15f6, 0x2000 },
+ { 0x0700, 0x15f5, 0x0000 },
+ { 0x0700, 0x15f7, 0x0000 },
+ { 0x8700, 0x1608, 0x5000 },
+ { 0x8700, 0x1600, 0x4000 },
+ { 0x8700, 0x15fc, 0x3000 },
+ { 0x8700, 0x15fa, 0x2000 },
+ { 0x0700, 0x15f9, 0x0000 },
+ { 0x0700, 0x15fb, 0x0000 },
+ { 0x8700, 0x15fe, 0x2000 },
+ { 0x0700, 0x15fd, 0x0000 },
+ { 0x0700, 0x15ff, 0x0000 },
+ { 0x8700, 0x1604, 0x3000 },
+ { 0x8700, 0x1602, 0x2000 },
+ { 0x0700, 0x1601, 0x0000 },
+ { 0x0700, 0x1603, 0x0000 },
+ { 0x8700, 0x1606, 0x2000 },
+ { 0x0700, 0x1605, 0x0000 },
+ { 0x0700, 0x1607, 0x0000 },
+ { 0x8700, 0x1610, 0x4000 },
+ { 0x8700, 0x160c, 0x3000 },
+ { 0x8700, 0x160a, 0x2000 },
+ { 0x0700, 0x1609, 0x0000 },
+ { 0x0700, 0x160b, 0x0000 },
+ { 0x8700, 0x160e, 0x2000 },
+ { 0x0700, 0x160d, 0x0000 },
+ { 0x0700, 0x160f, 0x0000 },
+ { 0x8700, 0x1614, 0x3000 },
+ { 0x8700, 0x1612, 0x2000 },
+ { 0x0700, 0x1611, 0x0000 },
+ { 0x0700, 0x1613, 0x0000 },
+ { 0x8700, 0x1616, 0x2000 },
+ { 0x0700, 0x1615, 0x0000 },
+ { 0x0700, 0x1617, 0x0000 },
+ { 0x8700, 0x1638, 0x6000 },
+ { 0x8700, 0x1628, 0x5000 },
+ { 0x8700, 0x1620, 0x4000 },
+ { 0x8700, 0x161c, 0x3000 },
+ { 0x8700, 0x161a, 0x2000 },
+ { 0x0700, 0x1619, 0x0000 },
+ { 0x0700, 0x161b, 0x0000 },
+ { 0x8700, 0x161e, 0x2000 },
+ { 0x0700, 0x161d, 0x0000 },
+ { 0x0700, 0x161f, 0x0000 },
+ { 0x8700, 0x1624, 0x3000 },
+ { 0x8700, 0x1622, 0x2000 },
+ { 0x0700, 0x1621, 0x0000 },
+ { 0x0700, 0x1623, 0x0000 },
+ { 0x8700, 0x1626, 0x2000 },
+ { 0x0700, 0x1625, 0x0000 },
+ { 0x0700, 0x1627, 0x0000 },
+ { 0x8700, 0x1630, 0x4000 },
+ { 0x8700, 0x162c, 0x3000 },
+ { 0x8700, 0x162a, 0x2000 },
+ { 0x0700, 0x1629, 0x0000 },
+ { 0x0700, 0x162b, 0x0000 },
+ { 0x8700, 0x162e, 0x2000 },
+ { 0x0700, 0x162d, 0x0000 },
+ { 0x0700, 0x162f, 0x0000 },
+ { 0x8700, 0x1634, 0x3000 },
+ { 0x8700, 0x1632, 0x2000 },
+ { 0x0700, 0x1631, 0x0000 },
+ { 0x0700, 0x1633, 0x0000 },
+ { 0x8700, 0x1636, 0x2000 },
+ { 0x0700, 0x1635, 0x0000 },
+ { 0x0700, 0x1637, 0x0000 },
+ { 0x8700, 0x1648, 0x5000 },
+ { 0x8700, 0x1640, 0x4000 },
+ { 0x8700, 0x163c, 0x3000 },
+ { 0x8700, 0x163a, 0x2000 },
+ { 0x0700, 0x1639, 0x0000 },
+ { 0x0700, 0x163b, 0x0000 },
+ { 0x8700, 0x163e, 0x2000 },
+ { 0x0700, 0x163d, 0x0000 },
+ { 0x0700, 0x163f, 0x0000 },
+ { 0x8700, 0x1644, 0x3000 },
+ { 0x8700, 0x1642, 0x2000 },
+ { 0x0700, 0x1641, 0x0000 },
+ { 0x0700, 0x1643, 0x0000 },
+ { 0x8700, 0x1646, 0x2000 },
+ { 0x0700, 0x1645, 0x0000 },
+ { 0x0700, 0x1647, 0x0000 },
+ { 0x8700, 0x1650, 0x4000 },
+ { 0x8700, 0x164c, 0x3000 },
+ { 0x8700, 0x164a, 0x2000 },
+ { 0x0700, 0x1649, 0x0000 },
+ { 0x0700, 0x164b, 0x0000 },
+ { 0x8700, 0x164e, 0x2000 },
+ { 0x0700, 0x164d, 0x0000 },
+ { 0x0700, 0x164f, 0x0000 },
+ { 0x8700, 0x1654, 0x3000 },
+ { 0x8700, 0x1652, 0x2000 },
+ { 0x0700, 0x1651, 0x0000 },
+ { 0x0700, 0x1653, 0x0000 },
+ { 0x8700, 0x1656, 0x2000 },
+ { 0x0700, 0x1655, 0x0000 },
+ { 0x0700, 0x1657, 0x0000 },
+ { 0x8700, 0x16e4, 0x8000 },
+ { 0x8700, 0x16a4, 0x7000 },
+ { 0x8700, 0x1681, 0x6000 },
+ { 0x8700, 0x1668, 0x5000 },
+ { 0x8700, 0x1660, 0x4000 },
+ { 0x8700, 0x165c, 0x3000 },
+ { 0x8700, 0x165a, 0x2000 },
+ { 0x0700, 0x1659, 0x0000 },
+ { 0x0700, 0x165b, 0x0000 },
+ { 0x8700, 0x165e, 0x2000 },
+ { 0x0700, 0x165d, 0x0000 },
+ { 0x0700, 0x165f, 0x0000 },
+ { 0x8700, 0x1664, 0x3000 },
+ { 0x8700, 0x1662, 0x2000 },
+ { 0x0700, 0x1661, 0x0000 },
+ { 0x0700, 0x1663, 0x0000 },
+ { 0x8700, 0x1666, 0x2000 },
+ { 0x0700, 0x1665, 0x0000 },
+ { 0x0700, 0x1667, 0x0000 },
+ { 0x8700, 0x1670, 0x4000 },
+ { 0x8700, 0x166c, 0x3000 },
+ { 0x8700, 0x166a, 0x2000 },
+ { 0x0700, 0x1669, 0x0000 },
+ { 0x0700, 0x166b, 0x0000 },
+ { 0x9500, 0x166e, 0x2000 },
+ { 0x1500, 0x166d, 0x0000 },
+ { 0x0700, 0x166f, 0x0000 },
+ { 0x8700, 0x1674, 0x3000 },
+ { 0x8700, 0x1672, 0x2000 },
+ { 0x0700, 0x1671, 0x0000 },
+ { 0x0700, 0x1673, 0x0000 },
+ { 0x8700, 0x1676, 0x2000 },
+ { 0x0700, 0x1675, 0x0000 },
+ { 0x1d00, 0x1680, 0x0000 },
+ { 0x8700, 0x1691, 0x5000 },
+ { 0x8700, 0x1689, 0x4000 },
+ { 0x8700, 0x1685, 0x3000 },
+ { 0x8700, 0x1683, 0x2000 },
+ { 0x0700, 0x1682, 0x0000 },
+ { 0x0700, 0x1684, 0x0000 },
+ { 0x8700, 0x1687, 0x2000 },
+ { 0x0700, 0x1686, 0x0000 },
+ { 0x0700, 0x1688, 0x0000 },
+ { 0x8700, 0x168d, 0x3000 },
+ { 0x8700, 0x168b, 0x2000 },
+ { 0x0700, 0x168a, 0x0000 },
+ { 0x0700, 0x168c, 0x0000 },
+ { 0x8700, 0x168f, 0x2000 },
+ { 0x0700, 0x168e, 0x0000 },
+ { 0x0700, 0x1690, 0x0000 },
+ { 0x8700, 0x1699, 0x4000 },
+ { 0x8700, 0x1695, 0x3000 },
+ { 0x8700, 0x1693, 0x2000 },
+ { 0x0700, 0x1692, 0x0000 },
+ { 0x0700, 0x1694, 0x0000 },
+ { 0x8700, 0x1697, 0x2000 },
+ { 0x0700, 0x1696, 0x0000 },
+ { 0x0700, 0x1698, 0x0000 },
+ { 0x8700, 0x16a0, 0x3000 },
+ { 0x9600, 0x169b, 0x2000 },
+ { 0x0700, 0x169a, 0x0000 },
+ { 0x1200, 0x169c, 0x0000 },
+ { 0x8700, 0x16a2, 0x2000 },
+ { 0x0700, 0x16a1, 0x0000 },
+ { 0x0700, 0x16a3, 0x0000 },
+ { 0x8700, 0x16c4, 0x6000 },
+ { 0x8700, 0x16b4, 0x5000 },
+ { 0x8700, 0x16ac, 0x4000 },
+ { 0x8700, 0x16a8, 0x3000 },
+ { 0x8700, 0x16a6, 0x2000 },
+ { 0x0700, 0x16a5, 0x0000 },
+ { 0x0700, 0x16a7, 0x0000 },
+ { 0x8700, 0x16aa, 0x2000 },
+ { 0x0700, 0x16a9, 0x0000 },
+ { 0x0700, 0x16ab, 0x0000 },
+ { 0x8700, 0x16b0, 0x3000 },
+ { 0x8700, 0x16ae, 0x2000 },
+ { 0x0700, 0x16ad, 0x0000 },
+ { 0x0700, 0x16af, 0x0000 },
+ { 0x8700, 0x16b2, 0x2000 },
+ { 0x0700, 0x16b1, 0x0000 },
+ { 0x0700, 0x16b3, 0x0000 },
+ { 0x8700, 0x16bc, 0x4000 },
+ { 0x8700, 0x16b8, 0x3000 },
+ { 0x8700, 0x16b6, 0x2000 },
+ { 0x0700, 0x16b5, 0x0000 },
+ { 0x0700, 0x16b7, 0x0000 },
+ { 0x8700, 0x16ba, 0x2000 },
+ { 0x0700, 0x16b9, 0x0000 },
+ { 0x0700, 0x16bb, 0x0000 },
+ { 0x8700, 0x16c0, 0x3000 },
+ { 0x8700, 0x16be, 0x2000 },
+ { 0x0700, 0x16bd, 0x0000 },
+ { 0x0700, 0x16bf, 0x0000 },
+ { 0x8700, 0x16c2, 0x2000 },
+ { 0x0700, 0x16c1, 0x0000 },
+ { 0x0700, 0x16c3, 0x0000 },
+ { 0x8700, 0x16d4, 0x5000 },
+ { 0x8700, 0x16cc, 0x4000 },
+ { 0x8700, 0x16c8, 0x3000 },
+ { 0x8700, 0x16c6, 0x2000 },
+ { 0x0700, 0x16c5, 0x0000 },
+ { 0x0700, 0x16c7, 0x0000 },
+ { 0x8700, 0x16ca, 0x2000 },
+ { 0x0700, 0x16c9, 0x0000 },
+ { 0x0700, 0x16cb, 0x0000 },
+ { 0x8700, 0x16d0, 0x3000 },
+ { 0x8700, 0x16ce, 0x2000 },
+ { 0x0700, 0x16cd, 0x0000 },
+ { 0x0700, 0x16cf, 0x0000 },
+ { 0x8700, 0x16d2, 0x2000 },
+ { 0x0700, 0x16d1, 0x0000 },
+ { 0x0700, 0x16d3, 0x0000 },
+ { 0x8700, 0x16dc, 0x4000 },
+ { 0x8700, 0x16d8, 0x3000 },
+ { 0x8700, 0x16d6, 0x2000 },
+ { 0x0700, 0x16d5, 0x0000 },
+ { 0x0700, 0x16d7, 0x0000 },
+ { 0x8700, 0x16da, 0x2000 },
+ { 0x0700, 0x16d9, 0x0000 },
+ { 0x0700, 0x16db, 0x0000 },
+ { 0x8700, 0x16e0, 0x3000 },
+ { 0x8700, 0x16de, 0x2000 },
+ { 0x0700, 0x16dd, 0x0000 },
+ { 0x0700, 0x16df, 0x0000 },
+ { 0x8700, 0x16e2, 0x2000 },
+ { 0x0700, 0x16e1, 0x0000 },
+ { 0x0700, 0x16e3, 0x0000 },
+ { 0x8700, 0x1748, 0x7000 },
+ { 0x8c00, 0x1714, 0x6000 },
+ { 0x8700, 0x1703, 0x5000 },
+ { 0x9500, 0x16ec, 0x4000 },
+ { 0x8700, 0x16e8, 0x3000 },
+ { 0x8700, 0x16e6, 0x2000 },
+ { 0x0700, 0x16e5, 0x0000 },
+ { 0x0700, 0x16e7, 0x0000 },
+ { 0x8700, 0x16ea, 0x2000 },
+ { 0x0700, 0x16e9, 0x0000 },
+ { 0x1500, 0x16eb, 0x0000 },
+ { 0x8e00, 0x16f0, 0x3000 },
+ { 0x8e00, 0x16ee, 0x2000 },
+ { 0x1500, 0x16ed, 0x0000 },
+ { 0x0e00, 0x16ef, 0x0000 },
+ { 0x8700, 0x1701, 0x2000 },
+ { 0x0700, 0x1700, 0x0000 },
+ { 0x0700, 0x1702, 0x0000 },
+ { 0x8700, 0x170b, 0x4000 },
+ { 0x8700, 0x1707, 0x3000 },
+ { 0x8700, 0x1705, 0x2000 },
+ { 0x0700, 0x1704, 0x0000 },
+ { 0x0700, 0x1706, 0x0000 },
+ { 0x8700, 0x1709, 0x2000 },
+ { 0x0700, 0x1708, 0x0000 },
+ { 0x0700, 0x170a, 0x0000 },
+ { 0x8700, 0x1710, 0x3000 },
+ { 0x8700, 0x170e, 0x2000 },
+ { 0x0700, 0x170c, 0x0000 },
+ { 0x0700, 0x170f, 0x0000 },
+ { 0x8c00, 0x1712, 0x2000 },
+ { 0x0700, 0x1711, 0x0000 },
+ { 0x0c00, 0x1713, 0x0000 },
+ { 0x8700, 0x172f, 0x5000 },
+ { 0x8700, 0x1727, 0x4000 },
+ { 0x8700, 0x1723, 0x3000 },
+ { 0x8700, 0x1721, 0x2000 },
+ { 0x0700, 0x1720, 0x0000 },
+ { 0x0700, 0x1722, 0x0000 },
+ { 0x8700, 0x1725, 0x2000 },
+ { 0x0700, 0x1724, 0x0000 },
+ { 0x0700, 0x1726, 0x0000 },
+ { 0x8700, 0x172b, 0x3000 },
+ { 0x8700, 0x1729, 0x2000 },
+ { 0x0700, 0x1728, 0x0000 },
+ { 0x0700, 0x172a, 0x0000 },
+ { 0x8700, 0x172d, 0x2000 },
+ { 0x0700, 0x172c, 0x0000 },
+ { 0x0700, 0x172e, 0x0000 },
+ { 0x8700, 0x1740, 0x4000 },
+ { 0x8c00, 0x1733, 0x3000 },
+ { 0x8700, 0x1731, 0x2000 },
+ { 0x0700, 0x1730, 0x0000 },
+ { 0x0c00, 0x1732, 0x0000 },
+ { 0x9500, 0x1735, 0x2000 },
+ { 0x0c00, 0x1734, 0x0000 },
+ { 0x1500, 0x1736, 0x0000 },
+ { 0x8700, 0x1744, 0x3000 },
+ { 0x8700, 0x1742, 0x2000 },
+ { 0x0700, 0x1741, 0x0000 },
+ { 0x0700, 0x1743, 0x0000 },
+ { 0x8700, 0x1746, 0x2000 },
+ { 0x0700, 0x1745, 0x0000 },
+ { 0x0700, 0x1747, 0x0000 },
+ { 0x8700, 0x1782, 0x6000 },
+ { 0x8700, 0x1764, 0x5000 },
+ { 0x8700, 0x1750, 0x4000 },
+ { 0x8700, 0x174c, 0x3000 },
+ { 0x8700, 0x174a, 0x2000 },
+ { 0x0700, 0x1749, 0x0000 },
+ { 0x0700, 0x174b, 0x0000 },
+ { 0x8700, 0x174e, 0x2000 },
+ { 0x0700, 0x174d, 0x0000 },
+ { 0x0700, 0x174f, 0x0000 },
+ { 0x8700, 0x1760, 0x3000 },
+ { 0x8c00, 0x1752, 0x2000 },
+ { 0x0700, 0x1751, 0x0000 },
+ { 0x0c00, 0x1753, 0x0000 },
+ { 0x8700, 0x1762, 0x2000 },
+ { 0x0700, 0x1761, 0x0000 },
+ { 0x0700, 0x1763, 0x0000 },
+ { 0x8700, 0x176c, 0x4000 },
+ { 0x8700, 0x1768, 0x3000 },
+ { 0x8700, 0x1766, 0x2000 },
+ { 0x0700, 0x1765, 0x0000 },
+ { 0x0700, 0x1767, 0x0000 },
+ { 0x8700, 0x176a, 0x2000 },
+ { 0x0700, 0x1769, 0x0000 },
+ { 0x0700, 0x176b, 0x0000 },
+ { 0x8c00, 0x1772, 0x3000 },
+ { 0x8700, 0x176f, 0x2000 },
+ { 0x0700, 0x176e, 0x0000 },
+ { 0x0700, 0x1770, 0x0000 },
+ { 0x8700, 0x1780, 0x2000 },
+ { 0x0c00, 0x1773, 0x0000 },
+ { 0x0700, 0x1781, 0x0000 },
+ { 0x8700, 0x1792, 0x5000 },
+ { 0x8700, 0x178a, 0x4000 },
+ { 0x8700, 0x1786, 0x3000 },
+ { 0x8700, 0x1784, 0x2000 },
+ { 0x0700, 0x1783, 0x0000 },
+ { 0x0700, 0x1785, 0x0000 },
+ { 0x8700, 0x1788, 0x2000 },
+ { 0x0700, 0x1787, 0x0000 },
+ { 0x0700, 0x1789, 0x0000 },
+ { 0x8700, 0x178e, 0x3000 },
+ { 0x8700, 0x178c, 0x2000 },
+ { 0x0700, 0x178b, 0x0000 },
+ { 0x0700, 0x178d, 0x0000 },
+ { 0x8700, 0x1790, 0x2000 },
+ { 0x0700, 0x178f, 0x0000 },
+ { 0x0700, 0x1791, 0x0000 },
+ { 0x8700, 0x179a, 0x4000 },
+ { 0x8700, 0x1796, 0x3000 },
+ { 0x8700, 0x1794, 0x2000 },
+ { 0x0700, 0x1793, 0x0000 },
+ { 0x0700, 0x1795, 0x0000 },
+ { 0x8700, 0x1798, 0x2000 },
+ { 0x0700, 0x1797, 0x0000 },
+ { 0x0700, 0x1799, 0x0000 },
+ { 0x8700, 0x179e, 0x3000 },
+ { 0x8700, 0x179c, 0x2000 },
+ { 0x0700, 0x179b, 0x0000 },
+ { 0x0700, 0x179d, 0x0000 },
+ { 0x8700, 0x17a0, 0x2000 },
+ { 0x0700, 0x179f, 0x0000 },
+ { 0x0700, 0x17a1, 0x0000 },
+ { 0x8700, 0x1915, 0x9000 },
+ { 0x8700, 0x1837, 0x8000 },
+ { 0x8d00, 0x17e4, 0x7000 },
+ { 0x8a00, 0x17c2, 0x6000 },
+ { 0x8700, 0x17b2, 0x5000 },
+ { 0x8700, 0x17aa, 0x4000 },
+ { 0x8700, 0x17a6, 0x3000 },
+ { 0x8700, 0x17a4, 0x2000 },
+ { 0x0700, 0x17a3, 0x0000 },
+ { 0x0700, 0x17a5, 0x0000 },
+ { 0x8700, 0x17a8, 0x2000 },
+ { 0x0700, 0x17a7, 0x0000 },
+ { 0x0700, 0x17a9, 0x0000 },
+ { 0x8700, 0x17ae, 0x3000 },
+ { 0x8700, 0x17ac, 0x2000 },
+ { 0x0700, 0x17ab, 0x0000 },
+ { 0x0700, 0x17ad, 0x0000 },
+ { 0x8700, 0x17b0, 0x2000 },
+ { 0x0700, 0x17af, 0x0000 },
+ { 0x0700, 0x17b1, 0x0000 },
+ { 0x8c00, 0x17ba, 0x4000 },
+ { 0x8a00, 0x17b6, 0x3000 },
+ { 0x8100, 0x17b4, 0x2000 },
+ { 0x0700, 0x17b3, 0x0000 },
+ { 0x0100, 0x17b5, 0x0000 },
+ { 0x8c00, 0x17b8, 0x2000 },
+ { 0x0c00, 0x17b7, 0x0000 },
+ { 0x0c00, 0x17b9, 0x0000 },
+ { 0x8a00, 0x17be, 0x3000 },
+ { 0x8c00, 0x17bc, 0x2000 },
+ { 0x0c00, 0x17bb, 0x0000 },
+ { 0x0c00, 0x17bd, 0x0000 },
+ { 0x8a00, 0x17c0, 0x2000 },
+ { 0x0a00, 0x17bf, 0x0000 },
+ { 0x0a00, 0x17c1, 0x0000 },
+ { 0x8c00, 0x17d2, 0x5000 },
+ { 0x8c00, 0x17ca, 0x4000 },
+ { 0x8c00, 0x17c6, 0x3000 },
+ { 0x8a00, 0x17c4, 0x2000 },
+ { 0x0a00, 0x17c3, 0x0000 },
+ { 0x0a00, 0x17c5, 0x0000 },
+ { 0x8a00, 0x17c8, 0x2000 },
+ { 0x0a00, 0x17c7, 0x0000 },
+ { 0x0c00, 0x17c9, 0x0000 },
+ { 0x8c00, 0x17ce, 0x3000 },
+ { 0x8c00, 0x17cc, 0x2000 },
+ { 0x0c00, 0x17cb, 0x0000 },
+ { 0x0c00, 0x17cd, 0x0000 },
+ { 0x8c00, 0x17d0, 0x2000 },
+ { 0x0c00, 0x17cf, 0x0000 },
+ { 0x0c00, 0x17d1, 0x0000 },
+ { 0x9500, 0x17da, 0x4000 },
+ { 0x9500, 0x17d6, 0x3000 },
+ { 0x9500, 0x17d4, 0x2000 },
+ { 0x0c00, 0x17d3, 0x0000 },
+ { 0x1500, 0x17d5, 0x0000 },
+ { 0x9500, 0x17d8, 0x2000 },
+ { 0x0600, 0x17d7, 0x0000 },
+ { 0x1500, 0x17d9, 0x0000 },
+ { 0x8d00, 0x17e0, 0x3000 },
+ { 0x8700, 0x17dc, 0x2000 },
+ { 0x1700, 0x17db, 0x0000 },
+ { 0x0c00, 0x17dd, 0x0000 },
+ { 0x8d00, 0x17e2, 0x2000 },
+ { 0x0d00, 0x17e1, 0x0000 },
+ { 0x0d00, 0x17e3, 0x0000 },
+ { 0x8d00, 0x1811, 0x6000 },
+ { 0x9500, 0x1800, 0x5000 },
+ { 0x8f00, 0x17f2, 0x4000 },
+ { 0x8d00, 0x17e8, 0x3000 },
+ { 0x8d00, 0x17e6, 0x2000 },
+ { 0x0d00, 0x17e5, 0x0000 },
+ { 0x0d00, 0x17e7, 0x0000 },
+ { 0x8f00, 0x17f0, 0x2000 },
+ { 0x0d00, 0x17e9, 0x0000 },
+ { 0x0f00, 0x17f1, 0x0000 },
+ { 0x8f00, 0x17f6, 0x3000 },
+ { 0x8f00, 0x17f4, 0x2000 },
+ { 0x0f00, 0x17f3, 0x0000 },
+ { 0x0f00, 0x17f5, 0x0000 },
+ { 0x8f00, 0x17f8, 0x2000 },
+ { 0x0f00, 0x17f7, 0x0000 },
+ { 0x0f00, 0x17f9, 0x0000 },
+ { 0x9500, 0x1808, 0x4000 },
+ { 0x9500, 0x1804, 0x3000 },
+ { 0x9500, 0x1802, 0x2000 },
+ { 0x1500, 0x1801, 0x0000 },
+ { 0x1500, 0x1803, 0x0000 },
+ { 0x9100, 0x1806, 0x2000 },
+ { 0x1500, 0x1805, 0x0000 },
+ { 0x1500, 0x1807, 0x0000 },
+ { 0x8c00, 0x180c, 0x3000 },
+ { 0x9500, 0x180a, 0x2000 },
+ { 0x1500, 0x1809, 0x0000 },
+ { 0x0c00, 0x180b, 0x0000 },
+ { 0x9d00, 0x180e, 0x2000 },
+ { 0x0c00, 0x180d, 0x0000 },
+ { 0x0d00, 0x1810, 0x0000 },
+ { 0x8700, 0x1827, 0x5000 },
+ { 0x8d00, 0x1819, 0x4000 },
+ { 0x8d00, 0x1815, 0x3000 },
+ { 0x8d00, 0x1813, 0x2000 },
+ { 0x0d00, 0x1812, 0x0000 },
+ { 0x0d00, 0x1814, 0x0000 },
+ { 0x8d00, 0x1817, 0x2000 },
+ { 0x0d00, 0x1816, 0x0000 },
+ { 0x0d00, 0x1818, 0x0000 },
+ { 0x8700, 0x1823, 0x3000 },
+ { 0x8700, 0x1821, 0x2000 },
+ { 0x0700, 0x1820, 0x0000 },
+ { 0x0700, 0x1822, 0x0000 },
+ { 0x8700, 0x1825, 0x2000 },
+ { 0x0700, 0x1824, 0x0000 },
+ { 0x0700, 0x1826, 0x0000 },
+ { 0x8700, 0x182f, 0x4000 },
+ { 0x8700, 0x182b, 0x3000 },
+ { 0x8700, 0x1829, 0x2000 },
+ { 0x0700, 0x1828, 0x0000 },
+ { 0x0700, 0x182a, 0x0000 },
+ { 0x8700, 0x182d, 0x2000 },
+ { 0x0700, 0x182c, 0x0000 },
+ { 0x0700, 0x182e, 0x0000 },
+ { 0x8700, 0x1833, 0x3000 },
+ { 0x8700, 0x1831, 0x2000 },
+ { 0x0700, 0x1830, 0x0000 },
+ { 0x0700, 0x1832, 0x0000 },
+ { 0x8700, 0x1835, 0x2000 },
+ { 0x0700, 0x1834, 0x0000 },
+ { 0x0700, 0x1836, 0x0000 },
+ { 0x8700, 0x1877, 0x7000 },
+ { 0x8700, 0x1857, 0x6000 },
+ { 0x8700, 0x1847, 0x5000 },
+ { 0x8700, 0x183f, 0x4000 },
+ { 0x8700, 0x183b, 0x3000 },
+ { 0x8700, 0x1839, 0x2000 },
+ { 0x0700, 0x1838, 0x0000 },
+ { 0x0700, 0x183a, 0x0000 },
+ { 0x8700, 0x183d, 0x2000 },
+ { 0x0700, 0x183c, 0x0000 },
+ { 0x0700, 0x183e, 0x0000 },
+ { 0x8600, 0x1843, 0x3000 },
+ { 0x8700, 0x1841, 0x2000 },
+ { 0x0700, 0x1840, 0x0000 },
+ { 0x0700, 0x1842, 0x0000 },
+ { 0x8700, 0x1845, 0x2000 },
+ { 0x0700, 0x1844, 0x0000 },
+ { 0x0700, 0x1846, 0x0000 },
+ { 0x8700, 0x184f, 0x4000 },
+ { 0x8700, 0x184b, 0x3000 },
+ { 0x8700, 0x1849, 0x2000 },
+ { 0x0700, 0x1848, 0x0000 },
+ { 0x0700, 0x184a, 0x0000 },
+ { 0x8700, 0x184d, 0x2000 },
+ { 0x0700, 0x184c, 0x0000 },
+ { 0x0700, 0x184e, 0x0000 },
+ { 0x8700, 0x1853, 0x3000 },
+ { 0x8700, 0x1851, 0x2000 },
+ { 0x0700, 0x1850, 0x0000 },
+ { 0x0700, 0x1852, 0x0000 },
+ { 0x8700, 0x1855, 0x2000 },
+ { 0x0700, 0x1854, 0x0000 },
+ { 0x0700, 0x1856, 0x0000 },
+ { 0x8700, 0x1867, 0x5000 },
+ { 0x8700, 0x185f, 0x4000 },
+ { 0x8700, 0x185b, 0x3000 },
+ { 0x8700, 0x1859, 0x2000 },
+ { 0x0700, 0x1858, 0x0000 },
+ { 0x0700, 0x185a, 0x0000 },
+ { 0x8700, 0x185d, 0x2000 },
+ { 0x0700, 0x185c, 0x0000 },
+ { 0x0700, 0x185e, 0x0000 },
+ { 0x8700, 0x1863, 0x3000 },
+ { 0x8700, 0x1861, 0x2000 },
+ { 0x0700, 0x1860, 0x0000 },
+ { 0x0700, 0x1862, 0x0000 },
+ { 0x8700, 0x1865, 0x2000 },
+ { 0x0700, 0x1864, 0x0000 },
+ { 0x0700, 0x1866, 0x0000 },
+ { 0x8700, 0x186f, 0x4000 },
+ { 0x8700, 0x186b, 0x3000 },
+ { 0x8700, 0x1869, 0x2000 },
+ { 0x0700, 0x1868, 0x0000 },
+ { 0x0700, 0x186a, 0x0000 },
+ { 0x8700, 0x186d, 0x2000 },
+ { 0x0700, 0x186c, 0x0000 },
+ { 0x0700, 0x186e, 0x0000 },
+ { 0x8700, 0x1873, 0x3000 },
+ { 0x8700, 0x1871, 0x2000 },
+ { 0x0700, 0x1870, 0x0000 },
+ { 0x0700, 0x1872, 0x0000 },
+ { 0x8700, 0x1875, 0x2000 },
+ { 0x0700, 0x1874, 0x0000 },
+ { 0x0700, 0x1876, 0x0000 },
+ { 0x8700, 0x189f, 0x6000 },
+ { 0x8700, 0x188f, 0x5000 },
+ { 0x8700, 0x1887, 0x4000 },
+ { 0x8700, 0x1883, 0x3000 },
+ { 0x8700, 0x1881, 0x2000 },
+ { 0x0700, 0x1880, 0x0000 },
+ { 0x0700, 0x1882, 0x0000 },
+ { 0x8700, 0x1885, 0x2000 },
+ { 0x0700, 0x1884, 0x0000 },
+ { 0x0700, 0x1886, 0x0000 },
+ { 0x8700, 0x188b, 0x3000 },
+ { 0x8700, 0x1889, 0x2000 },
+ { 0x0700, 0x1888, 0x0000 },
+ { 0x0700, 0x188a, 0x0000 },
+ { 0x8700, 0x188d, 0x2000 },
+ { 0x0700, 0x188c, 0x0000 },
+ { 0x0700, 0x188e, 0x0000 },
+ { 0x8700, 0x1897, 0x4000 },
+ { 0x8700, 0x1893, 0x3000 },
+ { 0x8700, 0x1891, 0x2000 },
+ { 0x0700, 0x1890, 0x0000 },
+ { 0x0700, 0x1892, 0x0000 },
+ { 0x8700, 0x1895, 0x2000 },
+ { 0x0700, 0x1894, 0x0000 },
+ { 0x0700, 0x1896, 0x0000 },
+ { 0x8700, 0x189b, 0x3000 },
+ { 0x8700, 0x1899, 0x2000 },
+ { 0x0700, 0x1898, 0x0000 },
+ { 0x0700, 0x189a, 0x0000 },
+ { 0x8700, 0x189d, 0x2000 },
+ { 0x0700, 0x189c, 0x0000 },
+ { 0x0700, 0x189e, 0x0000 },
+ { 0x8700, 0x1905, 0x5000 },
+ { 0x8700, 0x18a7, 0x4000 },
+ { 0x8700, 0x18a3, 0x3000 },
+ { 0x8700, 0x18a1, 0x2000 },
+ { 0x0700, 0x18a0, 0x0000 },
+ { 0x0700, 0x18a2, 0x0000 },
+ { 0x8700, 0x18a5, 0x2000 },
+ { 0x0700, 0x18a4, 0x0000 },
+ { 0x0700, 0x18a6, 0x0000 },
+ { 0x8700, 0x1901, 0x3000 },
+ { 0x8c00, 0x18a9, 0x2000 },
+ { 0x0700, 0x18a8, 0x0000 },
+ { 0x0700, 0x1900, 0x0000 },
+ { 0x8700, 0x1903, 0x2000 },
+ { 0x0700, 0x1902, 0x0000 },
+ { 0x0700, 0x1904, 0x0000 },
+ { 0x8700, 0x190d, 0x4000 },
+ { 0x8700, 0x1909, 0x3000 },
+ { 0x8700, 0x1907, 0x2000 },
+ { 0x0700, 0x1906, 0x0000 },
+ { 0x0700, 0x1908, 0x0000 },
+ { 0x8700, 0x190b, 0x2000 },
+ { 0x0700, 0x190a, 0x0000 },
+ { 0x0700, 0x190c, 0x0000 },
+ { 0x8700, 0x1911, 0x3000 },
+ { 0x8700, 0x190f, 0x2000 },
+ { 0x0700, 0x190e, 0x0000 },
+ { 0x0700, 0x1910, 0x0000 },
+ { 0x8700, 0x1913, 0x2000 },
+ { 0x0700, 0x1912, 0x0000 },
+ { 0x0700, 0x1914, 0x0000 },
+ { 0x8500, 0x1d10, 0x8000 },
+ { 0x8700, 0x1963, 0x7000 },
+ { 0x9a00, 0x1940, 0x6000 },
+ { 0x8c00, 0x1928, 0x5000 },
+ { 0x8c00, 0x1920, 0x4000 },
+ { 0x8700, 0x1919, 0x3000 },
+ { 0x8700, 0x1917, 0x2000 },
+ { 0x0700, 0x1916, 0x0000 },
+ { 0x0700, 0x1918, 0x0000 },
+ { 0x8700, 0x191b, 0x2000 },
+ { 0x0700, 0x191a, 0x0000 },
+ { 0x0700, 0x191c, 0x0000 },
+ { 0x8a00, 0x1924, 0x3000 },
+ { 0x8c00, 0x1922, 0x2000 },
+ { 0x0c00, 0x1921, 0x0000 },
+ { 0x0a00, 0x1923, 0x0000 },
+ { 0x8a00, 0x1926, 0x2000 },
+ { 0x0a00, 0x1925, 0x0000 },
+ { 0x0c00, 0x1927, 0x0000 },
+ { 0x8a00, 0x1934, 0x4000 },
+ { 0x8a00, 0x1930, 0x3000 },
+ { 0x8a00, 0x192a, 0x2000 },
+ { 0x0a00, 0x1929, 0x0000 },
+ { 0x0a00, 0x192b, 0x0000 },
+ { 0x8c00, 0x1932, 0x2000 },
+ { 0x0a00, 0x1931, 0x0000 },
+ { 0x0a00, 0x1933, 0x0000 },
+ { 0x8a00, 0x1938, 0x3000 },
+ { 0x8a00, 0x1936, 0x2000 },
+ { 0x0a00, 0x1935, 0x0000 },
+ { 0x0a00, 0x1937, 0x0000 },
+ { 0x8c00, 0x193a, 0x2000 },
+ { 0x0c00, 0x1939, 0x0000 },
+ { 0x0c00, 0x193b, 0x0000 },
+ { 0x8700, 0x1953, 0x5000 },
+ { 0x8d00, 0x194b, 0x4000 },
+ { 0x8d00, 0x1947, 0x3000 },
+ { 0x9500, 0x1945, 0x2000 },
+ { 0x1500, 0x1944, 0x0000 },
+ { 0x0d00, 0x1946, 0x0000 },
+ { 0x8d00, 0x1949, 0x2000 },
+ { 0x0d00, 0x1948, 0x0000 },
+ { 0x0d00, 0x194a, 0x0000 },
+ { 0x8d00, 0x194f, 0x3000 },
+ { 0x8d00, 0x194d, 0x2000 },
+ { 0x0d00, 0x194c, 0x0000 },
+ { 0x0d00, 0x194e, 0x0000 },
+ { 0x8700, 0x1951, 0x2000 },
+ { 0x0700, 0x1950, 0x0000 },
+ { 0x0700, 0x1952, 0x0000 },
+ { 0x8700, 0x195b, 0x4000 },
+ { 0x8700, 0x1957, 0x3000 },
+ { 0x8700, 0x1955, 0x2000 },
+ { 0x0700, 0x1954, 0x0000 },
+ { 0x0700, 0x1956, 0x0000 },
+ { 0x8700, 0x1959, 0x2000 },
+ { 0x0700, 0x1958, 0x0000 },
+ { 0x0700, 0x195a, 0x0000 },
+ { 0x8700, 0x195f, 0x3000 },
+ { 0x8700, 0x195d, 0x2000 },
+ { 0x0700, 0x195c, 0x0000 },
+ { 0x0700, 0x195e, 0x0000 },
+ { 0x8700, 0x1961, 0x2000 },
+ { 0x0700, 0x1960, 0x0000 },
+ { 0x0700, 0x1962, 0x0000 },
+ { 0x9a00, 0x19f0, 0x6000 },
+ { 0x9a00, 0x19e0, 0x5000 },
+ { 0x8700, 0x196b, 0x4000 },
+ { 0x8700, 0x1967, 0x3000 },
+ { 0x8700, 0x1965, 0x2000 },
+ { 0x0700, 0x1964, 0x0000 },
+ { 0x0700, 0x1966, 0x0000 },
+ { 0x8700, 0x1969, 0x2000 },
+ { 0x0700, 0x1968, 0x0000 },
+ { 0x0700, 0x196a, 0x0000 },
+ { 0x8700, 0x1971, 0x3000 },
+ { 0x8700, 0x196d, 0x2000 },
+ { 0x0700, 0x196c, 0x0000 },
+ { 0x0700, 0x1970, 0x0000 },
+ { 0x8700, 0x1973, 0x2000 },
+ { 0x0700, 0x1972, 0x0000 },
+ { 0x0700, 0x1974, 0x0000 },
+ { 0x9a00, 0x19e8, 0x4000 },
+ { 0x9a00, 0x19e4, 0x3000 },
+ { 0x9a00, 0x19e2, 0x2000 },
+ { 0x1a00, 0x19e1, 0x0000 },
+ { 0x1a00, 0x19e3, 0x0000 },
+ { 0x9a00, 0x19e6, 0x2000 },
+ { 0x1a00, 0x19e5, 0x0000 },
+ { 0x1a00, 0x19e7, 0x0000 },
+ { 0x9a00, 0x19ec, 0x3000 },
+ { 0x9a00, 0x19ea, 0x2000 },
+ { 0x1a00, 0x19e9, 0x0000 },
+ { 0x1a00, 0x19eb, 0x0000 },
+ { 0x9a00, 0x19ee, 0x2000 },
+ { 0x1a00, 0x19ed, 0x0000 },
+ { 0x1a00, 0x19ef, 0x0000 },
+ { 0x8500, 0x1d00, 0x5000 },
+ { 0x9a00, 0x19f8, 0x4000 },
+ { 0x9a00, 0x19f4, 0x3000 },
+ { 0x9a00, 0x19f2, 0x2000 },
+ { 0x1a00, 0x19f1, 0x0000 },
+ { 0x1a00, 0x19f3, 0x0000 },
+ { 0x9a00, 0x19f6, 0x2000 },
+ { 0x1a00, 0x19f5, 0x0000 },
+ { 0x1a00, 0x19f7, 0x0000 },
+ { 0x9a00, 0x19fc, 0x3000 },
+ { 0x9a00, 0x19fa, 0x2000 },
+ { 0x1a00, 0x19f9, 0x0000 },
+ { 0x1a00, 0x19fb, 0x0000 },
+ { 0x9a00, 0x19fe, 0x2000 },
+ { 0x1a00, 0x19fd, 0x0000 },
+ { 0x1a00, 0x19ff, 0x0000 },
+ { 0x8500, 0x1d08, 0x4000 },
+ { 0x8500, 0x1d04, 0x3000 },
+ { 0x8500, 0x1d02, 0x2000 },
+ { 0x0500, 0x1d01, 0x0000 },
+ { 0x0500, 0x1d03, 0x0000 },
+ { 0x8500, 0x1d06, 0x2000 },
+ { 0x0500, 0x1d05, 0x0000 },
+ { 0x0500, 0x1d07, 0x0000 },
+ { 0x8500, 0x1d0c, 0x3000 },
+ { 0x8500, 0x1d0a, 0x2000 },
+ { 0x0500, 0x1d09, 0x0000 },
+ { 0x0500, 0x1d0b, 0x0000 },
+ { 0x8500, 0x1d0e, 0x2000 },
+ { 0x0500, 0x1d0d, 0x0000 },
+ { 0x0500, 0x1d0f, 0x0000 },
+ { 0x8600, 0x1d50, 0x7000 },
+ { 0x8600, 0x1d30, 0x6000 },
+ { 0x8500, 0x1d20, 0x5000 },
+ { 0x8500, 0x1d18, 0x4000 },
+ { 0x8500, 0x1d14, 0x3000 },
+ { 0x8500, 0x1d12, 0x2000 },
+ { 0x0500, 0x1d11, 0x0000 },
+ { 0x0500, 0x1d13, 0x0000 },
+ { 0x8500, 0x1d16, 0x2000 },
+ { 0x0500, 0x1d15, 0x0000 },
+ { 0x0500, 0x1d17, 0x0000 },
+ { 0x8500, 0x1d1c, 0x3000 },
+ { 0x8500, 0x1d1a, 0x2000 },
+ { 0x0500, 0x1d19, 0x0000 },
+ { 0x0500, 0x1d1b, 0x0000 },
+ { 0x8500, 0x1d1e, 0x2000 },
+ { 0x0500, 0x1d1d, 0x0000 },
+ { 0x0500, 0x1d1f, 0x0000 },
+ { 0x8500, 0x1d28, 0x4000 },
+ { 0x8500, 0x1d24, 0x3000 },
+ { 0x8500, 0x1d22, 0x2000 },
+ { 0x0500, 0x1d21, 0x0000 },
+ { 0x0500, 0x1d23, 0x0000 },
+ { 0x8500, 0x1d26, 0x2000 },
+ { 0x0500, 0x1d25, 0x0000 },
+ { 0x0500, 0x1d27, 0x0000 },
+ { 0x8600, 0x1d2c, 0x3000 },
+ { 0x8500, 0x1d2a, 0x2000 },
+ { 0x0500, 0x1d29, 0x0000 },
+ { 0x0500, 0x1d2b, 0x0000 },
+ { 0x8600, 0x1d2e, 0x2000 },
+ { 0x0600, 0x1d2d, 0x0000 },
+ { 0x0600, 0x1d2f, 0x0000 },
+ { 0x8600, 0x1d40, 0x5000 },
+ { 0x8600, 0x1d38, 0x4000 },
+ { 0x8600, 0x1d34, 0x3000 },
+ { 0x8600, 0x1d32, 0x2000 },
+ { 0x0600, 0x1d31, 0x0000 },
+ { 0x0600, 0x1d33, 0x0000 },
+ { 0x8600, 0x1d36, 0x2000 },
+ { 0x0600, 0x1d35, 0x0000 },
+ { 0x0600, 0x1d37, 0x0000 },
+ { 0x8600, 0x1d3c, 0x3000 },
+ { 0x8600, 0x1d3a, 0x2000 },
+ { 0x0600, 0x1d39, 0x0000 },
+ { 0x0600, 0x1d3b, 0x0000 },
+ { 0x8600, 0x1d3e, 0x2000 },
+ { 0x0600, 0x1d3d, 0x0000 },
+ { 0x0600, 0x1d3f, 0x0000 },
+ { 0x8600, 0x1d48, 0x4000 },
+ { 0x8600, 0x1d44, 0x3000 },
+ { 0x8600, 0x1d42, 0x2000 },
+ { 0x0600, 0x1d41, 0x0000 },
+ { 0x0600, 0x1d43, 0x0000 },
+ { 0x8600, 0x1d46, 0x2000 },
+ { 0x0600, 0x1d45, 0x0000 },
+ { 0x0600, 0x1d47, 0x0000 },
+ { 0x8600, 0x1d4c, 0x3000 },
+ { 0x8600, 0x1d4a, 0x2000 },
+ { 0x0600, 0x1d49, 0x0000 },
+ { 0x0600, 0x1d4b, 0x0000 },
+ { 0x8600, 0x1d4e, 0x2000 },
+ { 0x0600, 0x1d4d, 0x0000 },
+ { 0x0600, 0x1d4f, 0x0000 },
+ { 0x8900, 0x1e04, 0x6001 },
+ { 0x8600, 0x1d60, 0x5000 },
+ { 0x8600, 0x1d58, 0x4000 },
+ { 0x8600, 0x1d54, 0x3000 },
+ { 0x8600, 0x1d52, 0x2000 },
+ { 0x0600, 0x1d51, 0x0000 },
+ { 0x0600, 0x1d53, 0x0000 },
+ { 0x8600, 0x1d56, 0x2000 },
+ { 0x0600, 0x1d55, 0x0000 },
+ { 0x0600, 0x1d57, 0x0000 },
+ { 0x8600, 0x1d5c, 0x3000 },
+ { 0x8600, 0x1d5a, 0x2000 },
+ { 0x0600, 0x1d59, 0x0000 },
+ { 0x0600, 0x1d5b, 0x0000 },
+ { 0x8600, 0x1d5e, 0x2000 },
+ { 0x0600, 0x1d5d, 0x0000 },
+ { 0x0600, 0x1d5f, 0x0000 },
+ { 0x8500, 0x1d68, 0x4000 },
+ { 0x8500, 0x1d64, 0x3000 },
+ { 0x8500, 0x1d62, 0x2000 },
+ { 0x0600, 0x1d61, 0x0000 },
+ { 0x0500, 0x1d63, 0x0000 },
+ { 0x8500, 0x1d66, 0x2000 },
+ { 0x0500, 0x1d65, 0x0000 },
+ { 0x0500, 0x1d67, 0x0000 },
+ { 0x8900, 0x1e00, 0x3001 },
+ { 0x8500, 0x1d6a, 0x2000 },
+ { 0x0500, 0x1d69, 0x0000 },
+ { 0x0500, 0x1d6b, 0x0000 },
+ { 0x8900, 0x1e02, 0x2001 },
+ { 0x0500, 0x1e01, 0x0fff },
+ { 0x0500, 0x1e03, 0x0fff },
+ { 0x8900, 0x1e14, 0x5001 },
+ { 0x8900, 0x1e0c, 0x4001 },
+ { 0x8900, 0x1e08, 0x3001 },
+ { 0x8900, 0x1e06, 0x2001 },
+ { 0x0500, 0x1e05, 0x0fff },
+ { 0x0500, 0x1e07, 0x0fff },
+ { 0x8900, 0x1e0a, 0x2001 },
+ { 0x0500, 0x1e09, 0x0fff },
+ { 0x0500, 0x1e0b, 0x0fff },
+ { 0x8900, 0x1e10, 0x3001 },
+ { 0x8900, 0x1e0e, 0x2001 },
+ { 0x0500, 0x1e0d, 0x0fff },
+ { 0x0500, 0x1e0f, 0x0fff },
+ { 0x8900, 0x1e12, 0x2001 },
+ { 0x0500, 0x1e11, 0x0fff },
+ { 0x0500, 0x1e13, 0x0fff },
+ { 0x8900, 0x1e1c, 0x4001 },
+ { 0x8900, 0x1e18, 0x3001 },
+ { 0x8900, 0x1e16, 0x2001 },
+ { 0x0500, 0x1e15, 0x0fff },
+ { 0x0500, 0x1e17, 0x0fff },
+ { 0x8900, 0x1e1a, 0x2001 },
+ { 0x0500, 0x1e19, 0x0fff },
+ { 0x0500, 0x1e1b, 0x0fff },
+ { 0x8900, 0x1e20, 0x3001 },
+ { 0x8900, 0x1e1e, 0x2001 },
+ { 0x0500, 0x1e1d, 0x0fff },
+ { 0x0500, 0x1e1f, 0x0fff },
+ { 0x8900, 0x1e22, 0x2001 },
+ { 0x0500, 0x1e21, 0x0fff },
+ { 0x0500, 0x1e23, 0x0fff },
+ { 0x9600, 0x2045, 0xa000 },
+ { 0x8500, 0x1f32, 0x9008 },
+ { 0x8900, 0x1ea8, 0x8001 },
+ { 0x8900, 0x1e64, 0x7001 },
+ { 0x8900, 0x1e44, 0x6001 },
+ { 0x8900, 0x1e34, 0x5001 },
+ { 0x8900, 0x1e2c, 0x4001 },
+ { 0x8900, 0x1e28, 0x3001 },
+ { 0x8900, 0x1e26, 0x2001 },
+ { 0x0500, 0x1e25, 0x0fff },
+ { 0x0500, 0x1e27, 0x0fff },
+ { 0x8900, 0x1e2a, 0x2001 },
+ { 0x0500, 0x1e29, 0x0fff },
+ { 0x0500, 0x1e2b, 0x0fff },
+ { 0x8900, 0x1e30, 0x3001 },
+ { 0x8900, 0x1e2e, 0x2001 },
+ { 0x0500, 0x1e2d, 0x0fff },
+ { 0x0500, 0x1e2f, 0x0fff },
+ { 0x8900, 0x1e32, 0x2001 },
+ { 0x0500, 0x1e31, 0x0fff },
+ { 0x0500, 0x1e33, 0x0fff },
+ { 0x8900, 0x1e3c, 0x4001 },
+ { 0x8900, 0x1e38, 0x3001 },
+ { 0x8900, 0x1e36, 0x2001 },
+ { 0x0500, 0x1e35, 0x0fff },
+ { 0x0500, 0x1e37, 0x0fff },
+ { 0x8900, 0x1e3a, 0x2001 },
+ { 0x0500, 0x1e39, 0x0fff },
+ { 0x0500, 0x1e3b, 0x0fff },
+ { 0x8900, 0x1e40, 0x3001 },
+ { 0x8900, 0x1e3e, 0x2001 },
+ { 0x0500, 0x1e3d, 0x0fff },
+ { 0x0500, 0x1e3f, 0x0fff },
+ { 0x8900, 0x1e42, 0x2001 },
+ { 0x0500, 0x1e41, 0x0fff },
+ { 0x0500, 0x1e43, 0x0fff },
+ { 0x8900, 0x1e54, 0x5001 },
+ { 0x8900, 0x1e4c, 0x4001 },
+ { 0x8900, 0x1e48, 0x3001 },
+ { 0x8900, 0x1e46, 0x2001 },
+ { 0x0500, 0x1e45, 0x0fff },
+ { 0x0500, 0x1e47, 0x0fff },
+ { 0x8900, 0x1e4a, 0x2001 },
+ { 0x0500, 0x1e49, 0x0fff },
+ { 0x0500, 0x1e4b, 0x0fff },
+ { 0x8900, 0x1e50, 0x3001 },
+ { 0x8900, 0x1e4e, 0x2001 },
+ { 0x0500, 0x1e4d, 0x0fff },
+ { 0x0500, 0x1e4f, 0x0fff },
+ { 0x8900, 0x1e52, 0x2001 },
+ { 0x0500, 0x1e51, 0x0fff },
+ { 0x0500, 0x1e53, 0x0fff },
+ { 0x8900, 0x1e5c, 0x4001 },
+ { 0x8900, 0x1e58, 0x3001 },
+ { 0x8900, 0x1e56, 0x2001 },
+ { 0x0500, 0x1e55, 0x0fff },
+ { 0x0500, 0x1e57, 0x0fff },
+ { 0x8900, 0x1e5a, 0x2001 },
+ { 0x0500, 0x1e59, 0x0fff },
+ { 0x0500, 0x1e5b, 0x0fff },
+ { 0x8900, 0x1e60, 0x3001 },
+ { 0x8900, 0x1e5e, 0x2001 },
+ { 0x0500, 0x1e5d, 0x0fff },
+ { 0x0500, 0x1e5f, 0x0fff },
+ { 0x8900, 0x1e62, 0x2001 },
+ { 0x0500, 0x1e61, 0x0fff },
+ { 0x0500, 0x1e63, 0x0fff },
+ { 0x8900, 0x1e84, 0x6001 },
+ { 0x8900, 0x1e74, 0x5001 },
+ { 0x8900, 0x1e6c, 0x4001 },
+ { 0x8900, 0x1e68, 0x3001 },
+ { 0x8900, 0x1e66, 0x2001 },
+ { 0x0500, 0x1e65, 0x0fff },
+ { 0x0500, 0x1e67, 0x0fff },
+ { 0x8900, 0x1e6a, 0x2001 },
+ { 0x0500, 0x1e69, 0x0fff },
+ { 0x0500, 0x1e6b, 0x0fff },
+ { 0x8900, 0x1e70, 0x3001 },
+ { 0x8900, 0x1e6e, 0x2001 },
+ { 0x0500, 0x1e6d, 0x0fff },
+ { 0x0500, 0x1e6f, 0x0fff },
+ { 0x8900, 0x1e72, 0x2001 },
+ { 0x0500, 0x1e71, 0x0fff },
+ { 0x0500, 0x1e73, 0x0fff },
+ { 0x8900, 0x1e7c, 0x4001 },
+ { 0x8900, 0x1e78, 0x3001 },
+ { 0x8900, 0x1e76, 0x2001 },
+ { 0x0500, 0x1e75, 0x0fff },
+ { 0x0500, 0x1e77, 0x0fff },
+ { 0x8900, 0x1e7a, 0x2001 },
+ { 0x0500, 0x1e79, 0x0fff },
+ { 0x0500, 0x1e7b, 0x0fff },
+ { 0x8900, 0x1e80, 0x3001 },
+ { 0x8900, 0x1e7e, 0x2001 },
+ { 0x0500, 0x1e7d, 0x0fff },
+ { 0x0500, 0x1e7f, 0x0fff },
+ { 0x8900, 0x1e82, 0x2001 },
+ { 0x0500, 0x1e81, 0x0fff },
+ { 0x0500, 0x1e83, 0x0fff },
+ { 0x8900, 0x1e94, 0x5001 },
+ { 0x8900, 0x1e8c, 0x4001 },
+ { 0x8900, 0x1e88, 0x3001 },
+ { 0x8900, 0x1e86, 0x2001 },
+ { 0x0500, 0x1e85, 0x0fff },
+ { 0x0500, 0x1e87, 0x0fff },
+ { 0x8900, 0x1e8a, 0x2001 },
+ { 0x0500, 0x1e89, 0x0fff },
+ { 0x0500, 0x1e8b, 0x0fff },
+ { 0x8900, 0x1e90, 0x3001 },
+ { 0x8900, 0x1e8e, 0x2001 },
+ { 0x0500, 0x1e8d, 0x0fff },
+ { 0x0500, 0x1e8f, 0x0fff },
+ { 0x8900, 0x1e92, 0x2001 },
+ { 0x0500, 0x1e91, 0x0fff },
+ { 0x0500, 0x1e93, 0x0fff },
+ { 0x8900, 0x1ea0, 0x4001 },
+ { 0x8500, 0x1e98, 0x3000 },
+ { 0x8500, 0x1e96, 0x2000 },
+ { 0x0500, 0x1e95, 0x0fff },
+ { 0x0500, 0x1e97, 0x0000 },
+ { 0x8500, 0x1e9a, 0x2000 },
+ { 0x0500, 0x1e99, 0x0000 },
+ { 0x0500, 0x1e9b, 0x0fc5 },
+ { 0x8900, 0x1ea4, 0x3001 },
+ { 0x8900, 0x1ea2, 0x2001 },
+ { 0x0500, 0x1ea1, 0x0fff },
+ { 0x0500, 0x1ea3, 0x0fff },
+ { 0x8900, 0x1ea6, 0x2001 },
+ { 0x0500, 0x1ea5, 0x0fff },
+ { 0x0500, 0x1ea7, 0x0fff },
+ { 0x8900, 0x1ee8, 0x7001 },
+ { 0x8900, 0x1ec8, 0x6001 },
+ { 0x8900, 0x1eb8, 0x5001 },
+ { 0x8900, 0x1eb0, 0x4001 },
+ { 0x8900, 0x1eac, 0x3001 },
+ { 0x8900, 0x1eaa, 0x2001 },
+ { 0x0500, 0x1ea9, 0x0fff },
+ { 0x0500, 0x1eab, 0x0fff },
+ { 0x8900, 0x1eae, 0x2001 },
+ { 0x0500, 0x1ead, 0x0fff },
+ { 0x0500, 0x1eaf, 0x0fff },
+ { 0x8900, 0x1eb4, 0x3001 },
+ { 0x8900, 0x1eb2, 0x2001 },
+ { 0x0500, 0x1eb1, 0x0fff },
+ { 0x0500, 0x1eb3, 0x0fff },
+ { 0x8900, 0x1eb6, 0x2001 },
+ { 0x0500, 0x1eb5, 0x0fff },
+ { 0x0500, 0x1eb7, 0x0fff },
+ { 0x8900, 0x1ec0, 0x4001 },
+ { 0x8900, 0x1ebc, 0x3001 },
+ { 0x8900, 0x1eba, 0x2001 },
+ { 0x0500, 0x1eb9, 0x0fff },
+ { 0x0500, 0x1ebb, 0x0fff },
+ { 0x8900, 0x1ebe, 0x2001 },
+ { 0x0500, 0x1ebd, 0x0fff },
+ { 0x0500, 0x1ebf, 0x0fff },
+ { 0x8900, 0x1ec4, 0x3001 },
+ { 0x8900, 0x1ec2, 0x2001 },
+ { 0x0500, 0x1ec1, 0x0fff },
+ { 0x0500, 0x1ec3, 0x0fff },
+ { 0x8900, 0x1ec6, 0x2001 },
+ { 0x0500, 0x1ec5, 0x0fff },
+ { 0x0500, 0x1ec7, 0x0fff },
+ { 0x8900, 0x1ed8, 0x5001 },
+ { 0x8900, 0x1ed0, 0x4001 },
+ { 0x8900, 0x1ecc, 0x3001 },
+ { 0x8900, 0x1eca, 0x2001 },
+ { 0x0500, 0x1ec9, 0x0fff },
+ { 0x0500, 0x1ecb, 0x0fff },
+ { 0x8900, 0x1ece, 0x2001 },
+ { 0x0500, 0x1ecd, 0x0fff },
+ { 0x0500, 0x1ecf, 0x0fff },
+ { 0x8900, 0x1ed4, 0x3001 },
+ { 0x8900, 0x1ed2, 0x2001 },
+ { 0x0500, 0x1ed1, 0x0fff },
+ { 0x0500, 0x1ed3, 0x0fff },
+ { 0x8900, 0x1ed6, 0x2001 },
+ { 0x0500, 0x1ed5, 0x0fff },
+ { 0x0500, 0x1ed7, 0x0fff },
+ { 0x8900, 0x1ee0, 0x4001 },
+ { 0x8900, 0x1edc, 0x3001 },
+ { 0x8900, 0x1eda, 0x2001 },
+ { 0x0500, 0x1ed9, 0x0fff },
+ { 0x0500, 0x1edb, 0x0fff },
+ { 0x8900, 0x1ede, 0x2001 },
+ { 0x0500, 0x1edd, 0x0fff },
+ { 0x0500, 0x1edf, 0x0fff },
+ { 0x8900, 0x1ee4, 0x3001 },
+ { 0x8900, 0x1ee2, 0x2001 },
+ { 0x0500, 0x1ee1, 0x0fff },
+ { 0x0500, 0x1ee3, 0x0fff },
+ { 0x8900, 0x1ee6, 0x2001 },
+ { 0x0500, 0x1ee5, 0x0fff },
+ { 0x0500, 0x1ee7, 0x0fff },
+ { 0x8900, 0x1f0e, 0x6ff8 },
+ { 0x8900, 0x1ef8, 0x5001 },
+ { 0x8900, 0x1ef0, 0x4001 },
+ { 0x8900, 0x1eec, 0x3001 },
+ { 0x8900, 0x1eea, 0x2001 },
+ { 0x0500, 0x1ee9, 0x0fff },
+ { 0x0500, 0x1eeb, 0x0fff },
+ { 0x8900, 0x1eee, 0x2001 },
+ { 0x0500, 0x1eed, 0x0fff },
+ { 0x0500, 0x1eef, 0x0fff },
+ { 0x8900, 0x1ef4, 0x3001 },
+ { 0x8900, 0x1ef2, 0x2001 },
+ { 0x0500, 0x1ef1, 0x0fff },
+ { 0x0500, 0x1ef3, 0x0fff },
+ { 0x8900, 0x1ef6, 0x2001 },
+ { 0x0500, 0x1ef5, 0x0fff },
+ { 0x0500, 0x1ef7, 0x0fff },
+ { 0x8500, 0x1f06, 0x4008 },
+ { 0x8500, 0x1f02, 0x3008 },
+ { 0x8500, 0x1f00, 0x2008 },
+ { 0x0500, 0x1ef9, 0x0fff },
+ { 0x0500, 0x1f01, 0x0008 },
+ { 0x8500, 0x1f04, 0x2008 },
+ { 0x0500, 0x1f03, 0x0008 },
+ { 0x0500, 0x1f05, 0x0008 },
+ { 0x8900, 0x1f0a, 0x3ff8 },
+ { 0x8900, 0x1f08, 0x2ff8 },
+ { 0x0500, 0x1f07, 0x0008 },
+ { 0x0900, 0x1f09, 0x0ff8 },
+ { 0x8900, 0x1f0c, 0x2ff8 },
+ { 0x0900, 0x1f0b, 0x0ff8 },
+ { 0x0900, 0x1f0d, 0x0ff8 },
+ { 0x8500, 0x1f22, 0x5008 },
+ { 0x8900, 0x1f18, 0x4ff8 },
+ { 0x8500, 0x1f12, 0x3008 },
+ { 0x8500, 0x1f10, 0x2008 },
+ { 0x0900, 0x1f0f, 0x0ff8 },
+ { 0x0500, 0x1f11, 0x0008 },
+ { 0x8500, 0x1f14, 0x2008 },
+ { 0x0500, 0x1f13, 0x0008 },
+ { 0x0500, 0x1f15, 0x0008 },
+ { 0x8900, 0x1f1c, 0x3ff8 },
+ { 0x8900, 0x1f1a, 0x2ff8 },
+ { 0x0900, 0x1f19, 0x0ff8 },
+ { 0x0900, 0x1f1b, 0x0ff8 },
+ { 0x8500, 0x1f20, 0x2008 },
+ { 0x0900, 0x1f1d, 0x0ff8 },
+ { 0x0500, 0x1f21, 0x0008 },
+ { 0x8900, 0x1f2a, 0x4ff8 },
+ { 0x8500, 0x1f26, 0x3008 },
+ { 0x8500, 0x1f24, 0x2008 },
+ { 0x0500, 0x1f23, 0x0008 },
+ { 0x0500, 0x1f25, 0x0008 },
+ { 0x8900, 0x1f28, 0x2ff8 },
+ { 0x0500, 0x1f27, 0x0008 },
+ { 0x0900, 0x1f29, 0x0ff8 },
+ { 0x8900, 0x1f2e, 0x3ff8 },
+ { 0x8900, 0x1f2c, 0x2ff8 },
+ { 0x0900, 0x1f2b, 0x0ff8 },
+ { 0x0900, 0x1f2d, 0x0ff8 },
+ { 0x8500, 0x1f30, 0x2008 },
+ { 0x0900, 0x1f2f, 0x0ff8 },
+ { 0x0500, 0x1f31, 0x0008 },
+ { 0x9800, 0x1fbd, 0x8000 },
+ { 0x8500, 0x1f7a, 0x7070 },
+ { 0x8500, 0x1f56, 0x6000 },
+ { 0x8500, 0x1f42, 0x5008 },
+ { 0x8900, 0x1f3a, 0x4ff8 },
+ { 0x8500, 0x1f36, 0x3008 },
+ { 0x8500, 0x1f34, 0x2008 },
+ { 0x0500, 0x1f33, 0x0008 },
+ { 0x0500, 0x1f35, 0x0008 },
+ { 0x8900, 0x1f38, 0x2ff8 },
+ { 0x0500, 0x1f37, 0x0008 },
+ { 0x0900, 0x1f39, 0x0ff8 },
+ { 0x8900, 0x1f3e, 0x3ff8 },
+ { 0x8900, 0x1f3c, 0x2ff8 },
+ { 0x0900, 0x1f3b, 0x0ff8 },
+ { 0x0900, 0x1f3d, 0x0ff8 },
+ { 0x8500, 0x1f40, 0x2008 },
+ { 0x0900, 0x1f3f, 0x0ff8 },
+ { 0x0500, 0x1f41, 0x0008 },
+ { 0x8900, 0x1f4c, 0x4ff8 },
+ { 0x8900, 0x1f48, 0x3ff8 },
+ { 0x8500, 0x1f44, 0x2008 },
+ { 0x0500, 0x1f43, 0x0008 },
+ { 0x0500, 0x1f45, 0x0008 },
+ { 0x8900, 0x1f4a, 0x2ff8 },
+ { 0x0900, 0x1f49, 0x0ff8 },
+ { 0x0900, 0x1f4b, 0x0ff8 },
+ { 0x8500, 0x1f52, 0x3000 },
+ { 0x8500, 0x1f50, 0x2000 },
+ { 0x0900, 0x1f4d, 0x0ff8 },
+ { 0x0500, 0x1f51, 0x0008 },
+ { 0x8500, 0x1f54, 0x2000 },
+ { 0x0500, 0x1f53, 0x0008 },
+ { 0x0500, 0x1f55, 0x0008 },
+ { 0x8900, 0x1f6a, 0x5ff8 },
+ { 0x8500, 0x1f62, 0x4008 },
+ { 0x8900, 0x1f5d, 0x3ff8 },
+ { 0x8900, 0x1f59, 0x2ff8 },
+ { 0x0500, 0x1f57, 0x0008 },
+ { 0x0900, 0x1f5b, 0x0ff8 },
+ { 0x8500, 0x1f60, 0x2008 },
+ { 0x0900, 0x1f5f, 0x0ff8 },
+ { 0x0500, 0x1f61, 0x0008 },
+ { 0x8500, 0x1f66, 0x3008 },
+ { 0x8500, 0x1f64, 0x2008 },
+ { 0x0500, 0x1f63, 0x0008 },
+ { 0x0500, 0x1f65, 0x0008 },
+ { 0x8900, 0x1f68, 0x2ff8 },
+ { 0x0500, 0x1f67, 0x0008 },
+ { 0x0900, 0x1f69, 0x0ff8 },
+ { 0x8500, 0x1f72, 0x4056 },
+ { 0x8900, 0x1f6e, 0x3ff8 },
+ { 0x8900, 0x1f6c, 0x2ff8 },
+ { 0x0900, 0x1f6b, 0x0ff8 },
+ { 0x0900, 0x1f6d, 0x0ff8 },
+ { 0x8500, 0x1f70, 0x204a },
+ { 0x0900, 0x1f6f, 0x0ff8 },
+ { 0x0500, 0x1f71, 0x004a },
+ { 0x8500, 0x1f76, 0x3064 },
+ { 0x8500, 0x1f74, 0x2056 },
+ { 0x0500, 0x1f73, 0x0056 },
+ { 0x0500, 0x1f75, 0x0056 },
+ { 0x8500, 0x1f78, 0x2080 },
+ { 0x0500, 0x1f77, 0x0064 },
+ { 0x0500, 0x1f79, 0x0080 },
+ { 0x8800, 0x1f9c, 0x6000 },
+ { 0x8800, 0x1f8c, 0x5000 },
+ { 0x8500, 0x1f84, 0x4008 },
+ { 0x8500, 0x1f80, 0x3008 },
+ { 0x8500, 0x1f7c, 0x207e },
+ { 0x0500, 0x1f7b, 0x0070 },
+ { 0x0500, 0x1f7d, 0x007e },
+ { 0x8500, 0x1f82, 0x2008 },
+ { 0x0500, 0x1f81, 0x0008 },
+ { 0x0500, 0x1f83, 0x0008 },
+ { 0x8800, 0x1f88, 0x3000 },
+ { 0x8500, 0x1f86, 0x2008 },
+ { 0x0500, 0x1f85, 0x0008 },
+ { 0x0500, 0x1f87, 0x0008 },
+ { 0x8800, 0x1f8a, 0x2000 },
+ { 0x0800, 0x1f89, 0x0000 },
+ { 0x0800, 0x1f8b, 0x0000 },
+ { 0x8500, 0x1f94, 0x4008 },
+ { 0x8500, 0x1f90, 0x3008 },
+ { 0x8800, 0x1f8e, 0x2000 },
+ { 0x0800, 0x1f8d, 0x0000 },
+ { 0x0800, 0x1f8f, 0x0000 },
+ { 0x8500, 0x1f92, 0x2008 },
+ { 0x0500, 0x1f91, 0x0008 },
+ { 0x0500, 0x1f93, 0x0008 },
+ { 0x8800, 0x1f98, 0x3000 },
+ { 0x8500, 0x1f96, 0x2008 },
+ { 0x0500, 0x1f95, 0x0008 },
+ { 0x0500, 0x1f97, 0x0008 },
+ { 0x8800, 0x1f9a, 0x2000 },
+ { 0x0800, 0x1f99, 0x0000 },
+ { 0x0800, 0x1f9b, 0x0000 },
+ { 0x8800, 0x1fac, 0x5000 },
+ { 0x8500, 0x1fa4, 0x4008 },
+ { 0x8500, 0x1fa0, 0x3008 },
+ { 0x8800, 0x1f9e, 0x2000 },
+ { 0x0800, 0x1f9d, 0x0000 },
+ { 0x0800, 0x1f9f, 0x0000 },
+ { 0x8500, 0x1fa2, 0x2008 },
+ { 0x0500, 0x1fa1, 0x0008 },
+ { 0x0500, 0x1fa3, 0x0008 },
+ { 0x8800, 0x1fa8, 0x3000 },
+ { 0x8500, 0x1fa6, 0x2008 },
+ { 0x0500, 0x1fa5, 0x0008 },
+ { 0x0500, 0x1fa7, 0x0008 },
+ { 0x8800, 0x1faa, 0x2000 },
+ { 0x0800, 0x1fa9, 0x0000 },
+ { 0x0800, 0x1fab, 0x0000 },
+ { 0x8500, 0x1fb4, 0x4000 },
+ { 0x8500, 0x1fb0, 0x3008 },
+ { 0x8800, 0x1fae, 0x2000 },
+ { 0x0800, 0x1fad, 0x0000 },
+ { 0x0800, 0x1faf, 0x0000 },
+ { 0x8500, 0x1fb2, 0x2000 },
+ { 0x0500, 0x1fb1, 0x0008 },
+ { 0x0500, 0x1fb3, 0x0009 },
+ { 0x8900, 0x1fb9, 0x3ff8 },
+ { 0x8500, 0x1fb7, 0x2000 },
+ { 0x0500, 0x1fb6, 0x0000 },
+ { 0x0900, 0x1fb8, 0x0ff8 },
+ { 0x8900, 0x1fbb, 0x2fb6 },
+ { 0x0900, 0x1fba, 0x0fb6 },
+ { 0x0800, 0x1fbc, 0x0000 },
+ { 0x9d00, 0x2005, 0x7000 },
+ { 0x8500, 0x1fe1, 0x6008 },
+ { 0x9800, 0x1fce, 0x5000 },
+ { 0x8500, 0x1fc6, 0x4000 },
+ { 0x9800, 0x1fc1, 0x3000 },
+ { 0x9800, 0x1fbf, 0x2000 },
+ { 0x0500, 0x1fbe, 0x0000 },
+ { 0x1800, 0x1fc0, 0x0000 },
+ { 0x8500, 0x1fc3, 0x2009 },
+ { 0x0500, 0x1fc2, 0x0000 },
+ { 0x0500, 0x1fc4, 0x0000 },
+ { 0x8900, 0x1fca, 0x3faa },
+ { 0x8900, 0x1fc8, 0x2faa },
+ { 0x0500, 0x1fc7, 0x0000 },
+ { 0x0900, 0x1fc9, 0x0faa },
+ { 0x8800, 0x1fcc, 0x2000 },
+ { 0x0900, 0x1fcb, 0x0faa },
+ { 0x1800, 0x1fcd, 0x0000 },
+ { 0x8900, 0x1fd8, 0x4ff8 },
+ { 0x8500, 0x1fd2, 0x3000 },
+ { 0x8500, 0x1fd0, 0x2008 },
+ { 0x1800, 0x1fcf, 0x0000 },
+ { 0x0500, 0x1fd1, 0x0008 },
+ { 0x8500, 0x1fd6, 0x2000 },
+ { 0x0500, 0x1fd3, 0x0000 },
+ { 0x0500, 0x1fd7, 0x0000 },
+ { 0x9800, 0x1fdd, 0x3000 },
+ { 0x8900, 0x1fda, 0x2f9c },
+ { 0x0900, 0x1fd9, 0x0ff8 },
+ { 0x0900, 0x1fdb, 0x0f9c },
+ { 0x9800, 0x1fdf, 0x2000 },
+ { 0x1800, 0x1fde, 0x0000 },
+ { 0x0500, 0x1fe0, 0x0008 },
+ { 0x8500, 0x1ff3, 0x5009 },
+ { 0x8900, 0x1fe9, 0x4ff8 },
+ { 0x8500, 0x1fe5, 0x3007 },
+ { 0x8500, 0x1fe3, 0x2000 },
+ { 0x0500, 0x1fe2, 0x0000 },
+ { 0x0500, 0x1fe4, 0x0000 },
+ { 0x8500, 0x1fe7, 0x2000 },
+ { 0x0500, 0x1fe6, 0x0000 },
+ { 0x0900, 0x1fe8, 0x0ff8 },
+ { 0x9800, 0x1fed, 0x3000 },
+ { 0x8900, 0x1feb, 0x2f90 },
+ { 0x0900, 0x1fea, 0x0f90 },
+ { 0x0900, 0x1fec, 0x0ff9 },
+ { 0x9800, 0x1fef, 0x2000 },
+ { 0x1800, 0x1fee, 0x0000 },
+ { 0x0500, 0x1ff2, 0x0000 },
+ { 0x8800, 0x1ffc, 0x4000 },
+ { 0x8900, 0x1ff8, 0x3f80 },
+ { 0x8500, 0x1ff6, 0x2000 },
+ { 0x0500, 0x1ff4, 0x0000 },
+ { 0x0500, 0x1ff7, 0x0000 },
+ { 0x8900, 0x1ffa, 0x2f82 },
+ { 0x0900, 0x1ff9, 0x0f80 },
+ { 0x0900, 0x1ffb, 0x0f82 },
+ { 0x9d00, 0x2001, 0x3000 },
+ { 0x9800, 0x1ffe, 0x2000 },
+ { 0x1800, 0x1ffd, 0x0000 },
+ { 0x1d00, 0x2000, 0x0000 },
+ { 0x9d00, 0x2003, 0x2000 },
+ { 0x1d00, 0x2002, 0x0000 },
+ { 0x1d00, 0x2004, 0x0000 },
+ { 0x9500, 0x2025, 0x6000 },
+ { 0x9100, 0x2015, 0x5000 },
+ { 0x8100, 0x200d, 0x4000 },
+ { 0x9d00, 0x2009, 0x3000 },
+ { 0x9d00, 0x2007, 0x2000 },
+ { 0x1d00, 0x2006, 0x0000 },
+ { 0x1d00, 0x2008, 0x0000 },
+ { 0x9d00, 0x200b, 0x2000 },
+ { 0x1d00, 0x200a, 0x0000 },
+ { 0x0100, 0x200c, 0x0000 },
+ { 0x9100, 0x2011, 0x3000 },
+ { 0x8100, 0x200f, 0x2000 },
+ { 0x0100, 0x200e, 0x0000 },
+ { 0x1100, 0x2010, 0x0000 },
+ { 0x9100, 0x2013, 0x2000 },
+ { 0x1100, 0x2012, 0x0000 },
+ { 0x1100, 0x2014, 0x0000 },
+ { 0x9300, 0x201d, 0x4000 },
+ { 0x9300, 0x2019, 0x3000 },
+ { 0x9500, 0x2017, 0x2000 },
+ { 0x1500, 0x2016, 0x0000 },
+ { 0x1400, 0x2018, 0x0000 },
+ { 0x9400, 0x201b, 0x2000 },
+ { 0x1600, 0x201a, 0x0000 },
+ { 0x1400, 0x201c, 0x0000 },
+ { 0x9500, 0x2021, 0x3000 },
+ { 0x9400, 0x201f, 0x2000 },
+ { 0x1600, 0x201e, 0x0000 },
+ { 0x1500, 0x2020, 0x0000 },
+ { 0x9500, 0x2023, 0x2000 },
+ { 0x1500, 0x2022, 0x0000 },
+ { 0x1500, 0x2024, 0x0000 },
+ { 0x9500, 0x2035, 0x5000 },
+ { 0x8100, 0x202d, 0x4000 },
+ { 0x9c00, 0x2029, 0x3000 },
+ { 0x9500, 0x2027, 0x2000 },
+ { 0x1500, 0x2026, 0x0000 },
+ { 0x1b00, 0x2028, 0x0000 },
+ { 0x8100, 0x202b, 0x2000 },
+ { 0x0100, 0x202a, 0x0000 },
+ { 0x0100, 0x202c, 0x0000 },
+ { 0x9500, 0x2031, 0x3000 },
+ { 0x9d00, 0x202f, 0x2000 },
+ { 0x0100, 0x202e, 0x0000 },
+ { 0x1500, 0x2030, 0x0000 },
+ { 0x9500, 0x2033, 0x2000 },
+ { 0x1500, 0x2032, 0x0000 },
+ { 0x1500, 0x2034, 0x0000 },
+ { 0x9500, 0x203d, 0x4000 },
+ { 0x9400, 0x2039, 0x3000 },
+ { 0x9500, 0x2037, 0x2000 },
+ { 0x1500, 0x2036, 0x0000 },
+ { 0x1500, 0x2038, 0x0000 },
+ { 0x9500, 0x203b, 0x2000 },
+ { 0x1300, 0x203a, 0x0000 },
+ { 0x1500, 0x203c, 0x0000 },
+ { 0x9500, 0x2041, 0x3000 },
+ { 0x9000, 0x203f, 0x2000 },
+ { 0x1500, 0x203e, 0x0000 },
+ { 0x1000, 0x2040, 0x0000 },
+ { 0x9500, 0x2043, 0x2000 },
+ { 0x1500, 0x2042, 0x0000 },
+ { 0x1900, 0x2044, 0x0000 },
+ { 0x9900, 0x21ae, 0x9000 },
+ { 0x8900, 0x211a, 0x8000 },
+ { 0x9700, 0x20a7, 0x7000 },
+ { 0x8f00, 0x2076, 0x6000 },
+ { 0x9500, 0x2057, 0x5000 },
+ { 0x9500, 0x204d, 0x4000 },
+ { 0x9500, 0x2049, 0x3000 },
+ { 0x9500, 0x2047, 0x2000 },
+ { 0x1200, 0x2046, 0x0000 },
+ { 0x1500, 0x2048, 0x0000 },
+ { 0x9500, 0x204b, 0x2000 },
+ { 0x1500, 0x204a, 0x0000 },
+ { 0x1500, 0x204c, 0x0000 },
+ { 0x9500, 0x2051, 0x3000 },
+ { 0x9500, 0x204f, 0x2000 },
+ { 0x1500, 0x204e, 0x0000 },
+ { 0x1500, 0x2050, 0x0000 },
+ { 0x9500, 0x2053, 0x2000 },
+ { 0x1900, 0x2052, 0x0000 },
+ { 0x1000, 0x2054, 0x0000 },
+ { 0x8100, 0x206c, 0x4000 },
+ { 0x8100, 0x2062, 0x3000 },
+ { 0x8100, 0x2060, 0x2000 },
+ { 0x1d00, 0x205f, 0x0000 },
+ { 0x0100, 0x2061, 0x0000 },
+ { 0x8100, 0x206a, 0x2000 },
+ { 0x0100, 0x2063, 0x0000 },
+ { 0x0100, 0x206b, 0x0000 },
+ { 0x8f00, 0x2070, 0x3000 },
+ { 0x8100, 0x206e, 0x2000 },
+ { 0x0100, 0x206d, 0x0000 },
+ { 0x0100, 0x206f, 0x0000 },
+ { 0x8f00, 0x2074, 0x2000 },
+ { 0x0500, 0x2071, 0x0000 },
+ { 0x0f00, 0x2075, 0x0000 },
+ { 0x8f00, 0x2086, 0x5000 },
+ { 0x9200, 0x207e, 0x4000 },
+ { 0x9900, 0x207a, 0x3000 },
+ { 0x8f00, 0x2078, 0x2000 },
+ { 0x0f00, 0x2077, 0x0000 },
+ { 0x0f00, 0x2079, 0x0000 },
+ { 0x9900, 0x207c, 0x2000 },
+ { 0x1900, 0x207b, 0x0000 },
+ { 0x1600, 0x207d, 0x0000 },
+ { 0x8f00, 0x2082, 0x3000 },
+ { 0x8f00, 0x2080, 0x2000 },
+ { 0x0500, 0x207f, 0x0000 },
+ { 0x0f00, 0x2081, 0x0000 },
+ { 0x8f00, 0x2084, 0x2000 },
+ { 0x0f00, 0x2083, 0x0000 },
+ { 0x0f00, 0x2085, 0x0000 },
+ { 0x9200, 0x208e, 0x4000 },
+ { 0x9900, 0x208a, 0x3000 },
+ { 0x8f00, 0x2088, 0x2000 },
+ { 0x0f00, 0x2087, 0x0000 },
+ { 0x0f00, 0x2089, 0x0000 },
+ { 0x9900, 0x208c, 0x2000 },
+ { 0x1900, 0x208b, 0x0000 },
+ { 0x1600, 0x208d, 0x0000 },
+ { 0x9700, 0x20a3, 0x3000 },
+ { 0x9700, 0x20a1, 0x2000 },
+ { 0x1700, 0x20a0, 0x0000 },
+ { 0x1700, 0x20a2, 0x0000 },
+ { 0x9700, 0x20a5, 0x2000 },
+ { 0x1700, 0x20a4, 0x0000 },
+ { 0x1700, 0x20a6, 0x0000 },
+ { 0x8c00, 0x20e5, 0x6000 },
+ { 0x8c00, 0x20d5, 0x5000 },
+ { 0x9700, 0x20af, 0x4000 },
+ { 0x9700, 0x20ab, 0x3000 },
+ { 0x9700, 0x20a9, 0x2000 },
+ { 0x1700, 0x20a8, 0x0000 },
+ { 0x1700, 0x20aa, 0x0000 },
+ { 0x9700, 0x20ad, 0x2000 },
+ { 0x1700, 0x20ac, 0x0000 },
+ { 0x1700, 0x20ae, 0x0000 },
+ { 0x8c00, 0x20d1, 0x3000 },
+ { 0x9700, 0x20b1, 0x2000 },
+ { 0x1700, 0x20b0, 0x0000 },
+ { 0x0c00, 0x20d0, 0x0000 },
+ { 0x8c00, 0x20d3, 0x2000 },
+ { 0x0c00, 0x20d2, 0x0000 },
+ { 0x0c00, 0x20d4, 0x0000 },
+ { 0x8b00, 0x20dd, 0x4000 },
+ { 0x8c00, 0x20d9, 0x3000 },
+ { 0x8c00, 0x20d7, 0x2000 },
+ { 0x0c00, 0x20d6, 0x0000 },
+ { 0x0c00, 0x20d8, 0x0000 },
+ { 0x8c00, 0x20db, 0x2000 },
+ { 0x0c00, 0x20da, 0x0000 },
+ { 0x0c00, 0x20dc, 0x0000 },
+ { 0x8c00, 0x20e1, 0x3000 },
+ { 0x8b00, 0x20df, 0x2000 },
+ { 0x0b00, 0x20de, 0x0000 },
+ { 0x0b00, 0x20e0, 0x0000 },
+ { 0x8b00, 0x20e3, 0x2000 },
+ { 0x0b00, 0x20e2, 0x0000 },
+ { 0x0b00, 0x20e4, 0x0000 },
+ { 0x8500, 0x210a, 0x5000 },
+ { 0x8900, 0x2102, 0x4000 },
+ { 0x8c00, 0x20e9, 0x3000 },
+ { 0x8c00, 0x20e7, 0x2000 },
+ { 0x0c00, 0x20e6, 0x0000 },
+ { 0x0c00, 0x20e8, 0x0000 },
+ { 0x9a00, 0x2100, 0x2000 },
+ { 0x0c00, 0x20ea, 0x0000 },
+ { 0x1a00, 0x2101, 0x0000 },
+ { 0x9a00, 0x2106, 0x3000 },
+ { 0x9a00, 0x2104, 0x2000 },
+ { 0x1a00, 0x2103, 0x0000 },
+ { 0x1a00, 0x2105, 0x0000 },
+ { 0x9a00, 0x2108, 0x2000 },
+ { 0x0900, 0x2107, 0x0000 },
+ { 0x1a00, 0x2109, 0x0000 },
+ { 0x8900, 0x2112, 0x4000 },
+ { 0x8500, 0x210e, 0x3000 },
+ { 0x8900, 0x210c, 0x2000 },
+ { 0x0900, 0x210b, 0x0000 },
+ { 0x0900, 0x210d, 0x0000 },
+ { 0x8900, 0x2110, 0x2000 },
+ { 0x0500, 0x210f, 0x0000 },
+ { 0x0900, 0x2111, 0x0000 },
+ { 0x9a00, 0x2116, 0x3000 },
+ { 0x9a00, 0x2114, 0x2000 },
+ { 0x0500, 0x2113, 0x0000 },
+ { 0x0900, 0x2115, 0x0000 },
+ { 0x9a00, 0x2118, 0x2000 },
+ { 0x1a00, 0x2117, 0x0000 },
+ { 0x0900, 0x2119, 0x0000 },
+ { 0x8e00, 0x2162, 0x7000 },
+ { 0x9a00, 0x213a, 0x6000 },
+ { 0x8900, 0x212a, 0x5000 },
+ { 0x9a00, 0x2122, 0x4000 },
+ { 0x9a00, 0x211e, 0x3000 },
+ { 0x8900, 0x211c, 0x2000 },
+ { 0x0900, 0x211b, 0x0000 },
+ { 0x0900, 0x211d, 0x0000 },
+ { 0x9a00, 0x2120, 0x2000 },
+ { 0x1a00, 0x211f, 0x0000 },
+ { 0x1a00, 0x2121, 0x0000 },
+ { 0x8900, 0x2126, 0x3000 },
+ { 0x8900, 0x2124, 0x2000 },
+ { 0x1a00, 0x2123, 0x0000 },
+ { 0x1a00, 0x2125, 0x0000 },
+ { 0x8900, 0x2128, 0x2000 },
+ { 0x1a00, 0x2127, 0x0000 },
+ { 0x1a00, 0x2129, 0x0000 },
+ { 0x9a00, 0x2132, 0x4000 },
+ { 0x9a00, 0x212e, 0x3000 },
+ { 0x8900, 0x212c, 0x2000 },
+ { 0x0900, 0x212b, 0x0000 },
+ { 0x0900, 0x212d, 0x0000 },
+ { 0x8900, 0x2130, 0x2000 },
+ { 0x0500, 0x212f, 0x0000 },
+ { 0x0900, 0x2131, 0x0000 },
+ { 0x8700, 0x2136, 0x3000 },
+ { 0x8500, 0x2134, 0x2000 },
+ { 0x0900, 0x2133, 0x0000 },
+ { 0x0700, 0x2135, 0x0000 },
+ { 0x8700, 0x2138, 0x2000 },
+ { 0x0700, 0x2137, 0x0000 },
+ { 0x0500, 0x2139, 0x0000 },
+ { 0x9900, 0x214b, 0x5000 },
+ { 0x9900, 0x2143, 0x4000 },
+ { 0x8900, 0x213f, 0x3000 },
+ { 0x8500, 0x213d, 0x2000 },
+ { 0x1a00, 0x213b, 0x0000 },
+ { 0x0900, 0x213e, 0x0000 },
+ { 0x9900, 0x2141, 0x2000 },
+ { 0x1900, 0x2140, 0x0000 },
+ { 0x1900, 0x2142, 0x0000 },
+ { 0x8500, 0x2147, 0x3000 },
+ { 0x8900, 0x2145, 0x2000 },
+ { 0x1900, 0x2144, 0x0000 },
+ { 0x0500, 0x2146, 0x0000 },
+ { 0x8500, 0x2149, 0x2000 },
+ { 0x0500, 0x2148, 0x0000 },
+ { 0x1a00, 0x214a, 0x0000 },
+ { 0x8f00, 0x215a, 0x4000 },
+ { 0x8f00, 0x2156, 0x3000 },
+ { 0x8f00, 0x2154, 0x2000 },
+ { 0x0f00, 0x2153, 0x0000 },
+ { 0x0f00, 0x2155, 0x0000 },
+ { 0x8f00, 0x2158, 0x2000 },
+ { 0x0f00, 0x2157, 0x0000 },
+ { 0x0f00, 0x2159, 0x0000 },
+ { 0x8f00, 0x215e, 0x3000 },
+ { 0x8f00, 0x215c, 0x2000 },
+ { 0x0f00, 0x215b, 0x0000 },
+ { 0x0f00, 0x215d, 0x0000 },
+ { 0x8e00, 0x2160, 0x2000 },
+ { 0x0f00, 0x215f, 0x0000 },
+ { 0x0e00, 0x2161, 0x0000 },
+ { 0x8e00, 0x2182, 0x6000 },
+ { 0x8e00, 0x2172, 0x5000 },
+ { 0x8e00, 0x216a, 0x4000 },
+ { 0x8e00, 0x2166, 0x3000 },
+ { 0x8e00, 0x2164, 0x2000 },
+ { 0x0e00, 0x2163, 0x0000 },
+ { 0x0e00, 0x2165, 0x0000 },
+ { 0x8e00, 0x2168, 0x2000 },
+ { 0x0e00, 0x2167, 0x0000 },
+ { 0x0e00, 0x2169, 0x0000 },
+ { 0x8e00, 0x216e, 0x3000 },
+ { 0x8e00, 0x216c, 0x2000 },
+ { 0x0e00, 0x216b, 0x0000 },
+ { 0x0e00, 0x216d, 0x0000 },
+ { 0x8e00, 0x2170, 0x2000 },
+ { 0x0e00, 0x216f, 0x0000 },
+ { 0x0e00, 0x2171, 0x0000 },
+ { 0x8e00, 0x217a, 0x4000 },
+ { 0x8e00, 0x2176, 0x3000 },
+ { 0x8e00, 0x2174, 0x2000 },
+ { 0x0e00, 0x2173, 0x0000 },
+ { 0x0e00, 0x2175, 0x0000 },
+ { 0x8e00, 0x2178, 0x2000 },
+ { 0x0e00, 0x2177, 0x0000 },
+ { 0x0e00, 0x2179, 0x0000 },
+ { 0x8e00, 0x217e, 0x3000 },
+ { 0x8e00, 0x217c, 0x2000 },
+ { 0x0e00, 0x217b, 0x0000 },
+ { 0x0e00, 0x217d, 0x0000 },
+ { 0x8e00, 0x2180, 0x2000 },
+ { 0x0e00, 0x217f, 0x0000 },
+ { 0x0e00, 0x2181, 0x0000 },
+ { 0x9a00, 0x219e, 0x5000 },
+ { 0x9a00, 0x2196, 0x4000 },
+ { 0x9900, 0x2192, 0x3000 },
+ { 0x9900, 0x2190, 0x2000 },
+ { 0x0e00, 0x2183, 0x0000 },
+ { 0x1900, 0x2191, 0x0000 },
+ { 0x9900, 0x2194, 0x2000 },
+ { 0x1900, 0x2193, 0x0000 },
+ { 0x1a00, 0x2195, 0x0000 },
+ { 0x9900, 0x219a, 0x3000 },
+ { 0x9a00, 0x2198, 0x2000 },
+ { 0x1a00, 0x2197, 0x0000 },
+ { 0x1a00, 0x2199, 0x0000 },
+ { 0x9a00, 0x219c, 0x2000 },
+ { 0x1900, 0x219b, 0x0000 },
+ { 0x1a00, 0x219d, 0x0000 },
+ { 0x9900, 0x21a6, 0x4000 },
+ { 0x9a00, 0x21a2, 0x3000 },
+ { 0x9900, 0x21a0, 0x2000 },
+ { 0x1a00, 0x219f, 0x0000 },
+ { 0x1a00, 0x21a1, 0x0000 },
+ { 0x9a00, 0x21a4, 0x2000 },
+ { 0x1900, 0x21a3, 0x0000 },
+ { 0x1a00, 0x21a5, 0x0000 },
+ { 0x9a00, 0x21aa, 0x3000 },
+ { 0x9a00, 0x21a8, 0x2000 },
+ { 0x1a00, 0x21a7, 0x0000 },
+ { 0x1a00, 0x21a9, 0x0000 },
+ { 0x9a00, 0x21ac, 0x2000 },
+ { 0x1a00, 0x21ab, 0x0000 },
+ { 0x1a00, 0x21ad, 0x0000 },
+ { 0x9900, 0x222e, 0x8000 },
+ { 0x9a00, 0x21ee, 0x7000 },
+ { 0x9900, 0x21ce, 0x6000 },
+ { 0x9a00, 0x21be, 0x5000 },
+ { 0x9a00, 0x21b6, 0x4000 },
+ { 0x9a00, 0x21b2, 0x3000 },
+ { 0x9a00, 0x21b0, 0x2000 },
+ { 0x1a00, 0x21af, 0x0000 },
+ { 0x1a00, 0x21b1, 0x0000 },
+ { 0x9a00, 0x21b4, 0x2000 },
+ { 0x1a00, 0x21b3, 0x0000 },
+ { 0x1a00, 0x21b5, 0x0000 },
+ { 0x9a00, 0x21ba, 0x3000 },
+ { 0x9a00, 0x21b8, 0x2000 },
+ { 0x1a00, 0x21b7, 0x0000 },
+ { 0x1a00, 0x21b9, 0x0000 },
+ { 0x9a00, 0x21bc, 0x2000 },
+ { 0x1a00, 0x21bb, 0x0000 },
+ { 0x1a00, 0x21bd, 0x0000 },
+ { 0x9a00, 0x21c6, 0x4000 },
+ { 0x9a00, 0x21c2, 0x3000 },
+ { 0x9a00, 0x21c0, 0x2000 },
+ { 0x1a00, 0x21bf, 0x0000 },
+ { 0x1a00, 0x21c1, 0x0000 },
+ { 0x9a00, 0x21c4, 0x2000 },
+ { 0x1a00, 0x21c3, 0x0000 },
+ { 0x1a00, 0x21c5, 0x0000 },
+ { 0x9a00, 0x21ca, 0x3000 },
+ { 0x9a00, 0x21c8, 0x2000 },
+ { 0x1a00, 0x21c7, 0x0000 },
+ { 0x1a00, 0x21c9, 0x0000 },
+ { 0x9a00, 0x21cc, 0x2000 },
+ { 0x1a00, 0x21cb, 0x0000 },
+ { 0x1a00, 0x21cd, 0x0000 },
+ { 0x9a00, 0x21de, 0x5000 },
+ { 0x9a00, 0x21d6, 0x4000 },
+ { 0x9900, 0x21d2, 0x3000 },
+ { 0x9a00, 0x21d0, 0x2000 },
+ { 0x1900, 0x21cf, 0x0000 },
+ { 0x1a00, 0x21d1, 0x0000 },
+ { 0x9900, 0x21d4, 0x2000 },
+ { 0x1a00, 0x21d3, 0x0000 },
+ { 0x1a00, 0x21d5, 0x0000 },
+ { 0x9a00, 0x21da, 0x3000 },
+ { 0x9a00, 0x21d8, 0x2000 },
+ { 0x1a00, 0x21d7, 0x0000 },
+ { 0x1a00, 0x21d9, 0x0000 },
+ { 0x9a00, 0x21dc, 0x2000 },
+ { 0x1a00, 0x21db, 0x0000 },
+ { 0x1a00, 0x21dd, 0x0000 },
+ { 0x9a00, 0x21e6, 0x4000 },
+ { 0x9a00, 0x21e2, 0x3000 },
+ { 0x9a00, 0x21e0, 0x2000 },
+ { 0x1a00, 0x21df, 0x0000 },
+ { 0x1a00, 0x21e1, 0x0000 },
+ { 0x9a00, 0x21e4, 0x2000 },
+ { 0x1a00, 0x21e3, 0x0000 },
+ { 0x1a00, 0x21e5, 0x0000 },
+ { 0x9a00, 0x21ea, 0x3000 },
+ { 0x9a00, 0x21e8, 0x2000 },
+ { 0x1a00, 0x21e7, 0x0000 },
+ { 0x1a00, 0x21e9, 0x0000 },
+ { 0x9a00, 0x21ec, 0x2000 },
+ { 0x1a00, 0x21eb, 0x0000 },
+ { 0x1a00, 0x21ed, 0x0000 },
+ { 0x9900, 0x220e, 0x6000 },
+ { 0x9900, 0x21fe, 0x5000 },
+ { 0x9900, 0x21f6, 0x4000 },
+ { 0x9a00, 0x21f2, 0x3000 },
+ { 0x9a00, 0x21f0, 0x2000 },
+ { 0x1a00, 0x21ef, 0x0000 },
+ { 0x1a00, 0x21f1, 0x0000 },
+ { 0x9900, 0x21f4, 0x2000 },
+ { 0x1a00, 0x21f3, 0x0000 },
+ { 0x1900, 0x21f5, 0x0000 },
+ { 0x9900, 0x21fa, 0x3000 },
+ { 0x9900, 0x21f8, 0x2000 },
+ { 0x1900, 0x21f7, 0x0000 },
+ { 0x1900, 0x21f9, 0x0000 },
+ { 0x9900, 0x21fc, 0x2000 },
+ { 0x1900, 0x21fb, 0x0000 },
+ { 0x1900, 0x21fd, 0x0000 },
+ { 0x9900, 0x2206, 0x4000 },
+ { 0x9900, 0x2202, 0x3000 },
+ { 0x9900, 0x2200, 0x2000 },
+ { 0x1900, 0x21ff, 0x0000 },
+ { 0x1900, 0x2201, 0x0000 },
+ { 0x9900, 0x2204, 0x2000 },
+ { 0x1900, 0x2203, 0x0000 },
+ { 0x1900, 0x2205, 0x0000 },
+ { 0x9900, 0x220a, 0x3000 },
+ { 0x9900, 0x2208, 0x2000 },
+ { 0x1900, 0x2207, 0x0000 },
+ { 0x1900, 0x2209, 0x0000 },
+ { 0x9900, 0x220c, 0x2000 },
+ { 0x1900, 0x220b, 0x0000 },
+ { 0x1900, 0x220d, 0x0000 },
+ { 0x9900, 0x221e, 0x5000 },
+ { 0x9900, 0x2216, 0x4000 },
+ { 0x9900, 0x2212, 0x3000 },
+ { 0x9900, 0x2210, 0x2000 },
+ { 0x1900, 0x220f, 0x0000 },
+ { 0x1900, 0x2211, 0x0000 },
+ { 0x9900, 0x2214, 0x2000 },
+ { 0x1900, 0x2213, 0x0000 },
+ { 0x1900, 0x2215, 0x0000 },
+ { 0x9900, 0x221a, 0x3000 },
+ { 0x9900, 0x2218, 0x2000 },
+ { 0x1900, 0x2217, 0x0000 },
+ { 0x1900, 0x2219, 0x0000 },
+ { 0x9900, 0x221c, 0x2000 },
+ { 0x1900, 0x221b, 0x0000 },
+ { 0x1900, 0x221d, 0x0000 },
+ { 0x9900, 0x2226, 0x4000 },
+ { 0x9900, 0x2222, 0x3000 },
+ { 0x9900, 0x2220, 0x2000 },
+ { 0x1900, 0x221f, 0x0000 },
+ { 0x1900, 0x2221, 0x0000 },
+ { 0x9900, 0x2224, 0x2000 },
+ { 0x1900, 0x2223, 0x0000 },
+ { 0x1900, 0x2225, 0x0000 },
+ { 0x9900, 0x222a, 0x3000 },
+ { 0x9900, 0x2228, 0x2000 },
+ { 0x1900, 0x2227, 0x0000 },
+ { 0x1900, 0x2229, 0x0000 },
+ { 0x9900, 0x222c, 0x2000 },
+ { 0x1900, 0x222b, 0x0000 },
+ { 0x1900, 0x222d, 0x0000 },
+ { 0x9900, 0x226e, 0x7000 },
+ { 0x9900, 0x224e, 0x6000 },
+ { 0x9900, 0x223e, 0x5000 },
+ { 0x9900, 0x2236, 0x4000 },
+ { 0x9900, 0x2232, 0x3000 },
+ { 0x9900, 0x2230, 0x2000 },
+ { 0x1900, 0x222f, 0x0000 },
+ { 0x1900, 0x2231, 0x0000 },
+ { 0x9900, 0x2234, 0x2000 },
+ { 0x1900, 0x2233, 0x0000 },
+ { 0x1900, 0x2235, 0x0000 },
+ { 0x9900, 0x223a, 0x3000 },
+ { 0x9900, 0x2238, 0x2000 },
+ { 0x1900, 0x2237, 0x0000 },
+ { 0x1900, 0x2239, 0x0000 },
+ { 0x9900, 0x223c, 0x2000 },
+ { 0x1900, 0x223b, 0x0000 },
+ { 0x1900, 0x223d, 0x0000 },
+ { 0x9900, 0x2246, 0x4000 },
+ { 0x9900, 0x2242, 0x3000 },
+ { 0x9900, 0x2240, 0x2000 },
+ { 0x1900, 0x223f, 0x0000 },
+ { 0x1900, 0x2241, 0x0000 },
+ { 0x9900, 0x2244, 0x2000 },
+ { 0x1900, 0x2243, 0x0000 },
+ { 0x1900, 0x2245, 0x0000 },
+ { 0x9900, 0x224a, 0x3000 },
+ { 0x9900, 0x2248, 0x2000 },
+ { 0x1900, 0x2247, 0x0000 },
+ { 0x1900, 0x2249, 0x0000 },
+ { 0x9900, 0x224c, 0x2000 },
+ { 0x1900, 0x224b, 0x0000 },
+ { 0x1900, 0x224d, 0x0000 },
+ { 0x9900, 0x225e, 0x5000 },
+ { 0x9900, 0x2256, 0x4000 },
+ { 0x9900, 0x2252, 0x3000 },
+ { 0x9900, 0x2250, 0x2000 },
+ { 0x1900, 0x224f, 0x0000 },
+ { 0x1900, 0x2251, 0x0000 },
+ { 0x9900, 0x2254, 0x2000 },
+ { 0x1900, 0x2253, 0x0000 },
+ { 0x1900, 0x2255, 0x0000 },
+ { 0x9900, 0x225a, 0x3000 },
+ { 0x9900, 0x2258, 0x2000 },
+ { 0x1900, 0x2257, 0x0000 },
+ { 0x1900, 0x2259, 0x0000 },
+ { 0x9900, 0x225c, 0x2000 },
+ { 0x1900, 0x225b, 0x0000 },
+ { 0x1900, 0x225d, 0x0000 },
+ { 0x9900, 0x2266, 0x4000 },
+ { 0x9900, 0x2262, 0x3000 },
+ { 0x9900, 0x2260, 0x2000 },
+ { 0x1900, 0x225f, 0x0000 },
+ { 0x1900, 0x2261, 0x0000 },
+ { 0x9900, 0x2264, 0x2000 },
+ { 0x1900, 0x2263, 0x0000 },
+ { 0x1900, 0x2265, 0x0000 },
+ { 0x9900, 0x226a, 0x3000 },
+ { 0x9900, 0x2268, 0x2000 },
+ { 0x1900, 0x2267, 0x0000 },
+ { 0x1900, 0x2269, 0x0000 },
+ { 0x9900, 0x226c, 0x2000 },
+ { 0x1900, 0x226b, 0x0000 },
+ { 0x1900, 0x226d, 0x0000 },
+ { 0x9900, 0x228e, 0x6000 },
+ { 0x9900, 0x227e, 0x5000 },
+ { 0x9900, 0x2276, 0x4000 },
+ { 0x9900, 0x2272, 0x3000 },
+ { 0x9900, 0x2270, 0x2000 },
+ { 0x1900, 0x226f, 0x0000 },
+ { 0x1900, 0x2271, 0x0000 },
+ { 0x9900, 0x2274, 0x2000 },
+ { 0x1900, 0x2273, 0x0000 },
+ { 0x1900, 0x2275, 0x0000 },
+ { 0x9900, 0x227a, 0x3000 },
+ { 0x9900, 0x2278, 0x2000 },
+ { 0x1900, 0x2277, 0x0000 },
+ { 0x1900, 0x2279, 0x0000 },
+ { 0x9900, 0x227c, 0x2000 },
+ { 0x1900, 0x227b, 0x0000 },
+ { 0x1900, 0x227d, 0x0000 },
+ { 0x9900, 0x2286, 0x4000 },
+ { 0x9900, 0x2282, 0x3000 },
+ { 0x9900, 0x2280, 0x2000 },
+ { 0x1900, 0x227f, 0x0000 },
+ { 0x1900, 0x2281, 0x0000 },
+ { 0x9900, 0x2284, 0x2000 },
+ { 0x1900, 0x2283, 0x0000 },
+ { 0x1900, 0x2285, 0x0000 },
+ { 0x9900, 0x228a, 0x3000 },
+ { 0x9900, 0x2288, 0x2000 },
+ { 0x1900, 0x2287, 0x0000 },
+ { 0x1900, 0x2289, 0x0000 },
+ { 0x9900, 0x228c, 0x2000 },
+ { 0x1900, 0x228b, 0x0000 },
+ { 0x1900, 0x228d, 0x0000 },
+ { 0x9900, 0x229e, 0x5000 },
+ { 0x9900, 0x2296, 0x4000 },
+ { 0x9900, 0x2292, 0x3000 },
+ { 0x9900, 0x2290, 0x2000 },
+ { 0x1900, 0x228f, 0x0000 },
+ { 0x1900, 0x2291, 0x0000 },
+ { 0x9900, 0x2294, 0x2000 },
+ { 0x1900, 0x2293, 0x0000 },
+ { 0x1900, 0x2295, 0x0000 },
+ { 0x9900, 0x229a, 0x3000 },
+ { 0x9900, 0x2298, 0x2000 },
+ { 0x1900, 0x2297, 0x0000 },
+ { 0x1900, 0x2299, 0x0000 },
+ { 0x9900, 0x229c, 0x2000 },
+ { 0x1900, 0x229b, 0x0000 },
+ { 0x1900, 0x229d, 0x0000 },
+ { 0x9900, 0x22a6, 0x4000 },
+ { 0x9900, 0x22a2, 0x3000 },
+ { 0x9900, 0x22a0, 0x2000 },
+ { 0x1900, 0x229f, 0x0000 },
+ { 0x1900, 0x22a1, 0x0000 },
+ { 0x9900, 0x22a4, 0x2000 },
+ { 0x1900, 0x22a3, 0x0000 },
+ { 0x1900, 0x22a5, 0x0000 },
+ { 0x9900, 0x22aa, 0x3000 },
+ { 0x9900, 0x22a8, 0x2000 },
+ { 0x1900, 0x22a7, 0x0000 },
+ { 0x1900, 0x22a9, 0x0000 },
+ { 0x9900, 0x22ac, 0x2000 },
+ { 0x1900, 0x22ab, 0x0000 },
+ { 0x1900, 0x22ad, 0x0000 },
+ { 0x8f00, 0x2787, 0xb000 },
+ { 0x9a00, 0x250b, 0xa000 },
+ { 0x9900, 0x23ae, 0x9000 },
+ { 0x9a00, 0x232e, 0x8000 },
+ { 0x9900, 0x22ee, 0x7000 },
+ { 0x9900, 0x22ce, 0x6000 },
+ { 0x9900, 0x22be, 0x5000 },
+ { 0x9900, 0x22b6, 0x4000 },
+ { 0x9900, 0x22b2, 0x3000 },
+ { 0x9900, 0x22b0, 0x2000 },
+ { 0x1900, 0x22af, 0x0000 },
+ { 0x1900, 0x22b1, 0x0000 },
+ { 0x9900, 0x22b4, 0x2000 },
+ { 0x1900, 0x22b3, 0x0000 },
+ { 0x1900, 0x22b5, 0x0000 },
+ { 0x9900, 0x22ba, 0x3000 },
+ { 0x9900, 0x22b8, 0x2000 },
+ { 0x1900, 0x22b7, 0x0000 },
+ { 0x1900, 0x22b9, 0x0000 },
+ { 0x9900, 0x22bc, 0x2000 },
+ { 0x1900, 0x22bb, 0x0000 },
+ { 0x1900, 0x22bd, 0x0000 },
+ { 0x9900, 0x22c6, 0x4000 },
+ { 0x9900, 0x22c2, 0x3000 },
+ { 0x9900, 0x22c0, 0x2000 },
+ { 0x1900, 0x22bf, 0x0000 },
+ { 0x1900, 0x22c1, 0x0000 },
+ { 0x9900, 0x22c4, 0x2000 },
+ { 0x1900, 0x22c3, 0x0000 },
+ { 0x1900, 0x22c5, 0x0000 },
+ { 0x9900, 0x22ca, 0x3000 },
+ { 0x9900, 0x22c8, 0x2000 },
+ { 0x1900, 0x22c7, 0x0000 },
+ { 0x1900, 0x22c9, 0x0000 },
+ { 0x9900, 0x22cc, 0x2000 },
+ { 0x1900, 0x22cb, 0x0000 },
+ { 0x1900, 0x22cd, 0x0000 },
+ { 0x9900, 0x22de, 0x5000 },
+ { 0x9900, 0x22d6, 0x4000 },
+ { 0x9900, 0x22d2, 0x3000 },
+ { 0x9900, 0x22d0, 0x2000 },
+ { 0x1900, 0x22cf, 0x0000 },
+ { 0x1900, 0x22d1, 0x0000 },
+ { 0x9900, 0x22d4, 0x2000 },
+ { 0x1900, 0x22d3, 0x0000 },
+ { 0x1900, 0x22d5, 0x0000 },
+ { 0x9900, 0x22da, 0x3000 },
+ { 0x9900, 0x22d8, 0x2000 },
+ { 0x1900, 0x22d7, 0x0000 },
+ { 0x1900, 0x22d9, 0x0000 },
+ { 0x9900, 0x22dc, 0x2000 },
+ { 0x1900, 0x22db, 0x0000 },
+ { 0x1900, 0x22dd, 0x0000 },
+ { 0x9900, 0x22e6, 0x4000 },
+ { 0x9900, 0x22e2, 0x3000 },
+ { 0x9900, 0x22e0, 0x2000 },
+ { 0x1900, 0x22df, 0x0000 },
+ { 0x1900, 0x22e1, 0x0000 },
+ { 0x9900, 0x22e4, 0x2000 },
+ { 0x1900, 0x22e3, 0x0000 },
+ { 0x1900, 0x22e5, 0x0000 },
+ { 0x9900, 0x22ea, 0x3000 },
+ { 0x9900, 0x22e8, 0x2000 },
+ { 0x1900, 0x22e7, 0x0000 },
+ { 0x1900, 0x22e9, 0x0000 },
+ { 0x9900, 0x22ec, 0x2000 },
+ { 0x1900, 0x22eb, 0x0000 },
+ { 0x1900, 0x22ed, 0x0000 },
+ { 0x9a00, 0x230e, 0x6000 },
+ { 0x9900, 0x22fe, 0x5000 },
+ { 0x9900, 0x22f6, 0x4000 },
+ { 0x9900, 0x22f2, 0x3000 },
+ { 0x9900, 0x22f0, 0x2000 },
+ { 0x1900, 0x22ef, 0x0000 },
+ { 0x1900, 0x22f1, 0x0000 },
+ { 0x9900, 0x22f4, 0x2000 },
+ { 0x1900, 0x22f3, 0x0000 },
+ { 0x1900, 0x22f5, 0x0000 },
+ { 0x9900, 0x22fa, 0x3000 },
+ { 0x9900, 0x22f8, 0x2000 },
+ { 0x1900, 0x22f7, 0x0000 },
+ { 0x1900, 0x22f9, 0x0000 },
+ { 0x9900, 0x22fc, 0x2000 },
+ { 0x1900, 0x22fb, 0x0000 },
+ { 0x1900, 0x22fd, 0x0000 },
+ { 0x9a00, 0x2306, 0x4000 },
+ { 0x9a00, 0x2302, 0x3000 },
+ { 0x9a00, 0x2300, 0x2000 },
+ { 0x1900, 0x22ff, 0x0000 },
+ { 0x1a00, 0x2301, 0x0000 },
+ { 0x9a00, 0x2304, 0x2000 },
+ { 0x1a00, 0x2303, 0x0000 },
+ { 0x1a00, 0x2305, 0x0000 },
+ { 0x9900, 0x230a, 0x3000 },
+ { 0x9900, 0x2308, 0x2000 },
+ { 0x1a00, 0x2307, 0x0000 },
+ { 0x1900, 0x2309, 0x0000 },
+ { 0x9a00, 0x230c, 0x2000 },
+ { 0x1900, 0x230b, 0x0000 },
+ { 0x1a00, 0x230d, 0x0000 },
+ { 0x9a00, 0x231e, 0x5000 },
+ { 0x9a00, 0x2316, 0x4000 },
+ { 0x9a00, 0x2312, 0x3000 },
+ { 0x9a00, 0x2310, 0x2000 },
+ { 0x1a00, 0x230f, 0x0000 },
+ { 0x1a00, 0x2311, 0x0000 },
+ { 0x9a00, 0x2314, 0x2000 },
+ { 0x1a00, 0x2313, 0x0000 },
+ { 0x1a00, 0x2315, 0x0000 },
+ { 0x9a00, 0x231a, 0x3000 },
+ { 0x9a00, 0x2318, 0x2000 },
+ { 0x1a00, 0x2317, 0x0000 },
+ { 0x1a00, 0x2319, 0x0000 },
+ { 0x9a00, 0x231c, 0x2000 },
+ { 0x1a00, 0x231b, 0x0000 },
+ { 0x1a00, 0x231d, 0x0000 },
+ { 0x9a00, 0x2326, 0x4000 },
+ { 0x9a00, 0x2322, 0x3000 },
+ { 0x9900, 0x2320, 0x2000 },
+ { 0x1a00, 0x231f, 0x0000 },
+ { 0x1900, 0x2321, 0x0000 },
+ { 0x9a00, 0x2324, 0x2000 },
+ { 0x1a00, 0x2323, 0x0000 },
+ { 0x1a00, 0x2325, 0x0000 },
+ { 0x9200, 0x232a, 0x3000 },
+ { 0x9a00, 0x2328, 0x2000 },
+ { 0x1a00, 0x2327, 0x0000 },
+ { 0x1600, 0x2329, 0x0000 },
+ { 0x9a00, 0x232c, 0x2000 },
+ { 0x1a00, 0x232b, 0x0000 },
+ { 0x1a00, 0x232d, 0x0000 },
+ { 0x9a00, 0x236e, 0x7000 },
+ { 0x9a00, 0x234e, 0x6000 },
+ { 0x9a00, 0x233e, 0x5000 },
+ { 0x9a00, 0x2336, 0x4000 },
+ { 0x9a00, 0x2332, 0x3000 },
+ { 0x9a00, 0x2330, 0x2000 },
+ { 0x1a00, 0x232f, 0x0000 },
+ { 0x1a00, 0x2331, 0x0000 },
+ { 0x9a00, 0x2334, 0x2000 },
+ { 0x1a00, 0x2333, 0x0000 },
+ { 0x1a00, 0x2335, 0x0000 },
+ { 0x9a00, 0x233a, 0x3000 },
+ { 0x9a00, 0x2338, 0x2000 },
+ { 0x1a00, 0x2337, 0x0000 },
+ { 0x1a00, 0x2339, 0x0000 },
+ { 0x9a00, 0x233c, 0x2000 },
+ { 0x1a00, 0x233b, 0x0000 },
+ { 0x1a00, 0x233d, 0x0000 },
+ { 0x9a00, 0x2346, 0x4000 },
+ { 0x9a00, 0x2342, 0x3000 },
+ { 0x9a00, 0x2340, 0x2000 },
+ { 0x1a00, 0x233f, 0x0000 },
+ { 0x1a00, 0x2341, 0x0000 },
+ { 0x9a00, 0x2344, 0x2000 },
+ { 0x1a00, 0x2343, 0x0000 },
+ { 0x1a00, 0x2345, 0x0000 },
+ { 0x9a00, 0x234a, 0x3000 },
+ { 0x9a00, 0x2348, 0x2000 },
+ { 0x1a00, 0x2347, 0x0000 },
+ { 0x1a00, 0x2349, 0x0000 },
+ { 0x9a00, 0x234c, 0x2000 },
+ { 0x1a00, 0x234b, 0x0000 },
+ { 0x1a00, 0x234d, 0x0000 },
+ { 0x9a00, 0x235e, 0x5000 },
+ { 0x9a00, 0x2356, 0x4000 },
+ { 0x9a00, 0x2352, 0x3000 },
+ { 0x9a00, 0x2350, 0x2000 },
+ { 0x1a00, 0x234f, 0x0000 },
+ { 0x1a00, 0x2351, 0x0000 },
+ { 0x9a00, 0x2354, 0x2000 },
+ { 0x1a00, 0x2353, 0x0000 },
+ { 0x1a00, 0x2355, 0x0000 },
+ { 0x9a00, 0x235a, 0x3000 },
+ { 0x9a00, 0x2358, 0x2000 },
+ { 0x1a00, 0x2357, 0x0000 },
+ { 0x1a00, 0x2359, 0x0000 },
+ { 0x9a00, 0x235c, 0x2000 },
+ { 0x1a00, 0x235b, 0x0000 },
+ { 0x1a00, 0x235d, 0x0000 },
+ { 0x9a00, 0x2366, 0x4000 },
+ { 0x9a00, 0x2362, 0x3000 },
+ { 0x9a00, 0x2360, 0x2000 },
+ { 0x1a00, 0x235f, 0x0000 },
+ { 0x1a00, 0x2361, 0x0000 },
+ { 0x9a00, 0x2364, 0x2000 },
+ { 0x1a00, 0x2363, 0x0000 },
+ { 0x1a00, 0x2365, 0x0000 },
+ { 0x9a00, 0x236a, 0x3000 },
+ { 0x9a00, 0x2368, 0x2000 },
+ { 0x1a00, 0x2367, 0x0000 },
+ { 0x1a00, 0x2369, 0x0000 },
+ { 0x9a00, 0x236c, 0x2000 },
+ { 0x1a00, 0x236b, 0x0000 },
+ { 0x1a00, 0x236d, 0x0000 },
+ { 0x9a00, 0x238e, 0x6000 },
+ { 0x9a00, 0x237e, 0x5000 },
+ { 0x9a00, 0x2376, 0x4000 },
+ { 0x9a00, 0x2372, 0x3000 },
+ { 0x9a00, 0x2370, 0x2000 },
+ { 0x1a00, 0x236f, 0x0000 },
+ { 0x1a00, 0x2371, 0x0000 },
+ { 0x9a00, 0x2374, 0x2000 },
+ { 0x1a00, 0x2373, 0x0000 },
+ { 0x1a00, 0x2375, 0x0000 },
+ { 0x9a00, 0x237a, 0x3000 },
+ { 0x9a00, 0x2378, 0x2000 },
+ { 0x1a00, 0x2377, 0x0000 },
+ { 0x1a00, 0x2379, 0x0000 },
+ { 0x9900, 0x237c, 0x2000 },
+ { 0x1a00, 0x237b, 0x0000 },
+ { 0x1a00, 0x237d, 0x0000 },
+ { 0x9a00, 0x2386, 0x4000 },
+ { 0x9a00, 0x2382, 0x3000 },
+ { 0x9a00, 0x2380, 0x2000 },
+ { 0x1a00, 0x237f, 0x0000 },
+ { 0x1a00, 0x2381, 0x0000 },
+ { 0x9a00, 0x2384, 0x2000 },
+ { 0x1a00, 0x2383, 0x0000 },
+ { 0x1a00, 0x2385, 0x0000 },
+ { 0x9a00, 0x238a, 0x3000 },
+ { 0x9a00, 0x2388, 0x2000 },
+ { 0x1a00, 0x2387, 0x0000 },
+ { 0x1a00, 0x2389, 0x0000 },
+ { 0x9a00, 0x238c, 0x2000 },
+ { 0x1a00, 0x238b, 0x0000 },
+ { 0x1a00, 0x238d, 0x0000 },
+ { 0x9900, 0x239e, 0x5000 },
+ { 0x9a00, 0x2396, 0x4000 },
+ { 0x9a00, 0x2392, 0x3000 },
+ { 0x9a00, 0x2390, 0x2000 },
+ { 0x1a00, 0x238f, 0x0000 },
+ { 0x1a00, 0x2391, 0x0000 },
+ { 0x9a00, 0x2394, 0x2000 },
+ { 0x1a00, 0x2393, 0x0000 },
+ { 0x1a00, 0x2395, 0x0000 },
+ { 0x9a00, 0x239a, 0x3000 },
+ { 0x9a00, 0x2398, 0x2000 },
+ { 0x1a00, 0x2397, 0x0000 },
+ { 0x1a00, 0x2399, 0x0000 },
+ { 0x9900, 0x239c, 0x2000 },
+ { 0x1900, 0x239b, 0x0000 },
+ { 0x1900, 0x239d, 0x0000 },
+ { 0x9900, 0x23a6, 0x4000 },
+ { 0x9900, 0x23a2, 0x3000 },
+ { 0x9900, 0x23a0, 0x2000 },
+ { 0x1900, 0x239f, 0x0000 },
+ { 0x1900, 0x23a1, 0x0000 },
+ { 0x9900, 0x23a4, 0x2000 },
+ { 0x1900, 0x23a3, 0x0000 },
+ { 0x1900, 0x23a5, 0x0000 },
+ { 0x9900, 0x23aa, 0x3000 },
+ { 0x9900, 0x23a8, 0x2000 },
+ { 0x1900, 0x23a7, 0x0000 },
+ { 0x1900, 0x23a9, 0x0000 },
+ { 0x9900, 0x23ac, 0x2000 },
+ { 0x1900, 0x23ab, 0x0000 },
+ { 0x1900, 0x23ad, 0x0000 },
+ { 0x8f00, 0x248b, 0x8000 },
+ { 0x9a00, 0x241d, 0x7000 },
+ { 0x9a00, 0x23ce, 0x6000 },
+ { 0x9a00, 0x23be, 0x5000 },
+ { 0x9500, 0x23b6, 0x4000 },
+ { 0x9900, 0x23b2, 0x3000 },
+ { 0x9900, 0x23b0, 0x2000 },
+ { 0x1900, 0x23af, 0x0000 },
+ { 0x1900, 0x23b1, 0x0000 },
+ { 0x9600, 0x23b4, 0x2000 },
+ { 0x1900, 0x23b3, 0x0000 },
+ { 0x1200, 0x23b5, 0x0000 },
+ { 0x9a00, 0x23ba, 0x3000 },
+ { 0x9a00, 0x23b8, 0x2000 },
+ { 0x1a00, 0x23b7, 0x0000 },
+ { 0x1a00, 0x23b9, 0x0000 },
+ { 0x9a00, 0x23bc, 0x2000 },
+ { 0x1a00, 0x23bb, 0x0000 },
+ { 0x1a00, 0x23bd, 0x0000 },
+ { 0x9a00, 0x23c6, 0x4000 },
+ { 0x9a00, 0x23c2, 0x3000 },
+ { 0x9a00, 0x23c0, 0x2000 },
+ { 0x1a00, 0x23bf, 0x0000 },
+ { 0x1a00, 0x23c1, 0x0000 },
+ { 0x9a00, 0x23c4, 0x2000 },
+ { 0x1a00, 0x23c3, 0x0000 },
+ { 0x1a00, 0x23c5, 0x0000 },
+ { 0x9a00, 0x23ca, 0x3000 },
+ { 0x9a00, 0x23c8, 0x2000 },
+ { 0x1a00, 0x23c7, 0x0000 },
+ { 0x1a00, 0x23c9, 0x0000 },
+ { 0x9a00, 0x23cc, 0x2000 },
+ { 0x1a00, 0x23cb, 0x0000 },
+ { 0x1a00, 0x23cd, 0x0000 },
+ { 0x9a00, 0x240d, 0x5000 },
+ { 0x9a00, 0x2405, 0x4000 },
+ { 0x9a00, 0x2401, 0x3000 },
+ { 0x9a00, 0x23d0, 0x2000 },
+ { 0x1a00, 0x23cf, 0x0000 },
+ { 0x1a00, 0x2400, 0x0000 },
+ { 0x9a00, 0x2403, 0x2000 },
+ { 0x1a00, 0x2402, 0x0000 },
+ { 0x1a00, 0x2404, 0x0000 },
+ { 0x9a00, 0x2409, 0x3000 },
+ { 0x9a00, 0x2407, 0x2000 },
+ { 0x1a00, 0x2406, 0x0000 },
+ { 0x1a00, 0x2408, 0x0000 },
+ { 0x9a00, 0x240b, 0x2000 },
+ { 0x1a00, 0x240a, 0x0000 },
+ { 0x1a00, 0x240c, 0x0000 },
+ { 0x9a00, 0x2415, 0x4000 },
+ { 0x9a00, 0x2411, 0x3000 },
+ { 0x9a00, 0x240f, 0x2000 },
+ { 0x1a00, 0x240e, 0x0000 },
+ { 0x1a00, 0x2410, 0x0000 },
+ { 0x9a00, 0x2413, 0x2000 },
+ { 0x1a00, 0x2412, 0x0000 },
+ { 0x1a00, 0x2414, 0x0000 },
+ { 0x9a00, 0x2419, 0x3000 },
+ { 0x9a00, 0x2417, 0x2000 },
+ { 0x1a00, 0x2416, 0x0000 },
+ { 0x1a00, 0x2418, 0x0000 },
+ { 0x9a00, 0x241b, 0x2000 },
+ { 0x1a00, 0x241a, 0x0000 },
+ { 0x1a00, 0x241c, 0x0000 },
+ { 0x8f00, 0x246b, 0x6000 },
+ { 0x9a00, 0x2446, 0x5000 },
+ { 0x9a00, 0x2425, 0x4000 },
+ { 0x9a00, 0x2421, 0x3000 },
+ { 0x9a00, 0x241f, 0x2000 },
+ { 0x1a00, 0x241e, 0x0000 },
+ { 0x1a00, 0x2420, 0x0000 },
+ { 0x9a00, 0x2423, 0x2000 },
+ { 0x1a00, 0x2422, 0x0000 },
+ { 0x1a00, 0x2424, 0x0000 },
+ { 0x9a00, 0x2442, 0x3000 },
+ { 0x9a00, 0x2440, 0x2000 },
+ { 0x1a00, 0x2426, 0x0000 },
+ { 0x1a00, 0x2441, 0x0000 },
+ { 0x9a00, 0x2444, 0x2000 },
+ { 0x1a00, 0x2443, 0x0000 },
+ { 0x1a00, 0x2445, 0x0000 },
+ { 0x8f00, 0x2463, 0x4000 },
+ { 0x9a00, 0x244a, 0x3000 },
+ { 0x9a00, 0x2448, 0x2000 },
+ { 0x1a00, 0x2447, 0x0000 },
+ { 0x1a00, 0x2449, 0x0000 },
+ { 0x8f00, 0x2461, 0x2000 },
+ { 0x0f00, 0x2460, 0x0000 },
+ { 0x0f00, 0x2462, 0x0000 },
+ { 0x8f00, 0x2467, 0x3000 },
+ { 0x8f00, 0x2465, 0x2000 },
+ { 0x0f00, 0x2464, 0x0000 },
+ { 0x0f00, 0x2466, 0x0000 },
+ { 0x8f00, 0x2469, 0x2000 },
+ { 0x0f00, 0x2468, 0x0000 },
+ { 0x0f00, 0x246a, 0x0000 },
+ { 0x8f00, 0x247b, 0x5000 },
+ { 0x8f00, 0x2473, 0x4000 },
+ { 0x8f00, 0x246f, 0x3000 },
+ { 0x8f00, 0x246d, 0x2000 },
+ { 0x0f00, 0x246c, 0x0000 },
+ { 0x0f00, 0x246e, 0x0000 },
+ { 0x8f00, 0x2471, 0x2000 },
+ { 0x0f00, 0x2470, 0x0000 },
+ { 0x0f00, 0x2472, 0x0000 },
+ { 0x8f00, 0x2477, 0x3000 },
+ { 0x8f00, 0x2475, 0x2000 },
+ { 0x0f00, 0x2474, 0x0000 },
+ { 0x0f00, 0x2476, 0x0000 },
+ { 0x8f00, 0x2479, 0x2000 },
+ { 0x0f00, 0x2478, 0x0000 },
+ { 0x0f00, 0x247a, 0x0000 },
+ { 0x8f00, 0x2483, 0x4000 },
+ { 0x8f00, 0x247f, 0x3000 },
+ { 0x8f00, 0x247d, 0x2000 },
+ { 0x0f00, 0x247c, 0x0000 },
+ { 0x0f00, 0x247e, 0x0000 },
+ { 0x8f00, 0x2481, 0x2000 },
+ { 0x0f00, 0x2480, 0x0000 },
+ { 0x0f00, 0x2482, 0x0000 },
+ { 0x8f00, 0x2487, 0x3000 },
+ { 0x8f00, 0x2485, 0x2000 },
+ { 0x0f00, 0x2484, 0x0000 },
+ { 0x0f00, 0x2486, 0x0000 },
+ { 0x8f00, 0x2489, 0x2000 },
+ { 0x0f00, 0x2488, 0x0000 },
+ { 0x0f00, 0x248a, 0x0000 },
+ { 0x9a00, 0x24cb, 0x7000 },
+ { 0x9a00, 0x24ab, 0x6000 },
+ { 0x8f00, 0x249b, 0x5000 },
+ { 0x8f00, 0x2493, 0x4000 },
+ { 0x8f00, 0x248f, 0x3000 },
+ { 0x8f00, 0x248d, 0x2000 },
+ { 0x0f00, 0x248c, 0x0000 },
+ { 0x0f00, 0x248e, 0x0000 },
+ { 0x8f00, 0x2491, 0x2000 },
+ { 0x0f00, 0x2490, 0x0000 },
+ { 0x0f00, 0x2492, 0x0000 },
+ { 0x8f00, 0x2497, 0x3000 },
+ { 0x8f00, 0x2495, 0x2000 },
+ { 0x0f00, 0x2494, 0x0000 },
+ { 0x0f00, 0x2496, 0x0000 },
+ { 0x8f00, 0x2499, 0x2000 },
+ { 0x0f00, 0x2498, 0x0000 },
+ { 0x0f00, 0x249a, 0x0000 },
+ { 0x9a00, 0x24a3, 0x4000 },
+ { 0x9a00, 0x249f, 0x3000 },
+ { 0x9a00, 0x249d, 0x2000 },
+ { 0x1a00, 0x249c, 0x0000 },
+ { 0x1a00, 0x249e, 0x0000 },
+ { 0x9a00, 0x24a1, 0x2000 },
+ { 0x1a00, 0x24a0, 0x0000 },
+ { 0x1a00, 0x24a2, 0x0000 },
+ { 0x9a00, 0x24a7, 0x3000 },
+ { 0x9a00, 0x24a5, 0x2000 },
+ { 0x1a00, 0x24a4, 0x0000 },
+ { 0x1a00, 0x24a6, 0x0000 },
+ { 0x9a00, 0x24a9, 0x2000 },
+ { 0x1a00, 0x24a8, 0x0000 },
+ { 0x1a00, 0x24aa, 0x0000 },
+ { 0x9a00, 0x24bb, 0x5000 },
+ { 0x9a00, 0x24b3, 0x4000 },
+ { 0x9a00, 0x24af, 0x3000 },
+ { 0x9a00, 0x24ad, 0x2000 },
+ { 0x1a00, 0x24ac, 0x0000 },
+ { 0x1a00, 0x24ae, 0x0000 },
+ { 0x9a00, 0x24b1, 0x2000 },
+ { 0x1a00, 0x24b0, 0x0000 },
+ { 0x1a00, 0x24b2, 0x0000 },
+ { 0x9a00, 0x24b7, 0x3000 },
+ { 0x9a00, 0x24b5, 0x2000 },
+ { 0x1a00, 0x24b4, 0x0000 },
+ { 0x1a00, 0x24b6, 0x0000 },
+ { 0x9a00, 0x24b9, 0x2000 },
+ { 0x1a00, 0x24b8, 0x0000 },
+ { 0x1a00, 0x24ba, 0x0000 },
+ { 0x9a00, 0x24c3, 0x4000 },
+ { 0x9a00, 0x24bf, 0x3000 },
+ { 0x9a00, 0x24bd, 0x2000 },
+ { 0x1a00, 0x24bc, 0x0000 },
+ { 0x1a00, 0x24be, 0x0000 },
+ { 0x9a00, 0x24c1, 0x2000 },
+ { 0x1a00, 0x24c0, 0x0000 },
+ { 0x1a00, 0x24c2, 0x0000 },
+ { 0x9a00, 0x24c7, 0x3000 },
+ { 0x9a00, 0x24c5, 0x2000 },
+ { 0x1a00, 0x24c4, 0x0000 },
+ { 0x1a00, 0x24c6, 0x0000 },
+ { 0x9a00, 0x24c9, 0x2000 },
+ { 0x1a00, 0x24c8, 0x0000 },
+ { 0x1a00, 0x24ca, 0x0000 },
+ { 0x8f00, 0x24eb, 0x6000 },
+ { 0x9a00, 0x24db, 0x5000 },
+ { 0x9a00, 0x24d3, 0x4000 },
+ { 0x9a00, 0x24cf, 0x3000 },
+ { 0x9a00, 0x24cd, 0x2000 },
+ { 0x1a00, 0x24cc, 0x0000 },
+ { 0x1a00, 0x24ce, 0x0000 },
+ { 0x9a00, 0x24d1, 0x2000 },
+ { 0x1a00, 0x24d0, 0x0000 },
+ { 0x1a00, 0x24d2, 0x0000 },
+ { 0x9a00, 0x24d7, 0x3000 },
+ { 0x9a00, 0x24d5, 0x2000 },
+ { 0x1a00, 0x24d4, 0x0000 },
+ { 0x1a00, 0x24d6, 0x0000 },
+ { 0x9a00, 0x24d9, 0x2000 },
+ { 0x1a00, 0x24d8, 0x0000 },
+ { 0x1a00, 0x24da, 0x0000 },
+ { 0x9a00, 0x24e3, 0x4000 },
+ { 0x9a00, 0x24df, 0x3000 },
+ { 0x9a00, 0x24dd, 0x2000 },
+ { 0x1a00, 0x24dc, 0x0000 },
+ { 0x1a00, 0x24de, 0x0000 },
+ { 0x9a00, 0x24e1, 0x2000 },
+ { 0x1a00, 0x24e0, 0x0000 },
+ { 0x1a00, 0x24e2, 0x0000 },
+ { 0x9a00, 0x24e7, 0x3000 },
+ { 0x9a00, 0x24e5, 0x2000 },
+ { 0x1a00, 0x24e4, 0x0000 },
+ { 0x1a00, 0x24e6, 0x0000 },
+ { 0x9a00, 0x24e9, 0x2000 },
+ { 0x1a00, 0x24e8, 0x0000 },
+ { 0x0f00, 0x24ea, 0x0000 },
+ { 0x8f00, 0x24fb, 0x5000 },
+ { 0x8f00, 0x24f3, 0x4000 },
+ { 0x8f00, 0x24ef, 0x3000 },
+ { 0x8f00, 0x24ed, 0x2000 },
+ { 0x0f00, 0x24ec, 0x0000 },
+ { 0x0f00, 0x24ee, 0x0000 },
+ { 0x8f00, 0x24f1, 0x2000 },
+ { 0x0f00, 0x24f0, 0x0000 },
+ { 0x0f00, 0x24f2, 0x0000 },
+ { 0x8f00, 0x24f7, 0x3000 },
+ { 0x8f00, 0x24f5, 0x2000 },
+ { 0x0f00, 0x24f4, 0x0000 },
+ { 0x0f00, 0x24f6, 0x0000 },
+ { 0x8f00, 0x24f9, 0x2000 },
+ { 0x0f00, 0x24f8, 0x0000 },
+ { 0x0f00, 0x24fa, 0x0000 },
+ { 0x9a00, 0x2503, 0x4000 },
+ { 0x8f00, 0x24ff, 0x3000 },
+ { 0x8f00, 0x24fd, 0x2000 },
+ { 0x0f00, 0x24fc, 0x0000 },
+ { 0x0f00, 0x24fe, 0x0000 },
+ { 0x9a00, 0x2501, 0x2000 },
+ { 0x1a00, 0x2500, 0x0000 },
+ { 0x1a00, 0x2502, 0x0000 },
+ { 0x9a00, 0x2507, 0x3000 },
+ { 0x9a00, 0x2505, 0x2000 },
+ { 0x1a00, 0x2504, 0x0000 },
+ { 0x1a00, 0x2506, 0x0000 },
+ { 0x9a00, 0x2509, 0x2000 },
+ { 0x1a00, 0x2508, 0x0000 },
+ { 0x1a00, 0x250a, 0x0000 },
+ { 0x9a00, 0x260b, 0x9000 },
+ { 0x9a00, 0x258b, 0x8000 },
+ { 0x9a00, 0x254b, 0x7000 },
+ { 0x9a00, 0x252b, 0x6000 },
+ { 0x9a00, 0x251b, 0x5000 },
+ { 0x9a00, 0x2513, 0x4000 },
+ { 0x9a00, 0x250f, 0x3000 },
+ { 0x9a00, 0x250d, 0x2000 },
+ { 0x1a00, 0x250c, 0x0000 },
+ { 0x1a00, 0x250e, 0x0000 },
+ { 0x9a00, 0x2511, 0x2000 },
+ { 0x1a00, 0x2510, 0x0000 },
+ { 0x1a00, 0x2512, 0x0000 },
+ { 0x9a00, 0x2517, 0x3000 },
+ { 0x9a00, 0x2515, 0x2000 },
+ { 0x1a00, 0x2514, 0x0000 },
+ { 0x1a00, 0x2516, 0x0000 },
+ { 0x9a00, 0x2519, 0x2000 },
+ { 0x1a00, 0x2518, 0x0000 },
+ { 0x1a00, 0x251a, 0x0000 },
+ { 0x9a00, 0x2523, 0x4000 },
+ { 0x9a00, 0x251f, 0x3000 },
+ { 0x9a00, 0x251d, 0x2000 },
+ { 0x1a00, 0x251c, 0x0000 },
+ { 0x1a00, 0x251e, 0x0000 },
+ { 0x9a00, 0x2521, 0x2000 },
+ { 0x1a00, 0x2520, 0x0000 },
+ { 0x1a00, 0x2522, 0x0000 },
+ { 0x9a00, 0x2527, 0x3000 },
+ { 0x9a00, 0x2525, 0x2000 },
+ { 0x1a00, 0x2524, 0x0000 },
+ { 0x1a00, 0x2526, 0x0000 },
+ { 0x9a00, 0x2529, 0x2000 },
+ { 0x1a00, 0x2528, 0x0000 },
+ { 0x1a00, 0x252a, 0x0000 },
+ { 0x9a00, 0x253b, 0x5000 },
+ { 0x9a00, 0x2533, 0x4000 },
+ { 0x9a00, 0x252f, 0x3000 },
+ { 0x9a00, 0x252d, 0x2000 },
+ { 0x1a00, 0x252c, 0x0000 },
+ { 0x1a00, 0x252e, 0x0000 },
+ { 0x9a00, 0x2531, 0x2000 },
+ { 0x1a00, 0x2530, 0x0000 },
+ { 0x1a00, 0x2532, 0x0000 },
+ { 0x9a00, 0x2537, 0x3000 },
+ { 0x9a00, 0x2535, 0x2000 },
+ { 0x1a00, 0x2534, 0x0000 },
+ { 0x1a00, 0x2536, 0x0000 },
+ { 0x9a00, 0x2539, 0x2000 },
+ { 0x1a00, 0x2538, 0x0000 },
+ { 0x1a00, 0x253a, 0x0000 },
+ { 0x9a00, 0x2543, 0x4000 },
+ { 0x9a00, 0x253f, 0x3000 },
+ { 0x9a00, 0x253d, 0x2000 },
+ { 0x1a00, 0x253c, 0x0000 },
+ { 0x1a00, 0x253e, 0x0000 },
+ { 0x9a00, 0x2541, 0x2000 },
+ { 0x1a00, 0x2540, 0x0000 },
+ { 0x1a00, 0x2542, 0x0000 },
+ { 0x9a00, 0x2547, 0x3000 },
+ { 0x9a00, 0x2545, 0x2000 },
+ { 0x1a00, 0x2544, 0x0000 },
+ { 0x1a00, 0x2546, 0x0000 },
+ { 0x9a00, 0x2549, 0x2000 },
+ { 0x1a00, 0x2548, 0x0000 },
+ { 0x1a00, 0x254a, 0x0000 },
+ { 0x9a00, 0x256b, 0x6000 },
+ { 0x9a00, 0x255b, 0x5000 },
+ { 0x9a00, 0x2553, 0x4000 },
+ { 0x9a00, 0x254f, 0x3000 },
+ { 0x9a00, 0x254d, 0x2000 },
+ { 0x1a00, 0x254c, 0x0000 },
+ { 0x1a00, 0x254e, 0x0000 },
+ { 0x9a00, 0x2551, 0x2000 },
+ { 0x1a00, 0x2550, 0x0000 },
+ { 0x1a00, 0x2552, 0x0000 },
+ { 0x9a00, 0x2557, 0x3000 },
+ { 0x9a00, 0x2555, 0x2000 },
+ { 0x1a00, 0x2554, 0x0000 },
+ { 0x1a00, 0x2556, 0x0000 },
+ { 0x9a00, 0x2559, 0x2000 },
+ { 0x1a00, 0x2558, 0x0000 },
+ { 0x1a00, 0x255a, 0x0000 },
+ { 0x9a00, 0x2563, 0x4000 },
+ { 0x9a00, 0x255f, 0x3000 },
+ { 0x9a00, 0x255d, 0x2000 },
+ { 0x1a00, 0x255c, 0x0000 },
+ { 0x1a00, 0x255e, 0x0000 },
+ { 0x9a00, 0x2561, 0x2000 },
+ { 0x1a00, 0x2560, 0x0000 },
+ { 0x1a00, 0x2562, 0x0000 },
+ { 0x9a00, 0x2567, 0x3000 },
+ { 0x9a00, 0x2565, 0x2000 },
+ { 0x1a00, 0x2564, 0x0000 },
+ { 0x1a00, 0x2566, 0x0000 },
+ { 0x9a00, 0x2569, 0x2000 },
+ { 0x1a00, 0x2568, 0x0000 },
+ { 0x1a00, 0x256a, 0x0000 },
+ { 0x9a00, 0x257b, 0x5000 },
+ { 0x9a00, 0x2573, 0x4000 },
+ { 0x9a00, 0x256f, 0x3000 },
+ { 0x9a00, 0x256d, 0x2000 },
+ { 0x1a00, 0x256c, 0x0000 },
+ { 0x1a00, 0x256e, 0x0000 },
+ { 0x9a00, 0x2571, 0x2000 },
+ { 0x1a00, 0x2570, 0x0000 },
+ { 0x1a00, 0x2572, 0x0000 },
+ { 0x9a00, 0x2577, 0x3000 },
+ { 0x9a00, 0x2575, 0x2000 },
+ { 0x1a00, 0x2574, 0x0000 },
+ { 0x1a00, 0x2576, 0x0000 },
+ { 0x9a00, 0x2579, 0x2000 },
+ { 0x1a00, 0x2578, 0x0000 },
+ { 0x1a00, 0x257a, 0x0000 },
+ { 0x9a00, 0x2583, 0x4000 },
+ { 0x9a00, 0x257f, 0x3000 },
+ { 0x9a00, 0x257d, 0x2000 },
+ { 0x1a00, 0x257c, 0x0000 },
+ { 0x1a00, 0x257e, 0x0000 },
+ { 0x9a00, 0x2581, 0x2000 },
+ { 0x1a00, 0x2580, 0x0000 },
+ { 0x1a00, 0x2582, 0x0000 },
+ { 0x9a00, 0x2587, 0x3000 },
+ { 0x9a00, 0x2585, 0x2000 },
+ { 0x1a00, 0x2584, 0x0000 },
+ { 0x1a00, 0x2586, 0x0000 },
+ { 0x9a00, 0x2589, 0x2000 },
+ { 0x1a00, 0x2588, 0x0000 },
+ { 0x1a00, 0x258a, 0x0000 },
+ { 0x9a00, 0x25cb, 0x7000 },
+ { 0x9a00, 0x25ab, 0x6000 },
+ { 0x9a00, 0x259b, 0x5000 },
+ { 0x9a00, 0x2593, 0x4000 },
+ { 0x9a00, 0x258f, 0x3000 },
+ { 0x9a00, 0x258d, 0x2000 },
+ { 0x1a00, 0x258c, 0x0000 },
+ { 0x1a00, 0x258e, 0x0000 },
+ { 0x9a00, 0x2591, 0x2000 },
+ { 0x1a00, 0x2590, 0x0000 },
+ { 0x1a00, 0x2592, 0x0000 },
+ { 0x9a00, 0x2597, 0x3000 },
+ { 0x9a00, 0x2595, 0x2000 },
+ { 0x1a00, 0x2594, 0x0000 },
+ { 0x1a00, 0x2596, 0x0000 },
+ { 0x9a00, 0x2599, 0x2000 },
+ { 0x1a00, 0x2598, 0x0000 },
+ { 0x1a00, 0x259a, 0x0000 },
+ { 0x9a00, 0x25a3, 0x4000 },
+ { 0x9a00, 0x259f, 0x3000 },
+ { 0x9a00, 0x259d, 0x2000 },
+ { 0x1a00, 0x259c, 0x0000 },
+ { 0x1a00, 0x259e, 0x0000 },
+ { 0x9a00, 0x25a1, 0x2000 },
+ { 0x1a00, 0x25a0, 0x0000 },
+ { 0x1a00, 0x25a2, 0x0000 },
+ { 0x9a00, 0x25a7, 0x3000 },
+ { 0x9a00, 0x25a5, 0x2000 },
+ { 0x1a00, 0x25a4, 0x0000 },
+ { 0x1a00, 0x25a6, 0x0000 },
+ { 0x9a00, 0x25a9, 0x2000 },
+ { 0x1a00, 0x25a8, 0x0000 },
+ { 0x1a00, 0x25aa, 0x0000 },
+ { 0x9a00, 0x25bb, 0x5000 },
+ { 0x9a00, 0x25b3, 0x4000 },
+ { 0x9a00, 0x25af, 0x3000 },
+ { 0x9a00, 0x25ad, 0x2000 },
+ { 0x1a00, 0x25ac, 0x0000 },
+ { 0x1a00, 0x25ae, 0x0000 },
+ { 0x9a00, 0x25b1, 0x2000 },
+ { 0x1a00, 0x25b0, 0x0000 },
+ { 0x1a00, 0x25b2, 0x0000 },
+ { 0x9900, 0x25b7, 0x3000 },
+ { 0x9a00, 0x25b5, 0x2000 },
+ { 0x1a00, 0x25b4, 0x0000 },
+ { 0x1a00, 0x25b6, 0x0000 },
+ { 0x9a00, 0x25b9, 0x2000 },
+ { 0x1a00, 0x25b8, 0x0000 },
+ { 0x1a00, 0x25ba, 0x0000 },
+ { 0x9a00, 0x25c3, 0x4000 },
+ { 0x9a00, 0x25bf, 0x3000 },
+ { 0x9a00, 0x25bd, 0x2000 },
+ { 0x1a00, 0x25bc, 0x0000 },
+ { 0x1a00, 0x25be, 0x0000 },
+ { 0x9900, 0x25c1, 0x2000 },
+ { 0x1a00, 0x25c0, 0x0000 },
+ { 0x1a00, 0x25c2, 0x0000 },
+ { 0x9a00, 0x25c7, 0x3000 },
+ { 0x9a00, 0x25c5, 0x2000 },
+ { 0x1a00, 0x25c4, 0x0000 },
+ { 0x1a00, 0x25c6, 0x0000 },
+ { 0x9a00, 0x25c9, 0x2000 },
+ { 0x1a00, 0x25c8, 0x0000 },
+ { 0x1a00, 0x25ca, 0x0000 },
+ { 0x9a00, 0x25eb, 0x6000 },
+ { 0x9a00, 0x25db, 0x5000 },
+ { 0x9a00, 0x25d3, 0x4000 },
+ { 0x9a00, 0x25cf, 0x3000 },
+ { 0x9a00, 0x25cd, 0x2000 },
+ { 0x1a00, 0x25cc, 0x0000 },
+ { 0x1a00, 0x25ce, 0x0000 },
+ { 0x9a00, 0x25d1, 0x2000 },
+ { 0x1a00, 0x25d0, 0x0000 },
+ { 0x1a00, 0x25d2, 0x0000 },
+ { 0x9a00, 0x25d7, 0x3000 },
+ { 0x9a00, 0x25d5, 0x2000 },
+ { 0x1a00, 0x25d4, 0x0000 },
+ { 0x1a00, 0x25d6, 0x0000 },
+ { 0x9a00, 0x25d9, 0x2000 },
+ { 0x1a00, 0x25d8, 0x0000 },
+ { 0x1a00, 0x25da, 0x0000 },
+ { 0x9a00, 0x25e3, 0x4000 },
+ { 0x9a00, 0x25df, 0x3000 },
+ { 0x9a00, 0x25dd, 0x2000 },
+ { 0x1a00, 0x25dc, 0x0000 },
+ { 0x1a00, 0x25de, 0x0000 },
+ { 0x9a00, 0x25e1, 0x2000 },
+ { 0x1a00, 0x25e0, 0x0000 },
+ { 0x1a00, 0x25e2, 0x0000 },
+ { 0x9a00, 0x25e7, 0x3000 },
+ { 0x9a00, 0x25e5, 0x2000 },
+ { 0x1a00, 0x25e4, 0x0000 },
+ { 0x1a00, 0x25e6, 0x0000 },
+ { 0x9a00, 0x25e9, 0x2000 },
+ { 0x1a00, 0x25e8, 0x0000 },
+ { 0x1a00, 0x25ea, 0x0000 },
+ { 0x9900, 0x25fb, 0x5000 },
+ { 0x9a00, 0x25f3, 0x4000 },
+ { 0x9a00, 0x25ef, 0x3000 },
+ { 0x9a00, 0x25ed, 0x2000 },
+ { 0x1a00, 0x25ec, 0x0000 },
+ { 0x1a00, 0x25ee, 0x0000 },
+ { 0x9a00, 0x25f1, 0x2000 },
+ { 0x1a00, 0x25f0, 0x0000 },
+ { 0x1a00, 0x25f2, 0x0000 },
+ { 0x9a00, 0x25f7, 0x3000 },
+ { 0x9a00, 0x25f5, 0x2000 },
+ { 0x1a00, 0x25f4, 0x0000 },
+ { 0x1a00, 0x25f6, 0x0000 },
+ { 0x9900, 0x25f9, 0x2000 },
+ { 0x1900, 0x25f8, 0x0000 },
+ { 0x1900, 0x25fa, 0x0000 },
+ { 0x9a00, 0x2603, 0x4000 },
+ { 0x9900, 0x25ff, 0x3000 },
+ { 0x9900, 0x25fd, 0x2000 },
+ { 0x1900, 0x25fc, 0x0000 },
+ { 0x1900, 0x25fe, 0x0000 },
+ { 0x9a00, 0x2601, 0x2000 },
+ { 0x1a00, 0x2600, 0x0000 },
+ { 0x1a00, 0x2602, 0x0000 },
+ { 0x9a00, 0x2607, 0x3000 },
+ { 0x9a00, 0x2605, 0x2000 },
+ { 0x1a00, 0x2604, 0x0000 },
+ { 0x1a00, 0x2606, 0x0000 },
+ { 0x9a00, 0x2609, 0x2000 },
+ { 0x1a00, 0x2608, 0x0000 },
+ { 0x1a00, 0x260a, 0x0000 },
+ { 0x9a00, 0x268e, 0x8000 },
+ { 0x9a00, 0x264c, 0x7000 },
+ { 0x9a00, 0x262c, 0x6000 },
+ { 0x9a00, 0x261c, 0x5000 },
+ { 0x9a00, 0x2613, 0x4000 },
+ { 0x9a00, 0x260f, 0x3000 },
+ { 0x9a00, 0x260d, 0x2000 },
+ { 0x1a00, 0x260c, 0x0000 },
+ { 0x1a00, 0x260e, 0x0000 },
+ { 0x9a00, 0x2611, 0x2000 },
+ { 0x1a00, 0x2610, 0x0000 },
+ { 0x1a00, 0x2612, 0x0000 },
+ { 0x9a00, 0x2617, 0x3000 },
+ { 0x9a00, 0x2615, 0x2000 },
+ { 0x1a00, 0x2614, 0x0000 },
+ { 0x1a00, 0x2616, 0x0000 },
+ { 0x9a00, 0x261a, 0x2000 },
+ { 0x1a00, 0x2619, 0x0000 },
+ { 0x1a00, 0x261b, 0x0000 },
+ { 0x9a00, 0x2624, 0x4000 },
+ { 0x9a00, 0x2620, 0x3000 },
+ { 0x9a00, 0x261e, 0x2000 },
+ { 0x1a00, 0x261d, 0x0000 },
+ { 0x1a00, 0x261f, 0x0000 },
+ { 0x9a00, 0x2622, 0x2000 },
+ { 0x1a00, 0x2621, 0x0000 },
+ { 0x1a00, 0x2623, 0x0000 },
+ { 0x9a00, 0x2628, 0x3000 },
+ { 0x9a00, 0x2626, 0x2000 },
+ { 0x1a00, 0x2625, 0x0000 },
+ { 0x1a00, 0x2627, 0x0000 },
+ { 0x9a00, 0x262a, 0x2000 },
+ { 0x1a00, 0x2629, 0x0000 },
+ { 0x1a00, 0x262b, 0x0000 },
+ { 0x9a00, 0x263c, 0x5000 },
+ { 0x9a00, 0x2634, 0x4000 },
+ { 0x9a00, 0x2630, 0x3000 },
+ { 0x9a00, 0x262e, 0x2000 },
+ { 0x1a00, 0x262d, 0x0000 },
+ { 0x1a00, 0x262f, 0x0000 },
+ { 0x9a00, 0x2632, 0x2000 },
+ { 0x1a00, 0x2631, 0x0000 },
+ { 0x1a00, 0x2633, 0x0000 },
+ { 0x9a00, 0x2638, 0x3000 },
+ { 0x9a00, 0x2636, 0x2000 },
+ { 0x1a00, 0x2635, 0x0000 },
+ { 0x1a00, 0x2637, 0x0000 },
+ { 0x9a00, 0x263a, 0x2000 },
+ { 0x1a00, 0x2639, 0x0000 },
+ { 0x1a00, 0x263b, 0x0000 },
+ { 0x9a00, 0x2644, 0x4000 },
+ { 0x9a00, 0x2640, 0x3000 },
+ { 0x9a00, 0x263e, 0x2000 },
+ { 0x1a00, 0x263d, 0x0000 },
+ { 0x1a00, 0x263f, 0x0000 },
+ { 0x9a00, 0x2642, 0x2000 },
+ { 0x1a00, 0x2641, 0x0000 },
+ { 0x1a00, 0x2643, 0x0000 },
+ { 0x9a00, 0x2648, 0x3000 },
+ { 0x9a00, 0x2646, 0x2000 },
+ { 0x1a00, 0x2645, 0x0000 },
+ { 0x1a00, 0x2647, 0x0000 },
+ { 0x9a00, 0x264a, 0x2000 },
+ { 0x1a00, 0x2649, 0x0000 },
+ { 0x1a00, 0x264b, 0x0000 },
+ { 0x9a00, 0x266c, 0x6000 },
+ { 0x9a00, 0x265c, 0x5000 },
+ { 0x9a00, 0x2654, 0x4000 },
+ { 0x9a00, 0x2650, 0x3000 },
+ { 0x9a00, 0x264e, 0x2000 },
+ { 0x1a00, 0x264d, 0x0000 },
+ { 0x1a00, 0x264f, 0x0000 },
+ { 0x9a00, 0x2652, 0x2000 },
+ { 0x1a00, 0x2651, 0x0000 },
+ { 0x1a00, 0x2653, 0x0000 },
+ { 0x9a00, 0x2658, 0x3000 },
+ { 0x9a00, 0x2656, 0x2000 },
+ { 0x1a00, 0x2655, 0x0000 },
+ { 0x1a00, 0x2657, 0x0000 },
+ { 0x9a00, 0x265a, 0x2000 },
+ { 0x1a00, 0x2659, 0x0000 },
+ { 0x1a00, 0x265b, 0x0000 },
+ { 0x9a00, 0x2664, 0x4000 },
+ { 0x9a00, 0x2660, 0x3000 },
+ { 0x9a00, 0x265e, 0x2000 },
+ { 0x1a00, 0x265d, 0x0000 },
+ { 0x1a00, 0x265f, 0x0000 },
+ { 0x9a00, 0x2662, 0x2000 },
+ { 0x1a00, 0x2661, 0x0000 },
+ { 0x1a00, 0x2663, 0x0000 },
+ { 0x9a00, 0x2668, 0x3000 },
+ { 0x9a00, 0x2666, 0x2000 },
+ { 0x1a00, 0x2665, 0x0000 },
+ { 0x1a00, 0x2667, 0x0000 },
+ { 0x9a00, 0x266a, 0x2000 },
+ { 0x1a00, 0x2669, 0x0000 },
+ { 0x1a00, 0x266b, 0x0000 },
+ { 0x9a00, 0x267c, 0x5000 },
+ { 0x9a00, 0x2674, 0x4000 },
+ { 0x9a00, 0x2670, 0x3000 },
+ { 0x9a00, 0x266e, 0x2000 },
+ { 0x1a00, 0x266d, 0x0000 },
+ { 0x1900, 0x266f, 0x0000 },
+ { 0x9a00, 0x2672, 0x2000 },
+ { 0x1a00, 0x2671, 0x0000 },
+ { 0x1a00, 0x2673, 0x0000 },
+ { 0x9a00, 0x2678, 0x3000 },
+ { 0x9a00, 0x2676, 0x2000 },
+ { 0x1a00, 0x2675, 0x0000 },
+ { 0x1a00, 0x2677, 0x0000 },
+ { 0x9a00, 0x267a, 0x2000 },
+ { 0x1a00, 0x2679, 0x0000 },
+ { 0x1a00, 0x267b, 0x0000 },
+ { 0x9a00, 0x2686, 0x4000 },
+ { 0x9a00, 0x2682, 0x3000 },
+ { 0x9a00, 0x2680, 0x2000 },
+ { 0x1a00, 0x267d, 0x0000 },
+ { 0x1a00, 0x2681, 0x0000 },
+ { 0x9a00, 0x2684, 0x2000 },
+ { 0x1a00, 0x2683, 0x0000 },
+ { 0x1a00, 0x2685, 0x0000 },
+ { 0x9a00, 0x268a, 0x3000 },
+ { 0x9a00, 0x2688, 0x2000 },
+ { 0x1a00, 0x2687, 0x0000 },
+ { 0x1a00, 0x2689, 0x0000 },
+ { 0x9a00, 0x268c, 0x2000 },
+ { 0x1a00, 0x268b, 0x0000 },
+ { 0x1a00, 0x268d, 0x0000 },
+ { 0x9a00, 0x273f, 0x7000 },
+ { 0x9a00, 0x271e, 0x6000 },
+ { 0x9a00, 0x270e, 0x5000 },
+ { 0x9a00, 0x2703, 0x4000 },
+ { 0x9a00, 0x26a0, 0x3000 },
+ { 0x9a00, 0x2690, 0x2000 },
+ { 0x1a00, 0x268f, 0x0000 },
+ { 0x1a00, 0x2691, 0x0000 },
+ { 0x9a00, 0x2701, 0x2000 },
+ { 0x1a00, 0x26a1, 0x0000 },
+ { 0x1a00, 0x2702, 0x0000 },
+ { 0x9a00, 0x2708, 0x3000 },
+ { 0x9a00, 0x2706, 0x2000 },
+ { 0x1a00, 0x2704, 0x0000 },
+ { 0x1a00, 0x2707, 0x0000 },
+ { 0x9a00, 0x270c, 0x2000 },
+ { 0x1a00, 0x2709, 0x0000 },
+ { 0x1a00, 0x270d, 0x0000 },
+ { 0x9a00, 0x2716, 0x4000 },
+ { 0x9a00, 0x2712, 0x3000 },
+ { 0x9a00, 0x2710, 0x2000 },
+ { 0x1a00, 0x270f, 0x0000 },
+ { 0x1a00, 0x2711, 0x0000 },
+ { 0x9a00, 0x2714, 0x2000 },
+ { 0x1a00, 0x2713, 0x0000 },
+ { 0x1a00, 0x2715, 0x0000 },
+ { 0x9a00, 0x271a, 0x3000 },
+ { 0x9a00, 0x2718, 0x2000 },
+ { 0x1a00, 0x2717, 0x0000 },
+ { 0x1a00, 0x2719, 0x0000 },
+ { 0x9a00, 0x271c, 0x2000 },
+ { 0x1a00, 0x271b, 0x0000 },
+ { 0x1a00, 0x271d, 0x0000 },
+ { 0x9a00, 0x272f, 0x5000 },
+ { 0x9a00, 0x2726, 0x4000 },
+ { 0x9a00, 0x2722, 0x3000 },
+ { 0x9a00, 0x2720, 0x2000 },
+ { 0x1a00, 0x271f, 0x0000 },
+ { 0x1a00, 0x2721, 0x0000 },
+ { 0x9a00, 0x2724, 0x2000 },
+ { 0x1a00, 0x2723, 0x0000 },
+ { 0x1a00, 0x2725, 0x0000 },
+ { 0x9a00, 0x272b, 0x3000 },
+ { 0x9a00, 0x2729, 0x2000 },
+ { 0x1a00, 0x2727, 0x0000 },
+ { 0x1a00, 0x272a, 0x0000 },
+ { 0x9a00, 0x272d, 0x2000 },
+ { 0x1a00, 0x272c, 0x0000 },
+ { 0x1a00, 0x272e, 0x0000 },
+ { 0x9a00, 0x2737, 0x4000 },
+ { 0x9a00, 0x2733, 0x3000 },
+ { 0x9a00, 0x2731, 0x2000 },
+ { 0x1a00, 0x2730, 0x0000 },
+ { 0x1a00, 0x2732, 0x0000 },
+ { 0x9a00, 0x2735, 0x2000 },
+ { 0x1a00, 0x2734, 0x0000 },
+ { 0x1a00, 0x2736, 0x0000 },
+ { 0x9a00, 0x273b, 0x3000 },
+ { 0x9a00, 0x2739, 0x2000 },
+ { 0x1a00, 0x2738, 0x0000 },
+ { 0x1a00, 0x273a, 0x0000 },
+ { 0x9a00, 0x273d, 0x2000 },
+ { 0x1a00, 0x273c, 0x0000 },
+ { 0x1a00, 0x273e, 0x0000 },
+ { 0x9a00, 0x2767, 0x6000 },
+ { 0x9a00, 0x2751, 0x5000 },
+ { 0x9a00, 0x2747, 0x4000 },
+ { 0x9a00, 0x2743, 0x3000 },
+ { 0x9a00, 0x2741, 0x2000 },
+ { 0x1a00, 0x2740, 0x0000 },
+ { 0x1a00, 0x2742, 0x0000 },
+ { 0x9a00, 0x2745, 0x2000 },
+ { 0x1a00, 0x2744, 0x0000 },
+ { 0x1a00, 0x2746, 0x0000 },
+ { 0x9a00, 0x274b, 0x3000 },
+ { 0x9a00, 0x2749, 0x2000 },
+ { 0x1a00, 0x2748, 0x0000 },
+ { 0x1a00, 0x274a, 0x0000 },
+ { 0x9a00, 0x274f, 0x2000 },
+ { 0x1a00, 0x274d, 0x0000 },
+ { 0x1a00, 0x2750, 0x0000 },
+ { 0x9a00, 0x275d, 0x4000 },
+ { 0x9a00, 0x2759, 0x3000 },
+ { 0x9a00, 0x2756, 0x2000 },
+ { 0x1a00, 0x2752, 0x0000 },
+ { 0x1a00, 0x2758, 0x0000 },
+ { 0x9a00, 0x275b, 0x2000 },
+ { 0x1a00, 0x275a, 0x0000 },
+ { 0x1a00, 0x275c, 0x0000 },
+ { 0x9a00, 0x2763, 0x3000 },
+ { 0x9a00, 0x2761, 0x2000 },
+ { 0x1a00, 0x275e, 0x0000 },
+ { 0x1a00, 0x2762, 0x0000 },
+ { 0x9a00, 0x2765, 0x2000 },
+ { 0x1a00, 0x2764, 0x0000 },
+ { 0x1a00, 0x2766, 0x0000 },
+ { 0x8f00, 0x2777, 0x5000 },
+ { 0x9200, 0x276f, 0x4000 },
+ { 0x9200, 0x276b, 0x3000 },
+ { 0x9200, 0x2769, 0x2000 },
+ { 0x1600, 0x2768, 0x0000 },
+ { 0x1600, 0x276a, 0x0000 },
+ { 0x9200, 0x276d, 0x2000 },
+ { 0x1600, 0x276c, 0x0000 },
+ { 0x1600, 0x276e, 0x0000 },
+ { 0x9200, 0x2773, 0x3000 },
+ { 0x9200, 0x2771, 0x2000 },
+ { 0x1600, 0x2770, 0x0000 },
+ { 0x1600, 0x2772, 0x0000 },
+ { 0x9200, 0x2775, 0x2000 },
+ { 0x1600, 0x2774, 0x0000 },
+ { 0x0f00, 0x2776, 0x0000 },
+ { 0x8f00, 0x277f, 0x4000 },
+ { 0x8f00, 0x277b, 0x3000 },
+ { 0x8f00, 0x2779, 0x2000 },
+ { 0x0f00, 0x2778, 0x0000 },
+ { 0x0f00, 0x277a, 0x0000 },
+ { 0x8f00, 0x277d, 0x2000 },
+ { 0x0f00, 0x277c, 0x0000 },
+ { 0x0f00, 0x277e, 0x0000 },
+ { 0x8f00, 0x2783, 0x3000 },
+ { 0x8f00, 0x2781, 0x2000 },
+ { 0x0f00, 0x2780, 0x0000 },
+ { 0x0f00, 0x2782, 0x0000 },
+ { 0x8f00, 0x2785, 0x2000 },
+ { 0x0f00, 0x2784, 0x0000 },
+ { 0x0f00, 0x2786, 0x0000 },
+ { 0x9900, 0x29a0, 0xa000 },
+ { 0x9a00, 0x28a0, 0x9000 },
+ { 0x9a00, 0x2820, 0x8000 },
+ { 0x9900, 0x27dc, 0x7000 },
+ { 0x9a00, 0x27aa, 0x6000 },
+ { 0x9a00, 0x279a, 0x5000 },
+ { 0x8f00, 0x278f, 0x4000 },
+ { 0x8f00, 0x278b, 0x3000 },
+ { 0x8f00, 0x2789, 0x2000 },
+ { 0x0f00, 0x2788, 0x0000 },
+ { 0x0f00, 0x278a, 0x0000 },
+ { 0x8f00, 0x278d, 0x2000 },
+ { 0x0f00, 0x278c, 0x0000 },
+ { 0x0f00, 0x278e, 0x0000 },
+ { 0x8f00, 0x2793, 0x3000 },
+ { 0x8f00, 0x2791, 0x2000 },
+ { 0x0f00, 0x2790, 0x0000 },
+ { 0x0f00, 0x2792, 0x0000 },
+ { 0x9a00, 0x2798, 0x2000 },
+ { 0x1a00, 0x2794, 0x0000 },
+ { 0x1a00, 0x2799, 0x0000 },
+ { 0x9a00, 0x27a2, 0x4000 },
+ { 0x9a00, 0x279e, 0x3000 },
+ { 0x9a00, 0x279c, 0x2000 },
+ { 0x1a00, 0x279b, 0x0000 },
+ { 0x1a00, 0x279d, 0x0000 },
+ { 0x9a00, 0x27a0, 0x2000 },
+ { 0x1a00, 0x279f, 0x0000 },
+ { 0x1a00, 0x27a1, 0x0000 },
+ { 0x9a00, 0x27a6, 0x3000 },
+ { 0x9a00, 0x27a4, 0x2000 },
+ { 0x1a00, 0x27a3, 0x0000 },
+ { 0x1a00, 0x27a5, 0x0000 },
+ { 0x9a00, 0x27a8, 0x2000 },
+ { 0x1a00, 0x27a7, 0x0000 },
+ { 0x1a00, 0x27a9, 0x0000 },
+ { 0x9a00, 0x27bb, 0x5000 },
+ { 0x9a00, 0x27b3, 0x4000 },
+ { 0x9a00, 0x27ae, 0x3000 },
+ { 0x9a00, 0x27ac, 0x2000 },
+ { 0x1a00, 0x27ab, 0x0000 },
+ { 0x1a00, 0x27ad, 0x0000 },
+ { 0x9a00, 0x27b1, 0x2000 },
+ { 0x1a00, 0x27af, 0x0000 },
+ { 0x1a00, 0x27b2, 0x0000 },
+ { 0x9a00, 0x27b7, 0x3000 },
+ { 0x9a00, 0x27b5, 0x2000 },
+ { 0x1a00, 0x27b4, 0x0000 },
+ { 0x1a00, 0x27b6, 0x0000 },
+ { 0x9a00, 0x27b9, 0x2000 },
+ { 0x1a00, 0x27b8, 0x0000 },
+ { 0x1a00, 0x27ba, 0x0000 },
+ { 0x9900, 0x27d4, 0x4000 },
+ { 0x9900, 0x27d0, 0x3000 },
+ { 0x9a00, 0x27bd, 0x2000 },
+ { 0x1a00, 0x27bc, 0x0000 },
+ { 0x1a00, 0x27be, 0x0000 },
+ { 0x9900, 0x27d2, 0x2000 },
+ { 0x1900, 0x27d1, 0x0000 },
+ { 0x1900, 0x27d3, 0x0000 },
+ { 0x9900, 0x27d8, 0x3000 },
+ { 0x9900, 0x27d6, 0x2000 },
+ { 0x1900, 0x27d5, 0x0000 },
+ { 0x1900, 0x27d7, 0x0000 },
+ { 0x9900, 0x27da, 0x2000 },
+ { 0x1900, 0x27d9, 0x0000 },
+ { 0x1900, 0x27db, 0x0000 },
+ { 0x9a00, 0x2800, 0x6000 },
+ { 0x9900, 0x27f0, 0x5000 },
+ { 0x9900, 0x27e4, 0x4000 },
+ { 0x9900, 0x27e0, 0x3000 },
+ { 0x9900, 0x27de, 0x2000 },
+ { 0x1900, 0x27dd, 0x0000 },
+ { 0x1900, 0x27df, 0x0000 },
+ { 0x9900, 0x27e2, 0x2000 },
+ { 0x1900, 0x27e1, 0x0000 },
+ { 0x1900, 0x27e3, 0x0000 },
+ { 0x9600, 0x27e8, 0x3000 },
+ { 0x9600, 0x27e6, 0x2000 },
+ { 0x1900, 0x27e5, 0x0000 },
+ { 0x1200, 0x27e7, 0x0000 },
+ { 0x9600, 0x27ea, 0x2000 },
+ { 0x1200, 0x27e9, 0x0000 },
+ { 0x1200, 0x27eb, 0x0000 },
+ { 0x9900, 0x27f8, 0x4000 },
+ { 0x9900, 0x27f4, 0x3000 },
+ { 0x9900, 0x27f2, 0x2000 },
+ { 0x1900, 0x27f1, 0x0000 },
+ { 0x1900, 0x27f3, 0x0000 },
+ { 0x9900, 0x27f6, 0x2000 },
+ { 0x1900, 0x27f5, 0x0000 },
+ { 0x1900, 0x27f7, 0x0000 },
+ { 0x9900, 0x27fc, 0x3000 },
+ { 0x9900, 0x27fa, 0x2000 },
+ { 0x1900, 0x27f9, 0x0000 },
+ { 0x1900, 0x27fb, 0x0000 },
+ { 0x9900, 0x27fe, 0x2000 },
+ { 0x1900, 0x27fd, 0x0000 },
+ { 0x1900, 0x27ff, 0x0000 },
+ { 0x9a00, 0x2810, 0x5000 },
+ { 0x9a00, 0x2808, 0x4000 },
+ { 0x9a00, 0x2804, 0x3000 },
+ { 0x9a00, 0x2802, 0x2000 },
+ { 0x1a00, 0x2801, 0x0000 },
+ { 0x1a00, 0x2803, 0x0000 },
+ { 0x9a00, 0x2806, 0x2000 },
+ { 0x1a00, 0x2805, 0x0000 },
+ { 0x1a00, 0x2807, 0x0000 },
+ { 0x9a00, 0x280c, 0x3000 },
+ { 0x9a00, 0x280a, 0x2000 },
+ { 0x1a00, 0x2809, 0x0000 },
+ { 0x1a00, 0x280b, 0x0000 },
+ { 0x9a00, 0x280e, 0x2000 },
+ { 0x1a00, 0x280d, 0x0000 },
+ { 0x1a00, 0x280f, 0x0000 },
+ { 0x9a00, 0x2818, 0x4000 },
+ { 0x9a00, 0x2814, 0x3000 },
+ { 0x9a00, 0x2812, 0x2000 },
+ { 0x1a00, 0x2811, 0x0000 },
+ { 0x1a00, 0x2813, 0x0000 },
+ { 0x9a00, 0x2816, 0x2000 },
+ { 0x1a00, 0x2815, 0x0000 },
+ { 0x1a00, 0x2817, 0x0000 },
+ { 0x9a00, 0x281c, 0x3000 },
+ { 0x9a00, 0x281a, 0x2000 },
+ { 0x1a00, 0x2819, 0x0000 },
+ { 0x1a00, 0x281b, 0x0000 },
+ { 0x9a00, 0x281e, 0x2000 },
+ { 0x1a00, 0x281d, 0x0000 },
+ { 0x1a00, 0x281f, 0x0000 },
+ { 0x9a00, 0x2860, 0x7000 },
+ { 0x9a00, 0x2840, 0x6000 },
+ { 0x9a00, 0x2830, 0x5000 },
+ { 0x9a00, 0x2828, 0x4000 },
+ { 0x9a00, 0x2824, 0x3000 },
+ { 0x9a00, 0x2822, 0x2000 },
+ { 0x1a00, 0x2821, 0x0000 },
+ { 0x1a00, 0x2823, 0x0000 },
+ { 0x9a00, 0x2826, 0x2000 },
+ { 0x1a00, 0x2825, 0x0000 },
+ { 0x1a00, 0x2827, 0x0000 },
+ { 0x9a00, 0x282c, 0x3000 },
+ { 0x9a00, 0x282a, 0x2000 },
+ { 0x1a00, 0x2829, 0x0000 },
+ { 0x1a00, 0x282b, 0x0000 },
+ { 0x9a00, 0x282e, 0x2000 },
+ { 0x1a00, 0x282d, 0x0000 },
+ { 0x1a00, 0x282f, 0x0000 },
+ { 0x9a00, 0x2838, 0x4000 },
+ { 0x9a00, 0x2834, 0x3000 },
+ { 0x9a00, 0x2832, 0x2000 },
+ { 0x1a00, 0x2831, 0x0000 },
+ { 0x1a00, 0x2833, 0x0000 },
+ { 0x9a00, 0x2836, 0x2000 },
+ { 0x1a00, 0x2835, 0x0000 },
+ { 0x1a00, 0x2837, 0x0000 },
+ { 0x9a00, 0x283c, 0x3000 },
+ { 0x9a00, 0x283a, 0x2000 },
+ { 0x1a00, 0x2839, 0x0000 },
+ { 0x1a00, 0x283b, 0x0000 },
+ { 0x9a00, 0x283e, 0x2000 },
+ { 0x1a00, 0x283d, 0x0000 },
+ { 0x1a00, 0x283f, 0x0000 },
+ { 0x9a00, 0x2850, 0x5000 },
+ { 0x9a00, 0x2848, 0x4000 },
+ { 0x9a00, 0x2844, 0x3000 },
+ { 0x9a00, 0x2842, 0x2000 },
+ { 0x1a00, 0x2841, 0x0000 },
+ { 0x1a00, 0x2843, 0x0000 },
+ { 0x9a00, 0x2846, 0x2000 },
+ { 0x1a00, 0x2845, 0x0000 },
+ { 0x1a00, 0x2847, 0x0000 },
+ { 0x9a00, 0x284c, 0x3000 },
+ { 0x9a00, 0x284a, 0x2000 },
+ { 0x1a00, 0x2849, 0x0000 },
+ { 0x1a00, 0x284b, 0x0000 },
+ { 0x9a00, 0x284e, 0x2000 },
+ { 0x1a00, 0x284d, 0x0000 },
+ { 0x1a00, 0x284f, 0x0000 },
+ { 0x9a00, 0x2858, 0x4000 },
+ { 0x9a00, 0x2854, 0x3000 },
+ { 0x9a00, 0x2852, 0x2000 },
+ { 0x1a00, 0x2851, 0x0000 },
+ { 0x1a00, 0x2853, 0x0000 },
+ { 0x9a00, 0x2856, 0x2000 },
+ { 0x1a00, 0x2855, 0x0000 },
+ { 0x1a00, 0x2857, 0x0000 },
+ { 0x9a00, 0x285c, 0x3000 },
+ { 0x9a00, 0x285a, 0x2000 },
+ { 0x1a00, 0x2859, 0x0000 },
+ { 0x1a00, 0x285b, 0x0000 },
+ { 0x9a00, 0x285e, 0x2000 },
+ { 0x1a00, 0x285d, 0x0000 },
+ { 0x1a00, 0x285f, 0x0000 },
+ { 0x9a00, 0x2880, 0x6000 },
+ { 0x9a00, 0x2870, 0x5000 },
+ { 0x9a00, 0x2868, 0x4000 },
+ { 0x9a00, 0x2864, 0x3000 },
+ { 0x9a00, 0x2862, 0x2000 },
+ { 0x1a00, 0x2861, 0x0000 },
+ { 0x1a00, 0x2863, 0x0000 },
+ { 0x9a00, 0x2866, 0x2000 },
+ { 0x1a00, 0x2865, 0x0000 },
+ { 0x1a00, 0x2867, 0x0000 },
+ { 0x9a00, 0x286c, 0x3000 },
+ { 0x9a00, 0x286a, 0x2000 },
+ { 0x1a00, 0x2869, 0x0000 },
+ { 0x1a00, 0x286b, 0x0000 },
+ { 0x9a00, 0x286e, 0x2000 },
+ { 0x1a00, 0x286d, 0x0000 },
+ { 0x1a00, 0x286f, 0x0000 },
+ { 0x9a00, 0x2878, 0x4000 },
+ { 0x9a00, 0x2874, 0x3000 },
+ { 0x9a00, 0x2872, 0x2000 },
+ { 0x1a00, 0x2871, 0x0000 },
+ { 0x1a00, 0x2873, 0x0000 },
+ { 0x9a00, 0x2876, 0x2000 },
+ { 0x1a00, 0x2875, 0x0000 },
+ { 0x1a00, 0x2877, 0x0000 },
+ { 0x9a00, 0x287c, 0x3000 },
+ { 0x9a00, 0x287a, 0x2000 },
+ { 0x1a00, 0x2879, 0x0000 },
+ { 0x1a00, 0x287b, 0x0000 },
+ { 0x9a00, 0x287e, 0x2000 },
+ { 0x1a00, 0x287d, 0x0000 },
+ { 0x1a00, 0x287f, 0x0000 },
+ { 0x9a00, 0x2890, 0x5000 },
+ { 0x9a00, 0x2888, 0x4000 },
+ { 0x9a00, 0x2884, 0x3000 },
+ { 0x9a00, 0x2882, 0x2000 },
+ { 0x1a00, 0x2881, 0x0000 },
+ { 0x1a00, 0x2883, 0x0000 },
+ { 0x9a00, 0x2886, 0x2000 },
+ { 0x1a00, 0x2885, 0x0000 },
+ { 0x1a00, 0x2887, 0x0000 },
+ { 0x9a00, 0x288c, 0x3000 },
+ { 0x9a00, 0x288a, 0x2000 },
+ { 0x1a00, 0x2889, 0x0000 },
+ { 0x1a00, 0x288b, 0x0000 },
+ { 0x9a00, 0x288e, 0x2000 },
+ { 0x1a00, 0x288d, 0x0000 },
+ { 0x1a00, 0x288f, 0x0000 },
+ { 0x9a00, 0x2898, 0x4000 },
+ { 0x9a00, 0x2894, 0x3000 },
+ { 0x9a00, 0x2892, 0x2000 },
+ { 0x1a00, 0x2891, 0x0000 },
+ { 0x1a00, 0x2893, 0x0000 },
+ { 0x9a00, 0x2896, 0x2000 },
+ { 0x1a00, 0x2895, 0x0000 },
+ { 0x1a00, 0x2897, 0x0000 },
+ { 0x9a00, 0x289c, 0x3000 },
+ { 0x9a00, 0x289a, 0x2000 },
+ { 0x1a00, 0x2899, 0x0000 },
+ { 0x1a00, 0x289b, 0x0000 },
+ { 0x9a00, 0x289e, 0x2000 },
+ { 0x1a00, 0x289d, 0x0000 },
+ { 0x1a00, 0x289f, 0x0000 },
+ { 0x9900, 0x2920, 0x8000 },
+ { 0x9a00, 0x28e0, 0x7000 },
+ { 0x9a00, 0x28c0, 0x6000 },
+ { 0x9a00, 0x28b0, 0x5000 },
+ { 0x9a00, 0x28a8, 0x4000 },
+ { 0x9a00, 0x28a4, 0x3000 },
+ { 0x9a00, 0x28a2, 0x2000 },
+ { 0x1a00, 0x28a1, 0x0000 },
+ { 0x1a00, 0x28a3, 0x0000 },
+ { 0x9a00, 0x28a6, 0x2000 },
+ { 0x1a00, 0x28a5, 0x0000 },
+ { 0x1a00, 0x28a7, 0x0000 },
+ { 0x9a00, 0x28ac, 0x3000 },
+ { 0x9a00, 0x28aa, 0x2000 },
+ { 0x1a00, 0x28a9, 0x0000 },
+ { 0x1a00, 0x28ab, 0x0000 },
+ { 0x9a00, 0x28ae, 0x2000 },
+ { 0x1a00, 0x28ad, 0x0000 },
+ { 0x1a00, 0x28af, 0x0000 },
+ { 0x9a00, 0x28b8, 0x4000 },
+ { 0x9a00, 0x28b4, 0x3000 },
+ { 0x9a00, 0x28b2, 0x2000 },
+ { 0x1a00, 0x28b1, 0x0000 },
+ { 0x1a00, 0x28b3, 0x0000 },
+ { 0x9a00, 0x28b6, 0x2000 },
+ { 0x1a00, 0x28b5, 0x0000 },
+ { 0x1a00, 0x28b7, 0x0000 },
+ { 0x9a00, 0x28bc, 0x3000 },
+ { 0x9a00, 0x28ba, 0x2000 },
+ { 0x1a00, 0x28b9, 0x0000 },
+ { 0x1a00, 0x28bb, 0x0000 },
+ { 0x9a00, 0x28be, 0x2000 },
+ { 0x1a00, 0x28bd, 0x0000 },
+ { 0x1a00, 0x28bf, 0x0000 },
+ { 0x9a00, 0x28d0, 0x5000 },
+ { 0x9a00, 0x28c8, 0x4000 },
+ { 0x9a00, 0x28c4, 0x3000 },
+ { 0x9a00, 0x28c2, 0x2000 },
+ { 0x1a00, 0x28c1, 0x0000 },
+ { 0x1a00, 0x28c3, 0x0000 },
+ { 0x9a00, 0x28c6, 0x2000 },
+ { 0x1a00, 0x28c5, 0x0000 },
+ { 0x1a00, 0x28c7, 0x0000 },
+ { 0x9a00, 0x28cc, 0x3000 },
+ { 0x9a00, 0x28ca, 0x2000 },
+ { 0x1a00, 0x28c9, 0x0000 },
+ { 0x1a00, 0x28cb, 0x0000 },
+ { 0x9a00, 0x28ce, 0x2000 },
+ { 0x1a00, 0x28cd, 0x0000 },
+ { 0x1a00, 0x28cf, 0x0000 },
+ { 0x9a00, 0x28d8, 0x4000 },
+ { 0x9a00, 0x28d4, 0x3000 },
+ { 0x9a00, 0x28d2, 0x2000 },
+ { 0x1a00, 0x28d1, 0x0000 },
+ { 0x1a00, 0x28d3, 0x0000 },
+ { 0x9a00, 0x28d6, 0x2000 },
+ { 0x1a00, 0x28d5, 0x0000 },
+ { 0x1a00, 0x28d7, 0x0000 },
+ { 0x9a00, 0x28dc, 0x3000 },
+ { 0x9a00, 0x28da, 0x2000 },
+ { 0x1a00, 0x28d9, 0x0000 },
+ { 0x1a00, 0x28db, 0x0000 },
+ { 0x9a00, 0x28de, 0x2000 },
+ { 0x1a00, 0x28dd, 0x0000 },
+ { 0x1a00, 0x28df, 0x0000 },
+ { 0x9900, 0x2900, 0x6000 },
+ { 0x9a00, 0x28f0, 0x5000 },
+ { 0x9a00, 0x28e8, 0x4000 },
+ { 0x9a00, 0x28e4, 0x3000 },
+ { 0x9a00, 0x28e2, 0x2000 },
+ { 0x1a00, 0x28e1, 0x0000 },
+ { 0x1a00, 0x28e3, 0x0000 },
+ { 0x9a00, 0x28e6, 0x2000 },
+ { 0x1a00, 0x28e5, 0x0000 },
+ { 0x1a00, 0x28e7, 0x0000 },
+ { 0x9a00, 0x28ec, 0x3000 },
+ { 0x9a00, 0x28ea, 0x2000 },
+ { 0x1a00, 0x28e9, 0x0000 },
+ { 0x1a00, 0x28eb, 0x0000 },
+ { 0x9a00, 0x28ee, 0x2000 },
+ { 0x1a00, 0x28ed, 0x0000 },
+ { 0x1a00, 0x28ef, 0x0000 },
+ { 0x9a00, 0x28f8, 0x4000 },
+ { 0x9a00, 0x28f4, 0x3000 },
+ { 0x9a00, 0x28f2, 0x2000 },
+ { 0x1a00, 0x28f1, 0x0000 },
+ { 0x1a00, 0x28f3, 0x0000 },
+ { 0x9a00, 0x28f6, 0x2000 },
+ { 0x1a00, 0x28f5, 0x0000 },
+ { 0x1a00, 0x28f7, 0x0000 },
+ { 0x9a00, 0x28fc, 0x3000 },
+ { 0x9a00, 0x28fa, 0x2000 },
+ { 0x1a00, 0x28f9, 0x0000 },
+ { 0x1a00, 0x28fb, 0x0000 },
+ { 0x9a00, 0x28fe, 0x2000 },
+ { 0x1a00, 0x28fd, 0x0000 },
+ { 0x1a00, 0x28ff, 0x0000 },
+ { 0x9900, 0x2910, 0x5000 },
+ { 0x9900, 0x2908, 0x4000 },
+ { 0x9900, 0x2904, 0x3000 },
+ { 0x9900, 0x2902, 0x2000 },
+ { 0x1900, 0x2901, 0x0000 },
+ { 0x1900, 0x2903, 0x0000 },
+ { 0x9900, 0x2906, 0x2000 },
+ { 0x1900, 0x2905, 0x0000 },
+ { 0x1900, 0x2907, 0x0000 },
+ { 0x9900, 0x290c, 0x3000 },
+ { 0x9900, 0x290a, 0x2000 },
+ { 0x1900, 0x2909, 0x0000 },
+ { 0x1900, 0x290b, 0x0000 },
+ { 0x9900, 0x290e, 0x2000 },
+ { 0x1900, 0x290d, 0x0000 },
+ { 0x1900, 0x290f, 0x0000 },
+ { 0x9900, 0x2918, 0x4000 },
+ { 0x9900, 0x2914, 0x3000 },
+ { 0x9900, 0x2912, 0x2000 },
+ { 0x1900, 0x2911, 0x0000 },
+ { 0x1900, 0x2913, 0x0000 },
+ { 0x9900, 0x2916, 0x2000 },
+ { 0x1900, 0x2915, 0x0000 },
+ { 0x1900, 0x2917, 0x0000 },
+ { 0x9900, 0x291c, 0x3000 },
+ { 0x9900, 0x291a, 0x2000 },
+ { 0x1900, 0x2919, 0x0000 },
+ { 0x1900, 0x291b, 0x0000 },
+ { 0x9900, 0x291e, 0x2000 },
+ { 0x1900, 0x291d, 0x0000 },
+ { 0x1900, 0x291f, 0x0000 },
+ { 0x9900, 0x2960, 0x7000 },
+ { 0x9900, 0x2940, 0x6000 },
+ { 0x9900, 0x2930, 0x5000 },
+ { 0x9900, 0x2928, 0x4000 },
+ { 0x9900, 0x2924, 0x3000 },
+ { 0x9900, 0x2922, 0x2000 },
+ { 0x1900, 0x2921, 0x0000 },
+ { 0x1900, 0x2923, 0x0000 },
+ { 0x9900, 0x2926, 0x2000 },
+ { 0x1900, 0x2925, 0x0000 },
+ { 0x1900, 0x2927, 0x0000 },
+ { 0x9900, 0x292c, 0x3000 },
+ { 0x9900, 0x292a, 0x2000 },
+ { 0x1900, 0x2929, 0x0000 },
+ { 0x1900, 0x292b, 0x0000 },
+ { 0x9900, 0x292e, 0x2000 },
+ { 0x1900, 0x292d, 0x0000 },
+ { 0x1900, 0x292f, 0x0000 },
+ { 0x9900, 0x2938, 0x4000 },
+ { 0x9900, 0x2934, 0x3000 },
+ { 0x9900, 0x2932, 0x2000 },
+ { 0x1900, 0x2931, 0x0000 },
+ { 0x1900, 0x2933, 0x0000 },
+ { 0x9900, 0x2936, 0x2000 },
+ { 0x1900, 0x2935, 0x0000 },
+ { 0x1900, 0x2937, 0x0000 },
+ { 0x9900, 0x293c, 0x3000 },
+ { 0x9900, 0x293a, 0x2000 },
+ { 0x1900, 0x2939, 0x0000 },
+ { 0x1900, 0x293b, 0x0000 },
+ { 0x9900, 0x293e, 0x2000 },
+ { 0x1900, 0x293d, 0x0000 },
+ { 0x1900, 0x293f, 0x0000 },
+ { 0x9900, 0x2950, 0x5000 },
+ { 0x9900, 0x2948, 0x4000 },
+ { 0x9900, 0x2944, 0x3000 },
+ { 0x9900, 0x2942, 0x2000 },
+ { 0x1900, 0x2941, 0x0000 },
+ { 0x1900, 0x2943, 0x0000 },
+ { 0x9900, 0x2946, 0x2000 },
+ { 0x1900, 0x2945, 0x0000 },
+ { 0x1900, 0x2947, 0x0000 },
+ { 0x9900, 0x294c, 0x3000 },
+ { 0x9900, 0x294a, 0x2000 },
+ { 0x1900, 0x2949, 0x0000 },
+ { 0x1900, 0x294b, 0x0000 },
+ { 0x9900, 0x294e, 0x2000 },
+ { 0x1900, 0x294d, 0x0000 },
+ { 0x1900, 0x294f, 0x0000 },
+ { 0x9900, 0x2958, 0x4000 },
+ { 0x9900, 0x2954, 0x3000 },
+ { 0x9900, 0x2952, 0x2000 },
+ { 0x1900, 0x2951, 0x0000 },
+ { 0x1900, 0x2953, 0x0000 },
+ { 0x9900, 0x2956, 0x2000 },
+ { 0x1900, 0x2955, 0x0000 },
+ { 0x1900, 0x2957, 0x0000 },
+ { 0x9900, 0x295c, 0x3000 },
+ { 0x9900, 0x295a, 0x2000 },
+ { 0x1900, 0x2959, 0x0000 },
+ { 0x1900, 0x295b, 0x0000 },
+ { 0x9900, 0x295e, 0x2000 },
+ { 0x1900, 0x295d, 0x0000 },
+ { 0x1900, 0x295f, 0x0000 },
+ { 0x9900, 0x2980, 0x6000 },
+ { 0x9900, 0x2970, 0x5000 },
+ { 0x9900, 0x2968, 0x4000 },
+ { 0x9900, 0x2964, 0x3000 },
+ { 0x9900, 0x2962, 0x2000 },
+ { 0x1900, 0x2961, 0x0000 },
+ { 0x1900, 0x2963, 0x0000 },
+ { 0x9900, 0x2966, 0x2000 },
+ { 0x1900, 0x2965, 0x0000 },
+ { 0x1900, 0x2967, 0x0000 },
+ { 0x9900, 0x296c, 0x3000 },
+ { 0x9900, 0x296a, 0x2000 },
+ { 0x1900, 0x2969, 0x0000 },
+ { 0x1900, 0x296b, 0x0000 },
+ { 0x9900, 0x296e, 0x2000 },
+ { 0x1900, 0x296d, 0x0000 },
+ { 0x1900, 0x296f, 0x0000 },
+ { 0x9900, 0x2978, 0x4000 },
+ { 0x9900, 0x2974, 0x3000 },
+ { 0x9900, 0x2972, 0x2000 },
+ { 0x1900, 0x2971, 0x0000 },
+ { 0x1900, 0x2973, 0x0000 },
+ { 0x9900, 0x2976, 0x2000 },
+ { 0x1900, 0x2975, 0x0000 },
+ { 0x1900, 0x2977, 0x0000 },
+ { 0x9900, 0x297c, 0x3000 },
+ { 0x9900, 0x297a, 0x2000 },
+ { 0x1900, 0x2979, 0x0000 },
+ { 0x1900, 0x297b, 0x0000 },
+ { 0x9900, 0x297e, 0x2000 },
+ { 0x1900, 0x297d, 0x0000 },
+ { 0x1900, 0x297f, 0x0000 },
+ { 0x9200, 0x2990, 0x5000 },
+ { 0x9200, 0x2988, 0x4000 },
+ { 0x9200, 0x2984, 0x3000 },
+ { 0x9900, 0x2982, 0x2000 },
+ { 0x1900, 0x2981, 0x0000 },
+ { 0x1600, 0x2983, 0x0000 },
+ { 0x9200, 0x2986, 0x2000 },
+ { 0x1600, 0x2985, 0x0000 },
+ { 0x1600, 0x2987, 0x0000 },
+ { 0x9200, 0x298c, 0x3000 },
+ { 0x9200, 0x298a, 0x2000 },
+ { 0x1600, 0x2989, 0x0000 },
+ { 0x1600, 0x298b, 0x0000 },
+ { 0x9200, 0x298e, 0x2000 },
+ { 0x1600, 0x298d, 0x0000 },
+ { 0x1600, 0x298f, 0x0000 },
+ { 0x9200, 0x2998, 0x4000 },
+ { 0x9200, 0x2994, 0x3000 },
+ { 0x9200, 0x2992, 0x2000 },
+ { 0x1600, 0x2991, 0x0000 },
+ { 0x1600, 0x2993, 0x0000 },
+ { 0x9200, 0x2996, 0x2000 },
+ { 0x1600, 0x2995, 0x0000 },
+ { 0x1600, 0x2997, 0x0000 },
+ { 0x9900, 0x299c, 0x3000 },
+ { 0x9900, 0x299a, 0x2000 },
+ { 0x1900, 0x2999, 0x0000 },
+ { 0x1900, 0x299b, 0x0000 },
+ { 0x9900, 0x299e, 0x2000 },
+ { 0x1900, 0x299d, 0x0000 },
+ { 0x1900, 0x299f, 0x0000 },
+ { 0x9900, 0x2aa0, 0x9000 },
+ { 0x9900, 0x2a20, 0x8000 },
+ { 0x9900, 0x29e0, 0x7000 },
+ { 0x9900, 0x29c0, 0x6000 },
+ { 0x9900, 0x29b0, 0x5000 },
+ { 0x9900, 0x29a8, 0x4000 },
+ { 0x9900, 0x29a4, 0x3000 },
+ { 0x9900, 0x29a2, 0x2000 },
+ { 0x1900, 0x29a1, 0x0000 },
+ { 0x1900, 0x29a3, 0x0000 },
+ { 0x9900, 0x29a6, 0x2000 },
+ { 0x1900, 0x29a5, 0x0000 },
+ { 0x1900, 0x29a7, 0x0000 },
+ { 0x9900, 0x29ac, 0x3000 },
+ { 0x9900, 0x29aa, 0x2000 },
+ { 0x1900, 0x29a9, 0x0000 },
+ { 0x1900, 0x29ab, 0x0000 },
+ { 0x9900, 0x29ae, 0x2000 },
+ { 0x1900, 0x29ad, 0x0000 },
+ { 0x1900, 0x29af, 0x0000 },
+ { 0x9900, 0x29b8, 0x4000 },
+ { 0x9900, 0x29b4, 0x3000 },
+ { 0x9900, 0x29b2, 0x2000 },
+ { 0x1900, 0x29b1, 0x0000 },
+ { 0x1900, 0x29b3, 0x0000 },
+ { 0x9900, 0x29b6, 0x2000 },
+ { 0x1900, 0x29b5, 0x0000 },
+ { 0x1900, 0x29b7, 0x0000 },
+ { 0x9900, 0x29bc, 0x3000 },
+ { 0x9900, 0x29ba, 0x2000 },
+ { 0x1900, 0x29b9, 0x0000 },
+ { 0x1900, 0x29bb, 0x0000 },
+ { 0x9900, 0x29be, 0x2000 },
+ { 0x1900, 0x29bd, 0x0000 },
+ { 0x1900, 0x29bf, 0x0000 },
+ { 0x9900, 0x29d0, 0x5000 },
+ { 0x9900, 0x29c8, 0x4000 },
+ { 0x9900, 0x29c4, 0x3000 },
+ { 0x9900, 0x29c2, 0x2000 },
+ { 0x1900, 0x29c1, 0x0000 },
+ { 0x1900, 0x29c3, 0x0000 },
+ { 0x9900, 0x29c6, 0x2000 },
+ { 0x1900, 0x29c5, 0x0000 },
+ { 0x1900, 0x29c7, 0x0000 },
+ { 0x9900, 0x29cc, 0x3000 },
+ { 0x9900, 0x29ca, 0x2000 },
+ { 0x1900, 0x29c9, 0x0000 },
+ { 0x1900, 0x29cb, 0x0000 },
+ { 0x9900, 0x29ce, 0x2000 },
+ { 0x1900, 0x29cd, 0x0000 },
+ { 0x1900, 0x29cf, 0x0000 },
+ { 0x9600, 0x29d8, 0x4000 },
+ { 0x9900, 0x29d4, 0x3000 },
+ { 0x9900, 0x29d2, 0x2000 },
+ { 0x1900, 0x29d1, 0x0000 },
+ { 0x1900, 0x29d3, 0x0000 },
+ { 0x9900, 0x29d6, 0x2000 },
+ { 0x1900, 0x29d5, 0x0000 },
+ { 0x1900, 0x29d7, 0x0000 },
+ { 0x9900, 0x29dc, 0x3000 },
+ { 0x9600, 0x29da, 0x2000 },
+ { 0x1200, 0x29d9, 0x0000 },
+ { 0x1200, 0x29db, 0x0000 },
+ { 0x9900, 0x29de, 0x2000 },
+ { 0x1900, 0x29dd, 0x0000 },
+ { 0x1900, 0x29df, 0x0000 },
+ { 0x9900, 0x2a00, 0x6000 },
+ { 0x9900, 0x29f0, 0x5000 },
+ { 0x9900, 0x29e8, 0x4000 },
+ { 0x9900, 0x29e4, 0x3000 },
+ { 0x9900, 0x29e2, 0x2000 },
+ { 0x1900, 0x29e1, 0x0000 },
+ { 0x1900, 0x29e3, 0x0000 },
+ { 0x9900, 0x29e6, 0x2000 },
+ { 0x1900, 0x29e5, 0x0000 },
+ { 0x1900, 0x29e7, 0x0000 },
+ { 0x9900, 0x29ec, 0x3000 },
+ { 0x9900, 0x29ea, 0x2000 },
+ { 0x1900, 0x29e9, 0x0000 },
+ { 0x1900, 0x29eb, 0x0000 },
+ { 0x9900, 0x29ee, 0x2000 },
+ { 0x1900, 0x29ed, 0x0000 },
+ { 0x1900, 0x29ef, 0x0000 },
+ { 0x9900, 0x29f8, 0x4000 },
+ { 0x9900, 0x29f4, 0x3000 },
+ { 0x9900, 0x29f2, 0x2000 },
+ { 0x1900, 0x29f1, 0x0000 },
+ { 0x1900, 0x29f3, 0x0000 },
+ { 0x9900, 0x29f6, 0x2000 },
+ { 0x1900, 0x29f5, 0x0000 },
+ { 0x1900, 0x29f7, 0x0000 },
+ { 0x9600, 0x29fc, 0x3000 },
+ { 0x9900, 0x29fa, 0x2000 },
+ { 0x1900, 0x29f9, 0x0000 },
+ { 0x1900, 0x29fb, 0x0000 },
+ { 0x9900, 0x29fe, 0x2000 },
+ { 0x1200, 0x29fd, 0x0000 },
+ { 0x1900, 0x29ff, 0x0000 },
+ { 0x9900, 0x2a10, 0x5000 },
+ { 0x9900, 0x2a08, 0x4000 },
+ { 0x9900, 0x2a04, 0x3000 },
+ { 0x9900, 0x2a02, 0x2000 },
+ { 0x1900, 0x2a01, 0x0000 },
+ { 0x1900, 0x2a03, 0x0000 },
+ { 0x9900, 0x2a06, 0x2000 },
+ { 0x1900, 0x2a05, 0x0000 },
+ { 0x1900, 0x2a07, 0x0000 },
+ { 0x9900, 0x2a0c, 0x3000 },
+ { 0x9900, 0x2a0a, 0x2000 },
+ { 0x1900, 0x2a09, 0x0000 },
+ { 0x1900, 0x2a0b, 0x0000 },
+ { 0x9900, 0x2a0e, 0x2000 },
+ { 0x1900, 0x2a0d, 0x0000 },
+ { 0x1900, 0x2a0f, 0x0000 },
+ { 0x9900, 0x2a18, 0x4000 },
+ { 0x9900, 0x2a14, 0x3000 },
+ { 0x9900, 0x2a12, 0x2000 },
+ { 0x1900, 0x2a11, 0x0000 },
+ { 0x1900, 0x2a13, 0x0000 },
+ { 0x9900, 0x2a16, 0x2000 },
+ { 0x1900, 0x2a15, 0x0000 },
+ { 0x1900, 0x2a17, 0x0000 },
+ { 0x9900, 0x2a1c, 0x3000 },
+ { 0x9900, 0x2a1a, 0x2000 },
+ { 0x1900, 0x2a19, 0x0000 },
+ { 0x1900, 0x2a1b, 0x0000 },
+ { 0x9900, 0x2a1e, 0x2000 },
+ { 0x1900, 0x2a1d, 0x0000 },
+ { 0x1900, 0x2a1f, 0x0000 },
+ { 0x9900, 0x2a60, 0x7000 },
+ { 0x9900, 0x2a40, 0x6000 },
+ { 0x9900, 0x2a30, 0x5000 },
+ { 0x9900, 0x2a28, 0x4000 },
+ { 0x9900, 0x2a24, 0x3000 },
+ { 0x9900, 0x2a22, 0x2000 },
+ { 0x1900, 0x2a21, 0x0000 },
+ { 0x1900, 0x2a23, 0x0000 },
+ { 0x9900, 0x2a26, 0x2000 },
+ { 0x1900, 0x2a25, 0x0000 },
+ { 0x1900, 0x2a27, 0x0000 },
+ { 0x9900, 0x2a2c, 0x3000 },
+ { 0x9900, 0x2a2a, 0x2000 },
+ { 0x1900, 0x2a29, 0x0000 },
+ { 0x1900, 0x2a2b, 0x0000 },
+ { 0x9900, 0x2a2e, 0x2000 },
+ { 0x1900, 0x2a2d, 0x0000 },
+ { 0x1900, 0x2a2f, 0x0000 },
+ { 0x9900, 0x2a38, 0x4000 },
+ { 0x9900, 0x2a34, 0x3000 },
+ { 0x9900, 0x2a32, 0x2000 },
+ { 0x1900, 0x2a31, 0x0000 },
+ { 0x1900, 0x2a33, 0x0000 },
+ { 0x9900, 0x2a36, 0x2000 },
+ { 0x1900, 0x2a35, 0x0000 },
+ { 0x1900, 0x2a37, 0x0000 },
+ { 0x9900, 0x2a3c, 0x3000 },
+ { 0x9900, 0x2a3a, 0x2000 },
+ { 0x1900, 0x2a39, 0x0000 },
+ { 0x1900, 0x2a3b, 0x0000 },
+ { 0x9900, 0x2a3e, 0x2000 },
+ { 0x1900, 0x2a3d, 0x0000 },
+ { 0x1900, 0x2a3f, 0x0000 },
+ { 0x9900, 0x2a50, 0x5000 },
+ { 0x9900, 0x2a48, 0x4000 },
+ { 0x9900, 0x2a44, 0x3000 },
+ { 0x9900, 0x2a42, 0x2000 },
+ { 0x1900, 0x2a41, 0x0000 },
+ { 0x1900, 0x2a43, 0x0000 },
+ { 0x9900, 0x2a46, 0x2000 },
+ { 0x1900, 0x2a45, 0x0000 },
+ { 0x1900, 0x2a47, 0x0000 },
+ { 0x9900, 0x2a4c, 0x3000 },
+ { 0x9900, 0x2a4a, 0x2000 },
+ { 0x1900, 0x2a49, 0x0000 },
+ { 0x1900, 0x2a4b, 0x0000 },
+ { 0x9900, 0x2a4e, 0x2000 },
+ { 0x1900, 0x2a4d, 0x0000 },
+ { 0x1900, 0x2a4f, 0x0000 },
+ { 0x9900, 0x2a58, 0x4000 },
+ { 0x9900, 0x2a54, 0x3000 },
+ { 0x9900, 0x2a52, 0x2000 },
+ { 0x1900, 0x2a51, 0x0000 },
+ { 0x1900, 0x2a53, 0x0000 },
+ { 0x9900, 0x2a56, 0x2000 },
+ { 0x1900, 0x2a55, 0x0000 },
+ { 0x1900, 0x2a57, 0x0000 },
+ { 0x9900, 0x2a5c, 0x3000 },
+ { 0x9900, 0x2a5a, 0x2000 },
+ { 0x1900, 0x2a59, 0x0000 },
+ { 0x1900, 0x2a5b, 0x0000 },
+ { 0x9900, 0x2a5e, 0x2000 },
+ { 0x1900, 0x2a5d, 0x0000 },
+ { 0x1900, 0x2a5f, 0x0000 },
+ { 0x9900, 0x2a80, 0x6000 },
+ { 0x9900, 0x2a70, 0x5000 },
+ { 0x9900, 0x2a68, 0x4000 },
+ { 0x9900, 0x2a64, 0x3000 },
+ { 0x9900, 0x2a62, 0x2000 },
+ { 0x1900, 0x2a61, 0x0000 },
+ { 0x1900, 0x2a63, 0x0000 },
+ { 0x9900, 0x2a66, 0x2000 },
+ { 0x1900, 0x2a65, 0x0000 },
+ { 0x1900, 0x2a67, 0x0000 },
+ { 0x9900, 0x2a6c, 0x3000 },
+ { 0x9900, 0x2a6a, 0x2000 },
+ { 0x1900, 0x2a69, 0x0000 },
+ { 0x1900, 0x2a6b, 0x0000 },
+ { 0x9900, 0x2a6e, 0x2000 },
+ { 0x1900, 0x2a6d, 0x0000 },
+ { 0x1900, 0x2a6f, 0x0000 },
+ { 0x9900, 0x2a78, 0x4000 },
+ { 0x9900, 0x2a74, 0x3000 },
+ { 0x9900, 0x2a72, 0x2000 },
+ { 0x1900, 0x2a71, 0x0000 },
+ { 0x1900, 0x2a73, 0x0000 },
+ { 0x9900, 0x2a76, 0x2000 },
+ { 0x1900, 0x2a75, 0x0000 },
+ { 0x1900, 0x2a77, 0x0000 },
+ { 0x9900, 0x2a7c, 0x3000 },
+ { 0x9900, 0x2a7a, 0x2000 },
+ { 0x1900, 0x2a79, 0x0000 },
+ { 0x1900, 0x2a7b, 0x0000 },
+ { 0x9900, 0x2a7e, 0x2000 },
+ { 0x1900, 0x2a7d, 0x0000 },
+ { 0x1900, 0x2a7f, 0x0000 },
+ { 0x9900, 0x2a90, 0x5000 },
+ { 0x9900, 0x2a88, 0x4000 },
+ { 0x9900, 0x2a84, 0x3000 },
+ { 0x9900, 0x2a82, 0x2000 },
+ { 0x1900, 0x2a81, 0x0000 },
+ { 0x1900, 0x2a83, 0x0000 },
+ { 0x9900, 0x2a86, 0x2000 },
+ { 0x1900, 0x2a85, 0x0000 },
+ { 0x1900, 0x2a87, 0x0000 },
+ { 0x9900, 0x2a8c, 0x3000 },
+ { 0x9900, 0x2a8a, 0x2000 },
+ { 0x1900, 0x2a89, 0x0000 },
+ { 0x1900, 0x2a8b, 0x0000 },
+ { 0x9900, 0x2a8e, 0x2000 },
+ { 0x1900, 0x2a8d, 0x0000 },
+ { 0x1900, 0x2a8f, 0x0000 },
+ { 0x9900, 0x2a98, 0x4000 },
+ { 0x9900, 0x2a94, 0x3000 },
+ { 0x9900, 0x2a92, 0x2000 },
+ { 0x1900, 0x2a91, 0x0000 },
+ { 0x1900, 0x2a93, 0x0000 },
+ { 0x9900, 0x2a96, 0x2000 },
+ { 0x1900, 0x2a95, 0x0000 },
+ { 0x1900, 0x2a97, 0x0000 },
+ { 0x9900, 0x2a9c, 0x3000 },
+ { 0x9900, 0x2a9a, 0x2000 },
+ { 0x1900, 0x2a99, 0x0000 },
+ { 0x1900, 0x2a9b, 0x0000 },
+ { 0x9900, 0x2a9e, 0x2000 },
+ { 0x1900, 0x2a9d, 0x0000 },
+ { 0x1900, 0x2a9f, 0x0000 },
+ { 0x9a00, 0x2e92, 0x8000 },
+ { 0x9900, 0x2ae0, 0x7000 },
+ { 0x9900, 0x2ac0, 0x6000 },
+ { 0x9900, 0x2ab0, 0x5000 },
+ { 0x9900, 0x2aa8, 0x4000 },
+ { 0x9900, 0x2aa4, 0x3000 },
+ { 0x9900, 0x2aa2, 0x2000 },
+ { 0x1900, 0x2aa1, 0x0000 },
+ { 0x1900, 0x2aa3, 0x0000 },
+ { 0x9900, 0x2aa6, 0x2000 },
+ { 0x1900, 0x2aa5, 0x0000 },
+ { 0x1900, 0x2aa7, 0x0000 },
+ { 0x9900, 0x2aac, 0x3000 },
+ { 0x9900, 0x2aaa, 0x2000 },
+ { 0x1900, 0x2aa9, 0x0000 },
+ { 0x1900, 0x2aab, 0x0000 },
+ { 0x9900, 0x2aae, 0x2000 },
+ { 0x1900, 0x2aad, 0x0000 },
+ { 0x1900, 0x2aaf, 0x0000 },
+ { 0x9900, 0x2ab8, 0x4000 },
+ { 0x9900, 0x2ab4, 0x3000 },
+ { 0x9900, 0x2ab2, 0x2000 },
+ { 0x1900, 0x2ab1, 0x0000 },
+ { 0x1900, 0x2ab3, 0x0000 },
+ { 0x9900, 0x2ab6, 0x2000 },
+ { 0x1900, 0x2ab5, 0x0000 },
+ { 0x1900, 0x2ab7, 0x0000 },
+ { 0x9900, 0x2abc, 0x3000 },
+ { 0x9900, 0x2aba, 0x2000 },
+ { 0x1900, 0x2ab9, 0x0000 },
+ { 0x1900, 0x2abb, 0x0000 },
+ { 0x9900, 0x2abe, 0x2000 },
+ { 0x1900, 0x2abd, 0x0000 },
+ { 0x1900, 0x2abf, 0x0000 },
+ { 0x9900, 0x2ad0, 0x5000 },
+ { 0x9900, 0x2ac8, 0x4000 },
+ { 0x9900, 0x2ac4, 0x3000 },
+ { 0x9900, 0x2ac2, 0x2000 },
+ { 0x1900, 0x2ac1, 0x0000 },
+ { 0x1900, 0x2ac3, 0x0000 },
+ { 0x9900, 0x2ac6, 0x2000 },
+ { 0x1900, 0x2ac5, 0x0000 },
+ { 0x1900, 0x2ac7, 0x0000 },
+ { 0x9900, 0x2acc, 0x3000 },
+ { 0x9900, 0x2aca, 0x2000 },
+ { 0x1900, 0x2ac9, 0x0000 },
+ { 0x1900, 0x2acb, 0x0000 },
+ { 0x9900, 0x2ace, 0x2000 },
+ { 0x1900, 0x2acd, 0x0000 },
+ { 0x1900, 0x2acf, 0x0000 },
+ { 0x9900, 0x2ad8, 0x4000 },
+ { 0x9900, 0x2ad4, 0x3000 },
+ { 0x9900, 0x2ad2, 0x2000 },
+ { 0x1900, 0x2ad1, 0x0000 },
+ { 0x1900, 0x2ad3, 0x0000 },
+ { 0x9900, 0x2ad6, 0x2000 },
+ { 0x1900, 0x2ad5, 0x0000 },
+ { 0x1900, 0x2ad7, 0x0000 },
+ { 0x9900, 0x2adc, 0x3000 },
+ { 0x9900, 0x2ada, 0x2000 },
+ { 0x1900, 0x2ad9, 0x0000 },
+ { 0x1900, 0x2adb, 0x0000 },
+ { 0x9900, 0x2ade, 0x2000 },
+ { 0x1900, 0x2add, 0x0000 },
+ { 0x1900, 0x2adf, 0x0000 },
+ { 0x9a00, 0x2b00, 0x6000 },
+ { 0x9900, 0x2af0, 0x5000 },
+ { 0x9900, 0x2ae8, 0x4000 },
+ { 0x9900, 0x2ae4, 0x3000 },
+ { 0x9900, 0x2ae2, 0x2000 },
+ { 0x1900, 0x2ae1, 0x0000 },
+ { 0x1900, 0x2ae3, 0x0000 },
+ { 0x9900, 0x2ae6, 0x2000 },
+ { 0x1900, 0x2ae5, 0x0000 },
+ { 0x1900, 0x2ae7, 0x0000 },
+ { 0x9900, 0x2aec, 0x3000 },
+ { 0x9900, 0x2aea, 0x2000 },
+ { 0x1900, 0x2ae9, 0x0000 },
+ { 0x1900, 0x2aeb, 0x0000 },
+ { 0x9900, 0x2aee, 0x2000 },
+ { 0x1900, 0x2aed, 0x0000 },
+ { 0x1900, 0x2aef, 0x0000 },
+ { 0x9900, 0x2af8, 0x4000 },
+ { 0x9900, 0x2af4, 0x3000 },
+ { 0x9900, 0x2af2, 0x2000 },
+ { 0x1900, 0x2af1, 0x0000 },
+ { 0x1900, 0x2af3, 0x0000 },
+ { 0x9900, 0x2af6, 0x2000 },
+ { 0x1900, 0x2af5, 0x0000 },
+ { 0x1900, 0x2af7, 0x0000 },
+ { 0x9900, 0x2afc, 0x3000 },
+ { 0x9900, 0x2afa, 0x2000 },
+ { 0x1900, 0x2af9, 0x0000 },
+ { 0x1900, 0x2afb, 0x0000 },
+ { 0x9900, 0x2afe, 0x2000 },
+ { 0x1900, 0x2afd, 0x0000 },
+ { 0x1900, 0x2aff, 0x0000 },
+ { 0x9a00, 0x2e82, 0x5000 },
+ { 0x9a00, 0x2b08, 0x4000 },
+ { 0x9a00, 0x2b04, 0x3000 },
+ { 0x9a00, 0x2b02, 0x2000 },
+ { 0x1a00, 0x2b01, 0x0000 },
+ { 0x1a00, 0x2b03, 0x0000 },
+ { 0x9a00, 0x2b06, 0x2000 },
+ { 0x1a00, 0x2b05, 0x0000 },
+ { 0x1a00, 0x2b07, 0x0000 },
+ { 0x9a00, 0x2b0c, 0x3000 },
+ { 0x9a00, 0x2b0a, 0x2000 },
+ { 0x1a00, 0x2b09, 0x0000 },
+ { 0x1a00, 0x2b0b, 0x0000 },
+ { 0x9a00, 0x2e80, 0x2000 },
+ { 0x1a00, 0x2b0d, 0x0000 },
+ { 0x1a00, 0x2e81, 0x0000 },
+ { 0x9a00, 0x2e8a, 0x4000 },
+ { 0x9a00, 0x2e86, 0x3000 },
+ { 0x9a00, 0x2e84, 0x2000 },
+ { 0x1a00, 0x2e83, 0x0000 },
+ { 0x1a00, 0x2e85, 0x0000 },
+ { 0x9a00, 0x2e88, 0x2000 },
+ { 0x1a00, 0x2e87, 0x0000 },
+ { 0x1a00, 0x2e89, 0x0000 },
+ { 0x9a00, 0x2e8e, 0x3000 },
+ { 0x9a00, 0x2e8c, 0x2000 },
+ { 0x1a00, 0x2e8b, 0x0000 },
+ { 0x1a00, 0x2e8d, 0x0000 },
+ { 0x9a00, 0x2e90, 0x2000 },
+ { 0x1a00, 0x2e8f, 0x0000 },
+ { 0x1a00, 0x2e91, 0x0000 },
+ { 0x9a00, 0x2ed3, 0x7000 },
+ { 0x9a00, 0x2eb3, 0x6000 },
+ { 0x9a00, 0x2ea3, 0x5000 },
+ { 0x9a00, 0x2e9b, 0x4000 },
+ { 0x9a00, 0x2e96, 0x3000 },
+ { 0x9a00, 0x2e94, 0x2000 },
+ { 0x1a00, 0x2e93, 0x0000 },
+ { 0x1a00, 0x2e95, 0x0000 },
+ { 0x9a00, 0x2e98, 0x2000 },
+ { 0x1a00, 0x2e97, 0x0000 },
+ { 0x1a00, 0x2e99, 0x0000 },
+ { 0x9a00, 0x2e9f, 0x3000 },
+ { 0x9a00, 0x2e9d, 0x2000 },
+ { 0x1a00, 0x2e9c, 0x0000 },
+ { 0x1a00, 0x2e9e, 0x0000 },
+ { 0x9a00, 0x2ea1, 0x2000 },
+ { 0x1a00, 0x2ea0, 0x0000 },
+ { 0x1a00, 0x2ea2, 0x0000 },
+ { 0x9a00, 0x2eab, 0x4000 },
+ { 0x9a00, 0x2ea7, 0x3000 },
+ { 0x9a00, 0x2ea5, 0x2000 },
+ { 0x1a00, 0x2ea4, 0x0000 },
+ { 0x1a00, 0x2ea6, 0x0000 },
+ { 0x9a00, 0x2ea9, 0x2000 },
+ { 0x1a00, 0x2ea8, 0x0000 },
+ { 0x1a00, 0x2eaa, 0x0000 },
+ { 0x9a00, 0x2eaf, 0x3000 },
+ { 0x9a00, 0x2ead, 0x2000 },
+ { 0x1a00, 0x2eac, 0x0000 },
+ { 0x1a00, 0x2eae, 0x0000 },
+ { 0x9a00, 0x2eb1, 0x2000 },
+ { 0x1a00, 0x2eb0, 0x0000 },
+ { 0x1a00, 0x2eb2, 0x0000 },
+ { 0x9a00, 0x2ec3, 0x5000 },
+ { 0x9a00, 0x2ebb, 0x4000 },
+ { 0x9a00, 0x2eb7, 0x3000 },
+ { 0x9a00, 0x2eb5, 0x2000 },
+ { 0x1a00, 0x2eb4, 0x0000 },
+ { 0x1a00, 0x2eb6, 0x0000 },
+ { 0x9a00, 0x2eb9, 0x2000 },
+ { 0x1a00, 0x2eb8, 0x0000 },
+ { 0x1a00, 0x2eba, 0x0000 },
+ { 0x9a00, 0x2ebf, 0x3000 },
+ { 0x9a00, 0x2ebd, 0x2000 },
+ { 0x1a00, 0x2ebc, 0x0000 },
+ { 0x1a00, 0x2ebe, 0x0000 },
+ { 0x9a00, 0x2ec1, 0x2000 },
+ { 0x1a00, 0x2ec0, 0x0000 },
+ { 0x1a00, 0x2ec2, 0x0000 },
+ { 0x9a00, 0x2ecb, 0x4000 },
+ { 0x9a00, 0x2ec7, 0x3000 },
+ { 0x9a00, 0x2ec5, 0x2000 },
+ { 0x1a00, 0x2ec4, 0x0000 },
+ { 0x1a00, 0x2ec6, 0x0000 },
+ { 0x9a00, 0x2ec9, 0x2000 },
+ { 0x1a00, 0x2ec8, 0x0000 },
+ { 0x1a00, 0x2eca, 0x0000 },
+ { 0x9a00, 0x2ecf, 0x3000 },
+ { 0x9a00, 0x2ecd, 0x2000 },
+ { 0x1a00, 0x2ecc, 0x0000 },
+ { 0x1a00, 0x2ece, 0x0000 },
+ { 0x9a00, 0x2ed1, 0x2000 },
+ { 0x1a00, 0x2ed0, 0x0000 },
+ { 0x1a00, 0x2ed2, 0x0000 },
+ { 0x9a00, 0x2ef3, 0x6000 },
+ { 0x9a00, 0x2ee3, 0x5000 },
+ { 0x9a00, 0x2edb, 0x4000 },
+ { 0x9a00, 0x2ed7, 0x3000 },
+ { 0x9a00, 0x2ed5, 0x2000 },
+ { 0x1a00, 0x2ed4, 0x0000 },
+ { 0x1a00, 0x2ed6, 0x0000 },
+ { 0x9a00, 0x2ed9, 0x2000 },
+ { 0x1a00, 0x2ed8, 0x0000 },
+ { 0x1a00, 0x2eda, 0x0000 },
+ { 0x9a00, 0x2edf, 0x3000 },
+ { 0x9a00, 0x2edd, 0x2000 },
+ { 0x1a00, 0x2edc, 0x0000 },
+ { 0x1a00, 0x2ede, 0x0000 },
+ { 0x9a00, 0x2ee1, 0x2000 },
+ { 0x1a00, 0x2ee0, 0x0000 },
+ { 0x1a00, 0x2ee2, 0x0000 },
+ { 0x9a00, 0x2eeb, 0x4000 },
+ { 0x9a00, 0x2ee7, 0x3000 },
+ { 0x9a00, 0x2ee5, 0x2000 },
+ { 0x1a00, 0x2ee4, 0x0000 },
+ { 0x1a00, 0x2ee6, 0x0000 },
+ { 0x9a00, 0x2ee9, 0x2000 },
+ { 0x1a00, 0x2ee8, 0x0000 },
+ { 0x1a00, 0x2eea, 0x0000 },
+ { 0x9a00, 0x2eef, 0x3000 },
+ { 0x9a00, 0x2eed, 0x2000 },
+ { 0x1a00, 0x2eec, 0x0000 },
+ { 0x1a00, 0x2eee, 0x0000 },
+ { 0x9a00, 0x2ef1, 0x2000 },
+ { 0x1a00, 0x2ef0, 0x0000 },
+ { 0x1a00, 0x2ef2, 0x0000 },
+ { 0x9a00, 0x2f0f, 0x5000 },
+ { 0x9a00, 0x2f07, 0x4000 },
+ { 0x9a00, 0x2f03, 0x3000 },
+ { 0x9a00, 0x2f01, 0x2000 },
+ { 0x1a00, 0x2f00, 0x0000 },
+ { 0x1a00, 0x2f02, 0x0000 },
+ { 0x9a00, 0x2f05, 0x2000 },
+ { 0x1a00, 0x2f04, 0x0000 },
+ { 0x1a00, 0x2f06, 0x0000 },
+ { 0x9a00, 0x2f0b, 0x3000 },
+ { 0x9a00, 0x2f09, 0x2000 },
+ { 0x1a00, 0x2f08, 0x0000 },
+ { 0x1a00, 0x2f0a, 0x0000 },
+ { 0x9a00, 0x2f0d, 0x2000 },
+ { 0x1a00, 0x2f0c, 0x0000 },
+ { 0x1a00, 0x2f0e, 0x0000 },
+ { 0x9a00, 0x2f17, 0x4000 },
+ { 0x9a00, 0x2f13, 0x3000 },
+ { 0x9a00, 0x2f11, 0x2000 },
+ { 0x1a00, 0x2f10, 0x0000 },
+ { 0x1a00, 0x2f12, 0x0000 },
+ { 0x9a00, 0x2f15, 0x2000 },
+ { 0x1a00, 0x2f14, 0x0000 },
+ { 0x1a00, 0x2f16, 0x0000 },
+ { 0x9a00, 0x2f1b, 0x3000 },
+ { 0x9a00, 0x2f19, 0x2000 },
+ { 0x1a00, 0x2f18, 0x0000 },
+ { 0x1a00, 0x2f1a, 0x0000 },
+ { 0x9a00, 0x2f1d, 0x2000 },
+ { 0x1a00, 0x2f1c, 0x0000 },
+ { 0x1a00, 0x2f1e, 0x0000 },
+ { 0x8701, 0x00f0, 0xd000 },
+ { 0x8700, 0xa34d, 0xc000 },
+ { 0x9a00, 0x3391, 0xb000 },
+ { 0x8700, 0x3149, 0xa000 },
+ { 0x9500, 0x303d, 0x9000 },
+ { 0x9a00, 0x2f9f, 0x8000 },
+ { 0x9a00, 0x2f5f, 0x7000 },
+ { 0x9a00, 0x2f3f, 0x6000 },
+ { 0x9a00, 0x2f2f, 0x5000 },
+ { 0x9a00, 0x2f27, 0x4000 },
+ { 0x9a00, 0x2f23, 0x3000 },
+ { 0x9a00, 0x2f21, 0x2000 },
+ { 0x1a00, 0x2f20, 0x0000 },
+ { 0x1a00, 0x2f22, 0x0000 },
+ { 0x9a00, 0x2f25, 0x2000 },
+ { 0x1a00, 0x2f24, 0x0000 },
+ { 0x1a00, 0x2f26, 0x0000 },
+ { 0x9a00, 0x2f2b, 0x3000 },
+ { 0x9a00, 0x2f29, 0x2000 },
+ { 0x1a00, 0x2f28, 0x0000 },
+ { 0x1a00, 0x2f2a, 0x0000 },
+ { 0x9a00, 0x2f2d, 0x2000 },
+ { 0x1a00, 0x2f2c, 0x0000 },
+ { 0x1a00, 0x2f2e, 0x0000 },
+ { 0x9a00, 0x2f37, 0x4000 },
+ { 0x9a00, 0x2f33, 0x3000 },
+ { 0x9a00, 0x2f31, 0x2000 },
+ { 0x1a00, 0x2f30, 0x0000 },
+ { 0x1a00, 0x2f32, 0x0000 },
+ { 0x9a00, 0x2f35, 0x2000 },
+ { 0x1a00, 0x2f34, 0x0000 },
+ { 0x1a00, 0x2f36, 0x0000 },
+ { 0x9a00, 0x2f3b, 0x3000 },
+ { 0x9a00, 0x2f39, 0x2000 },
+ { 0x1a00, 0x2f38, 0x0000 },
+ { 0x1a00, 0x2f3a, 0x0000 },
+ { 0x9a00, 0x2f3d, 0x2000 },
+ { 0x1a00, 0x2f3c, 0x0000 },
+ { 0x1a00, 0x2f3e, 0x0000 },
+ { 0x9a00, 0x2f4f, 0x5000 },
+ { 0x9a00, 0x2f47, 0x4000 },
+ { 0x9a00, 0x2f43, 0x3000 },
+ { 0x9a00, 0x2f41, 0x2000 },
+ { 0x1a00, 0x2f40, 0x0000 },
+ { 0x1a00, 0x2f42, 0x0000 },
+ { 0x9a00, 0x2f45, 0x2000 },
+ { 0x1a00, 0x2f44, 0x0000 },
+ { 0x1a00, 0x2f46, 0x0000 },
+ { 0x9a00, 0x2f4b, 0x3000 },
+ { 0x9a00, 0x2f49, 0x2000 },
+ { 0x1a00, 0x2f48, 0x0000 },
+ { 0x1a00, 0x2f4a, 0x0000 },
+ { 0x9a00, 0x2f4d, 0x2000 },
+ { 0x1a00, 0x2f4c, 0x0000 },
+ { 0x1a00, 0x2f4e, 0x0000 },
+ { 0x9a00, 0x2f57, 0x4000 },
+ { 0x9a00, 0x2f53, 0x3000 },
+ { 0x9a00, 0x2f51, 0x2000 },
+ { 0x1a00, 0x2f50, 0x0000 },
+ { 0x1a00, 0x2f52, 0x0000 },
+ { 0x9a00, 0x2f55, 0x2000 },
+ { 0x1a00, 0x2f54, 0x0000 },
+ { 0x1a00, 0x2f56, 0x0000 },
+ { 0x9a00, 0x2f5b, 0x3000 },
+ { 0x9a00, 0x2f59, 0x2000 },
+ { 0x1a00, 0x2f58, 0x0000 },
+ { 0x1a00, 0x2f5a, 0x0000 },
+ { 0x9a00, 0x2f5d, 0x2000 },
+ { 0x1a00, 0x2f5c, 0x0000 },
+ { 0x1a00, 0x2f5e, 0x0000 },
+ { 0x9a00, 0x2f7f, 0x6000 },
+ { 0x9a00, 0x2f6f, 0x5000 },
+ { 0x9a00, 0x2f67, 0x4000 },
+ { 0x9a00, 0x2f63, 0x3000 },
+ { 0x9a00, 0x2f61, 0x2000 },
+ { 0x1a00, 0x2f60, 0x0000 },
+ { 0x1a00, 0x2f62, 0x0000 },
+ { 0x9a00, 0x2f65, 0x2000 },
+ { 0x1a00, 0x2f64, 0x0000 },
+ { 0x1a00, 0x2f66, 0x0000 },
+ { 0x9a00, 0x2f6b, 0x3000 },
+ { 0x9a00, 0x2f69, 0x2000 },
+ { 0x1a00, 0x2f68, 0x0000 },
+ { 0x1a00, 0x2f6a, 0x0000 },
+ { 0x9a00, 0x2f6d, 0x2000 },
+ { 0x1a00, 0x2f6c, 0x0000 },
+ { 0x1a00, 0x2f6e, 0x0000 },
+ { 0x9a00, 0x2f77, 0x4000 },
+ { 0x9a00, 0x2f73, 0x3000 },
+ { 0x9a00, 0x2f71, 0x2000 },
+ { 0x1a00, 0x2f70, 0x0000 },
+ { 0x1a00, 0x2f72, 0x0000 },
+ { 0x9a00, 0x2f75, 0x2000 },
+ { 0x1a00, 0x2f74, 0x0000 },
+ { 0x1a00, 0x2f76, 0x0000 },
+ { 0x9a00, 0x2f7b, 0x3000 },
+ { 0x9a00, 0x2f79, 0x2000 },
+ { 0x1a00, 0x2f78, 0x0000 },
+ { 0x1a00, 0x2f7a, 0x0000 },
+ { 0x9a00, 0x2f7d, 0x2000 },
+ { 0x1a00, 0x2f7c, 0x0000 },
+ { 0x1a00, 0x2f7e, 0x0000 },
+ { 0x9a00, 0x2f8f, 0x5000 },
+ { 0x9a00, 0x2f87, 0x4000 },
+ { 0x9a00, 0x2f83, 0x3000 },
+ { 0x9a00, 0x2f81, 0x2000 },
+ { 0x1a00, 0x2f80, 0x0000 },
+ { 0x1a00, 0x2f82, 0x0000 },
+ { 0x9a00, 0x2f85, 0x2000 },
+ { 0x1a00, 0x2f84, 0x0000 },
+ { 0x1a00, 0x2f86, 0x0000 },
+ { 0x9a00, 0x2f8b, 0x3000 },
+ { 0x9a00, 0x2f89, 0x2000 },
+ { 0x1a00, 0x2f88, 0x0000 },
+ { 0x1a00, 0x2f8a, 0x0000 },
+ { 0x9a00, 0x2f8d, 0x2000 },
+ { 0x1a00, 0x2f8c, 0x0000 },
+ { 0x1a00, 0x2f8e, 0x0000 },
+ { 0x9a00, 0x2f97, 0x4000 },
+ { 0x9a00, 0x2f93, 0x3000 },
+ { 0x9a00, 0x2f91, 0x2000 },
+ { 0x1a00, 0x2f90, 0x0000 },
+ { 0x1a00, 0x2f92, 0x0000 },
+ { 0x9a00, 0x2f95, 0x2000 },
+ { 0x1a00, 0x2f94, 0x0000 },
+ { 0x1a00, 0x2f96, 0x0000 },
+ { 0x9a00, 0x2f9b, 0x3000 },
+ { 0x9a00, 0x2f99, 0x2000 },
+ { 0x1a00, 0x2f98, 0x0000 },
+ { 0x1a00, 0x2f9a, 0x0000 },
+ { 0x9a00, 0x2f9d, 0x2000 },
+ { 0x1a00, 0x2f9c, 0x0000 },
+ { 0x1a00, 0x2f9e, 0x0000 },
+ { 0x9a00, 0x2ff9, 0x7000 },
+ { 0x9a00, 0x2fbf, 0x6000 },
+ { 0x9a00, 0x2faf, 0x5000 },
+ { 0x9a00, 0x2fa7, 0x4000 },
+ { 0x9a00, 0x2fa3, 0x3000 },
+ { 0x9a00, 0x2fa1, 0x2000 },
+ { 0x1a00, 0x2fa0, 0x0000 },
+ { 0x1a00, 0x2fa2, 0x0000 },
+ { 0x9a00, 0x2fa5, 0x2000 },
+ { 0x1a00, 0x2fa4, 0x0000 },
+ { 0x1a00, 0x2fa6, 0x0000 },
+ { 0x9a00, 0x2fab, 0x3000 },
+ { 0x9a00, 0x2fa9, 0x2000 },
+ { 0x1a00, 0x2fa8, 0x0000 },
+ { 0x1a00, 0x2faa, 0x0000 },
+ { 0x9a00, 0x2fad, 0x2000 },
+ { 0x1a00, 0x2fac, 0x0000 },
+ { 0x1a00, 0x2fae, 0x0000 },
+ { 0x9a00, 0x2fb7, 0x4000 },
+ { 0x9a00, 0x2fb3, 0x3000 },
+ { 0x9a00, 0x2fb1, 0x2000 },
+ { 0x1a00, 0x2fb0, 0x0000 },
+ { 0x1a00, 0x2fb2, 0x0000 },
+ { 0x9a00, 0x2fb5, 0x2000 },
+ { 0x1a00, 0x2fb4, 0x0000 },
+ { 0x1a00, 0x2fb6, 0x0000 },
+ { 0x9a00, 0x2fbb, 0x3000 },
+ { 0x9a00, 0x2fb9, 0x2000 },
+ { 0x1a00, 0x2fb8, 0x0000 },
+ { 0x1a00, 0x2fba, 0x0000 },
+ { 0x9a00, 0x2fbd, 0x2000 },
+ { 0x1a00, 0x2fbc, 0x0000 },
+ { 0x1a00, 0x2fbe, 0x0000 },
+ { 0x9a00, 0x2fcf, 0x5000 },
+ { 0x9a00, 0x2fc7, 0x4000 },
+ { 0x9a00, 0x2fc3, 0x3000 },
+ { 0x9a00, 0x2fc1, 0x2000 },
+ { 0x1a00, 0x2fc0, 0x0000 },
+ { 0x1a00, 0x2fc2, 0x0000 },
+ { 0x9a00, 0x2fc5, 0x2000 },
+ { 0x1a00, 0x2fc4, 0x0000 },
+ { 0x1a00, 0x2fc6, 0x0000 },
+ { 0x9a00, 0x2fcb, 0x3000 },
+ { 0x9a00, 0x2fc9, 0x2000 },
+ { 0x1a00, 0x2fc8, 0x0000 },
+ { 0x1a00, 0x2fca, 0x0000 },
+ { 0x9a00, 0x2fcd, 0x2000 },
+ { 0x1a00, 0x2fcc, 0x0000 },
+ { 0x1a00, 0x2fce, 0x0000 },
+ { 0x9a00, 0x2ff1, 0x4000 },
+ { 0x9a00, 0x2fd3, 0x3000 },
+ { 0x9a00, 0x2fd1, 0x2000 },
+ { 0x1a00, 0x2fd0, 0x0000 },
+ { 0x1a00, 0x2fd2, 0x0000 },
+ { 0x9a00, 0x2fd5, 0x2000 },
+ { 0x1a00, 0x2fd4, 0x0000 },
+ { 0x1a00, 0x2ff0, 0x0000 },
+ { 0x9a00, 0x2ff5, 0x3000 },
+ { 0x9a00, 0x2ff3, 0x2000 },
+ { 0x1a00, 0x2ff2, 0x0000 },
+ { 0x1a00, 0x2ff4, 0x0000 },
+ { 0x9a00, 0x2ff7, 0x2000 },
+ { 0x1a00, 0x2ff6, 0x0000 },
+ { 0x1a00, 0x2ff8, 0x0000 },
+ { 0x9600, 0x301d, 0x6000 },
+ { 0x9200, 0x300d, 0x5000 },
+ { 0x8600, 0x3005, 0x4000 },
+ { 0x9500, 0x3001, 0x3000 },
+ { 0x9a00, 0x2ffb, 0x2000 },
+ { 0x1a00, 0x2ffa, 0x0000 },
+ { 0x1d00, 0x3000, 0x0000 },
+ { 0x9500, 0x3003, 0x2000 },
+ { 0x1500, 0x3002, 0x0000 },
+ { 0x1a00, 0x3004, 0x0000 },
+ { 0x9200, 0x3009, 0x3000 },
+ { 0x8e00, 0x3007, 0x2000 },
+ { 0x0700, 0x3006, 0x0000 },
+ { 0x1600, 0x3008, 0x0000 },
+ { 0x9200, 0x300b, 0x2000 },
+ { 0x1600, 0x300a, 0x0000 },
+ { 0x1600, 0x300c, 0x0000 },
+ { 0x9200, 0x3015, 0x4000 },
+ { 0x9200, 0x3011, 0x3000 },
+ { 0x9200, 0x300f, 0x2000 },
+ { 0x1600, 0x300e, 0x0000 },
+ { 0x1600, 0x3010, 0x0000 },
+ { 0x9a00, 0x3013, 0x2000 },
+ { 0x1a00, 0x3012, 0x0000 },
+ { 0x1600, 0x3014, 0x0000 },
+ { 0x9200, 0x3019, 0x3000 },
+ { 0x9200, 0x3017, 0x2000 },
+ { 0x1600, 0x3016, 0x0000 },
+ { 0x1600, 0x3018, 0x0000 },
+ { 0x9200, 0x301b, 0x2000 },
+ { 0x1600, 0x301a, 0x0000 },
+ { 0x1100, 0x301c, 0x0000 },
+ { 0x8c00, 0x302d, 0x5000 },
+ { 0x8e00, 0x3025, 0x4000 },
+ { 0x8e00, 0x3021, 0x3000 },
+ { 0x9200, 0x301f, 0x2000 },
+ { 0x1200, 0x301e, 0x0000 },
+ { 0x1a00, 0x3020, 0x0000 },
+ { 0x8e00, 0x3023, 0x2000 },
+ { 0x0e00, 0x3022, 0x0000 },
+ { 0x0e00, 0x3024, 0x0000 },
+ { 0x8e00, 0x3029, 0x3000 },
+ { 0x8e00, 0x3027, 0x2000 },
+ { 0x0e00, 0x3026, 0x0000 },
+ { 0x0e00, 0x3028, 0x0000 },
+ { 0x8c00, 0x302b, 0x2000 },
+ { 0x0c00, 0x302a, 0x0000 },
+ { 0x0c00, 0x302c, 0x0000 },
+ { 0x8600, 0x3035, 0x4000 },
+ { 0x8600, 0x3031, 0x3000 },
+ { 0x8c00, 0x302f, 0x2000 },
+ { 0x0c00, 0x302e, 0x0000 },
+ { 0x1100, 0x3030, 0x0000 },
+ { 0x8600, 0x3033, 0x2000 },
+ { 0x0600, 0x3032, 0x0000 },
+ { 0x0600, 0x3034, 0x0000 },
+ { 0x8e00, 0x3039, 0x3000 },
+ { 0x9a00, 0x3037, 0x2000 },
+ { 0x1a00, 0x3036, 0x0000 },
+ { 0x0e00, 0x3038, 0x0000 },
+ { 0x8600, 0x303b, 0x2000 },
+ { 0x0e00, 0x303a, 0x0000 },
+ { 0x0700, 0x303c, 0x0000 },
+ { 0x8700, 0x30c0, 0x8000 },
+ { 0x8700, 0x307e, 0x7000 },
+ { 0x8700, 0x305e, 0x6000 },
+ { 0x8700, 0x304e, 0x5000 },
+ { 0x8700, 0x3046, 0x4000 },
+ { 0x8700, 0x3042, 0x3000 },
+ { 0x9a00, 0x303f, 0x2000 },
+ { 0x1a00, 0x303e, 0x0000 },
+ { 0x0700, 0x3041, 0x0000 },
+ { 0x8700, 0x3044, 0x2000 },
+ { 0x0700, 0x3043, 0x0000 },
+ { 0x0700, 0x3045, 0x0000 },
+ { 0x8700, 0x304a, 0x3000 },
+ { 0x8700, 0x3048, 0x2000 },
+ { 0x0700, 0x3047, 0x0000 },
+ { 0x0700, 0x3049, 0x0000 },
+ { 0x8700, 0x304c, 0x2000 },
+ { 0x0700, 0x304b, 0x0000 },
+ { 0x0700, 0x304d, 0x0000 },
+ { 0x8700, 0x3056, 0x4000 },
+ { 0x8700, 0x3052, 0x3000 },
+ { 0x8700, 0x3050, 0x2000 },
+ { 0x0700, 0x304f, 0x0000 },
+ { 0x0700, 0x3051, 0x0000 },
+ { 0x8700, 0x3054, 0x2000 },
+ { 0x0700, 0x3053, 0x0000 },
+ { 0x0700, 0x3055, 0x0000 },
+ { 0x8700, 0x305a, 0x3000 },
+ { 0x8700, 0x3058, 0x2000 },
+ { 0x0700, 0x3057, 0x0000 },
+ { 0x0700, 0x3059, 0x0000 },
+ { 0x8700, 0x305c, 0x2000 },
+ { 0x0700, 0x305b, 0x0000 },
+ { 0x0700, 0x305d, 0x0000 },
+ { 0x8700, 0x306e, 0x5000 },
+ { 0x8700, 0x3066, 0x4000 },
+ { 0x8700, 0x3062, 0x3000 },
+ { 0x8700, 0x3060, 0x2000 },
+ { 0x0700, 0x305f, 0x0000 },
+ { 0x0700, 0x3061, 0x0000 },
+ { 0x8700, 0x3064, 0x2000 },
+ { 0x0700, 0x3063, 0x0000 },
+ { 0x0700, 0x3065, 0x0000 },
+ { 0x8700, 0x306a, 0x3000 },
+ { 0x8700, 0x3068, 0x2000 },
+ { 0x0700, 0x3067, 0x0000 },
+ { 0x0700, 0x3069, 0x0000 },
+ { 0x8700, 0x306c, 0x2000 },
+ { 0x0700, 0x306b, 0x0000 },
+ { 0x0700, 0x306d, 0x0000 },
+ { 0x8700, 0x3076, 0x4000 },
+ { 0x8700, 0x3072, 0x3000 },
+ { 0x8700, 0x3070, 0x2000 },
+ { 0x0700, 0x306f, 0x0000 },
+ { 0x0700, 0x3071, 0x0000 },
+ { 0x8700, 0x3074, 0x2000 },
+ { 0x0700, 0x3073, 0x0000 },
+ { 0x0700, 0x3075, 0x0000 },
+ { 0x8700, 0x307a, 0x3000 },
+ { 0x8700, 0x3078, 0x2000 },
+ { 0x0700, 0x3077, 0x0000 },
+ { 0x0700, 0x3079, 0x0000 },
+ { 0x8700, 0x307c, 0x2000 },
+ { 0x0700, 0x307b, 0x0000 },
+ { 0x0700, 0x307d, 0x0000 },
+ { 0x9100, 0x30a0, 0x6000 },
+ { 0x8700, 0x308e, 0x5000 },
+ { 0x8700, 0x3086, 0x4000 },
+ { 0x8700, 0x3082, 0x3000 },
+ { 0x8700, 0x3080, 0x2000 },
+ { 0x0700, 0x307f, 0x0000 },
+ { 0x0700, 0x3081, 0x0000 },
+ { 0x8700, 0x3084, 0x2000 },
+ { 0x0700, 0x3083, 0x0000 },
+ { 0x0700, 0x3085, 0x0000 },
+ { 0x8700, 0x308a, 0x3000 },
+ { 0x8700, 0x3088, 0x2000 },
+ { 0x0700, 0x3087, 0x0000 },
+ { 0x0700, 0x3089, 0x0000 },
+ { 0x8700, 0x308c, 0x2000 },
+ { 0x0700, 0x308b, 0x0000 },
+ { 0x0700, 0x308d, 0x0000 },
+ { 0x8700, 0x3096, 0x4000 },
+ { 0x8700, 0x3092, 0x3000 },
+ { 0x8700, 0x3090, 0x2000 },
+ { 0x0700, 0x308f, 0x0000 },
+ { 0x0700, 0x3091, 0x0000 },
+ { 0x8700, 0x3094, 0x2000 },
+ { 0x0700, 0x3093, 0x0000 },
+ { 0x0700, 0x3095, 0x0000 },
+ { 0x9800, 0x309c, 0x3000 },
+ { 0x8c00, 0x309a, 0x2000 },
+ { 0x0c00, 0x3099, 0x0000 },
+ { 0x1800, 0x309b, 0x0000 },
+ { 0x8600, 0x309e, 0x2000 },
+ { 0x0600, 0x309d, 0x0000 },
+ { 0x0700, 0x309f, 0x0000 },
+ { 0x8700, 0x30b0, 0x5000 },
+ { 0x8700, 0x30a8, 0x4000 },
+ { 0x8700, 0x30a4, 0x3000 },
+ { 0x8700, 0x30a2, 0x2000 },
+ { 0x0700, 0x30a1, 0x0000 },
+ { 0x0700, 0x30a3, 0x0000 },
+ { 0x8700, 0x30a6, 0x2000 },
+ { 0x0700, 0x30a5, 0x0000 },
+ { 0x0700, 0x30a7, 0x0000 },
+ { 0x8700, 0x30ac, 0x3000 },
+ { 0x8700, 0x30aa, 0x2000 },
+ { 0x0700, 0x30a9, 0x0000 },
+ { 0x0700, 0x30ab, 0x0000 },
+ { 0x8700, 0x30ae, 0x2000 },
+ { 0x0700, 0x30ad, 0x0000 },
+ { 0x0700, 0x30af, 0x0000 },
+ { 0x8700, 0x30b8, 0x4000 },
+ { 0x8700, 0x30b4, 0x3000 },
+ { 0x8700, 0x30b2, 0x2000 },
+ { 0x0700, 0x30b1, 0x0000 },
+ { 0x0700, 0x30b3, 0x0000 },
+ { 0x8700, 0x30b6, 0x2000 },
+ { 0x0700, 0x30b5, 0x0000 },
+ { 0x0700, 0x30b7, 0x0000 },
+ { 0x8700, 0x30bc, 0x3000 },
+ { 0x8700, 0x30ba, 0x2000 },
+ { 0x0700, 0x30b9, 0x0000 },
+ { 0x0700, 0x30bb, 0x0000 },
+ { 0x8700, 0x30be, 0x2000 },
+ { 0x0700, 0x30bd, 0x0000 },
+ { 0x0700, 0x30bf, 0x0000 },
+ { 0x8700, 0x3105, 0x7000 },
+ { 0x8700, 0x30e0, 0x6000 },
+ { 0x8700, 0x30d0, 0x5000 },
+ { 0x8700, 0x30c8, 0x4000 },
+ { 0x8700, 0x30c4, 0x3000 },
+ { 0x8700, 0x30c2, 0x2000 },
+ { 0x0700, 0x30c1, 0x0000 },
+ { 0x0700, 0x30c3, 0x0000 },
+ { 0x8700, 0x30c6, 0x2000 },
+ { 0x0700, 0x30c5, 0x0000 },
+ { 0x0700, 0x30c7, 0x0000 },
+ { 0x8700, 0x30cc, 0x3000 },
+ { 0x8700, 0x30ca, 0x2000 },
+ { 0x0700, 0x30c9, 0x0000 },
+ { 0x0700, 0x30cb, 0x0000 },
+ { 0x8700, 0x30ce, 0x2000 },
+ { 0x0700, 0x30cd, 0x0000 },
+ { 0x0700, 0x30cf, 0x0000 },
+ { 0x8700, 0x30d8, 0x4000 },
+ { 0x8700, 0x30d4, 0x3000 },
+ { 0x8700, 0x30d2, 0x2000 },
+ { 0x0700, 0x30d1, 0x0000 },
+ { 0x0700, 0x30d3, 0x0000 },
+ { 0x8700, 0x30d6, 0x2000 },
+ { 0x0700, 0x30d5, 0x0000 },
+ { 0x0700, 0x30d7, 0x0000 },
+ { 0x8700, 0x30dc, 0x3000 },
+ { 0x8700, 0x30da, 0x2000 },
+ { 0x0700, 0x30d9, 0x0000 },
+ { 0x0700, 0x30db, 0x0000 },
+ { 0x8700, 0x30de, 0x2000 },
+ { 0x0700, 0x30dd, 0x0000 },
+ { 0x0700, 0x30df, 0x0000 },
+ { 0x8700, 0x30f0, 0x5000 },
+ { 0x8700, 0x30e8, 0x4000 },
+ { 0x8700, 0x30e4, 0x3000 },
+ { 0x8700, 0x30e2, 0x2000 },
+ { 0x0700, 0x30e1, 0x0000 },
+ { 0x0700, 0x30e3, 0x0000 },
+ { 0x8700, 0x30e6, 0x2000 },
+ { 0x0700, 0x30e5, 0x0000 },
+ { 0x0700, 0x30e7, 0x0000 },
+ { 0x8700, 0x30ec, 0x3000 },
+ { 0x8700, 0x30ea, 0x2000 },
+ { 0x0700, 0x30e9, 0x0000 },
+ { 0x0700, 0x30eb, 0x0000 },
+ { 0x8700, 0x30ee, 0x2000 },
+ { 0x0700, 0x30ed, 0x0000 },
+ { 0x0700, 0x30ef, 0x0000 },
+ { 0x8700, 0x30f8, 0x4000 },
+ { 0x8700, 0x30f4, 0x3000 },
+ { 0x8700, 0x30f2, 0x2000 },
+ { 0x0700, 0x30f1, 0x0000 },
+ { 0x0700, 0x30f3, 0x0000 },
+ { 0x8700, 0x30f6, 0x2000 },
+ { 0x0700, 0x30f5, 0x0000 },
+ { 0x0700, 0x30f7, 0x0000 },
+ { 0x8600, 0x30fc, 0x3000 },
+ { 0x8700, 0x30fa, 0x2000 },
+ { 0x0700, 0x30f9, 0x0000 },
+ { 0x1000, 0x30fb, 0x0000 },
+ { 0x8600, 0x30fe, 0x2000 },
+ { 0x0600, 0x30fd, 0x0000 },
+ { 0x0700, 0x30ff, 0x0000 },
+ { 0x8700, 0x3125, 0x6000 },
+ { 0x8700, 0x3115, 0x5000 },
+ { 0x8700, 0x310d, 0x4000 },
+ { 0x8700, 0x3109, 0x3000 },
+ { 0x8700, 0x3107, 0x2000 },
+ { 0x0700, 0x3106, 0x0000 },
+ { 0x0700, 0x3108, 0x0000 },
+ { 0x8700, 0x310b, 0x2000 },
+ { 0x0700, 0x310a, 0x0000 },
+ { 0x0700, 0x310c, 0x0000 },
+ { 0x8700, 0x3111, 0x3000 },
+ { 0x8700, 0x310f, 0x2000 },
+ { 0x0700, 0x310e, 0x0000 },
+ { 0x0700, 0x3110, 0x0000 },
+ { 0x8700, 0x3113, 0x2000 },
+ { 0x0700, 0x3112, 0x0000 },
+ { 0x0700, 0x3114, 0x0000 },
+ { 0x8700, 0x311d, 0x4000 },
+ { 0x8700, 0x3119, 0x3000 },
+ { 0x8700, 0x3117, 0x2000 },
+ { 0x0700, 0x3116, 0x0000 },
+ { 0x0700, 0x3118, 0x0000 },
+ { 0x8700, 0x311b, 0x2000 },
+ { 0x0700, 0x311a, 0x0000 },
+ { 0x0700, 0x311c, 0x0000 },
+ { 0x8700, 0x3121, 0x3000 },
+ { 0x8700, 0x311f, 0x2000 },
+ { 0x0700, 0x311e, 0x0000 },
+ { 0x0700, 0x3120, 0x0000 },
+ { 0x8700, 0x3123, 0x2000 },
+ { 0x0700, 0x3122, 0x0000 },
+ { 0x0700, 0x3124, 0x0000 },
+ { 0x8700, 0x3139, 0x5000 },
+ { 0x8700, 0x3131, 0x4000 },
+ { 0x8700, 0x3129, 0x3000 },
+ { 0x8700, 0x3127, 0x2000 },
+ { 0x0700, 0x3126, 0x0000 },
+ { 0x0700, 0x3128, 0x0000 },
+ { 0x8700, 0x312b, 0x2000 },
+ { 0x0700, 0x312a, 0x0000 },
+ { 0x0700, 0x312c, 0x0000 },
+ { 0x8700, 0x3135, 0x3000 },
+ { 0x8700, 0x3133, 0x2000 },
+ { 0x0700, 0x3132, 0x0000 },
+ { 0x0700, 0x3134, 0x0000 },
+ { 0x8700, 0x3137, 0x2000 },
+ { 0x0700, 0x3136, 0x0000 },
+ { 0x0700, 0x3138, 0x0000 },
+ { 0x8700, 0x3141, 0x4000 },
+ { 0x8700, 0x313d, 0x3000 },
+ { 0x8700, 0x313b, 0x2000 },
+ { 0x0700, 0x313a, 0x0000 },
+ { 0x0700, 0x313c, 0x0000 },
+ { 0x8700, 0x313f, 0x2000 },
+ { 0x0700, 0x313e, 0x0000 },
+ { 0x0700, 0x3140, 0x0000 },
+ { 0x8700, 0x3145, 0x3000 },
+ { 0x8700, 0x3143, 0x2000 },
+ { 0x0700, 0x3142, 0x0000 },
+ { 0x0700, 0x3144, 0x0000 },
+ { 0x8700, 0x3147, 0x2000 },
+ { 0x0700, 0x3146, 0x0000 },
+ { 0x0700, 0x3148, 0x0000 },
+ { 0x9a00, 0x3290, 0x9000 },
+ { 0x9a00, 0x3202, 0x8000 },
+ { 0x8700, 0x3189, 0x7000 },
+ { 0x8700, 0x3169, 0x6000 },
+ { 0x8700, 0x3159, 0x5000 },
+ { 0x8700, 0x3151, 0x4000 },
+ { 0x8700, 0x314d, 0x3000 },
+ { 0x8700, 0x314b, 0x2000 },
+ { 0x0700, 0x314a, 0x0000 },
+ { 0x0700, 0x314c, 0x0000 },
+ { 0x8700, 0x314f, 0x2000 },
+ { 0x0700, 0x314e, 0x0000 },
+ { 0x0700, 0x3150, 0x0000 },
+ { 0x8700, 0x3155, 0x3000 },
+ { 0x8700, 0x3153, 0x2000 },
+ { 0x0700, 0x3152, 0x0000 },
+ { 0x0700, 0x3154, 0x0000 },
+ { 0x8700, 0x3157, 0x2000 },
+ { 0x0700, 0x3156, 0x0000 },
+ { 0x0700, 0x3158, 0x0000 },
+ { 0x8700, 0x3161, 0x4000 },
+ { 0x8700, 0x315d, 0x3000 },
+ { 0x8700, 0x315b, 0x2000 },
+ { 0x0700, 0x315a, 0x0000 },
+ { 0x0700, 0x315c, 0x0000 },
+ { 0x8700, 0x315f, 0x2000 },
+ { 0x0700, 0x315e, 0x0000 },
+ { 0x0700, 0x3160, 0x0000 },
+ { 0x8700, 0x3165, 0x3000 },
+ { 0x8700, 0x3163, 0x2000 },
+ { 0x0700, 0x3162, 0x0000 },
+ { 0x0700, 0x3164, 0x0000 },
+ { 0x8700, 0x3167, 0x2000 },
+ { 0x0700, 0x3166, 0x0000 },
+ { 0x0700, 0x3168, 0x0000 },
+ { 0x8700, 0x3179, 0x5000 },
+ { 0x8700, 0x3171, 0x4000 },
+ { 0x8700, 0x316d, 0x3000 },
+ { 0x8700, 0x316b, 0x2000 },
+ { 0x0700, 0x316a, 0x0000 },
+ { 0x0700, 0x316c, 0x0000 },
+ { 0x8700, 0x316f, 0x2000 },
+ { 0x0700, 0x316e, 0x0000 },
+ { 0x0700, 0x3170, 0x0000 },
+ { 0x8700, 0x3175, 0x3000 },
+ { 0x8700, 0x3173, 0x2000 },
+ { 0x0700, 0x3172, 0x0000 },
+ { 0x0700, 0x3174, 0x0000 },
+ { 0x8700, 0x3177, 0x2000 },
+ { 0x0700, 0x3176, 0x0000 },
+ { 0x0700, 0x3178, 0x0000 },
+ { 0x8700, 0x3181, 0x4000 },
+ { 0x8700, 0x317d, 0x3000 },
+ { 0x8700, 0x317b, 0x2000 },
+ { 0x0700, 0x317a, 0x0000 },
+ { 0x0700, 0x317c, 0x0000 },
+ { 0x8700, 0x317f, 0x2000 },
+ { 0x0700, 0x317e, 0x0000 },
+ { 0x0700, 0x3180, 0x0000 },
+ { 0x8700, 0x3185, 0x3000 },
+ { 0x8700, 0x3183, 0x2000 },
+ { 0x0700, 0x3182, 0x0000 },
+ { 0x0700, 0x3184, 0x0000 },
+ { 0x8700, 0x3187, 0x2000 },
+ { 0x0700, 0x3186, 0x0000 },
+ { 0x0700, 0x3188, 0x0000 },
+ { 0x8700, 0x31aa, 0x6000 },
+ { 0x9a00, 0x319a, 0x5000 },
+ { 0x8f00, 0x3192, 0x4000 },
+ { 0x8700, 0x318d, 0x3000 },
+ { 0x8700, 0x318b, 0x2000 },
+ { 0x0700, 0x318a, 0x0000 },
+ { 0x0700, 0x318c, 0x0000 },
+ { 0x9a00, 0x3190, 0x2000 },
+ { 0x0700, 0x318e, 0x0000 },
+ { 0x1a00, 0x3191, 0x0000 },
+ { 0x9a00, 0x3196, 0x3000 },
+ { 0x8f00, 0x3194, 0x2000 },
+ { 0x0f00, 0x3193, 0x0000 },
+ { 0x0f00, 0x3195, 0x0000 },
+ { 0x9a00, 0x3198, 0x2000 },
+ { 0x1a00, 0x3197, 0x0000 },
+ { 0x1a00, 0x3199, 0x0000 },
+ { 0x8700, 0x31a2, 0x4000 },
+ { 0x9a00, 0x319e, 0x3000 },
+ { 0x9a00, 0x319c, 0x2000 },
+ { 0x1a00, 0x319b, 0x0000 },
+ { 0x1a00, 0x319d, 0x0000 },
+ { 0x8700, 0x31a0, 0x2000 },
+ { 0x1a00, 0x319f, 0x0000 },
+ { 0x0700, 0x31a1, 0x0000 },
+ { 0x8700, 0x31a6, 0x3000 },
+ { 0x8700, 0x31a4, 0x2000 },
+ { 0x0700, 0x31a3, 0x0000 },
+ { 0x0700, 0x31a5, 0x0000 },
+ { 0x8700, 0x31a8, 0x2000 },
+ { 0x0700, 0x31a7, 0x0000 },
+ { 0x0700, 0x31a9, 0x0000 },
+ { 0x8700, 0x31f2, 0x5000 },
+ { 0x8700, 0x31b2, 0x4000 },
+ { 0x8700, 0x31ae, 0x3000 },
+ { 0x8700, 0x31ac, 0x2000 },
+ { 0x0700, 0x31ab, 0x0000 },
+ { 0x0700, 0x31ad, 0x0000 },
+ { 0x8700, 0x31b0, 0x2000 },
+ { 0x0700, 0x31af, 0x0000 },
+ { 0x0700, 0x31b1, 0x0000 },
+ { 0x8700, 0x31b6, 0x3000 },
+ { 0x8700, 0x31b4, 0x2000 },
+ { 0x0700, 0x31b3, 0x0000 },
+ { 0x0700, 0x31b5, 0x0000 },
+ { 0x8700, 0x31f0, 0x2000 },
+ { 0x0700, 0x31b7, 0x0000 },
+ { 0x0700, 0x31f1, 0x0000 },
+ { 0x8700, 0x31fa, 0x4000 },
+ { 0x8700, 0x31f6, 0x3000 },
+ { 0x8700, 0x31f4, 0x2000 },
+ { 0x0700, 0x31f3, 0x0000 },
+ { 0x0700, 0x31f5, 0x0000 },
+ { 0x8700, 0x31f8, 0x2000 },
+ { 0x0700, 0x31f7, 0x0000 },
+ { 0x0700, 0x31f9, 0x0000 },
+ { 0x8700, 0x31fe, 0x3000 },
+ { 0x8700, 0x31fc, 0x2000 },
+ { 0x0700, 0x31fb, 0x0000 },
+ { 0x0700, 0x31fd, 0x0000 },
+ { 0x9a00, 0x3200, 0x2000 },
+ { 0x0700, 0x31ff, 0x0000 },
+ { 0x1a00, 0x3201, 0x0000 },
+ { 0x9a00, 0x3243, 0x7000 },
+ { 0x8f00, 0x3223, 0x6000 },
+ { 0x9a00, 0x3212, 0x5000 },
+ { 0x9a00, 0x320a, 0x4000 },
+ { 0x9a00, 0x3206, 0x3000 },
+ { 0x9a00, 0x3204, 0x2000 },
+ { 0x1a00, 0x3203, 0x0000 },
+ { 0x1a00, 0x3205, 0x0000 },
+ { 0x9a00, 0x3208, 0x2000 },
+ { 0x1a00, 0x3207, 0x0000 },
+ { 0x1a00, 0x3209, 0x0000 },
+ { 0x9a00, 0x320e, 0x3000 },
+ { 0x9a00, 0x320c, 0x2000 },
+ { 0x1a00, 0x320b, 0x0000 },
+ { 0x1a00, 0x320d, 0x0000 },
+ { 0x9a00, 0x3210, 0x2000 },
+ { 0x1a00, 0x320f, 0x0000 },
+ { 0x1a00, 0x3211, 0x0000 },
+ { 0x9a00, 0x321a, 0x4000 },
+ { 0x9a00, 0x3216, 0x3000 },
+ { 0x9a00, 0x3214, 0x2000 },
+ { 0x1a00, 0x3213, 0x0000 },
+ { 0x1a00, 0x3215, 0x0000 },
+ { 0x9a00, 0x3218, 0x2000 },
+ { 0x1a00, 0x3217, 0x0000 },
+ { 0x1a00, 0x3219, 0x0000 },
+ { 0x9a00, 0x321e, 0x3000 },
+ { 0x9a00, 0x321c, 0x2000 },
+ { 0x1a00, 0x321b, 0x0000 },
+ { 0x1a00, 0x321d, 0x0000 },
+ { 0x8f00, 0x3221, 0x2000 },
+ { 0x0f00, 0x3220, 0x0000 },
+ { 0x0f00, 0x3222, 0x0000 },
+ { 0x9a00, 0x3233, 0x5000 },
+ { 0x9a00, 0x322b, 0x4000 },
+ { 0x8f00, 0x3227, 0x3000 },
+ { 0x8f00, 0x3225, 0x2000 },
+ { 0x0f00, 0x3224, 0x0000 },
+ { 0x0f00, 0x3226, 0x0000 },
+ { 0x8f00, 0x3229, 0x2000 },
+ { 0x0f00, 0x3228, 0x0000 },
+ { 0x1a00, 0x322a, 0x0000 },
+ { 0x9a00, 0x322f, 0x3000 },
+ { 0x9a00, 0x322d, 0x2000 },
+ { 0x1a00, 0x322c, 0x0000 },
+ { 0x1a00, 0x322e, 0x0000 },
+ { 0x9a00, 0x3231, 0x2000 },
+ { 0x1a00, 0x3230, 0x0000 },
+ { 0x1a00, 0x3232, 0x0000 },
+ { 0x9a00, 0x323b, 0x4000 },
+ { 0x9a00, 0x3237, 0x3000 },
+ { 0x9a00, 0x3235, 0x2000 },
+ { 0x1a00, 0x3234, 0x0000 },
+ { 0x1a00, 0x3236, 0x0000 },
+ { 0x9a00, 0x3239, 0x2000 },
+ { 0x1a00, 0x3238, 0x0000 },
+ { 0x1a00, 0x323a, 0x0000 },
+ { 0x9a00, 0x323f, 0x3000 },
+ { 0x9a00, 0x323d, 0x2000 },
+ { 0x1a00, 0x323c, 0x0000 },
+ { 0x1a00, 0x323e, 0x0000 },
+ { 0x9a00, 0x3241, 0x2000 },
+ { 0x1a00, 0x3240, 0x0000 },
+ { 0x1a00, 0x3242, 0x0000 },
+ { 0x9a00, 0x326f, 0x6000 },
+ { 0x8f00, 0x325f, 0x5000 },
+ { 0x8f00, 0x3257, 0x4000 },
+ { 0x8f00, 0x3253, 0x3000 },
+ { 0x8f00, 0x3251, 0x2000 },
+ { 0x1a00, 0x3250, 0x0000 },
+ { 0x0f00, 0x3252, 0x0000 },
+ { 0x8f00, 0x3255, 0x2000 },
+ { 0x0f00, 0x3254, 0x0000 },
+ { 0x0f00, 0x3256, 0x0000 },
+ { 0x8f00, 0x325b, 0x3000 },
+ { 0x8f00, 0x3259, 0x2000 },
+ { 0x0f00, 0x3258, 0x0000 },
+ { 0x0f00, 0x325a, 0x0000 },
+ { 0x8f00, 0x325d, 0x2000 },
+ { 0x0f00, 0x325c, 0x0000 },
+ { 0x0f00, 0x325e, 0x0000 },
+ { 0x9a00, 0x3267, 0x4000 },
+ { 0x9a00, 0x3263, 0x3000 },
+ { 0x9a00, 0x3261, 0x2000 },
+ { 0x1a00, 0x3260, 0x0000 },
+ { 0x1a00, 0x3262, 0x0000 },
+ { 0x9a00, 0x3265, 0x2000 },
+ { 0x1a00, 0x3264, 0x0000 },
+ { 0x1a00, 0x3266, 0x0000 },
+ { 0x9a00, 0x326b, 0x3000 },
+ { 0x9a00, 0x3269, 0x2000 },
+ { 0x1a00, 0x3268, 0x0000 },
+ { 0x1a00, 0x326a, 0x0000 },
+ { 0x9a00, 0x326d, 0x2000 },
+ { 0x1a00, 0x326c, 0x0000 },
+ { 0x1a00, 0x326e, 0x0000 },
+ { 0x8f00, 0x3280, 0x5000 },
+ { 0x9a00, 0x3277, 0x4000 },
+ { 0x9a00, 0x3273, 0x3000 },
+ { 0x9a00, 0x3271, 0x2000 },
+ { 0x1a00, 0x3270, 0x0000 },
+ { 0x1a00, 0x3272, 0x0000 },
+ { 0x9a00, 0x3275, 0x2000 },
+ { 0x1a00, 0x3274, 0x0000 },
+ { 0x1a00, 0x3276, 0x0000 },
+ { 0x9a00, 0x327b, 0x3000 },
+ { 0x9a00, 0x3279, 0x2000 },
+ { 0x1a00, 0x3278, 0x0000 },
+ { 0x1a00, 0x327a, 0x0000 },
+ { 0x9a00, 0x327d, 0x2000 },
+ { 0x1a00, 0x327c, 0x0000 },
+ { 0x1a00, 0x327f, 0x0000 },
+ { 0x8f00, 0x3288, 0x4000 },
+ { 0x8f00, 0x3284, 0x3000 },
+ { 0x8f00, 0x3282, 0x2000 },
+ { 0x0f00, 0x3281, 0x0000 },
+ { 0x0f00, 0x3283, 0x0000 },
+ { 0x8f00, 0x3286, 0x2000 },
+ { 0x0f00, 0x3285, 0x0000 },
+ { 0x0f00, 0x3287, 0x0000 },
+ { 0x9a00, 0x328c, 0x3000 },
+ { 0x9a00, 0x328a, 0x2000 },
+ { 0x0f00, 0x3289, 0x0000 },
+ { 0x1a00, 0x328b, 0x0000 },
+ { 0x9a00, 0x328e, 0x2000 },
+ { 0x1a00, 0x328d, 0x0000 },
+ { 0x1a00, 0x328f, 0x0000 },
+ { 0x9a00, 0x3311, 0x8000 },
+ { 0x9a00, 0x32d0, 0x7000 },
+ { 0x9a00, 0x32b0, 0x6000 },
+ { 0x9a00, 0x32a0, 0x5000 },
+ { 0x9a00, 0x3298, 0x4000 },
+ { 0x9a00, 0x3294, 0x3000 },
+ { 0x9a00, 0x3292, 0x2000 },
+ { 0x1a00, 0x3291, 0x0000 },
+ { 0x1a00, 0x3293, 0x0000 },
+ { 0x9a00, 0x3296, 0x2000 },
+ { 0x1a00, 0x3295, 0x0000 },
+ { 0x1a00, 0x3297, 0x0000 },
+ { 0x9a00, 0x329c, 0x3000 },
+ { 0x9a00, 0x329a, 0x2000 },
+ { 0x1a00, 0x3299, 0x0000 },
+ { 0x1a00, 0x329b, 0x0000 },
+ { 0x9a00, 0x329e, 0x2000 },
+ { 0x1a00, 0x329d, 0x0000 },
+ { 0x1a00, 0x329f, 0x0000 },
+ { 0x9a00, 0x32a8, 0x4000 },
+ { 0x9a00, 0x32a4, 0x3000 },
+ { 0x9a00, 0x32a2, 0x2000 },
+ { 0x1a00, 0x32a1, 0x0000 },
+ { 0x1a00, 0x32a3, 0x0000 },
+ { 0x9a00, 0x32a6, 0x2000 },
+ { 0x1a00, 0x32a5, 0x0000 },
+ { 0x1a00, 0x32a7, 0x0000 },
+ { 0x9a00, 0x32ac, 0x3000 },
+ { 0x9a00, 0x32aa, 0x2000 },
+ { 0x1a00, 0x32a9, 0x0000 },
+ { 0x1a00, 0x32ab, 0x0000 },
+ { 0x9a00, 0x32ae, 0x2000 },
+ { 0x1a00, 0x32ad, 0x0000 },
+ { 0x1a00, 0x32af, 0x0000 },
+ { 0x9a00, 0x32c0, 0x5000 },
+ { 0x8f00, 0x32b8, 0x4000 },
+ { 0x8f00, 0x32b4, 0x3000 },
+ { 0x8f00, 0x32b2, 0x2000 },
+ { 0x0f00, 0x32b1, 0x0000 },
+ { 0x0f00, 0x32b3, 0x0000 },
+ { 0x8f00, 0x32b6, 0x2000 },
+ { 0x0f00, 0x32b5, 0x0000 },
+ { 0x0f00, 0x32b7, 0x0000 },
+ { 0x8f00, 0x32bc, 0x3000 },
+ { 0x8f00, 0x32ba, 0x2000 },
+ { 0x0f00, 0x32b9, 0x0000 },
+ { 0x0f00, 0x32bb, 0x0000 },
+ { 0x8f00, 0x32be, 0x2000 },
+ { 0x0f00, 0x32bd, 0x0000 },
+ { 0x0f00, 0x32bf, 0x0000 },
+ { 0x9a00, 0x32c8, 0x4000 },
+ { 0x9a00, 0x32c4, 0x3000 },
+ { 0x9a00, 0x32c2, 0x2000 },
+ { 0x1a00, 0x32c1, 0x0000 },
+ { 0x1a00, 0x32c3, 0x0000 },
+ { 0x9a00, 0x32c6, 0x2000 },
+ { 0x1a00, 0x32c5, 0x0000 },
+ { 0x1a00, 0x32c7, 0x0000 },
+ { 0x9a00, 0x32cc, 0x3000 },
+ { 0x9a00, 0x32ca, 0x2000 },
+ { 0x1a00, 0x32c9, 0x0000 },
+ { 0x1a00, 0x32cb, 0x0000 },
+ { 0x9a00, 0x32ce, 0x2000 },
+ { 0x1a00, 0x32cd, 0x0000 },
+ { 0x1a00, 0x32cf, 0x0000 },
+ { 0x9a00, 0x32f0, 0x6000 },
+ { 0x9a00, 0x32e0, 0x5000 },
+ { 0x9a00, 0x32d8, 0x4000 },
+ { 0x9a00, 0x32d4, 0x3000 },
+ { 0x9a00, 0x32d2, 0x2000 },
+ { 0x1a00, 0x32d1, 0x0000 },
+ { 0x1a00, 0x32d3, 0x0000 },
+ { 0x9a00, 0x32d6, 0x2000 },
+ { 0x1a00, 0x32d5, 0x0000 },
+ { 0x1a00, 0x32d7, 0x0000 },
+ { 0x9a00, 0x32dc, 0x3000 },
+ { 0x9a00, 0x32da, 0x2000 },
+ { 0x1a00, 0x32d9, 0x0000 },
+ { 0x1a00, 0x32db, 0x0000 },
+ { 0x9a00, 0x32de, 0x2000 },
+ { 0x1a00, 0x32dd, 0x0000 },
+ { 0x1a00, 0x32df, 0x0000 },
+ { 0x9a00, 0x32e8, 0x4000 },
+ { 0x9a00, 0x32e4, 0x3000 },
+ { 0x9a00, 0x32e2, 0x2000 },
+ { 0x1a00, 0x32e1, 0x0000 },
+ { 0x1a00, 0x32e3, 0x0000 },
+ { 0x9a00, 0x32e6, 0x2000 },
+ { 0x1a00, 0x32e5, 0x0000 },
+ { 0x1a00, 0x32e7, 0x0000 },
+ { 0x9a00, 0x32ec, 0x3000 },
+ { 0x9a00, 0x32ea, 0x2000 },
+ { 0x1a00, 0x32e9, 0x0000 },
+ { 0x1a00, 0x32eb, 0x0000 },
+ { 0x9a00, 0x32ee, 0x2000 },
+ { 0x1a00, 0x32ed, 0x0000 },
+ { 0x1a00, 0x32ef, 0x0000 },
+ { 0x9a00, 0x3301, 0x5000 },
+ { 0x9a00, 0x32f8, 0x4000 },
+ { 0x9a00, 0x32f4, 0x3000 },
+ { 0x9a00, 0x32f2, 0x2000 },
+ { 0x1a00, 0x32f1, 0x0000 },
+ { 0x1a00, 0x32f3, 0x0000 },
+ { 0x9a00, 0x32f6, 0x2000 },
+ { 0x1a00, 0x32f5, 0x0000 },
+ { 0x1a00, 0x32f7, 0x0000 },
+ { 0x9a00, 0x32fc, 0x3000 },
+ { 0x9a00, 0x32fa, 0x2000 },
+ { 0x1a00, 0x32f9, 0x0000 },
+ { 0x1a00, 0x32fb, 0x0000 },
+ { 0x9a00, 0x32fe, 0x2000 },
+ { 0x1a00, 0x32fd, 0x0000 },
+ { 0x1a00, 0x3300, 0x0000 },
+ { 0x9a00, 0x3309, 0x4000 },
+ { 0x9a00, 0x3305, 0x3000 },
+ { 0x9a00, 0x3303, 0x2000 },
+ { 0x1a00, 0x3302, 0x0000 },
+ { 0x1a00, 0x3304, 0x0000 },
+ { 0x9a00, 0x3307, 0x2000 },
+ { 0x1a00, 0x3306, 0x0000 },
+ { 0x1a00, 0x3308, 0x0000 },
+ { 0x9a00, 0x330d, 0x3000 },
+ { 0x9a00, 0x330b, 0x2000 },
+ { 0x1a00, 0x330a, 0x0000 },
+ { 0x1a00, 0x330c, 0x0000 },
+ { 0x9a00, 0x330f, 0x2000 },
+ { 0x1a00, 0x330e, 0x0000 },
+ { 0x1a00, 0x3310, 0x0000 },
+ { 0x9a00, 0x3351, 0x7000 },
+ { 0x9a00, 0x3331, 0x6000 },
+ { 0x9a00, 0x3321, 0x5000 },
+ { 0x9a00, 0x3319, 0x4000 },
+ { 0x9a00, 0x3315, 0x3000 },
+ { 0x9a00, 0x3313, 0x2000 },
+ { 0x1a00, 0x3312, 0x0000 },
+ { 0x1a00, 0x3314, 0x0000 },
+ { 0x9a00, 0x3317, 0x2000 },
+ { 0x1a00, 0x3316, 0x0000 },
+ { 0x1a00, 0x3318, 0x0000 },
+ { 0x9a00, 0x331d, 0x3000 },
+ { 0x9a00, 0x331b, 0x2000 },
+ { 0x1a00, 0x331a, 0x0000 },
+ { 0x1a00, 0x331c, 0x0000 },
+ { 0x9a00, 0x331f, 0x2000 },
+ { 0x1a00, 0x331e, 0x0000 },
+ { 0x1a00, 0x3320, 0x0000 },
+ { 0x9a00, 0x3329, 0x4000 },
+ { 0x9a00, 0x3325, 0x3000 },
+ { 0x9a00, 0x3323, 0x2000 },
+ { 0x1a00, 0x3322, 0x0000 },
+ { 0x1a00, 0x3324, 0x0000 },
+ { 0x9a00, 0x3327, 0x2000 },
+ { 0x1a00, 0x3326, 0x0000 },
+ { 0x1a00, 0x3328, 0x0000 },
+ { 0x9a00, 0x332d, 0x3000 },
+ { 0x9a00, 0x332b, 0x2000 },
+ { 0x1a00, 0x332a, 0x0000 },
+ { 0x1a00, 0x332c, 0x0000 },
+ { 0x9a00, 0x332f, 0x2000 },
+ { 0x1a00, 0x332e, 0x0000 },
+ { 0x1a00, 0x3330, 0x0000 },
+ { 0x9a00, 0x3341, 0x5000 },
+ { 0x9a00, 0x3339, 0x4000 },
+ { 0x9a00, 0x3335, 0x3000 },
+ { 0x9a00, 0x3333, 0x2000 },
+ { 0x1a00, 0x3332, 0x0000 },
+ { 0x1a00, 0x3334, 0x0000 },
+ { 0x9a00, 0x3337, 0x2000 },
+ { 0x1a00, 0x3336, 0x0000 },
+ { 0x1a00, 0x3338, 0x0000 },
+ { 0x9a00, 0x333d, 0x3000 },
+ { 0x9a00, 0x333b, 0x2000 },
+ { 0x1a00, 0x333a, 0x0000 },
+ { 0x1a00, 0x333c, 0x0000 },
+ { 0x9a00, 0x333f, 0x2000 },
+ { 0x1a00, 0x333e, 0x0000 },
+ { 0x1a00, 0x3340, 0x0000 },
+ { 0x9a00, 0x3349, 0x4000 },
+ { 0x9a00, 0x3345, 0x3000 },
+ { 0x9a00, 0x3343, 0x2000 },
+ { 0x1a00, 0x3342, 0x0000 },
+ { 0x1a00, 0x3344, 0x0000 },
+ { 0x9a00, 0x3347, 0x2000 },
+ { 0x1a00, 0x3346, 0x0000 },
+ { 0x1a00, 0x3348, 0x0000 },
+ { 0x9a00, 0x334d, 0x3000 },
+ { 0x9a00, 0x334b, 0x2000 },
+ { 0x1a00, 0x334a, 0x0000 },
+ { 0x1a00, 0x334c, 0x0000 },
+ { 0x9a00, 0x334f, 0x2000 },
+ { 0x1a00, 0x334e, 0x0000 },
+ { 0x1a00, 0x3350, 0x0000 },
+ { 0x9a00, 0x3371, 0x6000 },
+ { 0x9a00, 0x3361, 0x5000 },
+ { 0x9a00, 0x3359, 0x4000 },
+ { 0x9a00, 0x3355, 0x3000 },
+ { 0x9a00, 0x3353, 0x2000 },
+ { 0x1a00, 0x3352, 0x0000 },
+ { 0x1a00, 0x3354, 0x0000 },
+ { 0x9a00, 0x3357, 0x2000 },
+ { 0x1a00, 0x3356, 0x0000 },
+ { 0x1a00, 0x3358, 0x0000 },
+ { 0x9a00, 0x335d, 0x3000 },
+ { 0x9a00, 0x335b, 0x2000 },
+ { 0x1a00, 0x335a, 0x0000 },
+ { 0x1a00, 0x335c, 0x0000 },
+ { 0x9a00, 0x335f, 0x2000 },
+ { 0x1a00, 0x335e, 0x0000 },
+ { 0x1a00, 0x3360, 0x0000 },
+ { 0x9a00, 0x3369, 0x4000 },
+ { 0x9a00, 0x3365, 0x3000 },
+ { 0x9a00, 0x3363, 0x2000 },
+ { 0x1a00, 0x3362, 0x0000 },
+ { 0x1a00, 0x3364, 0x0000 },
+ { 0x9a00, 0x3367, 0x2000 },
+ { 0x1a00, 0x3366, 0x0000 },
+ { 0x1a00, 0x3368, 0x0000 },
+ { 0x9a00, 0x336d, 0x3000 },
+ { 0x9a00, 0x336b, 0x2000 },
+ { 0x1a00, 0x336a, 0x0000 },
+ { 0x1a00, 0x336c, 0x0000 },
+ { 0x9a00, 0x336f, 0x2000 },
+ { 0x1a00, 0x336e, 0x0000 },
+ { 0x1a00, 0x3370, 0x0000 },
+ { 0x9a00, 0x3381, 0x5000 },
+ { 0x9a00, 0x3379, 0x4000 },
+ { 0x9a00, 0x3375, 0x3000 },
+ { 0x9a00, 0x3373, 0x2000 },
+ { 0x1a00, 0x3372, 0x0000 },
+ { 0x1a00, 0x3374, 0x0000 },
+ { 0x9a00, 0x3377, 0x2000 },
+ { 0x1a00, 0x3376, 0x0000 },
+ { 0x1a00, 0x3378, 0x0000 },
+ { 0x9a00, 0x337d, 0x3000 },
+ { 0x9a00, 0x337b, 0x2000 },
+ { 0x1a00, 0x337a, 0x0000 },
+ { 0x1a00, 0x337c, 0x0000 },
+ { 0x9a00, 0x337f, 0x2000 },
+ { 0x1a00, 0x337e, 0x0000 },
+ { 0x1a00, 0x3380, 0x0000 },
+ { 0x9a00, 0x3389, 0x4000 },
+ { 0x9a00, 0x3385, 0x3000 },
+ { 0x9a00, 0x3383, 0x2000 },
+ { 0x1a00, 0x3382, 0x0000 },
+ { 0x1a00, 0x3384, 0x0000 },
+ { 0x9a00, 0x3387, 0x2000 },
+ { 0x1a00, 0x3386, 0x0000 },
+ { 0x1a00, 0x3388, 0x0000 },
+ { 0x9a00, 0x338d, 0x3000 },
+ { 0x9a00, 0x338b, 0x2000 },
+ { 0x1a00, 0x338a, 0x0000 },
+ { 0x1a00, 0x338c, 0x0000 },
+ { 0x9a00, 0x338f, 0x2000 },
+ { 0x1a00, 0x338e, 0x0000 },
+ { 0x1a00, 0x3390, 0x0000 },
+ { 0x8700, 0xa14d, 0xa000 },
+ { 0x8700, 0xa04d, 0x9000 },
+ { 0x9a00, 0x4dcf, 0x8000 },
+ { 0x9a00, 0x33d1, 0x7000 },
+ { 0x9a00, 0x33b1, 0x6000 },
+ { 0x9a00, 0x33a1, 0x5000 },
+ { 0x9a00, 0x3399, 0x4000 },
+ { 0x9a00, 0x3395, 0x3000 },
+ { 0x9a00, 0x3393, 0x2000 },
+ { 0x1a00, 0x3392, 0x0000 },
+ { 0x1a00, 0x3394, 0x0000 },
+ { 0x9a00, 0x3397, 0x2000 },
+ { 0x1a00, 0x3396, 0x0000 },
+ { 0x1a00, 0x3398, 0x0000 },
+ { 0x9a00, 0x339d, 0x3000 },
+ { 0x9a00, 0x339b, 0x2000 },
+ { 0x1a00, 0x339a, 0x0000 },
+ { 0x1a00, 0x339c, 0x0000 },
+ { 0x9a00, 0x339f, 0x2000 },
+ { 0x1a00, 0x339e, 0x0000 },
+ { 0x1a00, 0x33a0, 0x0000 },
+ { 0x9a00, 0x33a9, 0x4000 },
+ { 0x9a00, 0x33a5, 0x3000 },
+ { 0x9a00, 0x33a3, 0x2000 },
+ { 0x1a00, 0x33a2, 0x0000 },
+ { 0x1a00, 0x33a4, 0x0000 },
+ { 0x9a00, 0x33a7, 0x2000 },
+ { 0x1a00, 0x33a6, 0x0000 },
+ { 0x1a00, 0x33a8, 0x0000 },
+ { 0x9a00, 0x33ad, 0x3000 },
+ { 0x9a00, 0x33ab, 0x2000 },
+ { 0x1a00, 0x33aa, 0x0000 },
+ { 0x1a00, 0x33ac, 0x0000 },
+ { 0x9a00, 0x33af, 0x2000 },
+ { 0x1a00, 0x33ae, 0x0000 },
+ { 0x1a00, 0x33b0, 0x0000 },
+ { 0x9a00, 0x33c1, 0x5000 },
+ { 0x9a00, 0x33b9, 0x4000 },
+ { 0x9a00, 0x33b5, 0x3000 },
+ { 0x9a00, 0x33b3, 0x2000 },
+ { 0x1a00, 0x33b2, 0x0000 },
+ { 0x1a00, 0x33b4, 0x0000 },
+ { 0x9a00, 0x33b7, 0x2000 },
+ { 0x1a00, 0x33b6, 0x0000 },
+ { 0x1a00, 0x33b8, 0x0000 },
+ { 0x9a00, 0x33bd, 0x3000 },
+ { 0x9a00, 0x33bb, 0x2000 },
+ { 0x1a00, 0x33ba, 0x0000 },
+ { 0x1a00, 0x33bc, 0x0000 },
+ { 0x9a00, 0x33bf, 0x2000 },
+ { 0x1a00, 0x33be, 0x0000 },
+ { 0x1a00, 0x33c0, 0x0000 },
+ { 0x9a00, 0x33c9, 0x4000 },
+ { 0x9a00, 0x33c5, 0x3000 },
+ { 0x9a00, 0x33c3, 0x2000 },
+ { 0x1a00, 0x33c2, 0x0000 },
+ { 0x1a00, 0x33c4, 0x0000 },
+ { 0x9a00, 0x33c7, 0x2000 },
+ { 0x1a00, 0x33c6, 0x0000 },
+ { 0x1a00, 0x33c8, 0x0000 },
+ { 0x9a00, 0x33cd, 0x3000 },
+ { 0x9a00, 0x33cb, 0x2000 },
+ { 0x1a00, 0x33ca, 0x0000 },
+ { 0x1a00, 0x33cc, 0x0000 },
+ { 0x9a00, 0x33cf, 0x2000 },
+ { 0x1a00, 0x33ce, 0x0000 },
+ { 0x1a00, 0x33d0, 0x0000 },
+ { 0x9a00, 0x33f1, 0x6000 },
+ { 0x9a00, 0x33e1, 0x5000 },
+ { 0x9a00, 0x33d9, 0x4000 },
+ { 0x9a00, 0x33d5, 0x3000 },
+ { 0x9a00, 0x33d3, 0x2000 },
+ { 0x1a00, 0x33d2, 0x0000 },
+ { 0x1a00, 0x33d4, 0x0000 },
+ { 0x9a00, 0x33d7, 0x2000 },
+ { 0x1a00, 0x33d6, 0x0000 },
+ { 0x1a00, 0x33d8, 0x0000 },
+ { 0x9a00, 0x33dd, 0x3000 },
+ { 0x9a00, 0x33db, 0x2000 },
+ { 0x1a00, 0x33da, 0x0000 },
+ { 0x1a00, 0x33dc, 0x0000 },
+ { 0x9a00, 0x33df, 0x2000 },
+ { 0x1a00, 0x33de, 0x0000 },
+ { 0x1a00, 0x33e0, 0x0000 },
+ { 0x9a00, 0x33e9, 0x4000 },
+ { 0x9a00, 0x33e5, 0x3000 },
+ { 0x9a00, 0x33e3, 0x2000 },
+ { 0x1a00, 0x33e2, 0x0000 },
+ { 0x1a00, 0x33e4, 0x0000 },
+ { 0x9a00, 0x33e7, 0x2000 },
+ { 0x1a00, 0x33e6, 0x0000 },
+ { 0x1a00, 0x33e8, 0x0000 },
+ { 0x9a00, 0x33ed, 0x3000 },
+ { 0x9a00, 0x33eb, 0x2000 },
+ { 0x1a00, 0x33ea, 0x0000 },
+ { 0x1a00, 0x33ec, 0x0000 },
+ { 0x9a00, 0x33ef, 0x2000 },
+ { 0x1a00, 0x33ee, 0x0000 },
+ { 0x1a00, 0x33f0, 0x0000 },
+ { 0x8700, 0x4db5, 0x5000 },
+ { 0x9a00, 0x33f9, 0x4000 },
+ { 0x9a00, 0x33f5, 0x3000 },
+ { 0x9a00, 0x33f3, 0x2000 },
+ { 0x1a00, 0x33f2, 0x0000 },
+ { 0x1a00, 0x33f4, 0x0000 },
+ { 0x9a00, 0x33f7, 0x2000 },
+ { 0x1a00, 0x33f6, 0x0000 },
+ { 0x1a00, 0x33f8, 0x0000 },
+ { 0x9a00, 0x33fd, 0x3000 },
+ { 0x9a00, 0x33fb, 0x2000 },
+ { 0x1a00, 0x33fa, 0x0000 },
+ { 0x1a00, 0x33fc, 0x0000 },
+ { 0x9a00, 0x33ff, 0x2000 },
+ { 0x1a00, 0x33fe, 0x0000 },
+ { 0x0700, 0x3400, 0x0000 },
+ { 0x9a00, 0x4dc7, 0x4000 },
+ { 0x9a00, 0x4dc3, 0x3000 },
+ { 0x9a00, 0x4dc1, 0x2000 },
+ { 0x1a00, 0x4dc0, 0x0000 },
+ { 0x1a00, 0x4dc2, 0x0000 },
+ { 0x9a00, 0x4dc5, 0x2000 },
+ { 0x1a00, 0x4dc4, 0x0000 },
+ { 0x1a00, 0x4dc6, 0x0000 },
+ { 0x9a00, 0x4dcb, 0x3000 },
+ { 0x9a00, 0x4dc9, 0x2000 },
+ { 0x1a00, 0x4dc8, 0x0000 },
+ { 0x1a00, 0x4dca, 0x0000 },
+ { 0x9a00, 0x4dcd, 0x2000 },
+ { 0x1a00, 0x4dcc, 0x0000 },
+ { 0x1a00, 0x4dce, 0x0000 },
+ { 0x8700, 0xa00d, 0x7000 },
+ { 0x9a00, 0x4def, 0x6000 },
+ { 0x9a00, 0x4ddf, 0x5000 },
+ { 0x9a00, 0x4dd7, 0x4000 },
+ { 0x9a00, 0x4dd3, 0x3000 },
+ { 0x9a00, 0x4dd1, 0x2000 },
+ { 0x1a00, 0x4dd0, 0x0000 },
+ { 0x1a00, 0x4dd2, 0x0000 },
+ { 0x9a00, 0x4dd5, 0x2000 },
+ { 0x1a00, 0x4dd4, 0x0000 },
+ { 0x1a00, 0x4dd6, 0x0000 },
+ { 0x9a00, 0x4ddb, 0x3000 },
+ { 0x9a00, 0x4dd9, 0x2000 },
+ { 0x1a00, 0x4dd8, 0x0000 },
+ { 0x1a00, 0x4dda, 0x0000 },
+ { 0x9a00, 0x4ddd, 0x2000 },
+ { 0x1a00, 0x4ddc, 0x0000 },
+ { 0x1a00, 0x4dde, 0x0000 },
+ { 0x9a00, 0x4de7, 0x4000 },
+ { 0x9a00, 0x4de3, 0x3000 },
+ { 0x9a00, 0x4de1, 0x2000 },
+ { 0x1a00, 0x4de0, 0x0000 },
+ { 0x1a00, 0x4de2, 0x0000 },
+ { 0x9a00, 0x4de5, 0x2000 },
+ { 0x1a00, 0x4de4, 0x0000 },
+ { 0x1a00, 0x4de6, 0x0000 },
+ { 0x9a00, 0x4deb, 0x3000 },
+ { 0x9a00, 0x4de9, 0x2000 },
+ { 0x1a00, 0x4de8, 0x0000 },
+ { 0x1a00, 0x4dea, 0x0000 },
+ { 0x9a00, 0x4ded, 0x2000 },
+ { 0x1a00, 0x4dec, 0x0000 },
+ { 0x1a00, 0x4dee, 0x0000 },
+ { 0x9a00, 0x4dff, 0x5000 },
+ { 0x9a00, 0x4df7, 0x4000 },
+ { 0x9a00, 0x4df3, 0x3000 },
+ { 0x9a00, 0x4df1, 0x2000 },
+ { 0x1a00, 0x4df0, 0x0000 },
+ { 0x1a00, 0x4df2, 0x0000 },
+ { 0x9a00, 0x4df5, 0x2000 },
+ { 0x1a00, 0x4df4, 0x0000 },
+ { 0x1a00, 0x4df6, 0x0000 },
+ { 0x9a00, 0x4dfb, 0x3000 },
+ { 0x9a00, 0x4df9, 0x2000 },
+ { 0x1a00, 0x4df8, 0x0000 },
+ { 0x1a00, 0x4dfa, 0x0000 },
+ { 0x9a00, 0x4dfd, 0x2000 },
+ { 0x1a00, 0x4dfc, 0x0000 },
+ { 0x1a00, 0x4dfe, 0x0000 },
+ { 0x8700, 0xa005, 0x4000 },
+ { 0x8700, 0xa001, 0x3000 },
+ { 0x8700, 0x9fa5, 0x2000 },
+ { 0x0700, 0x4e00, 0x0000 },
+ { 0x0700, 0xa000, 0x0000 },
+ { 0x8700, 0xa003, 0x2000 },
+ { 0x0700, 0xa002, 0x0000 },
+ { 0x0700, 0xa004, 0x0000 },
+ { 0x8700, 0xa009, 0x3000 },
+ { 0x8700, 0xa007, 0x2000 },
+ { 0x0700, 0xa006, 0x0000 },
+ { 0x0700, 0xa008, 0x0000 },
+ { 0x8700, 0xa00b, 0x2000 },
+ { 0x0700, 0xa00a, 0x0000 },
+ { 0x0700, 0xa00c, 0x0000 },
+ { 0x8700, 0xa02d, 0x6000 },
+ { 0x8700, 0xa01d, 0x5000 },
+ { 0x8700, 0xa015, 0x4000 },
+ { 0x8700, 0xa011, 0x3000 },
+ { 0x8700, 0xa00f, 0x2000 },
+ { 0x0700, 0xa00e, 0x0000 },
+ { 0x0700, 0xa010, 0x0000 },
+ { 0x8700, 0xa013, 0x2000 },
+ { 0x0700, 0xa012, 0x0000 },
+ { 0x0700, 0xa014, 0x0000 },
+ { 0x8700, 0xa019, 0x3000 },
+ { 0x8700, 0xa017, 0x2000 },
+ { 0x0700, 0xa016, 0x0000 },
+ { 0x0700, 0xa018, 0x0000 },
+ { 0x8700, 0xa01b, 0x2000 },
+ { 0x0700, 0xa01a, 0x0000 },
+ { 0x0700, 0xa01c, 0x0000 },
+ { 0x8700, 0xa025, 0x4000 },
+ { 0x8700, 0xa021, 0x3000 },
+ { 0x8700, 0xa01f, 0x2000 },
+ { 0x0700, 0xa01e, 0x0000 },
+ { 0x0700, 0xa020, 0x0000 },
+ { 0x8700, 0xa023, 0x2000 },
+ { 0x0700, 0xa022, 0x0000 },
+ { 0x0700, 0xa024, 0x0000 },
+ { 0x8700, 0xa029, 0x3000 },
+ { 0x8700, 0xa027, 0x2000 },
+ { 0x0700, 0xa026, 0x0000 },
+ { 0x0700, 0xa028, 0x0000 },
+ { 0x8700, 0xa02b, 0x2000 },
+ { 0x0700, 0xa02a, 0x0000 },
+ { 0x0700, 0xa02c, 0x0000 },
+ { 0x8700, 0xa03d, 0x5000 },
+ { 0x8700, 0xa035, 0x4000 },
+ { 0x8700, 0xa031, 0x3000 },
+ { 0x8700, 0xa02f, 0x2000 },
+ { 0x0700, 0xa02e, 0x0000 },
+ { 0x0700, 0xa030, 0x0000 },
+ { 0x8700, 0xa033, 0x2000 },
+ { 0x0700, 0xa032, 0x0000 },
+ { 0x0700, 0xa034, 0x0000 },
+ { 0x8700, 0xa039, 0x3000 },
+ { 0x8700, 0xa037, 0x2000 },
+ { 0x0700, 0xa036, 0x0000 },
+ { 0x0700, 0xa038, 0x0000 },
+ { 0x8700, 0xa03b, 0x2000 },
+ { 0x0700, 0xa03a, 0x0000 },
+ { 0x0700, 0xa03c, 0x0000 },
+ { 0x8700, 0xa045, 0x4000 },
+ { 0x8700, 0xa041, 0x3000 },
+ { 0x8700, 0xa03f, 0x2000 },
+ { 0x0700, 0xa03e, 0x0000 },
+ { 0x0700, 0xa040, 0x0000 },
+ { 0x8700, 0xa043, 0x2000 },
+ { 0x0700, 0xa042, 0x0000 },
+ { 0x0700, 0xa044, 0x0000 },
+ { 0x8700, 0xa049, 0x3000 },
+ { 0x8700, 0xa047, 0x2000 },
+ { 0x0700, 0xa046, 0x0000 },
+ { 0x0700, 0xa048, 0x0000 },
+ { 0x8700, 0xa04b, 0x2000 },
+ { 0x0700, 0xa04a, 0x0000 },
+ { 0x0700, 0xa04c, 0x0000 },
+ { 0x8700, 0xa0cd, 0x8000 },
+ { 0x8700, 0xa08d, 0x7000 },
+ { 0x8700, 0xa06d, 0x6000 },
+ { 0x8700, 0xa05d, 0x5000 },
+ { 0x8700, 0xa055, 0x4000 },
+ { 0x8700, 0xa051, 0x3000 },
+ { 0x8700, 0xa04f, 0x2000 },
+ { 0x0700, 0xa04e, 0x0000 },
+ { 0x0700, 0xa050, 0x0000 },
+ { 0x8700, 0xa053, 0x2000 },
+ { 0x0700, 0xa052, 0x0000 },
+ { 0x0700, 0xa054, 0x0000 },
+ { 0x8700, 0xa059, 0x3000 },
+ { 0x8700, 0xa057, 0x2000 },
+ { 0x0700, 0xa056, 0x0000 },
+ { 0x0700, 0xa058, 0x0000 },
+ { 0x8700, 0xa05b, 0x2000 },
+ { 0x0700, 0xa05a, 0x0000 },
+ { 0x0700, 0xa05c, 0x0000 },
+ { 0x8700, 0xa065, 0x4000 },
+ { 0x8700, 0xa061, 0x3000 },
+ { 0x8700, 0xa05f, 0x2000 },
+ { 0x0700, 0xa05e, 0x0000 },
+ { 0x0700, 0xa060, 0x0000 },
+ { 0x8700, 0xa063, 0x2000 },
+ { 0x0700, 0xa062, 0x0000 },
+ { 0x0700, 0xa064, 0x0000 },
+ { 0x8700, 0xa069, 0x3000 },
+ { 0x8700, 0xa067, 0x2000 },
+ { 0x0700, 0xa066, 0x0000 },
+ { 0x0700, 0xa068, 0x0000 },
+ { 0x8700, 0xa06b, 0x2000 },
+ { 0x0700, 0xa06a, 0x0000 },
+ { 0x0700, 0xa06c, 0x0000 },
+ { 0x8700, 0xa07d, 0x5000 },
+ { 0x8700, 0xa075, 0x4000 },
+ { 0x8700, 0xa071, 0x3000 },
+ { 0x8700, 0xa06f, 0x2000 },
+ { 0x0700, 0xa06e, 0x0000 },
+ { 0x0700, 0xa070, 0x0000 },
+ { 0x8700, 0xa073, 0x2000 },
+ { 0x0700, 0xa072, 0x0000 },
+ { 0x0700, 0xa074, 0x0000 },
+ { 0x8700, 0xa079, 0x3000 },
+ { 0x8700, 0xa077, 0x2000 },
+ { 0x0700, 0xa076, 0x0000 },
+ { 0x0700, 0xa078, 0x0000 },
+ { 0x8700, 0xa07b, 0x2000 },
+ { 0x0700, 0xa07a, 0x0000 },
+ { 0x0700, 0xa07c, 0x0000 },
+ { 0x8700, 0xa085, 0x4000 },
+ { 0x8700, 0xa081, 0x3000 },
+ { 0x8700, 0xa07f, 0x2000 },
+ { 0x0700, 0xa07e, 0x0000 },
+ { 0x0700, 0xa080, 0x0000 },
+ { 0x8700, 0xa083, 0x2000 },
+ { 0x0700, 0xa082, 0x0000 },
+ { 0x0700, 0xa084, 0x0000 },
+ { 0x8700, 0xa089, 0x3000 },
+ { 0x8700, 0xa087, 0x2000 },
+ { 0x0700, 0xa086, 0x0000 },
+ { 0x0700, 0xa088, 0x0000 },
+ { 0x8700, 0xa08b, 0x2000 },
+ { 0x0700, 0xa08a, 0x0000 },
+ { 0x0700, 0xa08c, 0x0000 },
+ { 0x8700, 0xa0ad, 0x6000 },
+ { 0x8700, 0xa09d, 0x5000 },
+ { 0x8700, 0xa095, 0x4000 },
+ { 0x8700, 0xa091, 0x3000 },
+ { 0x8700, 0xa08f, 0x2000 },
+ { 0x0700, 0xa08e, 0x0000 },
+ { 0x0700, 0xa090, 0x0000 },
+ { 0x8700, 0xa093, 0x2000 },
+ { 0x0700, 0xa092, 0x0000 },
+ { 0x0700, 0xa094, 0x0000 },
+ { 0x8700, 0xa099, 0x3000 },
+ { 0x8700, 0xa097, 0x2000 },
+ { 0x0700, 0xa096, 0x0000 },
+ { 0x0700, 0xa098, 0x0000 },
+ { 0x8700, 0xa09b, 0x2000 },
+ { 0x0700, 0xa09a, 0x0000 },
+ { 0x0700, 0xa09c, 0x0000 },
+ { 0x8700, 0xa0a5, 0x4000 },
+ { 0x8700, 0xa0a1, 0x3000 },
+ { 0x8700, 0xa09f, 0x2000 },
+ { 0x0700, 0xa09e, 0x0000 },
+ { 0x0700, 0xa0a0, 0x0000 },
+ { 0x8700, 0xa0a3, 0x2000 },
+ { 0x0700, 0xa0a2, 0x0000 },
+ { 0x0700, 0xa0a4, 0x0000 },
+ { 0x8700, 0xa0a9, 0x3000 },
+ { 0x8700, 0xa0a7, 0x2000 },
+ { 0x0700, 0xa0a6, 0x0000 },
+ { 0x0700, 0xa0a8, 0x0000 },
+ { 0x8700, 0xa0ab, 0x2000 },
+ { 0x0700, 0xa0aa, 0x0000 },
+ { 0x0700, 0xa0ac, 0x0000 },
+ { 0x8700, 0xa0bd, 0x5000 },
+ { 0x8700, 0xa0b5, 0x4000 },
+ { 0x8700, 0xa0b1, 0x3000 },
+ { 0x8700, 0xa0af, 0x2000 },
+ { 0x0700, 0xa0ae, 0x0000 },
+ { 0x0700, 0xa0b0, 0x0000 },
+ { 0x8700, 0xa0b3, 0x2000 },
+ { 0x0700, 0xa0b2, 0x0000 },
+ { 0x0700, 0xa0b4, 0x0000 },
+ { 0x8700, 0xa0b9, 0x3000 },
+ { 0x8700, 0xa0b7, 0x2000 },
+ { 0x0700, 0xa0b6, 0x0000 },
+ { 0x0700, 0xa0b8, 0x0000 },
+ { 0x8700, 0xa0bb, 0x2000 },
+ { 0x0700, 0xa0ba, 0x0000 },
+ { 0x0700, 0xa0bc, 0x0000 },
+ { 0x8700, 0xa0c5, 0x4000 },
+ { 0x8700, 0xa0c1, 0x3000 },
+ { 0x8700, 0xa0bf, 0x2000 },
+ { 0x0700, 0xa0be, 0x0000 },
+ { 0x0700, 0xa0c0, 0x0000 },
+ { 0x8700, 0xa0c3, 0x2000 },
+ { 0x0700, 0xa0c2, 0x0000 },
+ { 0x0700, 0xa0c4, 0x0000 },
+ { 0x8700, 0xa0c9, 0x3000 },
+ { 0x8700, 0xa0c7, 0x2000 },
+ { 0x0700, 0xa0c6, 0x0000 },
+ { 0x0700, 0xa0c8, 0x0000 },
+ { 0x8700, 0xa0cb, 0x2000 },
+ { 0x0700, 0xa0ca, 0x0000 },
+ { 0x0700, 0xa0cc, 0x0000 },
+ { 0x8700, 0xa10d, 0x7000 },
+ { 0x8700, 0xa0ed, 0x6000 },
+ { 0x8700, 0xa0dd, 0x5000 },
+ { 0x8700, 0xa0d5, 0x4000 },
+ { 0x8700, 0xa0d1, 0x3000 },
+ { 0x8700, 0xa0cf, 0x2000 },
+ { 0x0700, 0xa0ce, 0x0000 },
+ { 0x0700, 0xa0d0, 0x0000 },
+ { 0x8700, 0xa0d3, 0x2000 },
+ { 0x0700, 0xa0d2, 0x0000 },
+ { 0x0700, 0xa0d4, 0x0000 },
+ { 0x8700, 0xa0d9, 0x3000 },
+ { 0x8700, 0xa0d7, 0x2000 },
+ { 0x0700, 0xa0d6, 0x0000 },
+ { 0x0700, 0xa0d8, 0x0000 },
+ { 0x8700, 0xa0db, 0x2000 },
+ { 0x0700, 0xa0da, 0x0000 },
+ { 0x0700, 0xa0dc, 0x0000 },
+ { 0x8700, 0xa0e5, 0x4000 },
+ { 0x8700, 0xa0e1, 0x3000 },
+ { 0x8700, 0xa0df, 0x2000 },
+ { 0x0700, 0xa0de, 0x0000 },
+ { 0x0700, 0xa0e0, 0x0000 },
+ { 0x8700, 0xa0e3, 0x2000 },
+ { 0x0700, 0xa0e2, 0x0000 },
+ { 0x0700, 0xa0e4, 0x0000 },
+ { 0x8700, 0xa0e9, 0x3000 },
+ { 0x8700, 0xa0e7, 0x2000 },
+ { 0x0700, 0xa0e6, 0x0000 },
+ { 0x0700, 0xa0e8, 0x0000 },
+ { 0x8700, 0xa0eb, 0x2000 },
+ { 0x0700, 0xa0ea, 0x0000 },
+ { 0x0700, 0xa0ec, 0x0000 },
+ { 0x8700, 0xa0fd, 0x5000 },
+ { 0x8700, 0xa0f5, 0x4000 },
+ { 0x8700, 0xa0f1, 0x3000 },
+ { 0x8700, 0xa0ef, 0x2000 },
+ { 0x0700, 0xa0ee, 0x0000 },
+ { 0x0700, 0xa0f0, 0x0000 },
+ { 0x8700, 0xa0f3, 0x2000 },
+ { 0x0700, 0xa0f2, 0x0000 },
+ { 0x0700, 0xa0f4, 0x0000 },
+ { 0x8700, 0xa0f9, 0x3000 },
+ { 0x8700, 0xa0f7, 0x2000 },
+ { 0x0700, 0xa0f6, 0x0000 },
+ { 0x0700, 0xa0f8, 0x0000 },
+ { 0x8700, 0xa0fb, 0x2000 },
+ { 0x0700, 0xa0fa, 0x0000 },
+ { 0x0700, 0xa0fc, 0x0000 },
+ { 0x8700, 0xa105, 0x4000 },
+ { 0x8700, 0xa101, 0x3000 },
+ { 0x8700, 0xa0ff, 0x2000 },
+ { 0x0700, 0xa0fe, 0x0000 },
+ { 0x0700, 0xa100, 0x0000 },
+ { 0x8700, 0xa103, 0x2000 },
+ { 0x0700, 0xa102, 0x0000 },
+ { 0x0700, 0xa104, 0x0000 },
+ { 0x8700, 0xa109, 0x3000 },
+ { 0x8700, 0xa107, 0x2000 },
+ { 0x0700, 0xa106, 0x0000 },
+ { 0x0700, 0xa108, 0x0000 },
+ { 0x8700, 0xa10b, 0x2000 },
+ { 0x0700, 0xa10a, 0x0000 },
+ { 0x0700, 0xa10c, 0x0000 },
+ { 0x8700, 0xa12d, 0x6000 },
+ { 0x8700, 0xa11d, 0x5000 },
+ { 0x8700, 0xa115, 0x4000 },
+ { 0x8700, 0xa111, 0x3000 },
+ { 0x8700, 0xa10f, 0x2000 },
+ { 0x0700, 0xa10e, 0x0000 },
+ { 0x0700, 0xa110, 0x0000 },
+ { 0x8700, 0xa113, 0x2000 },
+ { 0x0700, 0xa112, 0x0000 },
+ { 0x0700, 0xa114, 0x0000 },
+ { 0x8700, 0xa119, 0x3000 },
+ { 0x8700, 0xa117, 0x2000 },
+ { 0x0700, 0xa116, 0x0000 },
+ { 0x0700, 0xa118, 0x0000 },
+ { 0x8700, 0xa11b, 0x2000 },
+ { 0x0700, 0xa11a, 0x0000 },
+ { 0x0700, 0xa11c, 0x0000 },
+ { 0x8700, 0xa125, 0x4000 },
+ { 0x8700, 0xa121, 0x3000 },
+ { 0x8700, 0xa11f, 0x2000 },
+ { 0x0700, 0xa11e, 0x0000 },
+ { 0x0700, 0xa120, 0x0000 },
+ { 0x8700, 0xa123, 0x2000 },
+ { 0x0700, 0xa122, 0x0000 },
+ { 0x0700, 0xa124, 0x0000 },
+ { 0x8700, 0xa129, 0x3000 },
+ { 0x8700, 0xa127, 0x2000 },
+ { 0x0700, 0xa126, 0x0000 },
+ { 0x0700, 0xa128, 0x0000 },
+ { 0x8700, 0xa12b, 0x2000 },
+ { 0x0700, 0xa12a, 0x0000 },
+ { 0x0700, 0xa12c, 0x0000 },
+ { 0x8700, 0xa13d, 0x5000 },
+ { 0x8700, 0xa135, 0x4000 },
+ { 0x8700, 0xa131, 0x3000 },
+ { 0x8700, 0xa12f, 0x2000 },
+ { 0x0700, 0xa12e, 0x0000 },
+ { 0x0700, 0xa130, 0x0000 },
+ { 0x8700, 0xa133, 0x2000 },
+ { 0x0700, 0xa132, 0x0000 },
+ { 0x0700, 0xa134, 0x0000 },
+ { 0x8700, 0xa139, 0x3000 },
+ { 0x8700, 0xa137, 0x2000 },
+ { 0x0700, 0xa136, 0x0000 },
+ { 0x0700, 0xa138, 0x0000 },
+ { 0x8700, 0xa13b, 0x2000 },
+ { 0x0700, 0xa13a, 0x0000 },
+ { 0x0700, 0xa13c, 0x0000 },
+ { 0x8700, 0xa145, 0x4000 },
+ { 0x8700, 0xa141, 0x3000 },
+ { 0x8700, 0xa13f, 0x2000 },
+ { 0x0700, 0xa13e, 0x0000 },
+ { 0x0700, 0xa140, 0x0000 },
+ { 0x8700, 0xa143, 0x2000 },
+ { 0x0700, 0xa142, 0x0000 },
+ { 0x0700, 0xa144, 0x0000 },
+ { 0x8700, 0xa149, 0x3000 },
+ { 0x8700, 0xa147, 0x2000 },
+ { 0x0700, 0xa146, 0x0000 },
+ { 0x0700, 0xa148, 0x0000 },
+ { 0x8700, 0xa14b, 0x2000 },
+ { 0x0700, 0xa14a, 0x0000 },
+ { 0x0700, 0xa14c, 0x0000 },
+ { 0x8700, 0xa24d, 0x9000 },
+ { 0x8700, 0xa1cd, 0x8000 },
+ { 0x8700, 0xa18d, 0x7000 },
+ { 0x8700, 0xa16d, 0x6000 },
+ { 0x8700, 0xa15d, 0x5000 },
+ { 0x8700, 0xa155, 0x4000 },
+ { 0x8700, 0xa151, 0x3000 },
+ { 0x8700, 0xa14f, 0x2000 },
+ { 0x0700, 0xa14e, 0x0000 },
+ { 0x0700, 0xa150, 0x0000 },
+ { 0x8700, 0xa153, 0x2000 },
+ { 0x0700, 0xa152, 0x0000 },
+ { 0x0700, 0xa154, 0x0000 },
+ { 0x8700, 0xa159, 0x3000 },
+ { 0x8700, 0xa157, 0x2000 },
+ { 0x0700, 0xa156, 0x0000 },
+ { 0x0700, 0xa158, 0x0000 },
+ { 0x8700, 0xa15b, 0x2000 },
+ { 0x0700, 0xa15a, 0x0000 },
+ { 0x0700, 0xa15c, 0x0000 },
+ { 0x8700, 0xa165, 0x4000 },
+ { 0x8700, 0xa161, 0x3000 },
+ { 0x8700, 0xa15f, 0x2000 },
+ { 0x0700, 0xa15e, 0x0000 },
+ { 0x0700, 0xa160, 0x0000 },
+ { 0x8700, 0xa163, 0x2000 },
+ { 0x0700, 0xa162, 0x0000 },
+ { 0x0700, 0xa164, 0x0000 },
+ { 0x8700, 0xa169, 0x3000 },
+ { 0x8700, 0xa167, 0x2000 },
+ { 0x0700, 0xa166, 0x0000 },
+ { 0x0700, 0xa168, 0x0000 },
+ { 0x8700, 0xa16b, 0x2000 },
+ { 0x0700, 0xa16a, 0x0000 },
+ { 0x0700, 0xa16c, 0x0000 },
+ { 0x8700, 0xa17d, 0x5000 },
+ { 0x8700, 0xa175, 0x4000 },
+ { 0x8700, 0xa171, 0x3000 },
+ { 0x8700, 0xa16f, 0x2000 },
+ { 0x0700, 0xa16e, 0x0000 },
+ { 0x0700, 0xa170, 0x0000 },
+ { 0x8700, 0xa173, 0x2000 },
+ { 0x0700, 0xa172, 0x0000 },
+ { 0x0700, 0xa174, 0x0000 },
+ { 0x8700, 0xa179, 0x3000 },
+ { 0x8700, 0xa177, 0x2000 },
+ { 0x0700, 0xa176, 0x0000 },
+ { 0x0700, 0xa178, 0x0000 },
+ { 0x8700, 0xa17b, 0x2000 },
+ { 0x0700, 0xa17a, 0x0000 },
+ { 0x0700, 0xa17c, 0x0000 },
+ { 0x8700, 0xa185, 0x4000 },
+ { 0x8700, 0xa181, 0x3000 },
+ { 0x8700, 0xa17f, 0x2000 },
+ { 0x0700, 0xa17e, 0x0000 },
+ { 0x0700, 0xa180, 0x0000 },
+ { 0x8700, 0xa183, 0x2000 },
+ { 0x0700, 0xa182, 0x0000 },
+ { 0x0700, 0xa184, 0x0000 },
+ { 0x8700, 0xa189, 0x3000 },
+ { 0x8700, 0xa187, 0x2000 },
+ { 0x0700, 0xa186, 0x0000 },
+ { 0x0700, 0xa188, 0x0000 },
+ { 0x8700, 0xa18b, 0x2000 },
+ { 0x0700, 0xa18a, 0x0000 },
+ { 0x0700, 0xa18c, 0x0000 },
+ { 0x8700, 0xa1ad, 0x6000 },
+ { 0x8700, 0xa19d, 0x5000 },
+ { 0x8700, 0xa195, 0x4000 },
+ { 0x8700, 0xa191, 0x3000 },
+ { 0x8700, 0xa18f, 0x2000 },
+ { 0x0700, 0xa18e, 0x0000 },
+ { 0x0700, 0xa190, 0x0000 },
+ { 0x8700, 0xa193, 0x2000 },
+ { 0x0700, 0xa192, 0x0000 },
+ { 0x0700, 0xa194, 0x0000 },
+ { 0x8700, 0xa199, 0x3000 },
+ { 0x8700, 0xa197, 0x2000 },
+ { 0x0700, 0xa196, 0x0000 },
+ { 0x0700, 0xa198, 0x0000 },
+ { 0x8700, 0xa19b, 0x2000 },
+ { 0x0700, 0xa19a, 0x0000 },
+ { 0x0700, 0xa19c, 0x0000 },
+ { 0x8700, 0xa1a5, 0x4000 },
+ { 0x8700, 0xa1a1, 0x3000 },
+ { 0x8700, 0xa19f, 0x2000 },
+ { 0x0700, 0xa19e, 0x0000 },
+ { 0x0700, 0xa1a0, 0x0000 },
+ { 0x8700, 0xa1a3, 0x2000 },
+ { 0x0700, 0xa1a2, 0x0000 },
+ { 0x0700, 0xa1a4, 0x0000 },
+ { 0x8700, 0xa1a9, 0x3000 },
+ { 0x8700, 0xa1a7, 0x2000 },
+ { 0x0700, 0xa1a6, 0x0000 },
+ { 0x0700, 0xa1a8, 0x0000 },
+ { 0x8700, 0xa1ab, 0x2000 },
+ { 0x0700, 0xa1aa, 0x0000 },
+ { 0x0700, 0xa1ac, 0x0000 },
+ { 0x8700, 0xa1bd, 0x5000 },
+ { 0x8700, 0xa1b5, 0x4000 },
+ { 0x8700, 0xa1b1, 0x3000 },
+ { 0x8700, 0xa1af, 0x2000 },
+ { 0x0700, 0xa1ae, 0x0000 },
+ { 0x0700, 0xa1b0, 0x0000 },
+ { 0x8700, 0xa1b3, 0x2000 },
+ { 0x0700, 0xa1b2, 0x0000 },
+ { 0x0700, 0xa1b4, 0x0000 },
+ { 0x8700, 0xa1b9, 0x3000 },
+ { 0x8700, 0xa1b7, 0x2000 },
+ { 0x0700, 0xa1b6, 0x0000 },
+ { 0x0700, 0xa1b8, 0x0000 },
+ { 0x8700, 0xa1bb, 0x2000 },
+ { 0x0700, 0xa1ba, 0x0000 },
+ { 0x0700, 0xa1bc, 0x0000 },
+ { 0x8700, 0xa1c5, 0x4000 },
+ { 0x8700, 0xa1c1, 0x3000 },
+ { 0x8700, 0xa1bf, 0x2000 },
+ { 0x0700, 0xa1be, 0x0000 },
+ { 0x0700, 0xa1c0, 0x0000 },
+ { 0x8700, 0xa1c3, 0x2000 },
+ { 0x0700, 0xa1c2, 0x0000 },
+ { 0x0700, 0xa1c4, 0x0000 },
+ { 0x8700, 0xa1c9, 0x3000 },
+ { 0x8700, 0xa1c7, 0x2000 },
+ { 0x0700, 0xa1c6, 0x0000 },
+ { 0x0700, 0xa1c8, 0x0000 },
+ { 0x8700, 0xa1cb, 0x2000 },
+ { 0x0700, 0xa1ca, 0x0000 },
+ { 0x0700, 0xa1cc, 0x0000 },
+ { 0x8700, 0xa20d, 0x7000 },
+ { 0x8700, 0xa1ed, 0x6000 },
+ { 0x8700, 0xa1dd, 0x5000 },
+ { 0x8700, 0xa1d5, 0x4000 },
+ { 0x8700, 0xa1d1, 0x3000 },
+ { 0x8700, 0xa1cf, 0x2000 },
+ { 0x0700, 0xa1ce, 0x0000 },
+ { 0x0700, 0xa1d0, 0x0000 },
+ { 0x8700, 0xa1d3, 0x2000 },
+ { 0x0700, 0xa1d2, 0x0000 },
+ { 0x0700, 0xa1d4, 0x0000 },
+ { 0x8700, 0xa1d9, 0x3000 },
+ { 0x8700, 0xa1d7, 0x2000 },
+ { 0x0700, 0xa1d6, 0x0000 },
+ { 0x0700, 0xa1d8, 0x0000 },
+ { 0x8700, 0xa1db, 0x2000 },
+ { 0x0700, 0xa1da, 0x0000 },
+ { 0x0700, 0xa1dc, 0x0000 },
+ { 0x8700, 0xa1e5, 0x4000 },
+ { 0x8700, 0xa1e1, 0x3000 },
+ { 0x8700, 0xa1df, 0x2000 },
+ { 0x0700, 0xa1de, 0x0000 },
+ { 0x0700, 0xa1e0, 0x0000 },
+ { 0x8700, 0xa1e3, 0x2000 },
+ { 0x0700, 0xa1e2, 0x0000 },
+ { 0x0700, 0xa1e4, 0x0000 },
+ { 0x8700, 0xa1e9, 0x3000 },
+ { 0x8700, 0xa1e7, 0x2000 },
+ { 0x0700, 0xa1e6, 0x0000 },
+ { 0x0700, 0xa1e8, 0x0000 },
+ { 0x8700, 0xa1eb, 0x2000 },
+ { 0x0700, 0xa1ea, 0x0000 },
+ { 0x0700, 0xa1ec, 0x0000 },
+ { 0x8700, 0xa1fd, 0x5000 },
+ { 0x8700, 0xa1f5, 0x4000 },
+ { 0x8700, 0xa1f1, 0x3000 },
+ { 0x8700, 0xa1ef, 0x2000 },
+ { 0x0700, 0xa1ee, 0x0000 },
+ { 0x0700, 0xa1f0, 0x0000 },
+ { 0x8700, 0xa1f3, 0x2000 },
+ { 0x0700, 0xa1f2, 0x0000 },
+ { 0x0700, 0xa1f4, 0x0000 },
+ { 0x8700, 0xa1f9, 0x3000 },
+ { 0x8700, 0xa1f7, 0x2000 },
+ { 0x0700, 0xa1f6, 0x0000 },
+ { 0x0700, 0xa1f8, 0x0000 },
+ { 0x8700, 0xa1fb, 0x2000 },
+ { 0x0700, 0xa1fa, 0x0000 },
+ { 0x0700, 0xa1fc, 0x0000 },
+ { 0x8700, 0xa205, 0x4000 },
+ { 0x8700, 0xa201, 0x3000 },
+ { 0x8700, 0xa1ff, 0x2000 },
+ { 0x0700, 0xa1fe, 0x0000 },
+ { 0x0700, 0xa200, 0x0000 },
+ { 0x8700, 0xa203, 0x2000 },
+ { 0x0700, 0xa202, 0x0000 },
+ { 0x0700, 0xa204, 0x0000 },
+ { 0x8700, 0xa209, 0x3000 },
+ { 0x8700, 0xa207, 0x2000 },
+ { 0x0700, 0xa206, 0x0000 },
+ { 0x0700, 0xa208, 0x0000 },
+ { 0x8700, 0xa20b, 0x2000 },
+ { 0x0700, 0xa20a, 0x0000 },
+ { 0x0700, 0xa20c, 0x0000 },
+ { 0x8700, 0xa22d, 0x6000 },
+ { 0x8700, 0xa21d, 0x5000 },
+ { 0x8700, 0xa215, 0x4000 },
+ { 0x8700, 0xa211, 0x3000 },
+ { 0x8700, 0xa20f, 0x2000 },
+ { 0x0700, 0xa20e, 0x0000 },
+ { 0x0700, 0xa210, 0x0000 },
+ { 0x8700, 0xa213, 0x2000 },
+ { 0x0700, 0xa212, 0x0000 },
+ { 0x0700, 0xa214, 0x0000 },
+ { 0x8700, 0xa219, 0x3000 },
+ { 0x8700, 0xa217, 0x2000 },
+ { 0x0700, 0xa216, 0x0000 },
+ { 0x0700, 0xa218, 0x0000 },
+ { 0x8700, 0xa21b, 0x2000 },
+ { 0x0700, 0xa21a, 0x0000 },
+ { 0x0700, 0xa21c, 0x0000 },
+ { 0x8700, 0xa225, 0x4000 },
+ { 0x8700, 0xa221, 0x3000 },
+ { 0x8700, 0xa21f, 0x2000 },
+ { 0x0700, 0xa21e, 0x0000 },
+ { 0x0700, 0xa220, 0x0000 },
+ { 0x8700, 0xa223, 0x2000 },
+ { 0x0700, 0xa222, 0x0000 },
+ { 0x0700, 0xa224, 0x0000 },
+ { 0x8700, 0xa229, 0x3000 },
+ { 0x8700, 0xa227, 0x2000 },
+ { 0x0700, 0xa226, 0x0000 },
+ { 0x0700, 0xa228, 0x0000 },
+ { 0x8700, 0xa22b, 0x2000 },
+ { 0x0700, 0xa22a, 0x0000 },
+ { 0x0700, 0xa22c, 0x0000 },
+ { 0x8700, 0xa23d, 0x5000 },
+ { 0x8700, 0xa235, 0x4000 },
+ { 0x8700, 0xa231, 0x3000 },
+ { 0x8700, 0xa22f, 0x2000 },
+ { 0x0700, 0xa22e, 0x0000 },
+ { 0x0700, 0xa230, 0x0000 },
+ { 0x8700, 0xa233, 0x2000 },
+ { 0x0700, 0xa232, 0x0000 },
+ { 0x0700, 0xa234, 0x0000 },
+ { 0x8700, 0xa239, 0x3000 },
+ { 0x8700, 0xa237, 0x2000 },
+ { 0x0700, 0xa236, 0x0000 },
+ { 0x0700, 0xa238, 0x0000 },
+ { 0x8700, 0xa23b, 0x2000 },
+ { 0x0700, 0xa23a, 0x0000 },
+ { 0x0700, 0xa23c, 0x0000 },
+ { 0x8700, 0xa245, 0x4000 },
+ { 0x8700, 0xa241, 0x3000 },
+ { 0x8700, 0xa23f, 0x2000 },
+ { 0x0700, 0xa23e, 0x0000 },
+ { 0x0700, 0xa240, 0x0000 },
+ { 0x8700, 0xa243, 0x2000 },
+ { 0x0700, 0xa242, 0x0000 },
+ { 0x0700, 0xa244, 0x0000 },
+ { 0x8700, 0xa249, 0x3000 },
+ { 0x8700, 0xa247, 0x2000 },
+ { 0x0700, 0xa246, 0x0000 },
+ { 0x0700, 0xa248, 0x0000 },
+ { 0x8700, 0xa24b, 0x2000 },
+ { 0x0700, 0xa24a, 0x0000 },
+ { 0x0700, 0xa24c, 0x0000 },
+ { 0x8700, 0xa2cd, 0x8000 },
+ { 0x8700, 0xa28d, 0x7000 },
+ { 0x8700, 0xa26d, 0x6000 },
+ { 0x8700, 0xa25d, 0x5000 },
+ { 0x8700, 0xa255, 0x4000 },
+ { 0x8700, 0xa251, 0x3000 },
+ { 0x8700, 0xa24f, 0x2000 },
+ { 0x0700, 0xa24e, 0x0000 },
+ { 0x0700, 0xa250, 0x0000 },
+ { 0x8700, 0xa253, 0x2000 },
+ { 0x0700, 0xa252, 0x0000 },
+ { 0x0700, 0xa254, 0x0000 },
+ { 0x8700, 0xa259, 0x3000 },
+ { 0x8700, 0xa257, 0x2000 },
+ { 0x0700, 0xa256, 0x0000 },
+ { 0x0700, 0xa258, 0x0000 },
+ { 0x8700, 0xa25b, 0x2000 },
+ { 0x0700, 0xa25a, 0x0000 },
+ { 0x0700, 0xa25c, 0x0000 },
+ { 0x8700, 0xa265, 0x4000 },
+ { 0x8700, 0xa261, 0x3000 },
+ { 0x8700, 0xa25f, 0x2000 },
+ { 0x0700, 0xa25e, 0x0000 },
+ { 0x0700, 0xa260, 0x0000 },
+ { 0x8700, 0xa263, 0x2000 },
+ { 0x0700, 0xa262, 0x0000 },
+ { 0x0700, 0xa264, 0x0000 },
+ { 0x8700, 0xa269, 0x3000 },
+ { 0x8700, 0xa267, 0x2000 },
+ { 0x0700, 0xa266, 0x0000 },
+ { 0x0700, 0xa268, 0x0000 },
+ { 0x8700, 0xa26b, 0x2000 },
+ { 0x0700, 0xa26a, 0x0000 },
+ { 0x0700, 0xa26c, 0x0000 },
+ { 0x8700, 0xa27d, 0x5000 },
+ { 0x8700, 0xa275, 0x4000 },
+ { 0x8700, 0xa271, 0x3000 },
+ { 0x8700, 0xa26f, 0x2000 },
+ { 0x0700, 0xa26e, 0x0000 },
+ { 0x0700, 0xa270, 0x0000 },
+ { 0x8700, 0xa273, 0x2000 },
+ { 0x0700, 0xa272, 0x0000 },
+ { 0x0700, 0xa274, 0x0000 },
+ { 0x8700, 0xa279, 0x3000 },
+ { 0x8700, 0xa277, 0x2000 },
+ { 0x0700, 0xa276, 0x0000 },
+ { 0x0700, 0xa278, 0x0000 },
+ { 0x8700, 0xa27b, 0x2000 },
+ { 0x0700, 0xa27a, 0x0000 },
+ { 0x0700, 0xa27c, 0x0000 },
+ { 0x8700, 0xa285, 0x4000 },
+ { 0x8700, 0xa281, 0x3000 },
+ { 0x8700, 0xa27f, 0x2000 },
+ { 0x0700, 0xa27e, 0x0000 },
+ { 0x0700, 0xa280, 0x0000 },
+ { 0x8700, 0xa283, 0x2000 },
+ { 0x0700, 0xa282, 0x0000 },
+ { 0x0700, 0xa284, 0x0000 },
+ { 0x8700, 0xa289, 0x3000 },
+ { 0x8700, 0xa287, 0x2000 },
+ { 0x0700, 0xa286, 0x0000 },
+ { 0x0700, 0xa288, 0x0000 },
+ { 0x8700, 0xa28b, 0x2000 },
+ { 0x0700, 0xa28a, 0x0000 },
+ { 0x0700, 0xa28c, 0x0000 },
+ { 0x8700, 0xa2ad, 0x6000 },
+ { 0x8700, 0xa29d, 0x5000 },
+ { 0x8700, 0xa295, 0x4000 },
+ { 0x8700, 0xa291, 0x3000 },
+ { 0x8700, 0xa28f, 0x2000 },
+ { 0x0700, 0xa28e, 0x0000 },
+ { 0x0700, 0xa290, 0x0000 },
+ { 0x8700, 0xa293, 0x2000 },
+ { 0x0700, 0xa292, 0x0000 },
+ { 0x0700, 0xa294, 0x0000 },
+ { 0x8700, 0xa299, 0x3000 },
+ { 0x8700, 0xa297, 0x2000 },
+ { 0x0700, 0xa296, 0x0000 },
+ { 0x0700, 0xa298, 0x0000 },
+ { 0x8700, 0xa29b, 0x2000 },
+ { 0x0700, 0xa29a, 0x0000 },
+ { 0x0700, 0xa29c, 0x0000 },
+ { 0x8700, 0xa2a5, 0x4000 },
+ { 0x8700, 0xa2a1, 0x3000 },
+ { 0x8700, 0xa29f, 0x2000 },
+ { 0x0700, 0xa29e, 0x0000 },
+ { 0x0700, 0xa2a0, 0x0000 },
+ { 0x8700, 0xa2a3, 0x2000 },
+ { 0x0700, 0xa2a2, 0x0000 },
+ { 0x0700, 0xa2a4, 0x0000 },
+ { 0x8700, 0xa2a9, 0x3000 },
+ { 0x8700, 0xa2a7, 0x2000 },
+ { 0x0700, 0xa2a6, 0x0000 },
+ { 0x0700, 0xa2a8, 0x0000 },
+ { 0x8700, 0xa2ab, 0x2000 },
+ { 0x0700, 0xa2aa, 0x0000 },
+ { 0x0700, 0xa2ac, 0x0000 },
+ { 0x8700, 0xa2bd, 0x5000 },
+ { 0x8700, 0xa2b5, 0x4000 },
+ { 0x8700, 0xa2b1, 0x3000 },
+ { 0x8700, 0xa2af, 0x2000 },
+ { 0x0700, 0xa2ae, 0x0000 },
+ { 0x0700, 0xa2b0, 0x0000 },
+ { 0x8700, 0xa2b3, 0x2000 },
+ { 0x0700, 0xa2b2, 0x0000 },
+ { 0x0700, 0xa2b4, 0x0000 },
+ { 0x8700, 0xa2b9, 0x3000 },
+ { 0x8700, 0xa2b7, 0x2000 },
+ { 0x0700, 0xa2b6, 0x0000 },
+ { 0x0700, 0xa2b8, 0x0000 },
+ { 0x8700, 0xa2bb, 0x2000 },
+ { 0x0700, 0xa2ba, 0x0000 },
+ { 0x0700, 0xa2bc, 0x0000 },
+ { 0x8700, 0xa2c5, 0x4000 },
+ { 0x8700, 0xa2c1, 0x3000 },
+ { 0x8700, 0xa2bf, 0x2000 },
+ { 0x0700, 0xa2be, 0x0000 },
+ { 0x0700, 0xa2c0, 0x0000 },
+ { 0x8700, 0xa2c3, 0x2000 },
+ { 0x0700, 0xa2c2, 0x0000 },
+ { 0x0700, 0xa2c4, 0x0000 },
+ { 0x8700, 0xa2c9, 0x3000 },
+ { 0x8700, 0xa2c7, 0x2000 },
+ { 0x0700, 0xa2c6, 0x0000 },
+ { 0x0700, 0xa2c8, 0x0000 },
+ { 0x8700, 0xa2cb, 0x2000 },
+ { 0x0700, 0xa2ca, 0x0000 },
+ { 0x0700, 0xa2cc, 0x0000 },
+ { 0x8700, 0xa30d, 0x7000 },
+ { 0x8700, 0xa2ed, 0x6000 },
+ { 0x8700, 0xa2dd, 0x5000 },
+ { 0x8700, 0xa2d5, 0x4000 },
+ { 0x8700, 0xa2d1, 0x3000 },
+ { 0x8700, 0xa2cf, 0x2000 },
+ { 0x0700, 0xa2ce, 0x0000 },
+ { 0x0700, 0xa2d0, 0x0000 },
+ { 0x8700, 0xa2d3, 0x2000 },
+ { 0x0700, 0xa2d2, 0x0000 },
+ { 0x0700, 0xa2d4, 0x0000 },
+ { 0x8700, 0xa2d9, 0x3000 },
+ { 0x8700, 0xa2d7, 0x2000 },
+ { 0x0700, 0xa2d6, 0x0000 },
+ { 0x0700, 0xa2d8, 0x0000 },
+ { 0x8700, 0xa2db, 0x2000 },
+ { 0x0700, 0xa2da, 0x0000 },
+ { 0x0700, 0xa2dc, 0x0000 },
+ { 0x8700, 0xa2e5, 0x4000 },
+ { 0x8700, 0xa2e1, 0x3000 },
+ { 0x8700, 0xa2df, 0x2000 },
+ { 0x0700, 0xa2de, 0x0000 },
+ { 0x0700, 0xa2e0, 0x0000 },
+ { 0x8700, 0xa2e3, 0x2000 },
+ { 0x0700, 0xa2e2, 0x0000 },
+ { 0x0700, 0xa2e4, 0x0000 },
+ { 0x8700, 0xa2e9, 0x3000 },
+ { 0x8700, 0xa2e7, 0x2000 },
+ { 0x0700, 0xa2e6, 0x0000 },
+ { 0x0700, 0xa2e8, 0x0000 },
+ { 0x8700, 0xa2eb, 0x2000 },
+ { 0x0700, 0xa2ea, 0x0000 },
+ { 0x0700, 0xa2ec, 0x0000 },
+ { 0x8700, 0xa2fd, 0x5000 },
+ { 0x8700, 0xa2f5, 0x4000 },
+ { 0x8700, 0xa2f1, 0x3000 },
+ { 0x8700, 0xa2ef, 0x2000 },
+ { 0x0700, 0xa2ee, 0x0000 },
+ { 0x0700, 0xa2f0, 0x0000 },
+ { 0x8700, 0xa2f3, 0x2000 },
+ { 0x0700, 0xa2f2, 0x0000 },
+ { 0x0700, 0xa2f4, 0x0000 },
+ { 0x8700, 0xa2f9, 0x3000 },
+ { 0x8700, 0xa2f7, 0x2000 },
+ { 0x0700, 0xa2f6, 0x0000 },
+ { 0x0700, 0xa2f8, 0x0000 },
+ { 0x8700, 0xa2fb, 0x2000 },
+ { 0x0700, 0xa2fa, 0x0000 },
+ { 0x0700, 0xa2fc, 0x0000 },
+ { 0x8700, 0xa305, 0x4000 },
+ { 0x8700, 0xa301, 0x3000 },
+ { 0x8700, 0xa2ff, 0x2000 },
+ { 0x0700, 0xa2fe, 0x0000 },
+ { 0x0700, 0xa300, 0x0000 },
+ { 0x8700, 0xa303, 0x2000 },
+ { 0x0700, 0xa302, 0x0000 },
+ { 0x0700, 0xa304, 0x0000 },
+ { 0x8700, 0xa309, 0x3000 },
+ { 0x8700, 0xa307, 0x2000 },
+ { 0x0700, 0xa306, 0x0000 },
+ { 0x0700, 0xa308, 0x0000 },
+ { 0x8700, 0xa30b, 0x2000 },
+ { 0x0700, 0xa30a, 0x0000 },
+ { 0x0700, 0xa30c, 0x0000 },
+ { 0x8700, 0xa32d, 0x6000 },
+ { 0x8700, 0xa31d, 0x5000 },
+ { 0x8700, 0xa315, 0x4000 },
+ { 0x8700, 0xa311, 0x3000 },
+ { 0x8700, 0xa30f, 0x2000 },
+ { 0x0700, 0xa30e, 0x0000 },
+ { 0x0700, 0xa310, 0x0000 },
+ { 0x8700, 0xa313, 0x2000 },
+ { 0x0700, 0xa312, 0x0000 },
+ { 0x0700, 0xa314, 0x0000 },
+ { 0x8700, 0xa319, 0x3000 },
+ { 0x8700, 0xa317, 0x2000 },
+ { 0x0700, 0xa316, 0x0000 },
+ { 0x0700, 0xa318, 0x0000 },
+ { 0x8700, 0xa31b, 0x2000 },
+ { 0x0700, 0xa31a, 0x0000 },
+ { 0x0700, 0xa31c, 0x0000 },
+ { 0x8700, 0xa325, 0x4000 },
+ { 0x8700, 0xa321, 0x3000 },
+ { 0x8700, 0xa31f, 0x2000 },
+ { 0x0700, 0xa31e, 0x0000 },
+ { 0x0700, 0xa320, 0x0000 },
+ { 0x8700, 0xa323, 0x2000 },
+ { 0x0700, 0xa322, 0x0000 },
+ { 0x0700, 0xa324, 0x0000 },
+ { 0x8700, 0xa329, 0x3000 },
+ { 0x8700, 0xa327, 0x2000 },
+ { 0x0700, 0xa326, 0x0000 },
+ { 0x0700, 0xa328, 0x0000 },
+ { 0x8700, 0xa32b, 0x2000 },
+ { 0x0700, 0xa32a, 0x0000 },
+ { 0x0700, 0xa32c, 0x0000 },
+ { 0x8700, 0xa33d, 0x5000 },
+ { 0x8700, 0xa335, 0x4000 },
+ { 0x8700, 0xa331, 0x3000 },
+ { 0x8700, 0xa32f, 0x2000 },
+ { 0x0700, 0xa32e, 0x0000 },
+ { 0x0700, 0xa330, 0x0000 },
+ { 0x8700, 0xa333, 0x2000 },
+ { 0x0700, 0xa332, 0x0000 },
+ { 0x0700, 0xa334, 0x0000 },
+ { 0x8700, 0xa339, 0x3000 },
+ { 0x8700, 0xa337, 0x2000 },
+ { 0x0700, 0xa336, 0x0000 },
+ { 0x0700, 0xa338, 0x0000 },
+ { 0x8700, 0xa33b, 0x2000 },
+ { 0x0700, 0xa33a, 0x0000 },
+ { 0x0700, 0xa33c, 0x0000 },
+ { 0x8700, 0xa345, 0x4000 },
+ { 0x8700, 0xa341, 0x3000 },
+ { 0x8700, 0xa33f, 0x2000 },
+ { 0x0700, 0xa33e, 0x0000 },
+ { 0x0700, 0xa340, 0x0000 },
+ { 0x8700, 0xa343, 0x2000 },
+ { 0x0700, 0xa342, 0x0000 },
+ { 0x0700, 0xa344, 0x0000 },
+ { 0x8700, 0xa349, 0x3000 },
+ { 0x8700, 0xa347, 0x2000 },
+ { 0x0700, 0xa346, 0x0000 },
+ { 0x0700, 0xa348, 0x0000 },
+ { 0x8700, 0xa34b, 0x2000 },
+ { 0x0700, 0xa34a, 0x0000 },
+ { 0x0700, 0xa34c, 0x0000 },
+ { 0x8700, 0xfc4d, 0xb000 },
+ { 0x8700, 0xf97f, 0xa000 },
+ { 0x8700, 0xa44d, 0x9000 },
+ { 0x8700, 0xa3cd, 0x8000 },
+ { 0x8700, 0xa38d, 0x7000 },
+ { 0x8700, 0xa36d, 0x6000 },
+ { 0x8700, 0xa35d, 0x5000 },
+ { 0x8700, 0xa355, 0x4000 },
+ { 0x8700, 0xa351, 0x3000 },
+ { 0x8700, 0xa34f, 0x2000 },
+ { 0x0700, 0xa34e, 0x0000 },
+ { 0x0700, 0xa350, 0x0000 },
+ { 0x8700, 0xa353, 0x2000 },
+ { 0x0700, 0xa352, 0x0000 },
+ { 0x0700, 0xa354, 0x0000 },
+ { 0x8700, 0xa359, 0x3000 },
+ { 0x8700, 0xa357, 0x2000 },
+ { 0x0700, 0xa356, 0x0000 },
+ { 0x0700, 0xa358, 0x0000 },
+ { 0x8700, 0xa35b, 0x2000 },
+ { 0x0700, 0xa35a, 0x0000 },
+ { 0x0700, 0xa35c, 0x0000 },
+ { 0x8700, 0xa365, 0x4000 },
+ { 0x8700, 0xa361, 0x3000 },
+ { 0x8700, 0xa35f, 0x2000 },
+ { 0x0700, 0xa35e, 0x0000 },
+ { 0x0700, 0xa360, 0x0000 },
+ { 0x8700, 0xa363, 0x2000 },
+ { 0x0700, 0xa362, 0x0000 },
+ { 0x0700, 0xa364, 0x0000 },
+ { 0x8700, 0xa369, 0x3000 },
+ { 0x8700, 0xa367, 0x2000 },
+ { 0x0700, 0xa366, 0x0000 },
+ { 0x0700, 0xa368, 0x0000 },
+ { 0x8700, 0xa36b, 0x2000 },
+ { 0x0700, 0xa36a, 0x0000 },
+ { 0x0700, 0xa36c, 0x0000 },
+ { 0x8700, 0xa37d, 0x5000 },
+ { 0x8700, 0xa375, 0x4000 },
+ { 0x8700, 0xa371, 0x3000 },
+ { 0x8700, 0xa36f, 0x2000 },
+ { 0x0700, 0xa36e, 0x0000 },
+ { 0x0700, 0xa370, 0x0000 },
+ { 0x8700, 0xa373, 0x2000 },
+ { 0x0700, 0xa372, 0x0000 },
+ { 0x0700, 0xa374, 0x0000 },
+ { 0x8700, 0xa379, 0x3000 },
+ { 0x8700, 0xa377, 0x2000 },
+ { 0x0700, 0xa376, 0x0000 },
+ { 0x0700, 0xa378, 0x0000 },
+ { 0x8700, 0xa37b, 0x2000 },
+ { 0x0700, 0xa37a, 0x0000 },
+ { 0x0700, 0xa37c, 0x0000 },
+ { 0x8700, 0xa385, 0x4000 },
+ { 0x8700, 0xa381, 0x3000 },
+ { 0x8700, 0xa37f, 0x2000 },
+ { 0x0700, 0xa37e, 0x0000 },
+ { 0x0700, 0xa380, 0x0000 },
+ { 0x8700, 0xa383, 0x2000 },
+ { 0x0700, 0xa382, 0x0000 },
+ { 0x0700, 0xa384, 0x0000 },
+ { 0x8700, 0xa389, 0x3000 },
+ { 0x8700, 0xa387, 0x2000 },
+ { 0x0700, 0xa386, 0x0000 },
+ { 0x0700, 0xa388, 0x0000 },
+ { 0x8700, 0xa38b, 0x2000 },
+ { 0x0700, 0xa38a, 0x0000 },
+ { 0x0700, 0xa38c, 0x0000 },
+ { 0x8700, 0xa3ad, 0x6000 },
+ { 0x8700, 0xa39d, 0x5000 },
+ { 0x8700, 0xa395, 0x4000 },
+ { 0x8700, 0xa391, 0x3000 },
+ { 0x8700, 0xa38f, 0x2000 },
+ { 0x0700, 0xa38e, 0x0000 },
+ { 0x0700, 0xa390, 0x0000 },
+ { 0x8700, 0xa393, 0x2000 },
+ { 0x0700, 0xa392, 0x0000 },
+ { 0x0700, 0xa394, 0x0000 },
+ { 0x8700, 0xa399, 0x3000 },
+ { 0x8700, 0xa397, 0x2000 },
+ { 0x0700, 0xa396, 0x0000 },
+ { 0x0700, 0xa398, 0x0000 },
+ { 0x8700, 0xa39b, 0x2000 },
+ { 0x0700, 0xa39a, 0x0000 },
+ { 0x0700, 0xa39c, 0x0000 },
+ { 0x8700, 0xa3a5, 0x4000 },
+ { 0x8700, 0xa3a1, 0x3000 },
+ { 0x8700, 0xa39f, 0x2000 },
+ { 0x0700, 0xa39e, 0x0000 },
+ { 0x0700, 0xa3a0, 0x0000 },
+ { 0x8700, 0xa3a3, 0x2000 },
+ { 0x0700, 0xa3a2, 0x0000 },
+ { 0x0700, 0xa3a4, 0x0000 },
+ { 0x8700, 0xa3a9, 0x3000 },
+ { 0x8700, 0xa3a7, 0x2000 },
+ { 0x0700, 0xa3a6, 0x0000 },
+ { 0x0700, 0xa3a8, 0x0000 },
+ { 0x8700, 0xa3ab, 0x2000 },
+ { 0x0700, 0xa3aa, 0x0000 },
+ { 0x0700, 0xa3ac, 0x0000 },
+ { 0x8700, 0xa3bd, 0x5000 },
+ { 0x8700, 0xa3b5, 0x4000 },
+ { 0x8700, 0xa3b1, 0x3000 },
+ { 0x8700, 0xa3af, 0x2000 },
+ { 0x0700, 0xa3ae, 0x0000 },
+ { 0x0700, 0xa3b0, 0x0000 },
+ { 0x8700, 0xa3b3, 0x2000 },
+ { 0x0700, 0xa3b2, 0x0000 },
+ { 0x0700, 0xa3b4, 0x0000 },
+ { 0x8700, 0xa3b9, 0x3000 },
+ { 0x8700, 0xa3b7, 0x2000 },
+ { 0x0700, 0xa3b6, 0x0000 },
+ { 0x0700, 0xa3b8, 0x0000 },
+ { 0x8700, 0xa3bb, 0x2000 },
+ { 0x0700, 0xa3ba, 0x0000 },
+ { 0x0700, 0xa3bc, 0x0000 },
+ { 0x8700, 0xa3c5, 0x4000 },
+ { 0x8700, 0xa3c1, 0x3000 },
+ { 0x8700, 0xa3bf, 0x2000 },
+ { 0x0700, 0xa3be, 0x0000 },
+ { 0x0700, 0xa3c0, 0x0000 },
+ { 0x8700, 0xa3c3, 0x2000 },
+ { 0x0700, 0xa3c2, 0x0000 },
+ { 0x0700, 0xa3c4, 0x0000 },
+ { 0x8700, 0xa3c9, 0x3000 },
+ { 0x8700, 0xa3c7, 0x2000 },
+ { 0x0700, 0xa3c6, 0x0000 },
+ { 0x0700, 0xa3c8, 0x0000 },
+ { 0x8700, 0xa3cb, 0x2000 },
+ { 0x0700, 0xa3ca, 0x0000 },
+ { 0x0700, 0xa3cc, 0x0000 },
+ { 0x8700, 0xa40d, 0x7000 },
+ { 0x8700, 0xa3ed, 0x6000 },
+ { 0x8700, 0xa3dd, 0x5000 },
+ { 0x8700, 0xa3d5, 0x4000 },
+ { 0x8700, 0xa3d1, 0x3000 },
+ { 0x8700, 0xa3cf, 0x2000 },
+ { 0x0700, 0xa3ce, 0x0000 },
+ { 0x0700, 0xa3d0, 0x0000 },
+ { 0x8700, 0xa3d3, 0x2000 },
+ { 0x0700, 0xa3d2, 0x0000 },
+ { 0x0700, 0xa3d4, 0x0000 },
+ { 0x8700, 0xa3d9, 0x3000 },
+ { 0x8700, 0xa3d7, 0x2000 },
+ { 0x0700, 0xa3d6, 0x0000 },
+ { 0x0700, 0xa3d8, 0x0000 },
+ { 0x8700, 0xa3db, 0x2000 },
+ { 0x0700, 0xa3da, 0x0000 },
+ { 0x0700, 0xa3dc, 0x0000 },
+ { 0x8700, 0xa3e5, 0x4000 },
+ { 0x8700, 0xa3e1, 0x3000 },
+ { 0x8700, 0xa3df, 0x2000 },
+ { 0x0700, 0xa3de, 0x0000 },
+ { 0x0700, 0xa3e0, 0x0000 },
+ { 0x8700, 0xa3e3, 0x2000 },
+ { 0x0700, 0xa3e2, 0x0000 },
+ { 0x0700, 0xa3e4, 0x0000 },
+ { 0x8700, 0xa3e9, 0x3000 },
+ { 0x8700, 0xa3e7, 0x2000 },
+ { 0x0700, 0xa3e6, 0x0000 },
+ { 0x0700, 0xa3e8, 0x0000 },
+ { 0x8700, 0xa3eb, 0x2000 },
+ { 0x0700, 0xa3ea, 0x0000 },
+ { 0x0700, 0xa3ec, 0x0000 },
+ { 0x8700, 0xa3fd, 0x5000 },
+ { 0x8700, 0xa3f5, 0x4000 },
+ { 0x8700, 0xa3f1, 0x3000 },
+ { 0x8700, 0xa3ef, 0x2000 },
+ { 0x0700, 0xa3ee, 0x0000 },
+ { 0x0700, 0xa3f0, 0x0000 },
+ { 0x8700, 0xa3f3, 0x2000 },
+ { 0x0700, 0xa3f2, 0x0000 },
+ { 0x0700, 0xa3f4, 0x0000 },
+ { 0x8700, 0xa3f9, 0x3000 },
+ { 0x8700, 0xa3f7, 0x2000 },
+ { 0x0700, 0xa3f6, 0x0000 },
+ { 0x0700, 0xa3f8, 0x0000 },
+ { 0x8700, 0xa3fb, 0x2000 },
+ { 0x0700, 0xa3fa, 0x0000 },
+ { 0x0700, 0xa3fc, 0x0000 },
+ { 0x8700, 0xa405, 0x4000 },
+ { 0x8700, 0xa401, 0x3000 },
+ { 0x8700, 0xa3ff, 0x2000 },
+ { 0x0700, 0xa3fe, 0x0000 },
+ { 0x0700, 0xa400, 0x0000 },
+ { 0x8700, 0xa403, 0x2000 },
+ { 0x0700, 0xa402, 0x0000 },
+ { 0x0700, 0xa404, 0x0000 },
+ { 0x8700, 0xa409, 0x3000 },
+ { 0x8700, 0xa407, 0x2000 },
+ { 0x0700, 0xa406, 0x0000 },
+ { 0x0700, 0xa408, 0x0000 },
+ { 0x8700, 0xa40b, 0x2000 },
+ { 0x0700, 0xa40a, 0x0000 },
+ { 0x0700, 0xa40c, 0x0000 },
+ { 0x8700, 0xa42d, 0x6000 },
+ { 0x8700, 0xa41d, 0x5000 },
+ { 0x8700, 0xa415, 0x4000 },
+ { 0x8700, 0xa411, 0x3000 },
+ { 0x8700, 0xa40f, 0x2000 },
+ { 0x0700, 0xa40e, 0x0000 },
+ { 0x0700, 0xa410, 0x0000 },
+ { 0x8700, 0xa413, 0x2000 },
+ { 0x0700, 0xa412, 0x0000 },
+ { 0x0700, 0xa414, 0x0000 },
+ { 0x8700, 0xa419, 0x3000 },
+ { 0x8700, 0xa417, 0x2000 },
+ { 0x0700, 0xa416, 0x0000 },
+ { 0x0700, 0xa418, 0x0000 },
+ { 0x8700, 0xa41b, 0x2000 },
+ { 0x0700, 0xa41a, 0x0000 },
+ { 0x0700, 0xa41c, 0x0000 },
+ { 0x8700, 0xa425, 0x4000 },
+ { 0x8700, 0xa421, 0x3000 },
+ { 0x8700, 0xa41f, 0x2000 },
+ { 0x0700, 0xa41e, 0x0000 },
+ { 0x0700, 0xa420, 0x0000 },
+ { 0x8700, 0xa423, 0x2000 },
+ { 0x0700, 0xa422, 0x0000 },
+ { 0x0700, 0xa424, 0x0000 },
+ { 0x8700, 0xa429, 0x3000 },
+ { 0x8700, 0xa427, 0x2000 },
+ { 0x0700, 0xa426, 0x0000 },
+ { 0x0700, 0xa428, 0x0000 },
+ { 0x8700, 0xa42b, 0x2000 },
+ { 0x0700, 0xa42a, 0x0000 },
+ { 0x0700, 0xa42c, 0x0000 },
+ { 0x8700, 0xa43d, 0x5000 },
+ { 0x8700, 0xa435, 0x4000 },
+ { 0x8700, 0xa431, 0x3000 },
+ { 0x8700, 0xa42f, 0x2000 },
+ { 0x0700, 0xa42e, 0x0000 },
+ { 0x0700, 0xa430, 0x0000 },
+ { 0x8700, 0xa433, 0x2000 },
+ { 0x0700, 0xa432, 0x0000 },
+ { 0x0700, 0xa434, 0x0000 },
+ { 0x8700, 0xa439, 0x3000 },
+ { 0x8700, 0xa437, 0x2000 },
+ { 0x0700, 0xa436, 0x0000 },
+ { 0x0700, 0xa438, 0x0000 },
+ { 0x8700, 0xa43b, 0x2000 },
+ { 0x0700, 0xa43a, 0x0000 },
+ { 0x0700, 0xa43c, 0x0000 },
+ { 0x8700, 0xa445, 0x4000 },
+ { 0x8700, 0xa441, 0x3000 },
+ { 0x8700, 0xa43f, 0x2000 },
+ { 0x0700, 0xa43e, 0x0000 },
+ { 0x0700, 0xa440, 0x0000 },
+ { 0x8700, 0xa443, 0x2000 },
+ { 0x0700, 0xa442, 0x0000 },
+ { 0x0700, 0xa444, 0x0000 },
+ { 0x8700, 0xa449, 0x3000 },
+ { 0x8700, 0xa447, 0x2000 },
+ { 0x0700, 0xa446, 0x0000 },
+ { 0x0700, 0xa448, 0x0000 },
+ { 0x8700, 0xa44b, 0x2000 },
+ { 0x0700, 0xa44a, 0x0000 },
+ { 0x0700, 0xa44c, 0x0000 },
+ { 0x8300, 0xf8ff, 0x8000 },
+ { 0x9a00, 0xa490, 0x7000 },
+ { 0x8700, 0xa46d, 0x6000 },
+ { 0x8700, 0xa45d, 0x5000 },
+ { 0x8700, 0xa455, 0x4000 },
+ { 0x8700, 0xa451, 0x3000 },
+ { 0x8700, 0xa44f, 0x2000 },
+ { 0x0700, 0xa44e, 0x0000 },
+ { 0x0700, 0xa450, 0x0000 },
+ { 0x8700, 0xa453, 0x2000 },
+ { 0x0700, 0xa452, 0x0000 },
+ { 0x0700, 0xa454, 0x0000 },
+ { 0x8700, 0xa459, 0x3000 },
+ { 0x8700, 0xa457, 0x2000 },
+ { 0x0700, 0xa456, 0x0000 },
+ { 0x0700, 0xa458, 0x0000 },
+ { 0x8700, 0xa45b, 0x2000 },
+ { 0x0700, 0xa45a, 0x0000 },
+ { 0x0700, 0xa45c, 0x0000 },
+ { 0x8700, 0xa465, 0x4000 },
+ { 0x8700, 0xa461, 0x3000 },
+ { 0x8700, 0xa45f, 0x2000 },
+ { 0x0700, 0xa45e, 0x0000 },
+ { 0x0700, 0xa460, 0x0000 },
+ { 0x8700, 0xa463, 0x2000 },
+ { 0x0700, 0xa462, 0x0000 },
+ { 0x0700, 0xa464, 0x0000 },
+ { 0x8700, 0xa469, 0x3000 },
+ { 0x8700, 0xa467, 0x2000 },
+ { 0x0700, 0xa466, 0x0000 },
+ { 0x0700, 0xa468, 0x0000 },
+ { 0x8700, 0xa46b, 0x2000 },
+ { 0x0700, 0xa46a, 0x0000 },
+ { 0x0700, 0xa46c, 0x0000 },
+ { 0x8700, 0xa47d, 0x5000 },
+ { 0x8700, 0xa475, 0x4000 },
+ { 0x8700, 0xa471, 0x3000 },
+ { 0x8700, 0xa46f, 0x2000 },
+ { 0x0700, 0xa46e, 0x0000 },
+ { 0x0700, 0xa470, 0x0000 },
+ { 0x8700, 0xa473, 0x2000 },
+ { 0x0700, 0xa472, 0x0000 },
+ { 0x0700, 0xa474, 0x0000 },
+ { 0x8700, 0xa479, 0x3000 },
+ { 0x8700, 0xa477, 0x2000 },
+ { 0x0700, 0xa476, 0x0000 },
+ { 0x0700, 0xa478, 0x0000 },
+ { 0x8700, 0xa47b, 0x2000 },
+ { 0x0700, 0xa47a, 0x0000 },
+ { 0x0700, 0xa47c, 0x0000 },
+ { 0x8700, 0xa485, 0x4000 },
+ { 0x8700, 0xa481, 0x3000 },
+ { 0x8700, 0xa47f, 0x2000 },
+ { 0x0700, 0xa47e, 0x0000 },
+ { 0x0700, 0xa480, 0x0000 },
+ { 0x8700, 0xa483, 0x2000 },
+ { 0x0700, 0xa482, 0x0000 },
+ { 0x0700, 0xa484, 0x0000 },
+ { 0x8700, 0xa489, 0x3000 },
+ { 0x8700, 0xa487, 0x2000 },
+ { 0x0700, 0xa486, 0x0000 },
+ { 0x0700, 0xa488, 0x0000 },
+ { 0x8700, 0xa48b, 0x2000 },
+ { 0x0700, 0xa48a, 0x0000 },
+ { 0x0700, 0xa48c, 0x0000 },
+ { 0x9a00, 0xa4b0, 0x6000 },
+ { 0x9a00, 0xa4a0, 0x5000 },
+ { 0x9a00, 0xa498, 0x4000 },
+ { 0x9a00, 0xa494, 0x3000 },
+ { 0x9a00, 0xa492, 0x2000 },
+ { 0x1a00, 0xa491, 0x0000 },
+ { 0x1a00, 0xa493, 0x0000 },
+ { 0x9a00, 0xa496, 0x2000 },
+ { 0x1a00, 0xa495, 0x0000 },
+ { 0x1a00, 0xa497, 0x0000 },
+ { 0x9a00, 0xa49c, 0x3000 },
+ { 0x9a00, 0xa49a, 0x2000 },
+ { 0x1a00, 0xa499, 0x0000 },
+ { 0x1a00, 0xa49b, 0x0000 },
+ { 0x9a00, 0xa49e, 0x2000 },
+ { 0x1a00, 0xa49d, 0x0000 },
+ { 0x1a00, 0xa49f, 0x0000 },
+ { 0x9a00, 0xa4a8, 0x4000 },
+ { 0x9a00, 0xa4a4, 0x3000 },
+ { 0x9a00, 0xa4a2, 0x2000 },
+ { 0x1a00, 0xa4a1, 0x0000 },
+ { 0x1a00, 0xa4a3, 0x0000 },
+ { 0x9a00, 0xa4a6, 0x2000 },
+ { 0x1a00, 0xa4a5, 0x0000 },
+ { 0x1a00, 0xa4a7, 0x0000 },
+ { 0x9a00, 0xa4ac, 0x3000 },
+ { 0x9a00, 0xa4aa, 0x2000 },
+ { 0x1a00, 0xa4a9, 0x0000 },
+ { 0x1a00, 0xa4ab, 0x0000 },
+ { 0x9a00, 0xa4ae, 0x2000 },
+ { 0x1a00, 0xa4ad, 0x0000 },
+ { 0x1a00, 0xa4af, 0x0000 },
+ { 0x9a00, 0xa4c0, 0x5000 },
+ { 0x9a00, 0xa4b8, 0x4000 },
+ { 0x9a00, 0xa4b4, 0x3000 },
+ { 0x9a00, 0xa4b2, 0x2000 },
+ { 0x1a00, 0xa4b1, 0x0000 },
+ { 0x1a00, 0xa4b3, 0x0000 },
+ { 0x9a00, 0xa4b6, 0x2000 },
+ { 0x1a00, 0xa4b5, 0x0000 },
+ { 0x1a00, 0xa4b7, 0x0000 },
+ { 0x9a00, 0xa4bc, 0x3000 },
+ { 0x9a00, 0xa4ba, 0x2000 },
+ { 0x1a00, 0xa4b9, 0x0000 },
+ { 0x1a00, 0xa4bb, 0x0000 },
+ { 0x9a00, 0xa4be, 0x2000 },
+ { 0x1a00, 0xa4bd, 0x0000 },
+ { 0x1a00, 0xa4bf, 0x0000 },
+ { 0x8700, 0xd7a3, 0x4000 },
+ { 0x9a00, 0xa4c4, 0x3000 },
+ { 0x9a00, 0xa4c2, 0x2000 },
+ { 0x1a00, 0xa4c1, 0x0000 },
+ { 0x1a00, 0xa4c3, 0x0000 },
+ { 0x9a00, 0xa4c6, 0x2000 },
+ { 0x1a00, 0xa4c5, 0x0000 },
+ { 0x0700, 0xac00, 0x0000 },
+ { 0x8400, 0xdbff, 0x3000 },
+ { 0x8400, 0xdb7f, 0x2000 },
+ { 0x0400, 0xd800, 0x0000 },
+ { 0x0400, 0xdb80, 0x0000 },
+ { 0x8400, 0xdfff, 0x2000 },
+ { 0x0400, 0xdc00, 0x0000 },
+ { 0x0300, 0xe000, 0x0000 },
+ { 0x8700, 0xf93f, 0x7000 },
+ { 0x8700, 0xf91f, 0x6000 },
+ { 0x8700, 0xf90f, 0x5000 },
+ { 0x8700, 0xf907, 0x4000 },
+ { 0x8700, 0xf903, 0x3000 },
+ { 0x8700, 0xf901, 0x2000 },
+ { 0x0700, 0xf900, 0x0000 },
+ { 0x0700, 0xf902, 0x0000 },
+ { 0x8700, 0xf905, 0x2000 },
+ { 0x0700, 0xf904, 0x0000 },
+ { 0x0700, 0xf906, 0x0000 },
+ { 0x8700, 0xf90b, 0x3000 },
+ { 0x8700, 0xf909, 0x2000 },
+ { 0x0700, 0xf908, 0x0000 },
+ { 0x0700, 0xf90a, 0x0000 },
+ { 0x8700, 0xf90d, 0x2000 },
+ { 0x0700, 0xf90c, 0x0000 },
+ { 0x0700, 0xf90e, 0x0000 },
+ { 0x8700, 0xf917, 0x4000 },
+ { 0x8700, 0xf913, 0x3000 },
+ { 0x8700, 0xf911, 0x2000 },
+ { 0x0700, 0xf910, 0x0000 },
+ { 0x0700, 0xf912, 0x0000 },
+ { 0x8700, 0xf915, 0x2000 },
+ { 0x0700, 0xf914, 0x0000 },
+ { 0x0700, 0xf916, 0x0000 },
+ { 0x8700, 0xf91b, 0x3000 },
+ { 0x8700, 0xf919, 0x2000 },
+ { 0x0700, 0xf918, 0x0000 },
+ { 0x0700, 0xf91a, 0x0000 },
+ { 0x8700, 0xf91d, 0x2000 },
+ { 0x0700, 0xf91c, 0x0000 },
+ { 0x0700, 0xf91e, 0x0000 },
+ { 0x8700, 0xf92f, 0x5000 },
+ { 0x8700, 0xf927, 0x4000 },
+ { 0x8700, 0xf923, 0x3000 },
+ { 0x8700, 0xf921, 0x2000 },
+ { 0x0700, 0xf920, 0x0000 },
+ { 0x0700, 0xf922, 0x0000 },
+ { 0x8700, 0xf925, 0x2000 },
+ { 0x0700, 0xf924, 0x0000 },
+ { 0x0700, 0xf926, 0x0000 },
+ { 0x8700, 0xf92b, 0x3000 },
+ { 0x8700, 0xf929, 0x2000 },
+ { 0x0700, 0xf928, 0x0000 },
+ { 0x0700, 0xf92a, 0x0000 },
+ { 0x8700, 0xf92d, 0x2000 },
+ { 0x0700, 0xf92c, 0x0000 },
+ { 0x0700, 0xf92e, 0x0000 },
+ { 0x8700, 0xf937, 0x4000 },
+ { 0x8700, 0xf933, 0x3000 },
+ { 0x8700, 0xf931, 0x2000 },
+ { 0x0700, 0xf930, 0x0000 },
+ { 0x0700, 0xf932, 0x0000 },
+ { 0x8700, 0xf935, 0x2000 },
+ { 0x0700, 0xf934, 0x0000 },
+ { 0x0700, 0xf936, 0x0000 },
+ { 0x8700, 0xf93b, 0x3000 },
+ { 0x8700, 0xf939, 0x2000 },
+ { 0x0700, 0xf938, 0x0000 },
+ { 0x0700, 0xf93a, 0x0000 },
+ { 0x8700, 0xf93d, 0x2000 },
+ { 0x0700, 0xf93c, 0x0000 },
+ { 0x0700, 0xf93e, 0x0000 },
+ { 0x8700, 0xf95f, 0x6000 },
+ { 0x8700, 0xf94f, 0x5000 },
+ { 0x8700, 0xf947, 0x4000 },
+ { 0x8700, 0xf943, 0x3000 },
+ { 0x8700, 0xf941, 0x2000 },
+ { 0x0700, 0xf940, 0x0000 },
+ { 0x0700, 0xf942, 0x0000 },
+ { 0x8700, 0xf945, 0x2000 },
+ { 0x0700, 0xf944, 0x0000 },
+ { 0x0700, 0xf946, 0x0000 },
+ { 0x8700, 0xf94b, 0x3000 },
+ { 0x8700, 0xf949, 0x2000 },
+ { 0x0700, 0xf948, 0x0000 },
+ { 0x0700, 0xf94a, 0x0000 },
+ { 0x8700, 0xf94d, 0x2000 },
+ { 0x0700, 0xf94c, 0x0000 },
+ { 0x0700, 0xf94e, 0x0000 },
+ { 0x8700, 0xf957, 0x4000 },
+ { 0x8700, 0xf953, 0x3000 },
+ { 0x8700, 0xf951, 0x2000 },
+ { 0x0700, 0xf950, 0x0000 },
+ { 0x0700, 0xf952, 0x0000 },
+ { 0x8700, 0xf955, 0x2000 },
+ { 0x0700, 0xf954, 0x0000 },
+ { 0x0700, 0xf956, 0x0000 },
+ { 0x8700, 0xf95b, 0x3000 },
+ { 0x8700, 0xf959, 0x2000 },
+ { 0x0700, 0xf958, 0x0000 },
+ { 0x0700, 0xf95a, 0x0000 },
+ { 0x8700, 0xf95d, 0x2000 },
+ { 0x0700, 0xf95c, 0x0000 },
+ { 0x0700, 0xf95e, 0x0000 },
+ { 0x8700, 0xf96f, 0x5000 },
+ { 0x8700, 0xf967, 0x4000 },
+ { 0x8700, 0xf963, 0x3000 },
+ { 0x8700, 0xf961, 0x2000 },
+ { 0x0700, 0xf960, 0x0000 },
+ { 0x0700, 0xf962, 0x0000 },
+ { 0x8700, 0xf965, 0x2000 },
+ { 0x0700, 0xf964, 0x0000 },
+ { 0x0700, 0xf966, 0x0000 },
+ { 0x8700, 0xf96b, 0x3000 },
+ { 0x8700, 0xf969, 0x2000 },
+ { 0x0700, 0xf968, 0x0000 },
+ { 0x0700, 0xf96a, 0x0000 },
+ { 0x8700, 0xf96d, 0x2000 },
+ { 0x0700, 0xf96c, 0x0000 },
+ { 0x0700, 0xf96e, 0x0000 },
+ { 0x8700, 0xf977, 0x4000 },
+ { 0x8700, 0xf973, 0x3000 },
+ { 0x8700, 0xf971, 0x2000 },
+ { 0x0700, 0xf970, 0x0000 },
+ { 0x0700, 0xf972, 0x0000 },
+ { 0x8700, 0xf975, 0x2000 },
+ { 0x0700, 0xf974, 0x0000 },
+ { 0x0700, 0xf976, 0x0000 },
+ { 0x8700, 0xf97b, 0x3000 },
+ { 0x8700, 0xf979, 0x2000 },
+ { 0x0700, 0xf978, 0x0000 },
+ { 0x0700, 0xf97a, 0x0000 },
+ { 0x8700, 0xf97d, 0x2000 },
+ { 0x0700, 0xf97c, 0x0000 },
+ { 0x0700, 0xf97e, 0x0000 },
+ { 0x8700, 0xfb27, 0x9000 },
+ { 0x8700, 0xf9ff, 0x8000 },
+ { 0x8700, 0xf9bf, 0x7000 },
+ { 0x8700, 0xf99f, 0x6000 },
+ { 0x8700, 0xf98f, 0x5000 },
+ { 0x8700, 0xf987, 0x4000 },
+ { 0x8700, 0xf983, 0x3000 },
+ { 0x8700, 0xf981, 0x2000 },
+ { 0x0700, 0xf980, 0x0000 },
+ { 0x0700, 0xf982, 0x0000 },
+ { 0x8700, 0xf985, 0x2000 },
+ { 0x0700, 0xf984, 0x0000 },
+ { 0x0700, 0xf986, 0x0000 },
+ { 0x8700, 0xf98b, 0x3000 },
+ { 0x8700, 0xf989, 0x2000 },
+ { 0x0700, 0xf988, 0x0000 },
+ { 0x0700, 0xf98a, 0x0000 },
+ { 0x8700, 0xf98d, 0x2000 },
+ { 0x0700, 0xf98c, 0x0000 },
+ { 0x0700, 0xf98e, 0x0000 },
+ { 0x8700, 0xf997, 0x4000 },
+ { 0x8700, 0xf993, 0x3000 },
+ { 0x8700, 0xf991, 0x2000 },
+ { 0x0700, 0xf990, 0x0000 },
+ { 0x0700, 0xf992, 0x0000 },
+ { 0x8700, 0xf995, 0x2000 },
+ { 0x0700, 0xf994, 0x0000 },
+ { 0x0700, 0xf996, 0x0000 },
+ { 0x8700, 0xf99b, 0x3000 },
+ { 0x8700, 0xf999, 0x2000 },
+ { 0x0700, 0xf998, 0x0000 },
+ { 0x0700, 0xf99a, 0x0000 },
+ { 0x8700, 0xf99d, 0x2000 },
+ { 0x0700, 0xf99c, 0x0000 },
+ { 0x0700, 0xf99e, 0x0000 },
+ { 0x8700, 0xf9af, 0x5000 },
+ { 0x8700, 0xf9a7, 0x4000 },
+ { 0x8700, 0xf9a3, 0x3000 },
+ { 0x8700, 0xf9a1, 0x2000 },
+ { 0x0700, 0xf9a0, 0x0000 },
+ { 0x0700, 0xf9a2, 0x0000 },
+ { 0x8700, 0xf9a5, 0x2000 },
+ { 0x0700, 0xf9a4, 0x0000 },
+ { 0x0700, 0xf9a6, 0x0000 },
+ { 0x8700, 0xf9ab, 0x3000 },
+ { 0x8700, 0xf9a9, 0x2000 },
+ { 0x0700, 0xf9a8, 0x0000 },
+ { 0x0700, 0xf9aa, 0x0000 },
+ { 0x8700, 0xf9ad, 0x2000 },
+ { 0x0700, 0xf9ac, 0x0000 },
+ { 0x0700, 0xf9ae, 0x0000 },
+ { 0x8700, 0xf9b7, 0x4000 },
+ { 0x8700, 0xf9b3, 0x3000 },
+ { 0x8700, 0xf9b1, 0x2000 },
+ { 0x0700, 0xf9b0, 0x0000 },
+ { 0x0700, 0xf9b2, 0x0000 },
+ { 0x8700, 0xf9b5, 0x2000 },
+ { 0x0700, 0xf9b4, 0x0000 },
+ { 0x0700, 0xf9b6, 0x0000 },
+ { 0x8700, 0xf9bb, 0x3000 },
+ { 0x8700, 0xf9b9, 0x2000 },
+ { 0x0700, 0xf9b8, 0x0000 },
+ { 0x0700, 0xf9ba, 0x0000 },
+ { 0x8700, 0xf9bd, 0x2000 },
+ { 0x0700, 0xf9bc, 0x0000 },
+ { 0x0700, 0xf9be, 0x0000 },
+ { 0x8700, 0xf9df, 0x6000 },
+ { 0x8700, 0xf9cf, 0x5000 },
+ { 0x8700, 0xf9c7, 0x4000 },
+ { 0x8700, 0xf9c3, 0x3000 },
+ { 0x8700, 0xf9c1, 0x2000 },
+ { 0x0700, 0xf9c0, 0x0000 },
+ { 0x0700, 0xf9c2, 0x0000 },
+ { 0x8700, 0xf9c5, 0x2000 },
+ { 0x0700, 0xf9c4, 0x0000 },
+ { 0x0700, 0xf9c6, 0x0000 },
+ { 0x8700, 0xf9cb, 0x3000 },
+ { 0x8700, 0xf9c9, 0x2000 },
+ { 0x0700, 0xf9c8, 0x0000 },
+ { 0x0700, 0xf9ca, 0x0000 },
+ { 0x8700, 0xf9cd, 0x2000 },
+ { 0x0700, 0xf9cc, 0x0000 },
+ { 0x0700, 0xf9ce, 0x0000 },
+ { 0x8700, 0xf9d7, 0x4000 },
+ { 0x8700, 0xf9d3, 0x3000 },
+ { 0x8700, 0xf9d1, 0x2000 },
+ { 0x0700, 0xf9d0, 0x0000 },
+ { 0x0700, 0xf9d2, 0x0000 },
+ { 0x8700, 0xf9d5, 0x2000 },
+ { 0x0700, 0xf9d4, 0x0000 },
+ { 0x0700, 0xf9d6, 0x0000 },
+ { 0x8700, 0xf9db, 0x3000 },
+ { 0x8700, 0xf9d9, 0x2000 },
+ { 0x0700, 0xf9d8, 0x0000 },
+ { 0x0700, 0xf9da, 0x0000 },
+ { 0x8700, 0xf9dd, 0x2000 },
+ { 0x0700, 0xf9dc, 0x0000 },
+ { 0x0700, 0xf9de, 0x0000 },
+ { 0x8700, 0xf9ef, 0x5000 },
+ { 0x8700, 0xf9e7, 0x4000 },
+ { 0x8700, 0xf9e3, 0x3000 },
+ { 0x8700, 0xf9e1, 0x2000 },
+ { 0x0700, 0xf9e0, 0x0000 },
+ { 0x0700, 0xf9e2, 0x0000 },
+ { 0x8700, 0xf9e5, 0x2000 },
+ { 0x0700, 0xf9e4, 0x0000 },
+ { 0x0700, 0xf9e6, 0x0000 },
+ { 0x8700, 0xf9eb, 0x3000 },
+ { 0x8700, 0xf9e9, 0x2000 },
+ { 0x0700, 0xf9e8, 0x0000 },
+ { 0x0700, 0xf9ea, 0x0000 },
+ { 0x8700, 0xf9ed, 0x2000 },
+ { 0x0700, 0xf9ec, 0x0000 },
+ { 0x0700, 0xf9ee, 0x0000 },
+ { 0x8700, 0xf9f7, 0x4000 },
+ { 0x8700, 0xf9f3, 0x3000 },
+ { 0x8700, 0xf9f1, 0x2000 },
+ { 0x0700, 0xf9f0, 0x0000 },
+ { 0x0700, 0xf9f2, 0x0000 },
+ { 0x8700, 0xf9f5, 0x2000 },
+ { 0x0700, 0xf9f4, 0x0000 },
+ { 0x0700, 0xf9f6, 0x0000 },
+ { 0x8700, 0xf9fb, 0x3000 },
+ { 0x8700, 0xf9f9, 0x2000 },
+ { 0x0700, 0xf9f8, 0x0000 },
+ { 0x0700, 0xf9fa, 0x0000 },
+ { 0x8700, 0xf9fd, 0x2000 },
+ { 0x0700, 0xf9fc, 0x0000 },
+ { 0x0700, 0xf9fe, 0x0000 },
+ { 0x8700, 0xfa41, 0x7000 },
+ { 0x8700, 0xfa1f, 0x6000 },
+ { 0x8700, 0xfa0f, 0x5000 },
+ { 0x8700, 0xfa07, 0x4000 },
+ { 0x8700, 0xfa03, 0x3000 },
+ { 0x8700, 0xfa01, 0x2000 },
+ { 0x0700, 0xfa00, 0x0000 },
+ { 0x0700, 0xfa02, 0x0000 },
+ { 0x8700, 0xfa05, 0x2000 },
+ { 0x0700, 0xfa04, 0x0000 },
+ { 0x0700, 0xfa06, 0x0000 },
+ { 0x8700, 0xfa0b, 0x3000 },
+ { 0x8700, 0xfa09, 0x2000 },
+ { 0x0700, 0xfa08, 0x0000 },
+ { 0x0700, 0xfa0a, 0x0000 },
+ { 0x8700, 0xfa0d, 0x2000 },
+ { 0x0700, 0xfa0c, 0x0000 },
+ { 0x0700, 0xfa0e, 0x0000 },
+ { 0x8700, 0xfa17, 0x4000 },
+ { 0x8700, 0xfa13, 0x3000 },
+ { 0x8700, 0xfa11, 0x2000 },
+ { 0x0700, 0xfa10, 0x0000 },
+ { 0x0700, 0xfa12, 0x0000 },
+ { 0x8700, 0xfa15, 0x2000 },
+ { 0x0700, 0xfa14, 0x0000 },
+ { 0x0700, 0xfa16, 0x0000 },
+ { 0x8700, 0xfa1b, 0x3000 },
+ { 0x8700, 0xfa19, 0x2000 },
+ { 0x0700, 0xfa18, 0x0000 },
+ { 0x0700, 0xfa1a, 0x0000 },
+ { 0x8700, 0xfa1d, 0x2000 },
+ { 0x0700, 0xfa1c, 0x0000 },
+ { 0x0700, 0xfa1e, 0x0000 },
+ { 0x8700, 0xfa31, 0x5000 },
+ { 0x8700, 0xfa27, 0x4000 },
+ { 0x8700, 0xfa23, 0x3000 },
+ { 0x8700, 0xfa21, 0x2000 },
+ { 0x0700, 0xfa20, 0x0000 },
+ { 0x0700, 0xfa22, 0x0000 },
+ { 0x8700, 0xfa25, 0x2000 },
+ { 0x0700, 0xfa24, 0x0000 },
+ { 0x0700, 0xfa26, 0x0000 },
+ { 0x8700, 0xfa2b, 0x3000 },
+ { 0x8700, 0xfa29, 0x2000 },
+ { 0x0700, 0xfa28, 0x0000 },
+ { 0x0700, 0xfa2a, 0x0000 },
+ { 0x8700, 0xfa2d, 0x2000 },
+ { 0x0700, 0xfa2c, 0x0000 },
+ { 0x0700, 0xfa30, 0x0000 },
+ { 0x8700, 0xfa39, 0x4000 },
+ { 0x8700, 0xfa35, 0x3000 },
+ { 0x8700, 0xfa33, 0x2000 },
+ { 0x0700, 0xfa32, 0x0000 },
+ { 0x0700, 0xfa34, 0x0000 },
+ { 0x8700, 0xfa37, 0x2000 },
+ { 0x0700, 0xfa36, 0x0000 },
+ { 0x0700, 0xfa38, 0x0000 },
+ { 0x8700, 0xfa3d, 0x3000 },
+ { 0x8700, 0xfa3b, 0x2000 },
+ { 0x0700, 0xfa3a, 0x0000 },
+ { 0x0700, 0xfa3c, 0x0000 },
+ { 0x8700, 0xfa3f, 0x2000 },
+ { 0x0700, 0xfa3e, 0x0000 },
+ { 0x0700, 0xfa40, 0x0000 },
+ { 0x8700, 0xfa61, 0x6000 },
+ { 0x8700, 0xfa51, 0x5000 },
+ { 0x8700, 0xfa49, 0x4000 },
+ { 0x8700, 0xfa45, 0x3000 },
+ { 0x8700, 0xfa43, 0x2000 },
+ { 0x0700, 0xfa42, 0x0000 },
+ { 0x0700, 0xfa44, 0x0000 },
+ { 0x8700, 0xfa47, 0x2000 },
+ { 0x0700, 0xfa46, 0x0000 },
+ { 0x0700, 0xfa48, 0x0000 },
+ { 0x8700, 0xfa4d, 0x3000 },
+ { 0x8700, 0xfa4b, 0x2000 },
+ { 0x0700, 0xfa4a, 0x0000 },
+ { 0x0700, 0xfa4c, 0x0000 },
+ { 0x8700, 0xfa4f, 0x2000 },
+ { 0x0700, 0xfa4e, 0x0000 },
+ { 0x0700, 0xfa50, 0x0000 },
+ { 0x8700, 0xfa59, 0x4000 },
+ { 0x8700, 0xfa55, 0x3000 },
+ { 0x8700, 0xfa53, 0x2000 },
+ { 0x0700, 0xfa52, 0x0000 },
+ { 0x0700, 0xfa54, 0x0000 },
+ { 0x8700, 0xfa57, 0x2000 },
+ { 0x0700, 0xfa56, 0x0000 },
+ { 0x0700, 0xfa58, 0x0000 },
+ { 0x8700, 0xfa5d, 0x3000 },
+ { 0x8700, 0xfa5b, 0x2000 },
+ { 0x0700, 0xfa5a, 0x0000 },
+ { 0x0700, 0xfa5c, 0x0000 },
+ { 0x8700, 0xfa5f, 0x2000 },
+ { 0x0700, 0xfa5e, 0x0000 },
+ { 0x0700, 0xfa60, 0x0000 },
+ { 0x8500, 0xfb06, 0x5000 },
+ { 0x8700, 0xfa69, 0x4000 },
+ { 0x8700, 0xfa65, 0x3000 },
+ { 0x8700, 0xfa63, 0x2000 },
+ { 0x0700, 0xfa62, 0x0000 },
+ { 0x0700, 0xfa64, 0x0000 },
+ { 0x8700, 0xfa67, 0x2000 },
+ { 0x0700, 0xfa66, 0x0000 },
+ { 0x0700, 0xfa68, 0x0000 },
+ { 0x8500, 0xfb02, 0x3000 },
+ { 0x8500, 0xfb00, 0x2000 },
+ { 0x0700, 0xfa6a, 0x0000 },
+ { 0x0500, 0xfb01, 0x0000 },
+ { 0x8500, 0xfb04, 0x2000 },
+ { 0x0500, 0xfb03, 0x0000 },
+ { 0x0500, 0xfb05, 0x0000 },
+ { 0x8700, 0xfb1f, 0x4000 },
+ { 0x8500, 0xfb16, 0x3000 },
+ { 0x8500, 0xfb14, 0x2000 },
+ { 0x0500, 0xfb13, 0x0000 },
+ { 0x0500, 0xfb15, 0x0000 },
+ { 0x8700, 0xfb1d, 0x2000 },
+ { 0x0500, 0xfb17, 0x0000 },
+ { 0x0c00, 0xfb1e, 0x0000 },
+ { 0x8700, 0xfb23, 0x3000 },
+ { 0x8700, 0xfb21, 0x2000 },
+ { 0x0700, 0xfb20, 0x0000 },
+ { 0x0700, 0xfb22, 0x0000 },
+ { 0x8700, 0xfb25, 0x2000 },
+ { 0x0700, 0xfb24, 0x0000 },
+ { 0x0700, 0xfb26, 0x0000 },
+ { 0x8700, 0xfbac, 0x8000 },
+ { 0x8700, 0xfb6c, 0x7000 },
+ { 0x8700, 0xfb4c, 0x6000 },
+ { 0x8700, 0xfb38, 0x5000 },
+ { 0x8700, 0xfb2f, 0x4000 },
+ { 0x8700, 0xfb2b, 0x3000 },
+ { 0x9900, 0xfb29, 0x2000 },
+ { 0x0700, 0xfb28, 0x0000 },
+ { 0x0700, 0xfb2a, 0x0000 },
+ { 0x8700, 0xfb2d, 0x2000 },
+ { 0x0700, 0xfb2c, 0x0000 },
+ { 0x0700, 0xfb2e, 0x0000 },
+ { 0x8700, 0xfb33, 0x3000 },
+ { 0x8700, 0xfb31, 0x2000 },
+ { 0x0700, 0xfb30, 0x0000 },
+ { 0x0700, 0xfb32, 0x0000 },
+ { 0x8700, 0xfb35, 0x2000 },
+ { 0x0700, 0xfb34, 0x0000 },
+ { 0x0700, 0xfb36, 0x0000 },
+ { 0x8700, 0xfb43, 0x4000 },
+ { 0x8700, 0xfb3c, 0x3000 },
+ { 0x8700, 0xfb3a, 0x2000 },
+ { 0x0700, 0xfb39, 0x0000 },
+ { 0x0700, 0xfb3b, 0x0000 },
+ { 0x8700, 0xfb40, 0x2000 },
+ { 0x0700, 0xfb3e, 0x0000 },
+ { 0x0700, 0xfb41, 0x0000 },
+ { 0x8700, 0xfb48, 0x3000 },
+ { 0x8700, 0xfb46, 0x2000 },
+ { 0x0700, 0xfb44, 0x0000 },
+ { 0x0700, 0xfb47, 0x0000 },
+ { 0x8700, 0xfb4a, 0x2000 },
+ { 0x0700, 0xfb49, 0x0000 },
+ { 0x0700, 0xfb4b, 0x0000 },
+ { 0x8700, 0xfb5c, 0x5000 },
+ { 0x8700, 0xfb54, 0x4000 },
+ { 0x8700, 0xfb50, 0x3000 },
+ { 0x8700, 0xfb4e, 0x2000 },
+ { 0x0700, 0xfb4d, 0x0000 },
+ { 0x0700, 0xfb4f, 0x0000 },
+ { 0x8700, 0xfb52, 0x2000 },
+ { 0x0700, 0xfb51, 0x0000 },
+ { 0x0700, 0xfb53, 0x0000 },
+ { 0x8700, 0xfb58, 0x3000 },
+ { 0x8700, 0xfb56, 0x2000 },
+ { 0x0700, 0xfb55, 0x0000 },
+ { 0x0700, 0xfb57, 0x0000 },
+ { 0x8700, 0xfb5a, 0x2000 },
+ { 0x0700, 0xfb59, 0x0000 },
+ { 0x0700, 0xfb5b, 0x0000 },
+ { 0x8700, 0xfb64, 0x4000 },
+ { 0x8700, 0xfb60, 0x3000 },
+ { 0x8700, 0xfb5e, 0x2000 },
+ { 0x0700, 0xfb5d, 0x0000 },
+ { 0x0700, 0xfb5f, 0x0000 },
+ { 0x8700, 0xfb62, 0x2000 },
+ { 0x0700, 0xfb61, 0x0000 },
+ { 0x0700, 0xfb63, 0x0000 },
+ { 0x8700, 0xfb68, 0x3000 },
+ { 0x8700, 0xfb66, 0x2000 },
+ { 0x0700, 0xfb65, 0x0000 },
+ { 0x0700, 0xfb67, 0x0000 },
+ { 0x8700, 0xfb6a, 0x2000 },
+ { 0x0700, 0xfb69, 0x0000 },
+ { 0x0700, 0xfb6b, 0x0000 },
+ { 0x8700, 0xfb8c, 0x6000 },
+ { 0x8700, 0xfb7c, 0x5000 },
+ { 0x8700, 0xfb74, 0x4000 },
+ { 0x8700, 0xfb70, 0x3000 },
+ { 0x8700, 0xfb6e, 0x2000 },
+ { 0x0700, 0xfb6d, 0x0000 },
+ { 0x0700, 0xfb6f, 0x0000 },
+ { 0x8700, 0xfb72, 0x2000 },
+ { 0x0700, 0xfb71, 0x0000 },
+ { 0x0700, 0xfb73, 0x0000 },
+ { 0x8700, 0xfb78, 0x3000 },
+ { 0x8700, 0xfb76, 0x2000 },
+ { 0x0700, 0xfb75, 0x0000 },
+ { 0x0700, 0xfb77, 0x0000 },
+ { 0x8700, 0xfb7a, 0x2000 },
+ { 0x0700, 0xfb79, 0x0000 },
+ { 0x0700, 0xfb7b, 0x0000 },
+ { 0x8700, 0xfb84, 0x4000 },
+ { 0x8700, 0xfb80, 0x3000 },
+ { 0x8700, 0xfb7e, 0x2000 },
+ { 0x0700, 0xfb7d, 0x0000 },
+ { 0x0700, 0xfb7f, 0x0000 },
+ { 0x8700, 0xfb82, 0x2000 },
+ { 0x0700, 0xfb81, 0x0000 },
+ { 0x0700, 0xfb83, 0x0000 },
+ { 0x8700, 0xfb88, 0x3000 },
+ { 0x8700, 0xfb86, 0x2000 },
+ { 0x0700, 0xfb85, 0x0000 },
+ { 0x0700, 0xfb87, 0x0000 },
+ { 0x8700, 0xfb8a, 0x2000 },
+ { 0x0700, 0xfb89, 0x0000 },
+ { 0x0700, 0xfb8b, 0x0000 },
+ { 0x8700, 0xfb9c, 0x5000 },
+ { 0x8700, 0xfb94, 0x4000 },
+ { 0x8700, 0xfb90, 0x3000 },
+ { 0x8700, 0xfb8e, 0x2000 },
+ { 0x0700, 0xfb8d, 0x0000 },
+ { 0x0700, 0xfb8f, 0x0000 },
+ { 0x8700, 0xfb92, 0x2000 },
+ { 0x0700, 0xfb91, 0x0000 },
+ { 0x0700, 0xfb93, 0x0000 },
+ { 0x8700, 0xfb98, 0x3000 },
+ { 0x8700, 0xfb96, 0x2000 },
+ { 0x0700, 0xfb95, 0x0000 },
+ { 0x0700, 0xfb97, 0x0000 },
+ { 0x8700, 0xfb9a, 0x2000 },
+ { 0x0700, 0xfb99, 0x0000 },
+ { 0x0700, 0xfb9b, 0x0000 },
+ { 0x8700, 0xfba4, 0x4000 },
+ { 0x8700, 0xfba0, 0x3000 },
+ { 0x8700, 0xfb9e, 0x2000 },
+ { 0x0700, 0xfb9d, 0x0000 },
+ { 0x0700, 0xfb9f, 0x0000 },
+ { 0x8700, 0xfba2, 0x2000 },
+ { 0x0700, 0xfba1, 0x0000 },
+ { 0x0700, 0xfba3, 0x0000 },
+ { 0x8700, 0xfba8, 0x3000 },
+ { 0x8700, 0xfba6, 0x2000 },
+ { 0x0700, 0xfba5, 0x0000 },
+ { 0x0700, 0xfba7, 0x0000 },
+ { 0x8700, 0xfbaa, 0x2000 },
+ { 0x0700, 0xfba9, 0x0000 },
+ { 0x0700, 0xfbab, 0x0000 },
+ { 0x8700, 0xfc0d, 0x7000 },
+ { 0x8700, 0xfbed, 0x6000 },
+ { 0x8700, 0xfbdd, 0x5000 },
+ { 0x8700, 0xfbd5, 0x4000 },
+ { 0x8700, 0xfbb0, 0x3000 },
+ { 0x8700, 0xfbae, 0x2000 },
+ { 0x0700, 0xfbad, 0x0000 },
+ { 0x0700, 0xfbaf, 0x0000 },
+ { 0x8700, 0xfbd3, 0x2000 },
+ { 0x0700, 0xfbb1, 0x0000 },
+ { 0x0700, 0xfbd4, 0x0000 },
+ { 0x8700, 0xfbd9, 0x3000 },
+ { 0x8700, 0xfbd7, 0x2000 },
+ { 0x0700, 0xfbd6, 0x0000 },
+ { 0x0700, 0xfbd8, 0x0000 },
+ { 0x8700, 0xfbdb, 0x2000 },
+ { 0x0700, 0xfbda, 0x0000 },
+ { 0x0700, 0xfbdc, 0x0000 },
+ { 0x8700, 0xfbe5, 0x4000 },
+ { 0x8700, 0xfbe1, 0x3000 },
+ { 0x8700, 0xfbdf, 0x2000 },
+ { 0x0700, 0xfbde, 0x0000 },
+ { 0x0700, 0xfbe0, 0x0000 },
+ { 0x8700, 0xfbe3, 0x2000 },
+ { 0x0700, 0xfbe2, 0x0000 },
+ { 0x0700, 0xfbe4, 0x0000 },
+ { 0x8700, 0xfbe9, 0x3000 },
+ { 0x8700, 0xfbe7, 0x2000 },
+ { 0x0700, 0xfbe6, 0x0000 },
+ { 0x0700, 0xfbe8, 0x0000 },
+ { 0x8700, 0xfbeb, 0x2000 },
+ { 0x0700, 0xfbea, 0x0000 },
+ { 0x0700, 0xfbec, 0x0000 },
+ { 0x8700, 0xfbfd, 0x5000 },
+ { 0x8700, 0xfbf5, 0x4000 },
+ { 0x8700, 0xfbf1, 0x3000 },
+ { 0x8700, 0xfbef, 0x2000 },
+ { 0x0700, 0xfbee, 0x0000 },
+ { 0x0700, 0xfbf0, 0x0000 },
+ { 0x8700, 0xfbf3, 0x2000 },
+ { 0x0700, 0xfbf2, 0x0000 },
+ { 0x0700, 0xfbf4, 0x0000 },
+ { 0x8700, 0xfbf9, 0x3000 },
+ { 0x8700, 0xfbf7, 0x2000 },
+ { 0x0700, 0xfbf6, 0x0000 },
+ { 0x0700, 0xfbf8, 0x0000 },
+ { 0x8700, 0xfbfb, 0x2000 },
+ { 0x0700, 0xfbfa, 0x0000 },
+ { 0x0700, 0xfbfc, 0x0000 },
+ { 0x8700, 0xfc05, 0x4000 },
+ { 0x8700, 0xfc01, 0x3000 },
+ { 0x8700, 0xfbff, 0x2000 },
+ { 0x0700, 0xfbfe, 0x0000 },
+ { 0x0700, 0xfc00, 0x0000 },
+ { 0x8700, 0xfc03, 0x2000 },
+ { 0x0700, 0xfc02, 0x0000 },
+ { 0x0700, 0xfc04, 0x0000 },
+ { 0x8700, 0xfc09, 0x3000 },
+ { 0x8700, 0xfc07, 0x2000 },
+ { 0x0700, 0xfc06, 0x0000 },
+ { 0x0700, 0xfc08, 0x0000 },
+ { 0x8700, 0xfc0b, 0x2000 },
+ { 0x0700, 0xfc0a, 0x0000 },
+ { 0x0700, 0xfc0c, 0x0000 },
+ { 0x8700, 0xfc2d, 0x6000 },
+ { 0x8700, 0xfc1d, 0x5000 },
+ { 0x8700, 0xfc15, 0x4000 },
+ { 0x8700, 0xfc11, 0x3000 },
+ { 0x8700, 0xfc0f, 0x2000 },
+ { 0x0700, 0xfc0e, 0x0000 },
+ { 0x0700, 0xfc10, 0x0000 },
+ { 0x8700, 0xfc13, 0x2000 },
+ { 0x0700, 0xfc12, 0x0000 },
+ { 0x0700, 0xfc14, 0x0000 },
+ { 0x8700, 0xfc19, 0x3000 },
+ { 0x8700, 0xfc17, 0x2000 },
+ { 0x0700, 0xfc16, 0x0000 },
+ { 0x0700, 0xfc18, 0x0000 },
+ { 0x8700, 0xfc1b, 0x2000 },
+ { 0x0700, 0xfc1a, 0x0000 },
+ { 0x0700, 0xfc1c, 0x0000 },
+ { 0x8700, 0xfc25, 0x4000 },
+ { 0x8700, 0xfc21, 0x3000 },
+ { 0x8700, 0xfc1f, 0x2000 },
+ { 0x0700, 0xfc1e, 0x0000 },
+ { 0x0700, 0xfc20, 0x0000 },
+ { 0x8700, 0xfc23, 0x2000 },
+ { 0x0700, 0xfc22, 0x0000 },
+ { 0x0700, 0xfc24, 0x0000 },
+ { 0x8700, 0xfc29, 0x3000 },
+ { 0x8700, 0xfc27, 0x2000 },
+ { 0x0700, 0xfc26, 0x0000 },
+ { 0x0700, 0xfc28, 0x0000 },
+ { 0x8700, 0xfc2b, 0x2000 },
+ { 0x0700, 0xfc2a, 0x0000 },
+ { 0x0700, 0xfc2c, 0x0000 },
+ { 0x8700, 0xfc3d, 0x5000 },
+ { 0x8700, 0xfc35, 0x4000 },
+ { 0x8700, 0xfc31, 0x3000 },
+ { 0x8700, 0xfc2f, 0x2000 },
+ { 0x0700, 0xfc2e, 0x0000 },
+ { 0x0700, 0xfc30, 0x0000 },
+ { 0x8700, 0xfc33, 0x2000 },
+ { 0x0700, 0xfc32, 0x0000 },
+ { 0x0700, 0xfc34, 0x0000 },
+ { 0x8700, 0xfc39, 0x3000 },
+ { 0x8700, 0xfc37, 0x2000 },
+ { 0x0700, 0xfc36, 0x0000 },
+ { 0x0700, 0xfc38, 0x0000 },
+ { 0x8700, 0xfc3b, 0x2000 },
+ { 0x0700, 0xfc3a, 0x0000 },
+ { 0x0700, 0xfc3c, 0x0000 },
+ { 0x8700, 0xfc45, 0x4000 },
+ { 0x8700, 0xfc41, 0x3000 },
+ { 0x8700, 0xfc3f, 0x2000 },
+ { 0x0700, 0xfc3e, 0x0000 },
+ { 0x0700, 0xfc40, 0x0000 },
+ { 0x8700, 0xfc43, 0x2000 },
+ { 0x0700, 0xfc42, 0x0000 },
+ { 0x0700, 0xfc44, 0x0000 },
+ { 0x8700, 0xfc49, 0x3000 },
+ { 0x8700, 0xfc47, 0x2000 },
+ { 0x0700, 0xfc46, 0x0000 },
+ { 0x0700, 0xfc48, 0x0000 },
+ { 0x8700, 0xfc4b, 0x2000 },
+ { 0x0700, 0xfc4a, 0x0000 },
+ { 0x0700, 0xfc4c, 0x0000 },
+ { 0x8700, 0xfeac, 0xa000 },
+ { 0x8700, 0xfd5d, 0x9000 },
+ { 0x8700, 0xfccd, 0x8000 },
+ { 0x8700, 0xfc8d, 0x7000 },
+ { 0x8700, 0xfc6d, 0x6000 },
+ { 0x8700, 0xfc5d, 0x5000 },
+ { 0x8700, 0xfc55, 0x4000 },
+ { 0x8700, 0xfc51, 0x3000 },
+ { 0x8700, 0xfc4f, 0x2000 },
+ { 0x0700, 0xfc4e, 0x0000 },
+ { 0x0700, 0xfc50, 0x0000 },
+ { 0x8700, 0xfc53, 0x2000 },
+ { 0x0700, 0xfc52, 0x0000 },
+ { 0x0700, 0xfc54, 0x0000 },
+ { 0x8700, 0xfc59, 0x3000 },
+ { 0x8700, 0xfc57, 0x2000 },
+ { 0x0700, 0xfc56, 0x0000 },
+ { 0x0700, 0xfc58, 0x0000 },
+ { 0x8700, 0xfc5b, 0x2000 },
+ { 0x0700, 0xfc5a, 0x0000 },
+ { 0x0700, 0xfc5c, 0x0000 },
+ { 0x8700, 0xfc65, 0x4000 },
+ { 0x8700, 0xfc61, 0x3000 },
+ { 0x8700, 0xfc5f, 0x2000 },
+ { 0x0700, 0xfc5e, 0x0000 },
+ { 0x0700, 0xfc60, 0x0000 },
+ { 0x8700, 0xfc63, 0x2000 },
+ { 0x0700, 0xfc62, 0x0000 },
+ { 0x0700, 0xfc64, 0x0000 },
+ { 0x8700, 0xfc69, 0x3000 },
+ { 0x8700, 0xfc67, 0x2000 },
+ { 0x0700, 0xfc66, 0x0000 },
+ { 0x0700, 0xfc68, 0x0000 },
+ { 0x8700, 0xfc6b, 0x2000 },
+ { 0x0700, 0xfc6a, 0x0000 },
+ { 0x0700, 0xfc6c, 0x0000 },
+ { 0x8700, 0xfc7d, 0x5000 },
+ { 0x8700, 0xfc75, 0x4000 },
+ { 0x8700, 0xfc71, 0x3000 },
+ { 0x8700, 0xfc6f, 0x2000 },
+ { 0x0700, 0xfc6e, 0x0000 },
+ { 0x0700, 0xfc70, 0x0000 },
+ { 0x8700, 0xfc73, 0x2000 },
+ { 0x0700, 0xfc72, 0x0000 },
+ { 0x0700, 0xfc74, 0x0000 },
+ { 0x8700, 0xfc79, 0x3000 },
+ { 0x8700, 0xfc77, 0x2000 },
+ { 0x0700, 0xfc76, 0x0000 },
+ { 0x0700, 0xfc78, 0x0000 },
+ { 0x8700, 0xfc7b, 0x2000 },
+ { 0x0700, 0xfc7a, 0x0000 },
+ { 0x0700, 0xfc7c, 0x0000 },
+ { 0x8700, 0xfc85, 0x4000 },
+ { 0x8700, 0xfc81, 0x3000 },
+ { 0x8700, 0xfc7f, 0x2000 },
+ { 0x0700, 0xfc7e, 0x0000 },
+ { 0x0700, 0xfc80, 0x0000 },
+ { 0x8700, 0xfc83, 0x2000 },
+ { 0x0700, 0xfc82, 0x0000 },
+ { 0x0700, 0xfc84, 0x0000 },
+ { 0x8700, 0xfc89, 0x3000 },
+ { 0x8700, 0xfc87, 0x2000 },
+ { 0x0700, 0xfc86, 0x0000 },
+ { 0x0700, 0xfc88, 0x0000 },
+ { 0x8700, 0xfc8b, 0x2000 },
+ { 0x0700, 0xfc8a, 0x0000 },
+ { 0x0700, 0xfc8c, 0x0000 },
+ { 0x8700, 0xfcad, 0x6000 },
+ { 0x8700, 0xfc9d, 0x5000 },
+ { 0x8700, 0xfc95, 0x4000 },
+ { 0x8700, 0xfc91, 0x3000 },
+ { 0x8700, 0xfc8f, 0x2000 },
+ { 0x0700, 0xfc8e, 0x0000 },
+ { 0x0700, 0xfc90, 0x0000 },
+ { 0x8700, 0xfc93, 0x2000 },
+ { 0x0700, 0xfc92, 0x0000 },
+ { 0x0700, 0xfc94, 0x0000 },
+ { 0x8700, 0xfc99, 0x3000 },
+ { 0x8700, 0xfc97, 0x2000 },
+ { 0x0700, 0xfc96, 0x0000 },
+ { 0x0700, 0xfc98, 0x0000 },
+ { 0x8700, 0xfc9b, 0x2000 },
+ { 0x0700, 0xfc9a, 0x0000 },
+ { 0x0700, 0xfc9c, 0x0000 },
+ { 0x8700, 0xfca5, 0x4000 },
+ { 0x8700, 0xfca1, 0x3000 },
+ { 0x8700, 0xfc9f, 0x2000 },
+ { 0x0700, 0xfc9e, 0x0000 },
+ { 0x0700, 0xfca0, 0x0000 },
+ { 0x8700, 0xfca3, 0x2000 },
+ { 0x0700, 0xfca2, 0x0000 },
+ { 0x0700, 0xfca4, 0x0000 },
+ { 0x8700, 0xfca9, 0x3000 },
+ { 0x8700, 0xfca7, 0x2000 },
+ { 0x0700, 0xfca6, 0x0000 },
+ { 0x0700, 0xfca8, 0x0000 },
+ { 0x8700, 0xfcab, 0x2000 },
+ { 0x0700, 0xfcaa, 0x0000 },
+ { 0x0700, 0xfcac, 0x0000 },
+ { 0x8700, 0xfcbd, 0x5000 },
+ { 0x8700, 0xfcb5, 0x4000 },
+ { 0x8700, 0xfcb1, 0x3000 },
+ { 0x8700, 0xfcaf, 0x2000 },
+ { 0x0700, 0xfcae, 0x0000 },
+ { 0x0700, 0xfcb0, 0x0000 },
+ { 0x8700, 0xfcb3, 0x2000 },
+ { 0x0700, 0xfcb2, 0x0000 },
+ { 0x0700, 0xfcb4, 0x0000 },
+ { 0x8700, 0xfcb9, 0x3000 },
+ { 0x8700, 0xfcb7, 0x2000 },
+ { 0x0700, 0xfcb6, 0x0000 },
+ { 0x0700, 0xfcb8, 0x0000 },
+ { 0x8700, 0xfcbb, 0x2000 },
+ { 0x0700, 0xfcba, 0x0000 },
+ { 0x0700, 0xfcbc, 0x0000 },
+ { 0x8700, 0xfcc5, 0x4000 },
+ { 0x8700, 0xfcc1, 0x3000 },
+ { 0x8700, 0xfcbf, 0x2000 },
+ { 0x0700, 0xfcbe, 0x0000 },
+ { 0x0700, 0xfcc0, 0x0000 },
+ { 0x8700, 0xfcc3, 0x2000 },
+ { 0x0700, 0xfcc2, 0x0000 },
+ { 0x0700, 0xfcc4, 0x0000 },
+ { 0x8700, 0xfcc9, 0x3000 },
+ { 0x8700, 0xfcc7, 0x2000 },
+ { 0x0700, 0xfcc6, 0x0000 },
+ { 0x0700, 0xfcc8, 0x0000 },
+ { 0x8700, 0xfccb, 0x2000 },
+ { 0x0700, 0xfcca, 0x0000 },
+ { 0x0700, 0xfccc, 0x0000 },
+ { 0x8700, 0xfd0d, 0x7000 },
+ { 0x8700, 0xfced, 0x6000 },
+ { 0x8700, 0xfcdd, 0x5000 },
+ { 0x8700, 0xfcd5, 0x4000 },
+ { 0x8700, 0xfcd1, 0x3000 },
+ { 0x8700, 0xfccf, 0x2000 },
+ { 0x0700, 0xfcce, 0x0000 },
+ { 0x0700, 0xfcd0, 0x0000 },
+ { 0x8700, 0xfcd3, 0x2000 },
+ { 0x0700, 0xfcd2, 0x0000 },
+ { 0x0700, 0xfcd4, 0x0000 },
+ { 0x8700, 0xfcd9, 0x3000 },
+ { 0x8700, 0xfcd7, 0x2000 },
+ { 0x0700, 0xfcd6, 0x0000 },
+ { 0x0700, 0xfcd8, 0x0000 },
+ { 0x8700, 0xfcdb, 0x2000 },
+ { 0x0700, 0xfcda, 0x0000 },
+ { 0x0700, 0xfcdc, 0x0000 },
+ { 0x8700, 0xfce5, 0x4000 },
+ { 0x8700, 0xfce1, 0x3000 },
+ { 0x8700, 0xfcdf, 0x2000 },
+ { 0x0700, 0xfcde, 0x0000 },
+ { 0x0700, 0xfce0, 0x0000 },
+ { 0x8700, 0xfce3, 0x2000 },
+ { 0x0700, 0xfce2, 0x0000 },
+ { 0x0700, 0xfce4, 0x0000 },
+ { 0x8700, 0xfce9, 0x3000 },
+ { 0x8700, 0xfce7, 0x2000 },
+ { 0x0700, 0xfce6, 0x0000 },
+ { 0x0700, 0xfce8, 0x0000 },
+ { 0x8700, 0xfceb, 0x2000 },
+ { 0x0700, 0xfcea, 0x0000 },
+ { 0x0700, 0xfcec, 0x0000 },
+ { 0x8700, 0xfcfd, 0x5000 },
+ { 0x8700, 0xfcf5, 0x4000 },
+ { 0x8700, 0xfcf1, 0x3000 },
+ { 0x8700, 0xfcef, 0x2000 },
+ { 0x0700, 0xfcee, 0x0000 },
+ { 0x0700, 0xfcf0, 0x0000 },
+ { 0x8700, 0xfcf3, 0x2000 },
+ { 0x0700, 0xfcf2, 0x0000 },
+ { 0x0700, 0xfcf4, 0x0000 },
+ { 0x8700, 0xfcf9, 0x3000 },
+ { 0x8700, 0xfcf7, 0x2000 },
+ { 0x0700, 0xfcf6, 0x0000 },
+ { 0x0700, 0xfcf8, 0x0000 },
+ { 0x8700, 0xfcfb, 0x2000 },
+ { 0x0700, 0xfcfa, 0x0000 },
+ { 0x0700, 0xfcfc, 0x0000 },
+ { 0x8700, 0xfd05, 0x4000 },
+ { 0x8700, 0xfd01, 0x3000 },
+ { 0x8700, 0xfcff, 0x2000 },
+ { 0x0700, 0xfcfe, 0x0000 },
+ { 0x0700, 0xfd00, 0x0000 },
+ { 0x8700, 0xfd03, 0x2000 },
+ { 0x0700, 0xfd02, 0x0000 },
+ { 0x0700, 0xfd04, 0x0000 },
+ { 0x8700, 0xfd09, 0x3000 },
+ { 0x8700, 0xfd07, 0x2000 },
+ { 0x0700, 0xfd06, 0x0000 },
+ { 0x0700, 0xfd08, 0x0000 },
+ { 0x8700, 0xfd0b, 0x2000 },
+ { 0x0700, 0xfd0a, 0x0000 },
+ { 0x0700, 0xfd0c, 0x0000 },
+ { 0x8700, 0xfd2d, 0x6000 },
+ { 0x8700, 0xfd1d, 0x5000 },
+ { 0x8700, 0xfd15, 0x4000 },
+ { 0x8700, 0xfd11, 0x3000 },
+ { 0x8700, 0xfd0f, 0x2000 },
+ { 0x0700, 0xfd0e, 0x0000 },
+ { 0x0700, 0xfd10, 0x0000 },
+ { 0x8700, 0xfd13, 0x2000 },
+ { 0x0700, 0xfd12, 0x0000 },
+ { 0x0700, 0xfd14, 0x0000 },
+ { 0x8700, 0xfd19, 0x3000 },
+ { 0x8700, 0xfd17, 0x2000 },
+ { 0x0700, 0xfd16, 0x0000 },
+ { 0x0700, 0xfd18, 0x0000 },
+ { 0x8700, 0xfd1b, 0x2000 },
+ { 0x0700, 0xfd1a, 0x0000 },
+ { 0x0700, 0xfd1c, 0x0000 },
+ { 0x8700, 0xfd25, 0x4000 },
+ { 0x8700, 0xfd21, 0x3000 },
+ { 0x8700, 0xfd1f, 0x2000 },
+ { 0x0700, 0xfd1e, 0x0000 },
+ { 0x0700, 0xfd20, 0x0000 },
+ { 0x8700, 0xfd23, 0x2000 },
+ { 0x0700, 0xfd22, 0x0000 },
+ { 0x0700, 0xfd24, 0x0000 },
+ { 0x8700, 0xfd29, 0x3000 },
+ { 0x8700, 0xfd27, 0x2000 },
+ { 0x0700, 0xfd26, 0x0000 },
+ { 0x0700, 0xfd28, 0x0000 },
+ { 0x8700, 0xfd2b, 0x2000 },
+ { 0x0700, 0xfd2a, 0x0000 },
+ { 0x0700, 0xfd2c, 0x0000 },
+ { 0x8700, 0xfd3d, 0x5000 },
+ { 0x8700, 0xfd35, 0x4000 },
+ { 0x8700, 0xfd31, 0x3000 },
+ { 0x8700, 0xfd2f, 0x2000 },
+ { 0x0700, 0xfd2e, 0x0000 },
+ { 0x0700, 0xfd30, 0x0000 },
+ { 0x8700, 0xfd33, 0x2000 },
+ { 0x0700, 0xfd32, 0x0000 },
+ { 0x0700, 0xfd34, 0x0000 },
+ { 0x8700, 0xfd39, 0x3000 },
+ { 0x8700, 0xfd37, 0x2000 },
+ { 0x0700, 0xfd36, 0x0000 },
+ { 0x0700, 0xfd38, 0x0000 },
+ { 0x8700, 0xfd3b, 0x2000 },
+ { 0x0700, 0xfd3a, 0x0000 },
+ { 0x0700, 0xfd3c, 0x0000 },
+ { 0x8700, 0xfd55, 0x4000 },
+ { 0x8700, 0xfd51, 0x3000 },
+ { 0x9200, 0xfd3f, 0x2000 },
+ { 0x1600, 0xfd3e, 0x0000 },
+ { 0x0700, 0xfd50, 0x0000 },
+ { 0x8700, 0xfd53, 0x2000 },
+ { 0x0700, 0xfd52, 0x0000 },
+ { 0x0700, 0xfd54, 0x0000 },
+ { 0x8700, 0xfd59, 0x3000 },
+ { 0x8700, 0xfd57, 0x2000 },
+ { 0x0700, 0xfd56, 0x0000 },
+ { 0x0700, 0xfd58, 0x0000 },
+ { 0x8700, 0xfd5b, 0x2000 },
+ { 0x0700, 0xfd5a, 0x0000 },
+ { 0x0700, 0xfd5c, 0x0000 },
+ { 0x8c00, 0xfe09, 0x8000 },
+ { 0x8700, 0xfd9f, 0x7000 },
+ { 0x8700, 0xfd7d, 0x6000 },
+ { 0x8700, 0xfd6d, 0x5000 },
+ { 0x8700, 0xfd65, 0x4000 },
+ { 0x8700, 0xfd61, 0x3000 },
+ { 0x8700, 0xfd5f, 0x2000 },
+ { 0x0700, 0xfd5e, 0x0000 },
+ { 0x0700, 0xfd60, 0x0000 },
+ { 0x8700, 0xfd63, 0x2000 },
+ { 0x0700, 0xfd62, 0x0000 },
+ { 0x0700, 0xfd64, 0x0000 },
+ { 0x8700, 0xfd69, 0x3000 },
+ { 0x8700, 0xfd67, 0x2000 },
+ { 0x0700, 0xfd66, 0x0000 },
+ { 0x0700, 0xfd68, 0x0000 },
+ { 0x8700, 0xfd6b, 0x2000 },
+ { 0x0700, 0xfd6a, 0x0000 },
+ { 0x0700, 0xfd6c, 0x0000 },
+ { 0x8700, 0xfd75, 0x4000 },
+ { 0x8700, 0xfd71, 0x3000 },
+ { 0x8700, 0xfd6f, 0x2000 },
+ { 0x0700, 0xfd6e, 0x0000 },
+ { 0x0700, 0xfd70, 0x0000 },
+ { 0x8700, 0xfd73, 0x2000 },
+ { 0x0700, 0xfd72, 0x0000 },
+ { 0x0700, 0xfd74, 0x0000 },
+ { 0x8700, 0xfd79, 0x3000 },
+ { 0x8700, 0xfd77, 0x2000 },
+ { 0x0700, 0xfd76, 0x0000 },
+ { 0x0700, 0xfd78, 0x0000 },
+ { 0x8700, 0xfd7b, 0x2000 },
+ { 0x0700, 0xfd7a, 0x0000 },
+ { 0x0700, 0xfd7c, 0x0000 },
+ { 0x8700, 0xfd8d, 0x5000 },
+ { 0x8700, 0xfd85, 0x4000 },
+ { 0x8700, 0xfd81, 0x3000 },
+ { 0x8700, 0xfd7f, 0x2000 },
+ { 0x0700, 0xfd7e, 0x0000 },
+ { 0x0700, 0xfd80, 0x0000 },
+ { 0x8700, 0xfd83, 0x2000 },
+ { 0x0700, 0xfd82, 0x0000 },
+ { 0x0700, 0xfd84, 0x0000 },
+ { 0x8700, 0xfd89, 0x3000 },
+ { 0x8700, 0xfd87, 0x2000 },
+ { 0x0700, 0xfd86, 0x0000 },
+ { 0x0700, 0xfd88, 0x0000 },
+ { 0x8700, 0xfd8b, 0x2000 },
+ { 0x0700, 0xfd8a, 0x0000 },
+ { 0x0700, 0xfd8c, 0x0000 },
+ { 0x8700, 0xfd97, 0x4000 },
+ { 0x8700, 0xfd93, 0x3000 },
+ { 0x8700, 0xfd8f, 0x2000 },
+ { 0x0700, 0xfd8e, 0x0000 },
+ { 0x0700, 0xfd92, 0x0000 },
+ { 0x8700, 0xfd95, 0x2000 },
+ { 0x0700, 0xfd94, 0x0000 },
+ { 0x0700, 0xfd96, 0x0000 },
+ { 0x8700, 0xfd9b, 0x3000 },
+ { 0x8700, 0xfd99, 0x2000 },
+ { 0x0700, 0xfd98, 0x0000 },
+ { 0x0700, 0xfd9a, 0x0000 },
+ { 0x8700, 0xfd9d, 0x2000 },
+ { 0x0700, 0xfd9c, 0x0000 },
+ { 0x0700, 0xfd9e, 0x0000 },
+ { 0x8700, 0xfdbf, 0x6000 },
+ { 0x8700, 0xfdaf, 0x5000 },
+ { 0x8700, 0xfda7, 0x4000 },
+ { 0x8700, 0xfda3, 0x3000 },
+ { 0x8700, 0xfda1, 0x2000 },
+ { 0x0700, 0xfda0, 0x0000 },
+ { 0x0700, 0xfda2, 0x0000 },
+ { 0x8700, 0xfda5, 0x2000 },
+ { 0x0700, 0xfda4, 0x0000 },
+ { 0x0700, 0xfda6, 0x0000 },
+ { 0x8700, 0xfdab, 0x3000 },
+ { 0x8700, 0xfda9, 0x2000 },
+ { 0x0700, 0xfda8, 0x0000 },
+ { 0x0700, 0xfdaa, 0x0000 },
+ { 0x8700, 0xfdad, 0x2000 },
+ { 0x0700, 0xfdac, 0x0000 },
+ { 0x0700, 0xfdae, 0x0000 },
+ { 0x8700, 0xfdb7, 0x4000 },
+ { 0x8700, 0xfdb3, 0x3000 },
+ { 0x8700, 0xfdb1, 0x2000 },
+ { 0x0700, 0xfdb0, 0x0000 },
+ { 0x0700, 0xfdb2, 0x0000 },
+ { 0x8700, 0xfdb5, 0x2000 },
+ { 0x0700, 0xfdb4, 0x0000 },
+ { 0x0700, 0xfdb6, 0x0000 },
+ { 0x8700, 0xfdbb, 0x3000 },
+ { 0x8700, 0xfdb9, 0x2000 },
+ { 0x0700, 0xfdb8, 0x0000 },
+ { 0x0700, 0xfdba, 0x0000 },
+ { 0x8700, 0xfdbd, 0x2000 },
+ { 0x0700, 0xfdbc, 0x0000 },
+ { 0x0700, 0xfdbe, 0x0000 },
+ { 0x8700, 0xfdf7, 0x5000 },
+ { 0x8700, 0xfdc7, 0x4000 },
+ { 0x8700, 0xfdc3, 0x3000 },
+ { 0x8700, 0xfdc1, 0x2000 },
+ { 0x0700, 0xfdc0, 0x0000 },
+ { 0x0700, 0xfdc2, 0x0000 },
+ { 0x8700, 0xfdc5, 0x2000 },
+ { 0x0700, 0xfdc4, 0x0000 },
+ { 0x0700, 0xfdc6, 0x0000 },
+ { 0x8700, 0xfdf3, 0x3000 },
+ { 0x8700, 0xfdf1, 0x2000 },
+ { 0x0700, 0xfdf0, 0x0000 },
+ { 0x0700, 0xfdf2, 0x0000 },
+ { 0x8700, 0xfdf5, 0x2000 },
+ { 0x0700, 0xfdf4, 0x0000 },
+ { 0x0700, 0xfdf6, 0x0000 },
+ { 0x8c00, 0xfe01, 0x4000 },
+ { 0x8700, 0xfdfb, 0x3000 },
+ { 0x8700, 0xfdf9, 0x2000 },
+ { 0x0700, 0xfdf8, 0x0000 },
+ { 0x0700, 0xfdfa, 0x0000 },
+ { 0x9a00, 0xfdfd, 0x2000 },
+ { 0x1700, 0xfdfc, 0x0000 },
+ { 0x0c00, 0xfe00, 0x0000 },
+ { 0x8c00, 0xfe05, 0x3000 },
+ { 0x8c00, 0xfe03, 0x2000 },
+ { 0x0c00, 0xfe02, 0x0000 },
+ { 0x0c00, 0xfe04, 0x0000 },
+ { 0x8c00, 0xfe07, 0x2000 },
+ { 0x0c00, 0xfe06, 0x0000 },
+ { 0x0c00, 0xfe08, 0x0000 },
+ { 0x9900, 0xfe66, 0x7000 },
+ { 0x9500, 0xfe45, 0x6000 },
+ { 0x9600, 0xfe35, 0x5000 },
+ { 0x8c00, 0xfe21, 0x4000 },
+ { 0x8c00, 0xfe0d, 0x3000 },
+ { 0x8c00, 0xfe0b, 0x2000 },
+ { 0x0c00, 0xfe0a, 0x0000 },
+ { 0x0c00, 0xfe0c, 0x0000 },
+ { 0x8c00, 0xfe0f, 0x2000 },
+ { 0x0c00, 0xfe0e, 0x0000 },
+ { 0x0c00, 0xfe20, 0x0000 },
+ { 0x9100, 0xfe31, 0x3000 },
+ { 0x8c00, 0xfe23, 0x2000 },
+ { 0x0c00, 0xfe22, 0x0000 },
+ { 0x1500, 0xfe30, 0x0000 },
+ { 0x9000, 0xfe33, 0x2000 },
+ { 0x1100, 0xfe32, 0x0000 },
+ { 0x1000, 0xfe34, 0x0000 },
+ { 0x9600, 0xfe3d, 0x4000 },
+ { 0x9600, 0xfe39, 0x3000 },
+ { 0x9600, 0xfe37, 0x2000 },
+ { 0x1200, 0xfe36, 0x0000 },
+ { 0x1200, 0xfe38, 0x0000 },
+ { 0x9600, 0xfe3b, 0x2000 },
+ { 0x1200, 0xfe3a, 0x0000 },
+ { 0x1200, 0xfe3c, 0x0000 },
+ { 0x9600, 0xfe41, 0x3000 },
+ { 0x9600, 0xfe3f, 0x2000 },
+ { 0x1200, 0xfe3e, 0x0000 },
+ { 0x1200, 0xfe40, 0x0000 },
+ { 0x9600, 0xfe43, 0x2000 },
+ { 0x1200, 0xfe42, 0x0000 },
+ { 0x1200, 0xfe44, 0x0000 },
+ { 0x9500, 0xfe56, 0x5000 },
+ { 0x9000, 0xfe4d, 0x4000 },
+ { 0x9500, 0xfe49, 0x3000 },
+ { 0x9600, 0xfe47, 0x2000 },
+ { 0x1500, 0xfe46, 0x0000 },
+ { 0x1200, 0xfe48, 0x0000 },
+ { 0x9500, 0xfe4b, 0x2000 },
+ { 0x1500, 0xfe4a, 0x0000 },
+ { 0x1500, 0xfe4c, 0x0000 },
+ { 0x9500, 0xfe51, 0x3000 },
+ { 0x9000, 0xfe4f, 0x2000 },
+ { 0x1000, 0xfe4e, 0x0000 },
+ { 0x1500, 0xfe50, 0x0000 },
+ { 0x9500, 0xfe54, 0x2000 },
+ { 0x1500, 0xfe52, 0x0000 },
+ { 0x1500, 0xfe55, 0x0000 },
+ { 0x9200, 0xfe5e, 0x4000 },
+ { 0x9200, 0xfe5a, 0x3000 },
+ { 0x9100, 0xfe58, 0x2000 },
+ { 0x1500, 0xfe57, 0x0000 },
+ { 0x1600, 0xfe59, 0x0000 },
+ { 0x9200, 0xfe5c, 0x2000 },
+ { 0x1600, 0xfe5b, 0x0000 },
+ { 0x1600, 0xfe5d, 0x0000 },
+ { 0x9900, 0xfe62, 0x3000 },
+ { 0x9500, 0xfe60, 0x2000 },
+ { 0x1500, 0xfe5f, 0x0000 },
+ { 0x1500, 0xfe61, 0x0000 },
+ { 0x9900, 0xfe64, 0x2000 },
+ { 0x1100, 0xfe63, 0x0000 },
+ { 0x1900, 0xfe65, 0x0000 },
+ { 0x8700, 0xfe8c, 0x6000 },
+ { 0x8700, 0xfe7c, 0x5000 },
+ { 0x8700, 0xfe73, 0x4000 },
+ { 0x9500, 0xfe6b, 0x3000 },
+ { 0x9700, 0xfe69, 0x2000 },
+ { 0x1500, 0xfe68, 0x0000 },
+ { 0x1500, 0xfe6a, 0x0000 },
+ { 0x8700, 0xfe71, 0x2000 },
+ { 0x0700, 0xfe70, 0x0000 },
+ { 0x0700, 0xfe72, 0x0000 },
+ { 0x8700, 0xfe78, 0x3000 },
+ { 0x8700, 0xfe76, 0x2000 },
+ { 0x0700, 0xfe74, 0x0000 },
+ { 0x0700, 0xfe77, 0x0000 },
+ { 0x8700, 0xfe7a, 0x2000 },
+ { 0x0700, 0xfe79, 0x0000 },
+ { 0x0700, 0xfe7b, 0x0000 },
+ { 0x8700, 0xfe84, 0x4000 },
+ { 0x8700, 0xfe80, 0x3000 },
+ { 0x8700, 0xfe7e, 0x2000 },
+ { 0x0700, 0xfe7d, 0x0000 },
+ { 0x0700, 0xfe7f, 0x0000 },
+ { 0x8700, 0xfe82, 0x2000 },
+ { 0x0700, 0xfe81, 0x0000 },
+ { 0x0700, 0xfe83, 0x0000 },
+ { 0x8700, 0xfe88, 0x3000 },
+ { 0x8700, 0xfe86, 0x2000 },
+ { 0x0700, 0xfe85, 0x0000 },
+ { 0x0700, 0xfe87, 0x0000 },
+ { 0x8700, 0xfe8a, 0x2000 },
+ { 0x0700, 0xfe89, 0x0000 },
+ { 0x0700, 0xfe8b, 0x0000 },
+ { 0x8700, 0xfe9c, 0x5000 },
+ { 0x8700, 0xfe94, 0x4000 },
+ { 0x8700, 0xfe90, 0x3000 },
+ { 0x8700, 0xfe8e, 0x2000 },
+ { 0x0700, 0xfe8d, 0x0000 },
+ { 0x0700, 0xfe8f, 0x0000 },
+ { 0x8700, 0xfe92, 0x2000 },
+ { 0x0700, 0xfe91, 0x0000 },
+ { 0x0700, 0xfe93, 0x0000 },
+ { 0x8700, 0xfe98, 0x3000 },
+ { 0x8700, 0xfe96, 0x2000 },
+ { 0x0700, 0xfe95, 0x0000 },
+ { 0x0700, 0xfe97, 0x0000 },
+ { 0x8700, 0xfe9a, 0x2000 },
+ { 0x0700, 0xfe99, 0x0000 },
+ { 0x0700, 0xfe9b, 0x0000 },
+ { 0x8700, 0xfea4, 0x4000 },
+ { 0x8700, 0xfea0, 0x3000 },
+ { 0x8700, 0xfe9e, 0x2000 },
+ { 0x0700, 0xfe9d, 0x0000 },
+ { 0x0700, 0xfe9f, 0x0000 },
+ { 0x8700, 0xfea2, 0x2000 },
+ { 0x0700, 0xfea1, 0x0000 },
+ { 0x0700, 0xfea3, 0x0000 },
+ { 0x8700, 0xfea8, 0x3000 },
+ { 0x8700, 0xfea6, 0x2000 },
+ { 0x0700, 0xfea5, 0x0000 },
+ { 0x0700, 0xfea7, 0x0000 },
+ { 0x8700, 0xfeaa, 0x2000 },
+ { 0x0700, 0xfea9, 0x0000 },
+ { 0x0700, 0xfeab, 0x0000 },
+ { 0x8700, 0xffaf, 0x9000 },
+ { 0x8900, 0xff2f, 0x8020 },
+ { 0x8700, 0xfeec, 0x7000 },
+ { 0x8700, 0xfecc, 0x6000 },
+ { 0x8700, 0xfebc, 0x5000 },
+ { 0x8700, 0xfeb4, 0x4000 },
+ { 0x8700, 0xfeb0, 0x3000 },
+ { 0x8700, 0xfeae, 0x2000 },
+ { 0x0700, 0xfead, 0x0000 },
+ { 0x0700, 0xfeaf, 0x0000 },
+ { 0x8700, 0xfeb2, 0x2000 },
+ { 0x0700, 0xfeb1, 0x0000 },
+ { 0x0700, 0xfeb3, 0x0000 },
+ { 0x8700, 0xfeb8, 0x3000 },
+ { 0x8700, 0xfeb6, 0x2000 },
+ { 0x0700, 0xfeb5, 0x0000 },
+ { 0x0700, 0xfeb7, 0x0000 },
+ { 0x8700, 0xfeba, 0x2000 },
+ { 0x0700, 0xfeb9, 0x0000 },
+ { 0x0700, 0xfebb, 0x0000 },
+ { 0x8700, 0xfec4, 0x4000 },
+ { 0x8700, 0xfec0, 0x3000 },
+ { 0x8700, 0xfebe, 0x2000 },
+ { 0x0700, 0xfebd, 0x0000 },
+ { 0x0700, 0xfebf, 0x0000 },
+ { 0x8700, 0xfec2, 0x2000 },
+ { 0x0700, 0xfec1, 0x0000 },
+ { 0x0700, 0xfec3, 0x0000 },
+ { 0x8700, 0xfec8, 0x3000 },
+ { 0x8700, 0xfec6, 0x2000 },
+ { 0x0700, 0xfec5, 0x0000 },
+ { 0x0700, 0xfec7, 0x0000 },
+ { 0x8700, 0xfeca, 0x2000 },
+ { 0x0700, 0xfec9, 0x0000 },
+ { 0x0700, 0xfecb, 0x0000 },
+ { 0x8700, 0xfedc, 0x5000 },
+ { 0x8700, 0xfed4, 0x4000 },
+ { 0x8700, 0xfed0, 0x3000 },
+ { 0x8700, 0xfece, 0x2000 },
+ { 0x0700, 0xfecd, 0x0000 },
+ { 0x0700, 0xfecf, 0x0000 },
+ { 0x8700, 0xfed2, 0x2000 },
+ { 0x0700, 0xfed1, 0x0000 },
+ { 0x0700, 0xfed3, 0x0000 },
+ { 0x8700, 0xfed8, 0x3000 },
+ { 0x8700, 0xfed6, 0x2000 },
+ { 0x0700, 0xfed5, 0x0000 },
+ { 0x0700, 0xfed7, 0x0000 },
+ { 0x8700, 0xfeda, 0x2000 },
+ { 0x0700, 0xfed9, 0x0000 },
+ { 0x0700, 0xfedb, 0x0000 },
+ { 0x8700, 0xfee4, 0x4000 },
+ { 0x8700, 0xfee0, 0x3000 },
+ { 0x8700, 0xfede, 0x2000 },
+ { 0x0700, 0xfedd, 0x0000 },
+ { 0x0700, 0xfedf, 0x0000 },
+ { 0x8700, 0xfee2, 0x2000 },
+ { 0x0700, 0xfee1, 0x0000 },
+ { 0x0700, 0xfee3, 0x0000 },
+ { 0x8700, 0xfee8, 0x3000 },
+ { 0x8700, 0xfee6, 0x2000 },
+ { 0x0700, 0xfee5, 0x0000 },
+ { 0x0700, 0xfee7, 0x0000 },
+ { 0x8700, 0xfeea, 0x2000 },
+ { 0x0700, 0xfee9, 0x0000 },
+ { 0x0700, 0xfeeb, 0x0000 },
+ { 0x9500, 0xff0f, 0x6000 },
+ { 0x8700, 0xfefc, 0x5000 },
+ { 0x8700, 0xfef4, 0x4000 },
+ { 0x8700, 0xfef0, 0x3000 },
+ { 0x8700, 0xfeee, 0x2000 },
+ { 0x0700, 0xfeed, 0x0000 },
+ { 0x0700, 0xfeef, 0x0000 },
+ { 0x8700, 0xfef2, 0x2000 },
+ { 0x0700, 0xfef1, 0x0000 },
+ { 0x0700, 0xfef3, 0x0000 },
+ { 0x8700, 0xfef8, 0x3000 },
+ { 0x8700, 0xfef6, 0x2000 },
+ { 0x0700, 0xfef5, 0x0000 },
+ { 0x0700, 0xfef7, 0x0000 },
+ { 0x8700, 0xfefa, 0x2000 },
+ { 0x0700, 0xfef9, 0x0000 },
+ { 0x0700, 0xfefb, 0x0000 },
+ { 0x9500, 0xff07, 0x4000 },
+ { 0x9500, 0xff03, 0x3000 },
+ { 0x9500, 0xff01, 0x2000 },
+ { 0x0100, 0xfeff, 0x0000 },
+ { 0x1500, 0xff02, 0x0000 },
+ { 0x9500, 0xff05, 0x2000 },
+ { 0x1700, 0xff04, 0x0000 },
+ { 0x1500, 0xff06, 0x0000 },
+ { 0x9900, 0xff0b, 0x3000 },
+ { 0x9200, 0xff09, 0x2000 },
+ { 0x1600, 0xff08, 0x0000 },
+ { 0x1500, 0xff0a, 0x0000 },
+ { 0x9100, 0xff0d, 0x2000 },
+ { 0x1500, 0xff0c, 0x0000 },
+ { 0x1500, 0xff0e, 0x0000 },
+ { 0x9500, 0xff1f, 0x5000 },
+ { 0x8d00, 0xff17, 0x4000 },
+ { 0x8d00, 0xff13, 0x3000 },
+ { 0x8d00, 0xff11, 0x2000 },
+ { 0x0d00, 0xff10, 0x0000 },
+ { 0x0d00, 0xff12, 0x0000 },
+ { 0x8d00, 0xff15, 0x2000 },
+ { 0x0d00, 0xff14, 0x0000 },
+ { 0x0d00, 0xff16, 0x0000 },
+ { 0x9500, 0xff1b, 0x3000 },
+ { 0x8d00, 0xff19, 0x2000 },
+ { 0x0d00, 0xff18, 0x0000 },
+ { 0x1500, 0xff1a, 0x0000 },
+ { 0x9900, 0xff1d, 0x2000 },
+ { 0x1900, 0xff1c, 0x0000 },
+ { 0x1900, 0xff1e, 0x0000 },
+ { 0x8900, 0xff27, 0x4020 },
+ { 0x8900, 0xff23, 0x3020 },
+ { 0x8900, 0xff21, 0x2020 },
+ { 0x1500, 0xff20, 0x0000 },
+ { 0x0900, 0xff22, 0x0020 },
+ { 0x8900, 0xff25, 0x2020 },
+ { 0x0900, 0xff24, 0x0020 },
+ { 0x0900, 0xff26, 0x0020 },
+ { 0x8900, 0xff2b, 0x3020 },
+ { 0x8900, 0xff29, 0x2020 },
+ { 0x0900, 0xff28, 0x0020 },
+ { 0x0900, 0xff2a, 0x0020 },
+ { 0x8900, 0xff2d, 0x2020 },
+ { 0x0900, 0xff2c, 0x0020 },
+ { 0x0900, 0xff2e, 0x0020 },
+ { 0x8700, 0xff6f, 0x7000 },
+ { 0x8500, 0xff4f, 0x6fe0 },
+ { 0x9000, 0xff3f, 0x5000 },
+ { 0x8900, 0xff37, 0x4020 },
+ { 0x8900, 0xff33, 0x3020 },
+ { 0x8900, 0xff31, 0x2020 },
+ { 0x0900, 0xff30, 0x0020 },
+ { 0x0900, 0xff32, 0x0020 },
+ { 0x8900, 0xff35, 0x2020 },
+ { 0x0900, 0xff34, 0x0020 },
+ { 0x0900, 0xff36, 0x0020 },
+ { 0x9600, 0xff3b, 0x3000 },
+ { 0x8900, 0xff39, 0x2020 },
+ { 0x0900, 0xff38, 0x0020 },
+ { 0x0900, 0xff3a, 0x0020 },
+ { 0x9200, 0xff3d, 0x2000 },
+ { 0x1500, 0xff3c, 0x0000 },
+ { 0x1800, 0xff3e, 0x0000 },
+ { 0x8500, 0xff47, 0x4fe0 },
+ { 0x8500, 0xff43, 0x3fe0 },
+ { 0x8500, 0xff41, 0x2fe0 },
+ { 0x1800, 0xff40, 0x0000 },
+ { 0x0500, 0xff42, 0x0fe0 },
+ { 0x8500, 0xff45, 0x2fe0 },
+ { 0x0500, 0xff44, 0x0fe0 },
+ { 0x0500, 0xff46, 0x0fe0 },
+ { 0x8500, 0xff4b, 0x3fe0 },
+ { 0x8500, 0xff49, 0x2fe0 },
+ { 0x0500, 0xff48, 0x0fe0 },
+ { 0x0500, 0xff4a, 0x0fe0 },
+ { 0x8500, 0xff4d, 0x2fe0 },
+ { 0x0500, 0xff4c, 0x0fe0 },
+ { 0x0500, 0xff4e, 0x0fe0 },
+ { 0x9600, 0xff5f, 0x5000 },
+ { 0x8500, 0xff57, 0x4fe0 },
+ { 0x8500, 0xff53, 0x3fe0 },
+ { 0x8500, 0xff51, 0x2fe0 },
+ { 0x0500, 0xff50, 0x0fe0 },
+ { 0x0500, 0xff52, 0x0fe0 },
+ { 0x8500, 0xff55, 0x2fe0 },
+ { 0x0500, 0xff54, 0x0fe0 },
+ { 0x0500, 0xff56, 0x0fe0 },
+ { 0x9600, 0xff5b, 0x3000 },
+ { 0x8500, 0xff59, 0x2fe0 },
+ { 0x0500, 0xff58, 0x0fe0 },
+ { 0x0500, 0xff5a, 0x0fe0 },
+ { 0x9200, 0xff5d, 0x2000 },
+ { 0x1900, 0xff5c, 0x0000 },
+ { 0x1900, 0xff5e, 0x0000 },
+ { 0x8700, 0xff67, 0x4000 },
+ { 0x9200, 0xff63, 0x3000 },
+ { 0x9500, 0xff61, 0x2000 },
+ { 0x1200, 0xff60, 0x0000 },
+ { 0x1600, 0xff62, 0x0000 },
+ { 0x9000, 0xff65, 0x2000 },
+ { 0x1500, 0xff64, 0x0000 },
+ { 0x0700, 0xff66, 0x0000 },
+ { 0x8700, 0xff6b, 0x3000 },
+ { 0x8700, 0xff69, 0x2000 },
+ { 0x0700, 0xff68, 0x0000 },
+ { 0x0700, 0xff6a, 0x0000 },
+ { 0x8700, 0xff6d, 0x2000 },
+ { 0x0700, 0xff6c, 0x0000 },
+ { 0x0700, 0xff6e, 0x0000 },
+ { 0x8700, 0xff8f, 0x6000 },
+ { 0x8700, 0xff7f, 0x5000 },
+ { 0x8700, 0xff77, 0x4000 },
+ { 0x8700, 0xff73, 0x3000 },
+ { 0x8700, 0xff71, 0x2000 },
+ { 0x0600, 0xff70, 0x0000 },
+ { 0x0700, 0xff72, 0x0000 },
+ { 0x8700, 0xff75, 0x2000 },
+ { 0x0700, 0xff74, 0x0000 },
+ { 0x0700, 0xff76, 0x0000 },
+ { 0x8700, 0xff7b, 0x3000 },
+ { 0x8700, 0xff79, 0x2000 },
+ { 0x0700, 0xff78, 0x0000 },
+ { 0x0700, 0xff7a, 0x0000 },
+ { 0x8700, 0xff7d, 0x2000 },
+ { 0x0700, 0xff7c, 0x0000 },
+ { 0x0700, 0xff7e, 0x0000 },
+ { 0x8700, 0xff87, 0x4000 },
+ { 0x8700, 0xff83, 0x3000 },
+ { 0x8700, 0xff81, 0x2000 },
+ { 0x0700, 0xff80, 0x0000 },
+ { 0x0700, 0xff82, 0x0000 },
+ { 0x8700, 0xff85, 0x2000 },
+ { 0x0700, 0xff84, 0x0000 },
+ { 0x0700, 0xff86, 0x0000 },
+ { 0x8700, 0xff8b, 0x3000 },
+ { 0x8700, 0xff89, 0x2000 },
+ { 0x0700, 0xff88, 0x0000 },
+ { 0x0700, 0xff8a, 0x0000 },
+ { 0x8700, 0xff8d, 0x2000 },
+ { 0x0700, 0xff8c, 0x0000 },
+ { 0x0700, 0xff8e, 0x0000 },
+ { 0x8600, 0xff9f, 0x5000 },
+ { 0x8700, 0xff97, 0x4000 },
+ { 0x8700, 0xff93, 0x3000 },
+ { 0x8700, 0xff91, 0x2000 },
+ { 0x0700, 0xff90, 0x0000 },
+ { 0x0700, 0xff92, 0x0000 },
+ { 0x8700, 0xff95, 0x2000 },
+ { 0x0700, 0xff94, 0x0000 },
+ { 0x0700, 0xff96, 0x0000 },
+ { 0x8700, 0xff9b, 0x3000 },
+ { 0x8700, 0xff99, 0x2000 },
+ { 0x0700, 0xff98, 0x0000 },
+ { 0x0700, 0xff9a, 0x0000 },
+ { 0x8700, 0xff9d, 0x2000 },
+ { 0x0700, 0xff9c, 0x0000 },
+ { 0x0600, 0xff9e, 0x0000 },
+ { 0x8700, 0xffa7, 0x4000 },
+ { 0x8700, 0xffa3, 0x3000 },
+ { 0x8700, 0xffa1, 0x2000 },
+ { 0x0700, 0xffa0, 0x0000 },
+ { 0x0700, 0xffa2, 0x0000 },
+ { 0x8700, 0xffa5, 0x2000 },
+ { 0x0700, 0xffa4, 0x0000 },
+ { 0x0700, 0xffa6, 0x0000 },
+ { 0x8700, 0xffab, 0x3000 },
+ { 0x8700, 0xffa9, 0x2000 },
+ { 0x0700, 0xffa8, 0x0000 },
+ { 0x0700, 0xffaa, 0x0000 },
+ { 0x8700, 0xffad, 0x2000 },
+ { 0x0700, 0xffac, 0x0000 },
+ { 0x0700, 0xffae, 0x0000 },
+ { 0x8701, 0x004c, 0x8000 },
+ { 0x8701, 0x0008, 0x7000 },
+ { 0x8700, 0xffd6, 0x6000 },
+ { 0x8700, 0xffc2, 0x5000 },
+ { 0x8700, 0xffb7, 0x4000 },
+ { 0x8700, 0xffb3, 0x3000 },
+ { 0x8700, 0xffb1, 0x2000 },
+ { 0x0700, 0xffb0, 0x0000 },
+ { 0x0700, 0xffb2, 0x0000 },
+ { 0x8700, 0xffb5, 0x2000 },
+ { 0x0700, 0xffb4, 0x0000 },
+ { 0x0700, 0xffb6, 0x0000 },
+ { 0x8700, 0xffbb, 0x3000 },
+ { 0x8700, 0xffb9, 0x2000 },
+ { 0x0700, 0xffb8, 0x0000 },
+ { 0x0700, 0xffba, 0x0000 },
+ { 0x8700, 0xffbd, 0x2000 },
+ { 0x0700, 0xffbc, 0x0000 },
+ { 0x0700, 0xffbe, 0x0000 },
+ { 0x8700, 0xffcc, 0x4000 },
+ { 0x8700, 0xffc6, 0x3000 },
+ { 0x8700, 0xffc4, 0x2000 },
+ { 0x0700, 0xffc3, 0x0000 },
+ { 0x0700, 0xffc5, 0x0000 },
+ { 0x8700, 0xffca, 0x2000 },
+ { 0x0700, 0xffc7, 0x0000 },
+ { 0x0700, 0xffcb, 0x0000 },
+ { 0x8700, 0xffd2, 0x3000 },
+ { 0x8700, 0xffce, 0x2000 },
+ { 0x0700, 0xffcd, 0x0000 },
+ { 0x0700, 0xffcf, 0x0000 },
+ { 0x8700, 0xffd4, 0x2000 },
+ { 0x0700, 0xffd3, 0x0000 },
+ { 0x0700, 0xffd5, 0x0000 },
+ { 0x9900, 0xffec, 0x5000 },
+ { 0x9800, 0xffe3, 0x4000 },
+ { 0x8700, 0xffdc, 0x3000 },
+ { 0x8700, 0xffda, 0x2000 },
+ { 0x0700, 0xffd7, 0x0000 },
+ { 0x0700, 0xffdb, 0x0000 },
+ { 0x9700, 0xffe1, 0x2000 },
+ { 0x1700, 0xffe0, 0x0000 },
+ { 0x1900, 0xffe2, 0x0000 },
+ { 0x9a00, 0xffe8, 0x3000 },
+ { 0x9700, 0xffe5, 0x2000 },
+ { 0x1a00, 0xffe4, 0x0000 },
+ { 0x1700, 0xffe6, 0x0000 },
+ { 0x9900, 0xffea, 0x2000 },
+ { 0x1900, 0xffe9, 0x0000 },
+ { 0x1900, 0xffeb, 0x0000 },
+ { 0x8701, 0x0000, 0x4000 },
+ { 0x8100, 0xfffa, 0x3000 },
+ { 0x9a00, 0xffee, 0x2000 },
+ { 0x1a00, 0xffed, 0x0000 },
+ { 0x0100, 0xfff9, 0x0000 },
+ { 0x9a00, 0xfffc, 0x2000 },
+ { 0x0100, 0xfffb, 0x0000 },
+ { 0x1a00, 0xfffd, 0x0000 },
+ { 0x8701, 0x0004, 0x3000 },
+ { 0x8701, 0x0002, 0x2000 },
+ { 0x0701, 0x0001, 0x0000 },
+ { 0x0701, 0x0003, 0x0000 },
+ { 0x8701, 0x0006, 0x2000 },
+ { 0x0701, 0x0005, 0x0000 },
+ { 0x0701, 0x0007, 0x0000 },
+ { 0x8701, 0x002a, 0x6000 },
+ { 0x8701, 0x0019, 0x5000 },
+ { 0x8701, 0x0011, 0x4000 },
+ { 0x8701, 0x000d, 0x3000 },
+ { 0x8701, 0x000a, 0x2000 },
+ { 0x0701, 0x0009, 0x0000 },
+ { 0x0701, 0x000b, 0x0000 },
+ { 0x8701, 0x000f, 0x2000 },
+ { 0x0701, 0x000e, 0x0000 },
+ { 0x0701, 0x0010, 0x0000 },
+ { 0x8701, 0x0015, 0x3000 },
+ { 0x8701, 0x0013, 0x2000 },
+ { 0x0701, 0x0012, 0x0000 },
+ { 0x0701, 0x0014, 0x0000 },
+ { 0x8701, 0x0017, 0x2000 },
+ { 0x0701, 0x0016, 0x0000 },
+ { 0x0701, 0x0018, 0x0000 },
+ { 0x8701, 0x0021, 0x4000 },
+ { 0x8701, 0x001d, 0x3000 },
+ { 0x8701, 0x001b, 0x2000 },
+ { 0x0701, 0x001a, 0x0000 },
+ { 0x0701, 0x001c, 0x0000 },
+ { 0x8701, 0x001f, 0x2000 },
+ { 0x0701, 0x001e, 0x0000 },
+ { 0x0701, 0x0020, 0x0000 },
+ { 0x8701, 0x0025, 0x3000 },
+ { 0x8701, 0x0023, 0x2000 },
+ { 0x0701, 0x0022, 0x0000 },
+ { 0x0701, 0x0024, 0x0000 },
+ { 0x8701, 0x0028, 0x2000 },
+ { 0x0701, 0x0026, 0x0000 },
+ { 0x0701, 0x0029, 0x0000 },
+ { 0x8701, 0x003a, 0x5000 },
+ { 0x8701, 0x0032, 0x4000 },
+ { 0x8701, 0x002e, 0x3000 },
+ { 0x8701, 0x002c, 0x2000 },
+ { 0x0701, 0x002b, 0x0000 },
+ { 0x0701, 0x002d, 0x0000 },
+ { 0x8701, 0x0030, 0x2000 },
+ { 0x0701, 0x002f, 0x0000 },
+ { 0x0701, 0x0031, 0x0000 },
+ { 0x8701, 0x0036, 0x3000 },
+ { 0x8701, 0x0034, 0x2000 },
+ { 0x0701, 0x0033, 0x0000 },
+ { 0x0701, 0x0035, 0x0000 },
+ { 0x8701, 0x0038, 0x2000 },
+ { 0x0701, 0x0037, 0x0000 },
+ { 0x0701, 0x0039, 0x0000 },
+ { 0x8701, 0x0044, 0x4000 },
+ { 0x8701, 0x0040, 0x3000 },
+ { 0x8701, 0x003d, 0x2000 },
+ { 0x0701, 0x003c, 0x0000 },
+ { 0x0701, 0x003f, 0x0000 },
+ { 0x8701, 0x0042, 0x2000 },
+ { 0x0701, 0x0041, 0x0000 },
+ { 0x0701, 0x0043, 0x0000 },
+ { 0x8701, 0x0048, 0x3000 },
+ { 0x8701, 0x0046, 0x2000 },
+ { 0x0701, 0x0045, 0x0000 },
+ { 0x0701, 0x0047, 0x0000 },
+ { 0x8701, 0x004a, 0x2000 },
+ { 0x0701, 0x0049, 0x0000 },
+ { 0x0701, 0x004b, 0x0000 },
+ { 0x8701, 0x00b0, 0x7000 },
+ { 0x8701, 0x0090, 0x6000 },
+ { 0x8701, 0x0080, 0x5000 },
+ { 0x8701, 0x0056, 0x4000 },
+ { 0x8701, 0x0052, 0x3000 },
+ { 0x8701, 0x0050, 0x2000 },
+ { 0x0701, 0x004d, 0x0000 },
+ { 0x0701, 0x0051, 0x0000 },
+ { 0x8701, 0x0054, 0x2000 },
+ { 0x0701, 0x0053, 0x0000 },
+ { 0x0701, 0x0055, 0x0000 },
+ { 0x8701, 0x005a, 0x3000 },
+ { 0x8701, 0x0058, 0x2000 },
+ { 0x0701, 0x0057, 0x0000 },
+ { 0x0701, 0x0059, 0x0000 },
+ { 0x8701, 0x005c, 0x2000 },
+ { 0x0701, 0x005b, 0x0000 },
+ { 0x0701, 0x005d, 0x0000 },
+ { 0x8701, 0x0088, 0x4000 },
+ { 0x8701, 0x0084, 0x3000 },
+ { 0x8701, 0x0082, 0x2000 },
+ { 0x0701, 0x0081, 0x0000 },
+ { 0x0701, 0x0083, 0x0000 },
+ { 0x8701, 0x0086, 0x2000 },
+ { 0x0701, 0x0085, 0x0000 },
+ { 0x0701, 0x0087, 0x0000 },
+ { 0x8701, 0x008c, 0x3000 },
+ { 0x8701, 0x008a, 0x2000 },
+ { 0x0701, 0x0089, 0x0000 },
+ { 0x0701, 0x008b, 0x0000 },
+ { 0x8701, 0x008e, 0x2000 },
+ { 0x0701, 0x008d, 0x0000 },
+ { 0x0701, 0x008f, 0x0000 },
+ { 0x8701, 0x00a0, 0x5000 },
+ { 0x8701, 0x0098, 0x4000 },
+ { 0x8701, 0x0094, 0x3000 },
+ { 0x8701, 0x0092, 0x2000 },
+ { 0x0701, 0x0091, 0x0000 },
+ { 0x0701, 0x0093, 0x0000 },
+ { 0x8701, 0x0096, 0x2000 },
+ { 0x0701, 0x0095, 0x0000 },
+ { 0x0701, 0x0097, 0x0000 },
+ { 0x8701, 0x009c, 0x3000 },
+ { 0x8701, 0x009a, 0x2000 },
+ { 0x0701, 0x0099, 0x0000 },
+ { 0x0701, 0x009b, 0x0000 },
+ { 0x8701, 0x009e, 0x2000 },
+ { 0x0701, 0x009d, 0x0000 },
+ { 0x0701, 0x009f, 0x0000 },
+ { 0x8701, 0x00a8, 0x4000 },
+ { 0x8701, 0x00a4, 0x3000 },
+ { 0x8701, 0x00a2, 0x2000 },
+ { 0x0701, 0x00a1, 0x0000 },
+ { 0x0701, 0x00a3, 0x0000 },
+ { 0x8701, 0x00a6, 0x2000 },
+ { 0x0701, 0x00a5, 0x0000 },
+ { 0x0701, 0x00a7, 0x0000 },
+ { 0x8701, 0x00ac, 0x3000 },
+ { 0x8701, 0x00aa, 0x2000 },
+ { 0x0701, 0x00a9, 0x0000 },
+ { 0x0701, 0x00ab, 0x0000 },
+ { 0x8701, 0x00ae, 0x2000 },
+ { 0x0701, 0x00ad, 0x0000 },
+ { 0x0701, 0x00af, 0x0000 },
+ { 0x8701, 0x00d0, 0x6000 },
+ { 0x8701, 0x00c0, 0x5000 },
+ { 0x8701, 0x00b8, 0x4000 },
+ { 0x8701, 0x00b4, 0x3000 },
+ { 0x8701, 0x00b2, 0x2000 },
+ { 0x0701, 0x00b1, 0x0000 },
+ { 0x0701, 0x00b3, 0x0000 },
+ { 0x8701, 0x00b6, 0x2000 },
+ { 0x0701, 0x00b5, 0x0000 },
+ { 0x0701, 0x00b7, 0x0000 },
+ { 0x8701, 0x00bc, 0x3000 },
+ { 0x8701, 0x00ba, 0x2000 },
+ { 0x0701, 0x00b9, 0x0000 },
+ { 0x0701, 0x00bb, 0x0000 },
+ { 0x8701, 0x00be, 0x2000 },
+ { 0x0701, 0x00bd, 0x0000 },
+ { 0x0701, 0x00bf, 0x0000 },
+ { 0x8701, 0x00c8, 0x4000 },
+ { 0x8701, 0x00c4, 0x3000 },
+ { 0x8701, 0x00c2, 0x2000 },
+ { 0x0701, 0x00c1, 0x0000 },
+ { 0x0701, 0x00c3, 0x0000 },
+ { 0x8701, 0x00c6, 0x2000 },
+ { 0x0701, 0x00c5, 0x0000 },
+ { 0x0701, 0x00c7, 0x0000 },
+ { 0x8701, 0x00cc, 0x3000 },
+ { 0x8701, 0x00ca, 0x2000 },
+ { 0x0701, 0x00c9, 0x0000 },
+ { 0x0701, 0x00cb, 0x0000 },
+ { 0x8701, 0x00ce, 0x2000 },
+ { 0x0701, 0x00cd, 0x0000 },
+ { 0x0701, 0x00cf, 0x0000 },
+ { 0x8701, 0x00e0, 0x5000 },
+ { 0x8701, 0x00d8, 0x4000 },
+ { 0x8701, 0x00d4, 0x3000 },
+ { 0x8701, 0x00d2, 0x2000 },
+ { 0x0701, 0x00d1, 0x0000 },
+ { 0x0701, 0x00d3, 0x0000 },
+ { 0x8701, 0x00d6, 0x2000 },
+ { 0x0701, 0x00d5, 0x0000 },
+ { 0x0701, 0x00d7, 0x0000 },
+ { 0x8701, 0x00dc, 0x3000 },
+ { 0x8701, 0x00da, 0x2000 },
+ { 0x0701, 0x00d9, 0x0000 },
+ { 0x0701, 0x00db, 0x0000 },
+ { 0x8701, 0x00de, 0x2000 },
+ { 0x0701, 0x00dd, 0x0000 },
+ { 0x0701, 0x00df, 0x0000 },
+ { 0x8701, 0x00e8, 0x4000 },
+ { 0x8701, 0x00e4, 0x3000 },
+ { 0x8701, 0x00e2, 0x2000 },
+ { 0x0701, 0x00e1, 0x0000 },
+ { 0x0701, 0x00e3, 0x0000 },
+ { 0x8701, 0x00e6, 0x2000 },
+ { 0x0701, 0x00e5, 0x0000 },
+ { 0x0701, 0x00e7, 0x0000 },
+ { 0x8701, 0x00ec, 0x3000 },
+ { 0x8701, 0x00ea, 0x2000 },
+ { 0x0701, 0x00e9, 0x0000 },
+ { 0x0701, 0x00eb, 0x0000 },
+ { 0x8701, 0x00ee, 0x2000 },
+ { 0x0701, 0x00ed, 0x0000 },
+ { 0x0701, 0x00ef, 0x0000 },
+ { 0x8501, 0xd459, 0xb000 },
+ { 0x9a01, 0xd080, 0xa000 },
+ { 0x8701, 0x045f, 0x9000 },
+ { 0x8701, 0x0349, 0x8000 },
+ { 0x9a01, 0x013c, 0x7000 },
+ { 0x8f01, 0x0119, 0x6000 },
+ { 0x8f01, 0x0109, 0x5000 },
+ { 0x8701, 0x00f8, 0x4000 },
+ { 0x8701, 0x00f4, 0x3000 },
+ { 0x8701, 0x00f2, 0x2000 },
+ { 0x0701, 0x00f1, 0x0000 },
+ { 0x0701, 0x00f3, 0x0000 },
+ { 0x8701, 0x00f6, 0x2000 },
+ { 0x0701, 0x00f5, 0x0000 },
+ { 0x0701, 0x00f7, 0x0000 },
+ { 0x9501, 0x0101, 0x3000 },
+ { 0x8701, 0x00fa, 0x2000 },
+ { 0x0701, 0x00f9, 0x0000 },
+ { 0x1501, 0x0100, 0x0000 },
+ { 0x8f01, 0x0107, 0x2000 },
+ { 0x1a01, 0x0102, 0x0000 },
+ { 0x0f01, 0x0108, 0x0000 },
+ { 0x8f01, 0x0111, 0x4000 },
+ { 0x8f01, 0x010d, 0x3000 },
+ { 0x8f01, 0x010b, 0x2000 },
+ { 0x0f01, 0x010a, 0x0000 },
+ { 0x0f01, 0x010c, 0x0000 },
+ { 0x8f01, 0x010f, 0x2000 },
+ { 0x0f01, 0x010e, 0x0000 },
+ { 0x0f01, 0x0110, 0x0000 },
+ { 0x8f01, 0x0115, 0x3000 },
+ { 0x8f01, 0x0113, 0x2000 },
+ { 0x0f01, 0x0112, 0x0000 },
+ { 0x0f01, 0x0114, 0x0000 },
+ { 0x8f01, 0x0117, 0x2000 },
+ { 0x0f01, 0x0116, 0x0000 },
+ { 0x0f01, 0x0118, 0x0000 },
+ { 0x8f01, 0x0129, 0x5000 },
+ { 0x8f01, 0x0121, 0x4000 },
+ { 0x8f01, 0x011d, 0x3000 },
+ { 0x8f01, 0x011b, 0x2000 },
+ { 0x0f01, 0x011a, 0x0000 },
+ { 0x0f01, 0x011c, 0x0000 },
+ { 0x8f01, 0x011f, 0x2000 },
+ { 0x0f01, 0x011e, 0x0000 },
+ { 0x0f01, 0x0120, 0x0000 },
+ { 0x8f01, 0x0125, 0x3000 },
+ { 0x8f01, 0x0123, 0x2000 },
+ { 0x0f01, 0x0122, 0x0000 },
+ { 0x0f01, 0x0124, 0x0000 },
+ { 0x8f01, 0x0127, 0x2000 },
+ { 0x0f01, 0x0126, 0x0000 },
+ { 0x0f01, 0x0128, 0x0000 },
+ { 0x8f01, 0x0131, 0x4000 },
+ { 0x8f01, 0x012d, 0x3000 },
+ { 0x8f01, 0x012b, 0x2000 },
+ { 0x0f01, 0x012a, 0x0000 },
+ { 0x0f01, 0x012c, 0x0000 },
+ { 0x8f01, 0x012f, 0x2000 },
+ { 0x0f01, 0x012e, 0x0000 },
+ { 0x0f01, 0x0130, 0x0000 },
+ { 0x9a01, 0x0138, 0x3000 },
+ { 0x8f01, 0x0133, 0x2000 },
+ { 0x0f01, 0x0132, 0x0000 },
+ { 0x1a01, 0x0137, 0x0000 },
+ { 0x9a01, 0x013a, 0x2000 },
+ { 0x1a01, 0x0139, 0x0000 },
+ { 0x1a01, 0x013b, 0x0000 },
+ { 0x8701, 0x031c, 0x6000 },
+ { 0x8701, 0x030c, 0x5000 },
+ { 0x8701, 0x0304, 0x4000 },
+ { 0x8701, 0x0300, 0x3000 },
+ { 0x9a01, 0x013e, 0x2000 },
+ { 0x1a01, 0x013d, 0x0000 },
+ { 0x1a01, 0x013f, 0x0000 },
+ { 0x8701, 0x0302, 0x2000 },
+ { 0x0701, 0x0301, 0x0000 },
+ { 0x0701, 0x0303, 0x0000 },
+ { 0x8701, 0x0308, 0x3000 },
+ { 0x8701, 0x0306, 0x2000 },
+ { 0x0701, 0x0305, 0x0000 },
+ { 0x0701, 0x0307, 0x0000 },
+ { 0x8701, 0x030a, 0x2000 },
+ { 0x0701, 0x0309, 0x0000 },
+ { 0x0701, 0x030b, 0x0000 },
+ { 0x8701, 0x0314, 0x4000 },
+ { 0x8701, 0x0310, 0x3000 },
+ { 0x8701, 0x030e, 0x2000 },
+ { 0x0701, 0x030d, 0x0000 },
+ { 0x0701, 0x030f, 0x0000 },
+ { 0x8701, 0x0312, 0x2000 },
+ { 0x0701, 0x0311, 0x0000 },
+ { 0x0701, 0x0313, 0x0000 },
+ { 0x8701, 0x0318, 0x3000 },
+ { 0x8701, 0x0316, 0x2000 },
+ { 0x0701, 0x0315, 0x0000 },
+ { 0x0701, 0x0317, 0x0000 },
+ { 0x8701, 0x031a, 0x2000 },
+ { 0x0701, 0x0319, 0x0000 },
+ { 0x0701, 0x031b, 0x0000 },
+ { 0x8701, 0x0339, 0x5000 },
+ { 0x8701, 0x0331, 0x4000 },
+ { 0x8f01, 0x0321, 0x3000 },
+ { 0x8701, 0x031e, 0x2000 },
+ { 0x0701, 0x031d, 0x0000 },
+ { 0x0f01, 0x0320, 0x0000 },
+ { 0x8f01, 0x0323, 0x2000 },
+ { 0x0f01, 0x0322, 0x0000 },
+ { 0x0701, 0x0330, 0x0000 },
+ { 0x8701, 0x0335, 0x3000 },
+ { 0x8701, 0x0333, 0x2000 },
+ { 0x0701, 0x0332, 0x0000 },
+ { 0x0701, 0x0334, 0x0000 },
+ { 0x8701, 0x0337, 0x2000 },
+ { 0x0701, 0x0336, 0x0000 },
+ { 0x0701, 0x0338, 0x0000 },
+ { 0x8701, 0x0341, 0x4000 },
+ { 0x8701, 0x033d, 0x3000 },
+ { 0x8701, 0x033b, 0x2000 },
+ { 0x0701, 0x033a, 0x0000 },
+ { 0x0701, 0x033c, 0x0000 },
+ { 0x8701, 0x033f, 0x2000 },
+ { 0x0701, 0x033e, 0x0000 },
+ { 0x0701, 0x0340, 0x0000 },
+ { 0x8701, 0x0345, 0x3000 },
+ { 0x8701, 0x0343, 0x2000 },
+ { 0x0701, 0x0342, 0x0000 },
+ { 0x0701, 0x0344, 0x0000 },
+ { 0x8701, 0x0347, 0x2000 },
+ { 0x0701, 0x0346, 0x0000 },
+ { 0x0701, 0x0348, 0x0000 },
+ { 0x8901, 0x041f, 0x7028 },
+ { 0x9501, 0x039f, 0x6000 },
+ { 0x8701, 0x038e, 0x5000 },
+ { 0x8701, 0x0386, 0x4000 },
+ { 0x8701, 0x0382, 0x3000 },
+ { 0x8701, 0x0380, 0x2000 },
+ { 0x0e01, 0x034a, 0x0000 },
+ { 0x0701, 0x0381, 0x0000 },
+ { 0x8701, 0x0384, 0x2000 },
+ { 0x0701, 0x0383, 0x0000 },
+ { 0x0701, 0x0385, 0x0000 },
+ { 0x8701, 0x038a, 0x3000 },
+ { 0x8701, 0x0388, 0x2000 },
+ { 0x0701, 0x0387, 0x0000 },
+ { 0x0701, 0x0389, 0x0000 },
+ { 0x8701, 0x038c, 0x2000 },
+ { 0x0701, 0x038b, 0x0000 },
+ { 0x0701, 0x038d, 0x0000 },
+ { 0x8701, 0x0396, 0x4000 },
+ { 0x8701, 0x0392, 0x3000 },
+ { 0x8701, 0x0390, 0x2000 },
+ { 0x0701, 0x038f, 0x0000 },
+ { 0x0701, 0x0391, 0x0000 },
+ { 0x8701, 0x0394, 0x2000 },
+ { 0x0701, 0x0393, 0x0000 },
+ { 0x0701, 0x0395, 0x0000 },
+ { 0x8701, 0x039a, 0x3000 },
+ { 0x8701, 0x0398, 0x2000 },
+ { 0x0701, 0x0397, 0x0000 },
+ { 0x0701, 0x0399, 0x0000 },
+ { 0x8701, 0x039c, 0x2000 },
+ { 0x0701, 0x039b, 0x0000 },
+ { 0x0701, 0x039d, 0x0000 },
+ { 0x8901, 0x040f, 0x5028 },
+ { 0x8901, 0x0407, 0x4028 },
+ { 0x8901, 0x0403, 0x3028 },
+ { 0x8901, 0x0401, 0x2028 },
+ { 0x0901, 0x0400, 0x0028 },
+ { 0x0901, 0x0402, 0x0028 },
+ { 0x8901, 0x0405, 0x2028 },
+ { 0x0901, 0x0404, 0x0028 },
+ { 0x0901, 0x0406, 0x0028 },
+ { 0x8901, 0x040b, 0x3028 },
+ { 0x8901, 0x0409, 0x2028 },
+ { 0x0901, 0x0408, 0x0028 },
+ { 0x0901, 0x040a, 0x0028 },
+ { 0x8901, 0x040d, 0x2028 },
+ { 0x0901, 0x040c, 0x0028 },
+ { 0x0901, 0x040e, 0x0028 },
+ { 0x8901, 0x0417, 0x4028 },
+ { 0x8901, 0x0413, 0x3028 },
+ { 0x8901, 0x0411, 0x2028 },
+ { 0x0901, 0x0410, 0x0028 },
+ { 0x0901, 0x0412, 0x0028 },
+ { 0x8901, 0x0415, 0x2028 },
+ { 0x0901, 0x0414, 0x0028 },
+ { 0x0901, 0x0416, 0x0028 },
+ { 0x8901, 0x041b, 0x3028 },
+ { 0x8901, 0x0419, 0x2028 },
+ { 0x0901, 0x0418, 0x0028 },
+ { 0x0901, 0x041a, 0x0028 },
+ { 0x8901, 0x041d, 0x2028 },
+ { 0x0901, 0x041c, 0x0028 },
+ { 0x0901, 0x041e, 0x0028 },
+ { 0x8501, 0x043f, 0x6fd8 },
+ { 0x8501, 0x042f, 0x5fd8 },
+ { 0x8901, 0x0427, 0x4028 },
+ { 0x8901, 0x0423, 0x3028 },
+ { 0x8901, 0x0421, 0x2028 },
+ { 0x0901, 0x0420, 0x0028 },
+ { 0x0901, 0x0422, 0x0028 },
+ { 0x8901, 0x0425, 0x2028 },
+ { 0x0901, 0x0424, 0x0028 },
+ { 0x0901, 0x0426, 0x0028 },
+ { 0x8501, 0x042b, 0x3fd8 },
+ { 0x8501, 0x0429, 0x2fd8 },
+ { 0x0501, 0x0428, 0x0fd8 },
+ { 0x0501, 0x042a, 0x0fd8 },
+ { 0x8501, 0x042d, 0x2fd8 },
+ { 0x0501, 0x042c, 0x0fd8 },
+ { 0x0501, 0x042e, 0x0fd8 },
+ { 0x8501, 0x0437, 0x4fd8 },
+ { 0x8501, 0x0433, 0x3fd8 },
+ { 0x8501, 0x0431, 0x2fd8 },
+ { 0x0501, 0x0430, 0x0fd8 },
+ { 0x0501, 0x0432, 0x0fd8 },
+ { 0x8501, 0x0435, 0x2fd8 },
+ { 0x0501, 0x0434, 0x0fd8 },
+ { 0x0501, 0x0436, 0x0fd8 },
+ { 0x8501, 0x043b, 0x3fd8 },
+ { 0x8501, 0x0439, 0x2fd8 },
+ { 0x0501, 0x0438, 0x0fd8 },
+ { 0x0501, 0x043a, 0x0fd8 },
+ { 0x8501, 0x043d, 0x2fd8 },
+ { 0x0501, 0x043c, 0x0fd8 },
+ { 0x0501, 0x043e, 0x0fd8 },
+ { 0x8501, 0x044f, 0x5fd8 },
+ { 0x8501, 0x0447, 0x4fd8 },
+ { 0x8501, 0x0443, 0x3fd8 },
+ { 0x8501, 0x0441, 0x2fd8 },
+ { 0x0501, 0x0440, 0x0fd8 },
+ { 0x0501, 0x0442, 0x0fd8 },
+ { 0x8501, 0x0445, 0x2fd8 },
+ { 0x0501, 0x0444, 0x0fd8 },
+ { 0x0501, 0x0446, 0x0fd8 },
+ { 0x8501, 0x044b, 0x3fd8 },
+ { 0x8501, 0x0449, 0x2fd8 },
+ { 0x0501, 0x0448, 0x0fd8 },
+ { 0x0501, 0x044a, 0x0fd8 },
+ { 0x8501, 0x044d, 0x2fd8 },
+ { 0x0501, 0x044c, 0x0fd8 },
+ { 0x0501, 0x044e, 0x0fd8 },
+ { 0x8701, 0x0457, 0x4000 },
+ { 0x8701, 0x0453, 0x3000 },
+ { 0x8701, 0x0451, 0x2000 },
+ { 0x0701, 0x0450, 0x0000 },
+ { 0x0701, 0x0452, 0x0000 },
+ { 0x8701, 0x0455, 0x2000 },
+ { 0x0701, 0x0454, 0x0000 },
+ { 0x0701, 0x0456, 0x0000 },
+ { 0x8701, 0x045b, 0x3000 },
+ { 0x8701, 0x0459, 0x2000 },
+ { 0x0701, 0x0458, 0x0000 },
+ { 0x0701, 0x045a, 0x0000 },
+ { 0x8701, 0x045d, 0x2000 },
+ { 0x0701, 0x045c, 0x0000 },
+ { 0x0701, 0x045e, 0x0000 },
+ { 0x9a01, 0xd000, 0x8000 },
+ { 0x8d01, 0x04a1, 0x7000 },
+ { 0x8701, 0x047f, 0x6000 },
+ { 0x8701, 0x046f, 0x5000 },
+ { 0x8701, 0x0467, 0x4000 },
+ { 0x8701, 0x0463, 0x3000 },
+ { 0x8701, 0x0461, 0x2000 },
+ { 0x0701, 0x0460, 0x0000 },
+ { 0x0701, 0x0462, 0x0000 },
+ { 0x8701, 0x0465, 0x2000 },
+ { 0x0701, 0x0464, 0x0000 },
+ { 0x0701, 0x0466, 0x0000 },
+ { 0x8701, 0x046b, 0x3000 },
+ { 0x8701, 0x0469, 0x2000 },
+ { 0x0701, 0x0468, 0x0000 },
+ { 0x0701, 0x046a, 0x0000 },
+ { 0x8701, 0x046d, 0x2000 },
+ { 0x0701, 0x046c, 0x0000 },
+ { 0x0701, 0x046e, 0x0000 },
+ { 0x8701, 0x0477, 0x4000 },
+ { 0x8701, 0x0473, 0x3000 },
+ { 0x8701, 0x0471, 0x2000 },
+ { 0x0701, 0x0470, 0x0000 },
+ { 0x0701, 0x0472, 0x0000 },
+ { 0x8701, 0x0475, 0x2000 },
+ { 0x0701, 0x0474, 0x0000 },
+ { 0x0701, 0x0476, 0x0000 },
+ { 0x8701, 0x047b, 0x3000 },
+ { 0x8701, 0x0479, 0x2000 },
+ { 0x0701, 0x0478, 0x0000 },
+ { 0x0701, 0x047a, 0x0000 },
+ { 0x8701, 0x047d, 0x2000 },
+ { 0x0701, 0x047c, 0x0000 },
+ { 0x0701, 0x047e, 0x0000 },
+ { 0x8701, 0x048f, 0x5000 },
+ { 0x8701, 0x0487, 0x4000 },
+ { 0x8701, 0x0483, 0x3000 },
+ { 0x8701, 0x0481, 0x2000 },
+ { 0x0701, 0x0480, 0x0000 },
+ { 0x0701, 0x0482, 0x0000 },
+ { 0x8701, 0x0485, 0x2000 },
+ { 0x0701, 0x0484, 0x0000 },
+ { 0x0701, 0x0486, 0x0000 },
+ { 0x8701, 0x048b, 0x3000 },
+ { 0x8701, 0x0489, 0x2000 },
+ { 0x0701, 0x0488, 0x0000 },
+ { 0x0701, 0x048a, 0x0000 },
+ { 0x8701, 0x048d, 0x2000 },
+ { 0x0701, 0x048c, 0x0000 },
+ { 0x0701, 0x048e, 0x0000 },
+ { 0x8701, 0x0497, 0x4000 },
+ { 0x8701, 0x0493, 0x3000 },
+ { 0x8701, 0x0491, 0x2000 },
+ { 0x0701, 0x0490, 0x0000 },
+ { 0x0701, 0x0492, 0x0000 },
+ { 0x8701, 0x0495, 0x2000 },
+ { 0x0701, 0x0494, 0x0000 },
+ { 0x0701, 0x0496, 0x0000 },
+ { 0x8701, 0x049b, 0x3000 },
+ { 0x8701, 0x0499, 0x2000 },
+ { 0x0701, 0x0498, 0x0000 },
+ { 0x0701, 0x049a, 0x0000 },
+ { 0x8701, 0x049d, 0x2000 },
+ { 0x0701, 0x049c, 0x0000 },
+ { 0x0d01, 0x04a0, 0x0000 },
+ { 0x8701, 0x081a, 0x6000 },
+ { 0x8701, 0x080a, 0x5000 },
+ { 0x8d01, 0x04a9, 0x4000 },
+ { 0x8d01, 0x04a5, 0x3000 },
+ { 0x8d01, 0x04a3, 0x2000 },
+ { 0x0d01, 0x04a2, 0x0000 },
+ { 0x0d01, 0x04a4, 0x0000 },
+ { 0x8d01, 0x04a7, 0x2000 },
+ { 0x0d01, 0x04a6, 0x0000 },
+ { 0x0d01, 0x04a8, 0x0000 },
+ { 0x8701, 0x0803, 0x3000 },
+ { 0x8701, 0x0801, 0x2000 },
+ { 0x0701, 0x0800, 0x0000 },
+ { 0x0701, 0x0802, 0x0000 },
+ { 0x8701, 0x0805, 0x2000 },
+ { 0x0701, 0x0804, 0x0000 },
+ { 0x0701, 0x0808, 0x0000 },
+ { 0x8701, 0x0812, 0x4000 },
+ { 0x8701, 0x080e, 0x3000 },
+ { 0x8701, 0x080c, 0x2000 },
+ { 0x0701, 0x080b, 0x0000 },
+ { 0x0701, 0x080d, 0x0000 },
+ { 0x8701, 0x0810, 0x2000 },
+ { 0x0701, 0x080f, 0x0000 },
+ { 0x0701, 0x0811, 0x0000 },
+ { 0x8701, 0x0816, 0x3000 },
+ { 0x8701, 0x0814, 0x2000 },
+ { 0x0701, 0x0813, 0x0000 },
+ { 0x0701, 0x0815, 0x0000 },
+ { 0x8701, 0x0818, 0x2000 },
+ { 0x0701, 0x0817, 0x0000 },
+ { 0x0701, 0x0819, 0x0000 },
+ { 0x8701, 0x082a, 0x5000 },
+ { 0x8701, 0x0822, 0x4000 },
+ { 0x8701, 0x081e, 0x3000 },
+ { 0x8701, 0x081c, 0x2000 },
+ { 0x0701, 0x081b, 0x0000 },
+ { 0x0701, 0x081d, 0x0000 },
+ { 0x8701, 0x0820, 0x2000 },
+ { 0x0701, 0x081f, 0x0000 },
+ { 0x0701, 0x0821, 0x0000 },
+ { 0x8701, 0x0826, 0x3000 },
+ { 0x8701, 0x0824, 0x2000 },
+ { 0x0701, 0x0823, 0x0000 },
+ { 0x0701, 0x0825, 0x0000 },
+ { 0x8701, 0x0828, 0x2000 },
+ { 0x0701, 0x0827, 0x0000 },
+ { 0x0701, 0x0829, 0x0000 },
+ { 0x8701, 0x0832, 0x4000 },
+ { 0x8701, 0x082e, 0x3000 },
+ { 0x8701, 0x082c, 0x2000 },
+ { 0x0701, 0x082b, 0x0000 },
+ { 0x0701, 0x082d, 0x0000 },
+ { 0x8701, 0x0830, 0x2000 },
+ { 0x0701, 0x082f, 0x0000 },
+ { 0x0701, 0x0831, 0x0000 },
+ { 0x8701, 0x0837, 0x3000 },
+ { 0x8701, 0x0834, 0x2000 },
+ { 0x0701, 0x0833, 0x0000 },
+ { 0x0701, 0x0835, 0x0000 },
+ { 0x8701, 0x083c, 0x2000 },
+ { 0x0701, 0x0838, 0x0000 },
+ { 0x0701, 0x083f, 0x0000 },
+ { 0x9a01, 0xd040, 0x7000 },
+ { 0x9a01, 0xd020, 0x6000 },
+ { 0x9a01, 0xd010, 0x5000 },
+ { 0x9a01, 0xd008, 0x4000 },
+ { 0x9a01, 0xd004, 0x3000 },
+ { 0x9a01, 0xd002, 0x2000 },
+ { 0x1a01, 0xd001, 0x0000 },
+ { 0x1a01, 0xd003, 0x0000 },
+ { 0x9a01, 0xd006, 0x2000 },
+ { 0x1a01, 0xd005, 0x0000 },
+ { 0x1a01, 0xd007, 0x0000 },
+ { 0x9a01, 0xd00c, 0x3000 },
+ { 0x9a01, 0xd00a, 0x2000 },
+ { 0x1a01, 0xd009, 0x0000 },
+ { 0x1a01, 0xd00b, 0x0000 },
+ { 0x9a01, 0xd00e, 0x2000 },
+ { 0x1a01, 0xd00d, 0x0000 },
+ { 0x1a01, 0xd00f, 0x0000 },
+ { 0x9a01, 0xd018, 0x4000 },
+ { 0x9a01, 0xd014, 0x3000 },
+ { 0x9a01, 0xd012, 0x2000 },
+ { 0x1a01, 0xd011, 0x0000 },
+ { 0x1a01, 0xd013, 0x0000 },
+ { 0x9a01, 0xd016, 0x2000 },
+ { 0x1a01, 0xd015, 0x0000 },
+ { 0x1a01, 0xd017, 0x0000 },
+ { 0x9a01, 0xd01c, 0x3000 },
+ { 0x9a01, 0xd01a, 0x2000 },
+ { 0x1a01, 0xd019, 0x0000 },
+ { 0x1a01, 0xd01b, 0x0000 },
+ { 0x9a01, 0xd01e, 0x2000 },
+ { 0x1a01, 0xd01d, 0x0000 },
+ { 0x1a01, 0xd01f, 0x0000 },
+ { 0x9a01, 0xd030, 0x5000 },
+ { 0x9a01, 0xd028, 0x4000 },
+ { 0x9a01, 0xd024, 0x3000 },
+ { 0x9a01, 0xd022, 0x2000 },
+ { 0x1a01, 0xd021, 0x0000 },
+ { 0x1a01, 0xd023, 0x0000 },
+ { 0x9a01, 0xd026, 0x2000 },
+ { 0x1a01, 0xd025, 0x0000 },
+ { 0x1a01, 0xd027, 0x0000 },
+ { 0x9a01, 0xd02c, 0x3000 },
+ { 0x9a01, 0xd02a, 0x2000 },
+ { 0x1a01, 0xd029, 0x0000 },
+ { 0x1a01, 0xd02b, 0x0000 },
+ { 0x9a01, 0xd02e, 0x2000 },
+ { 0x1a01, 0xd02d, 0x0000 },
+ { 0x1a01, 0xd02f, 0x0000 },
+ { 0x9a01, 0xd038, 0x4000 },
+ { 0x9a01, 0xd034, 0x3000 },
+ { 0x9a01, 0xd032, 0x2000 },
+ { 0x1a01, 0xd031, 0x0000 },
+ { 0x1a01, 0xd033, 0x0000 },
+ { 0x9a01, 0xd036, 0x2000 },
+ { 0x1a01, 0xd035, 0x0000 },
+ { 0x1a01, 0xd037, 0x0000 },
+ { 0x9a01, 0xd03c, 0x3000 },
+ { 0x9a01, 0xd03a, 0x2000 },
+ { 0x1a01, 0xd039, 0x0000 },
+ { 0x1a01, 0xd03b, 0x0000 },
+ { 0x9a01, 0xd03e, 0x2000 },
+ { 0x1a01, 0xd03d, 0x0000 },
+ { 0x1a01, 0xd03f, 0x0000 },
+ { 0x9a01, 0xd060, 0x6000 },
+ { 0x9a01, 0xd050, 0x5000 },
+ { 0x9a01, 0xd048, 0x4000 },
+ { 0x9a01, 0xd044, 0x3000 },
+ { 0x9a01, 0xd042, 0x2000 },
+ { 0x1a01, 0xd041, 0x0000 },
+ { 0x1a01, 0xd043, 0x0000 },
+ { 0x9a01, 0xd046, 0x2000 },
+ { 0x1a01, 0xd045, 0x0000 },
+ { 0x1a01, 0xd047, 0x0000 },
+ { 0x9a01, 0xd04c, 0x3000 },
+ { 0x9a01, 0xd04a, 0x2000 },
+ { 0x1a01, 0xd049, 0x0000 },
+ { 0x1a01, 0xd04b, 0x0000 },
+ { 0x9a01, 0xd04e, 0x2000 },
+ { 0x1a01, 0xd04d, 0x0000 },
+ { 0x1a01, 0xd04f, 0x0000 },
+ { 0x9a01, 0xd058, 0x4000 },
+ { 0x9a01, 0xd054, 0x3000 },
+ { 0x9a01, 0xd052, 0x2000 },
+ { 0x1a01, 0xd051, 0x0000 },
+ { 0x1a01, 0xd053, 0x0000 },
+ { 0x9a01, 0xd056, 0x2000 },
+ { 0x1a01, 0xd055, 0x0000 },
+ { 0x1a01, 0xd057, 0x0000 },
+ { 0x9a01, 0xd05c, 0x3000 },
+ { 0x9a01, 0xd05a, 0x2000 },
+ { 0x1a01, 0xd059, 0x0000 },
+ { 0x1a01, 0xd05b, 0x0000 },
+ { 0x9a01, 0xd05e, 0x2000 },
+ { 0x1a01, 0xd05d, 0x0000 },
+ { 0x1a01, 0xd05f, 0x0000 },
+ { 0x9a01, 0xd070, 0x5000 },
+ { 0x9a01, 0xd068, 0x4000 },
+ { 0x9a01, 0xd064, 0x3000 },
+ { 0x9a01, 0xd062, 0x2000 },
+ { 0x1a01, 0xd061, 0x0000 },
+ { 0x1a01, 0xd063, 0x0000 },
+ { 0x9a01, 0xd066, 0x2000 },
+ { 0x1a01, 0xd065, 0x0000 },
+ { 0x1a01, 0xd067, 0x0000 },
+ { 0x9a01, 0xd06c, 0x3000 },
+ { 0x9a01, 0xd06a, 0x2000 },
+ { 0x1a01, 0xd069, 0x0000 },
+ { 0x1a01, 0xd06b, 0x0000 },
+ { 0x9a01, 0xd06e, 0x2000 },
+ { 0x1a01, 0xd06d, 0x0000 },
+ { 0x1a01, 0xd06f, 0x0000 },
+ { 0x9a01, 0xd078, 0x4000 },
+ { 0x9a01, 0xd074, 0x3000 },
+ { 0x9a01, 0xd072, 0x2000 },
+ { 0x1a01, 0xd071, 0x0000 },
+ { 0x1a01, 0xd073, 0x0000 },
+ { 0x9a01, 0xd076, 0x2000 },
+ { 0x1a01, 0xd075, 0x0000 },
+ { 0x1a01, 0xd077, 0x0000 },
+ { 0x9a01, 0xd07c, 0x3000 },
+ { 0x9a01, 0xd07a, 0x2000 },
+ { 0x1a01, 0xd079, 0x0000 },
+ { 0x1a01, 0xd07b, 0x0000 },
+ { 0x9a01, 0xd07e, 0x2000 },
+ { 0x1a01, 0xd07d, 0x0000 },
+ { 0x1a01, 0xd07f, 0x0000 },
+ { 0x9a01, 0xd18d, 0x9000 },
+ { 0x9a01, 0xd10a, 0x8000 },
+ { 0x9a01, 0xd0c0, 0x7000 },
+ { 0x9a01, 0xd0a0, 0x6000 },
+ { 0x9a01, 0xd090, 0x5000 },
+ { 0x9a01, 0xd088, 0x4000 },
+ { 0x9a01, 0xd084, 0x3000 },
+ { 0x9a01, 0xd082, 0x2000 },
+ { 0x1a01, 0xd081, 0x0000 },
+ { 0x1a01, 0xd083, 0x0000 },
+ { 0x9a01, 0xd086, 0x2000 },
+ { 0x1a01, 0xd085, 0x0000 },
+ { 0x1a01, 0xd087, 0x0000 },
+ { 0x9a01, 0xd08c, 0x3000 },
+ { 0x9a01, 0xd08a, 0x2000 },
+ { 0x1a01, 0xd089, 0x0000 },
+ { 0x1a01, 0xd08b, 0x0000 },
+ { 0x9a01, 0xd08e, 0x2000 },
+ { 0x1a01, 0xd08d, 0x0000 },
+ { 0x1a01, 0xd08f, 0x0000 },
+ { 0x9a01, 0xd098, 0x4000 },
+ { 0x9a01, 0xd094, 0x3000 },
+ { 0x9a01, 0xd092, 0x2000 },
+ { 0x1a01, 0xd091, 0x0000 },
+ { 0x1a01, 0xd093, 0x0000 },
+ { 0x9a01, 0xd096, 0x2000 },
+ { 0x1a01, 0xd095, 0x0000 },
+ { 0x1a01, 0xd097, 0x0000 },
+ { 0x9a01, 0xd09c, 0x3000 },
+ { 0x9a01, 0xd09a, 0x2000 },
+ { 0x1a01, 0xd099, 0x0000 },
+ { 0x1a01, 0xd09b, 0x0000 },
+ { 0x9a01, 0xd09e, 0x2000 },
+ { 0x1a01, 0xd09d, 0x0000 },
+ { 0x1a01, 0xd09f, 0x0000 },
+ { 0x9a01, 0xd0b0, 0x5000 },
+ { 0x9a01, 0xd0a8, 0x4000 },
+ { 0x9a01, 0xd0a4, 0x3000 },
+ { 0x9a01, 0xd0a2, 0x2000 },
+ { 0x1a01, 0xd0a1, 0x0000 },
+ { 0x1a01, 0xd0a3, 0x0000 },
+ { 0x9a01, 0xd0a6, 0x2000 },
+ { 0x1a01, 0xd0a5, 0x0000 },
+ { 0x1a01, 0xd0a7, 0x0000 },
+ { 0x9a01, 0xd0ac, 0x3000 },
+ { 0x9a01, 0xd0aa, 0x2000 },
+ { 0x1a01, 0xd0a9, 0x0000 },
+ { 0x1a01, 0xd0ab, 0x0000 },
+ { 0x9a01, 0xd0ae, 0x2000 },
+ { 0x1a01, 0xd0ad, 0x0000 },
+ { 0x1a01, 0xd0af, 0x0000 },
+ { 0x9a01, 0xd0b8, 0x4000 },
+ { 0x9a01, 0xd0b4, 0x3000 },
+ { 0x9a01, 0xd0b2, 0x2000 },
+ { 0x1a01, 0xd0b1, 0x0000 },
+ { 0x1a01, 0xd0b3, 0x0000 },
+ { 0x9a01, 0xd0b6, 0x2000 },
+ { 0x1a01, 0xd0b5, 0x0000 },
+ { 0x1a01, 0xd0b7, 0x0000 },
+ { 0x9a01, 0xd0bc, 0x3000 },
+ { 0x9a01, 0xd0ba, 0x2000 },
+ { 0x1a01, 0xd0b9, 0x0000 },
+ { 0x1a01, 0xd0bb, 0x0000 },
+ { 0x9a01, 0xd0be, 0x2000 },
+ { 0x1a01, 0xd0bd, 0x0000 },
+ { 0x1a01, 0xd0bf, 0x0000 },
+ { 0x9a01, 0xd0e0, 0x6000 },
+ { 0x9a01, 0xd0d0, 0x5000 },
+ { 0x9a01, 0xd0c8, 0x4000 },
+ { 0x9a01, 0xd0c4, 0x3000 },
+ { 0x9a01, 0xd0c2, 0x2000 },
+ { 0x1a01, 0xd0c1, 0x0000 },
+ { 0x1a01, 0xd0c3, 0x0000 },
+ { 0x9a01, 0xd0c6, 0x2000 },
+ { 0x1a01, 0xd0c5, 0x0000 },
+ { 0x1a01, 0xd0c7, 0x0000 },
+ { 0x9a01, 0xd0cc, 0x3000 },
+ { 0x9a01, 0xd0ca, 0x2000 },
+ { 0x1a01, 0xd0c9, 0x0000 },
+ { 0x1a01, 0xd0cb, 0x0000 },
+ { 0x9a01, 0xd0ce, 0x2000 },
+ { 0x1a01, 0xd0cd, 0x0000 },
+ { 0x1a01, 0xd0cf, 0x0000 },
+ { 0x9a01, 0xd0d8, 0x4000 },
+ { 0x9a01, 0xd0d4, 0x3000 },
+ { 0x9a01, 0xd0d2, 0x2000 },
+ { 0x1a01, 0xd0d1, 0x0000 },
+ { 0x1a01, 0xd0d3, 0x0000 },
+ { 0x9a01, 0xd0d6, 0x2000 },
+ { 0x1a01, 0xd0d5, 0x0000 },
+ { 0x1a01, 0xd0d7, 0x0000 },
+ { 0x9a01, 0xd0dc, 0x3000 },
+ { 0x9a01, 0xd0da, 0x2000 },
+ { 0x1a01, 0xd0d9, 0x0000 },
+ { 0x1a01, 0xd0db, 0x0000 },
+ { 0x9a01, 0xd0de, 0x2000 },
+ { 0x1a01, 0xd0dd, 0x0000 },
+ { 0x1a01, 0xd0df, 0x0000 },
+ { 0x9a01, 0xd0f0, 0x5000 },
+ { 0x9a01, 0xd0e8, 0x4000 },
+ { 0x9a01, 0xd0e4, 0x3000 },
+ { 0x9a01, 0xd0e2, 0x2000 },
+ { 0x1a01, 0xd0e1, 0x0000 },
+ { 0x1a01, 0xd0e3, 0x0000 },
+ { 0x9a01, 0xd0e6, 0x2000 },
+ { 0x1a01, 0xd0e5, 0x0000 },
+ { 0x1a01, 0xd0e7, 0x0000 },
+ { 0x9a01, 0xd0ec, 0x3000 },
+ { 0x9a01, 0xd0ea, 0x2000 },
+ { 0x1a01, 0xd0e9, 0x0000 },
+ { 0x1a01, 0xd0eb, 0x0000 },
+ { 0x9a01, 0xd0ee, 0x2000 },
+ { 0x1a01, 0xd0ed, 0x0000 },
+ { 0x1a01, 0xd0ef, 0x0000 },
+ { 0x9a01, 0xd102, 0x4000 },
+ { 0x9a01, 0xd0f4, 0x3000 },
+ { 0x9a01, 0xd0f2, 0x2000 },
+ { 0x1a01, 0xd0f1, 0x0000 },
+ { 0x1a01, 0xd0f3, 0x0000 },
+ { 0x9a01, 0xd100, 0x2000 },
+ { 0x1a01, 0xd0f5, 0x0000 },
+ { 0x1a01, 0xd101, 0x0000 },
+ { 0x9a01, 0xd106, 0x3000 },
+ { 0x9a01, 0xd104, 0x2000 },
+ { 0x1a01, 0xd103, 0x0000 },
+ { 0x1a01, 0xd105, 0x0000 },
+ { 0x9a01, 0xd108, 0x2000 },
+ { 0x1a01, 0xd107, 0x0000 },
+ { 0x1a01, 0xd109, 0x0000 },
+ { 0x9a01, 0xd14d, 0x7000 },
+ { 0x9a01, 0xd12d, 0x6000 },
+ { 0x9a01, 0xd11a, 0x5000 },
+ { 0x9a01, 0xd112, 0x4000 },
+ { 0x9a01, 0xd10e, 0x3000 },
+ { 0x9a01, 0xd10c, 0x2000 },
+ { 0x1a01, 0xd10b, 0x0000 },
+ { 0x1a01, 0xd10d, 0x0000 },
+ { 0x9a01, 0xd110, 0x2000 },
+ { 0x1a01, 0xd10f, 0x0000 },
+ { 0x1a01, 0xd111, 0x0000 },
+ { 0x9a01, 0xd116, 0x3000 },
+ { 0x9a01, 0xd114, 0x2000 },
+ { 0x1a01, 0xd113, 0x0000 },
+ { 0x1a01, 0xd115, 0x0000 },
+ { 0x9a01, 0xd118, 0x2000 },
+ { 0x1a01, 0xd117, 0x0000 },
+ { 0x1a01, 0xd119, 0x0000 },
+ { 0x9a01, 0xd122, 0x4000 },
+ { 0x9a01, 0xd11e, 0x3000 },
+ { 0x9a01, 0xd11c, 0x2000 },
+ { 0x1a01, 0xd11b, 0x0000 },
+ { 0x1a01, 0xd11d, 0x0000 },
+ { 0x9a01, 0xd120, 0x2000 },
+ { 0x1a01, 0xd11f, 0x0000 },
+ { 0x1a01, 0xd121, 0x0000 },
+ { 0x9a01, 0xd126, 0x3000 },
+ { 0x9a01, 0xd124, 0x2000 },
+ { 0x1a01, 0xd123, 0x0000 },
+ { 0x1a01, 0xd125, 0x0000 },
+ { 0x9a01, 0xd12b, 0x2000 },
+ { 0x1a01, 0xd12a, 0x0000 },
+ { 0x1a01, 0xd12c, 0x0000 },
+ { 0x9a01, 0xd13d, 0x5000 },
+ { 0x9a01, 0xd135, 0x4000 },
+ { 0x9a01, 0xd131, 0x3000 },
+ { 0x9a01, 0xd12f, 0x2000 },
+ { 0x1a01, 0xd12e, 0x0000 },
+ { 0x1a01, 0xd130, 0x0000 },
+ { 0x9a01, 0xd133, 0x2000 },
+ { 0x1a01, 0xd132, 0x0000 },
+ { 0x1a01, 0xd134, 0x0000 },
+ { 0x9a01, 0xd139, 0x3000 },
+ { 0x9a01, 0xd137, 0x2000 },
+ { 0x1a01, 0xd136, 0x0000 },
+ { 0x1a01, 0xd138, 0x0000 },
+ { 0x9a01, 0xd13b, 0x2000 },
+ { 0x1a01, 0xd13a, 0x0000 },
+ { 0x1a01, 0xd13c, 0x0000 },
+ { 0x9a01, 0xd145, 0x4000 },
+ { 0x9a01, 0xd141, 0x3000 },
+ { 0x9a01, 0xd13f, 0x2000 },
+ { 0x1a01, 0xd13e, 0x0000 },
+ { 0x1a01, 0xd140, 0x0000 },
+ { 0x9a01, 0xd143, 0x2000 },
+ { 0x1a01, 0xd142, 0x0000 },
+ { 0x1a01, 0xd144, 0x0000 },
+ { 0x9a01, 0xd149, 0x3000 },
+ { 0x9a01, 0xd147, 0x2000 },
+ { 0x1a01, 0xd146, 0x0000 },
+ { 0x1a01, 0xd148, 0x0000 },
+ { 0x9a01, 0xd14b, 0x2000 },
+ { 0x1a01, 0xd14a, 0x0000 },
+ { 0x1a01, 0xd14c, 0x0000 },
+ { 0x8a01, 0xd16d, 0x6000 },
+ { 0x9a01, 0xd15d, 0x5000 },
+ { 0x9a01, 0xd155, 0x4000 },
+ { 0x9a01, 0xd151, 0x3000 },
+ { 0x9a01, 0xd14f, 0x2000 },
+ { 0x1a01, 0xd14e, 0x0000 },
+ { 0x1a01, 0xd150, 0x0000 },
+ { 0x9a01, 0xd153, 0x2000 },
+ { 0x1a01, 0xd152, 0x0000 },
+ { 0x1a01, 0xd154, 0x0000 },
+ { 0x9a01, 0xd159, 0x3000 },
+ { 0x9a01, 0xd157, 0x2000 },
+ { 0x1a01, 0xd156, 0x0000 },
+ { 0x1a01, 0xd158, 0x0000 },
+ { 0x9a01, 0xd15b, 0x2000 },
+ { 0x1a01, 0xd15a, 0x0000 },
+ { 0x1a01, 0xd15c, 0x0000 },
+ { 0x8a01, 0xd165, 0x4000 },
+ { 0x9a01, 0xd161, 0x3000 },
+ { 0x9a01, 0xd15f, 0x2000 },
+ { 0x1a01, 0xd15e, 0x0000 },
+ { 0x1a01, 0xd160, 0x0000 },
+ { 0x9a01, 0xd163, 0x2000 },
+ { 0x1a01, 0xd162, 0x0000 },
+ { 0x1a01, 0xd164, 0x0000 },
+ { 0x8c01, 0xd169, 0x3000 },
+ { 0x8c01, 0xd167, 0x2000 },
+ { 0x0a01, 0xd166, 0x0000 },
+ { 0x0c01, 0xd168, 0x0000 },
+ { 0x9a01, 0xd16b, 0x2000 },
+ { 0x1a01, 0xd16a, 0x0000 },
+ { 0x1a01, 0xd16c, 0x0000 },
+ { 0x8c01, 0xd17d, 0x5000 },
+ { 0x8101, 0xd175, 0x4000 },
+ { 0x8a01, 0xd171, 0x3000 },
+ { 0x8a01, 0xd16f, 0x2000 },
+ { 0x0a01, 0xd16e, 0x0000 },
+ { 0x0a01, 0xd170, 0x0000 },
+ { 0x8101, 0xd173, 0x2000 },
+ { 0x0a01, 0xd172, 0x0000 },
+ { 0x0101, 0xd174, 0x0000 },
+ { 0x8101, 0xd179, 0x3000 },
+ { 0x8101, 0xd177, 0x2000 },
+ { 0x0101, 0xd176, 0x0000 },
+ { 0x0101, 0xd178, 0x0000 },
+ { 0x8c01, 0xd17b, 0x2000 },
+ { 0x0101, 0xd17a, 0x0000 },
+ { 0x0c01, 0xd17c, 0x0000 },
+ { 0x8c01, 0xd185, 0x4000 },
+ { 0x8c01, 0xd181, 0x3000 },
+ { 0x8c01, 0xd17f, 0x2000 },
+ { 0x0c01, 0xd17e, 0x0000 },
+ { 0x0c01, 0xd180, 0x0000 },
+ { 0x9a01, 0xd183, 0x2000 },
+ { 0x0c01, 0xd182, 0x0000 },
+ { 0x1a01, 0xd184, 0x0000 },
+ { 0x8c01, 0xd189, 0x3000 },
+ { 0x8c01, 0xd187, 0x2000 },
+ { 0x0c01, 0xd186, 0x0000 },
+ { 0x0c01, 0xd188, 0x0000 },
+ { 0x8c01, 0xd18b, 0x2000 },
+ { 0x0c01, 0xd18a, 0x0000 },
+ { 0x1a01, 0xd18c, 0x0000 },
+ { 0x9a01, 0xd32f, 0x8000 },
+ { 0x9a01, 0xd1cd, 0x7000 },
+ { 0x8c01, 0xd1ad, 0x6000 },
+ { 0x9a01, 0xd19d, 0x5000 },
+ { 0x9a01, 0xd195, 0x4000 },
+ { 0x9a01, 0xd191, 0x3000 },
+ { 0x9a01, 0xd18f, 0x2000 },
+ { 0x1a01, 0xd18e, 0x0000 },
+ { 0x1a01, 0xd190, 0x0000 },
+ { 0x9a01, 0xd193, 0x2000 },
+ { 0x1a01, 0xd192, 0x0000 },
+ { 0x1a01, 0xd194, 0x0000 },
+ { 0x9a01, 0xd199, 0x3000 },
+ { 0x9a01, 0xd197, 0x2000 },
+ { 0x1a01, 0xd196, 0x0000 },
+ { 0x1a01, 0xd198, 0x0000 },
+ { 0x9a01, 0xd19b, 0x2000 },
+ { 0x1a01, 0xd19a, 0x0000 },
+ { 0x1a01, 0xd19c, 0x0000 },
+ { 0x9a01, 0xd1a5, 0x4000 },
+ { 0x9a01, 0xd1a1, 0x3000 },
+ { 0x9a01, 0xd19f, 0x2000 },
+ { 0x1a01, 0xd19e, 0x0000 },
+ { 0x1a01, 0xd1a0, 0x0000 },
+ { 0x9a01, 0xd1a3, 0x2000 },
+ { 0x1a01, 0xd1a2, 0x0000 },
+ { 0x1a01, 0xd1a4, 0x0000 },
+ { 0x9a01, 0xd1a9, 0x3000 },
+ { 0x9a01, 0xd1a7, 0x2000 },
+ { 0x1a01, 0xd1a6, 0x0000 },
+ { 0x1a01, 0xd1a8, 0x0000 },
+ { 0x8c01, 0xd1ab, 0x2000 },
+ { 0x0c01, 0xd1aa, 0x0000 },
+ { 0x0c01, 0xd1ac, 0x0000 },
+ { 0x9a01, 0xd1bd, 0x5000 },
+ { 0x9a01, 0xd1b5, 0x4000 },
+ { 0x9a01, 0xd1b1, 0x3000 },
+ { 0x9a01, 0xd1af, 0x2000 },
+ { 0x1a01, 0xd1ae, 0x0000 },
+ { 0x1a01, 0xd1b0, 0x0000 },
+ { 0x9a01, 0xd1b3, 0x2000 },
+ { 0x1a01, 0xd1b2, 0x0000 },
+ { 0x1a01, 0xd1b4, 0x0000 },
+ { 0x9a01, 0xd1b9, 0x3000 },
+ { 0x9a01, 0xd1b7, 0x2000 },
+ { 0x1a01, 0xd1b6, 0x0000 },
+ { 0x1a01, 0xd1b8, 0x0000 },
+ { 0x9a01, 0xd1bb, 0x2000 },
+ { 0x1a01, 0xd1ba, 0x0000 },
+ { 0x1a01, 0xd1bc, 0x0000 },
+ { 0x9a01, 0xd1c5, 0x4000 },
+ { 0x9a01, 0xd1c1, 0x3000 },
+ { 0x9a01, 0xd1bf, 0x2000 },
+ { 0x1a01, 0xd1be, 0x0000 },
+ { 0x1a01, 0xd1c0, 0x0000 },
+ { 0x9a01, 0xd1c3, 0x2000 },
+ { 0x1a01, 0xd1c2, 0x0000 },
+ { 0x1a01, 0xd1c4, 0x0000 },
+ { 0x9a01, 0xd1c9, 0x3000 },
+ { 0x9a01, 0xd1c7, 0x2000 },
+ { 0x1a01, 0xd1c6, 0x0000 },
+ { 0x1a01, 0xd1c8, 0x0000 },
+ { 0x9a01, 0xd1cb, 0x2000 },
+ { 0x1a01, 0xd1ca, 0x0000 },
+ { 0x1a01, 0xd1cc, 0x0000 },
+ { 0x9a01, 0xd30f, 0x6000 },
+ { 0x9a01, 0xd1dd, 0x5000 },
+ { 0x9a01, 0xd1d5, 0x4000 },
+ { 0x9a01, 0xd1d1, 0x3000 },
+ { 0x9a01, 0xd1cf, 0x2000 },
+ { 0x1a01, 0xd1ce, 0x0000 },
+ { 0x1a01, 0xd1d0, 0x0000 },
+ { 0x9a01, 0xd1d3, 0x2000 },
+ { 0x1a01, 0xd1d2, 0x0000 },
+ { 0x1a01, 0xd1d4, 0x0000 },
+ { 0x9a01, 0xd1d9, 0x3000 },
+ { 0x9a01, 0xd1d7, 0x2000 },
+ { 0x1a01, 0xd1d6, 0x0000 },
+ { 0x1a01, 0xd1d8, 0x0000 },
+ { 0x9a01, 0xd1db, 0x2000 },
+ { 0x1a01, 0xd1da, 0x0000 },
+ { 0x1a01, 0xd1dc, 0x0000 },
+ { 0x9a01, 0xd307, 0x4000 },
+ { 0x9a01, 0xd303, 0x3000 },
+ { 0x9a01, 0xd301, 0x2000 },
+ { 0x1a01, 0xd300, 0x0000 },
+ { 0x1a01, 0xd302, 0x0000 },
+ { 0x9a01, 0xd305, 0x2000 },
+ { 0x1a01, 0xd304, 0x0000 },
+ { 0x1a01, 0xd306, 0x0000 },
+ { 0x9a01, 0xd30b, 0x3000 },
+ { 0x9a01, 0xd309, 0x2000 },
+ { 0x1a01, 0xd308, 0x0000 },
+ { 0x1a01, 0xd30a, 0x0000 },
+ { 0x9a01, 0xd30d, 0x2000 },
+ { 0x1a01, 0xd30c, 0x0000 },
+ { 0x1a01, 0xd30e, 0x0000 },
+ { 0x9a01, 0xd31f, 0x5000 },
+ { 0x9a01, 0xd317, 0x4000 },
+ { 0x9a01, 0xd313, 0x3000 },
+ { 0x9a01, 0xd311, 0x2000 },
+ { 0x1a01, 0xd310, 0x0000 },
+ { 0x1a01, 0xd312, 0x0000 },
+ { 0x9a01, 0xd315, 0x2000 },
+ { 0x1a01, 0xd314, 0x0000 },
+ { 0x1a01, 0xd316, 0x0000 },
+ { 0x9a01, 0xd31b, 0x3000 },
+ { 0x9a01, 0xd319, 0x2000 },
+ { 0x1a01, 0xd318, 0x0000 },
+ { 0x1a01, 0xd31a, 0x0000 },
+ { 0x9a01, 0xd31d, 0x2000 },
+ { 0x1a01, 0xd31c, 0x0000 },
+ { 0x1a01, 0xd31e, 0x0000 },
+ { 0x9a01, 0xd327, 0x4000 },
+ { 0x9a01, 0xd323, 0x3000 },
+ { 0x9a01, 0xd321, 0x2000 },
+ { 0x1a01, 0xd320, 0x0000 },
+ { 0x1a01, 0xd322, 0x0000 },
+ { 0x9a01, 0xd325, 0x2000 },
+ { 0x1a01, 0xd324, 0x0000 },
+ { 0x1a01, 0xd326, 0x0000 },
+ { 0x9a01, 0xd32b, 0x3000 },
+ { 0x9a01, 0xd329, 0x2000 },
+ { 0x1a01, 0xd328, 0x0000 },
+ { 0x1a01, 0xd32a, 0x0000 },
+ { 0x9a01, 0xd32d, 0x2000 },
+ { 0x1a01, 0xd32c, 0x0000 },
+ { 0x1a01, 0xd32e, 0x0000 },
+ { 0x8901, 0xd418, 0x7000 },
+ { 0x9a01, 0xd34f, 0x6000 },
+ { 0x9a01, 0xd33f, 0x5000 },
+ { 0x9a01, 0xd337, 0x4000 },
+ { 0x9a01, 0xd333, 0x3000 },
+ { 0x9a01, 0xd331, 0x2000 },
+ { 0x1a01, 0xd330, 0x0000 },
+ { 0x1a01, 0xd332, 0x0000 },
+ { 0x9a01, 0xd335, 0x2000 },
+ { 0x1a01, 0xd334, 0x0000 },
+ { 0x1a01, 0xd336, 0x0000 },
+ { 0x9a01, 0xd33b, 0x3000 },
+ { 0x9a01, 0xd339, 0x2000 },
+ { 0x1a01, 0xd338, 0x0000 },
+ { 0x1a01, 0xd33a, 0x0000 },
+ { 0x9a01, 0xd33d, 0x2000 },
+ { 0x1a01, 0xd33c, 0x0000 },
+ { 0x1a01, 0xd33e, 0x0000 },
+ { 0x9a01, 0xd347, 0x4000 },
+ { 0x9a01, 0xd343, 0x3000 },
+ { 0x9a01, 0xd341, 0x2000 },
+ { 0x1a01, 0xd340, 0x0000 },
+ { 0x1a01, 0xd342, 0x0000 },
+ { 0x9a01, 0xd345, 0x2000 },
+ { 0x1a01, 0xd344, 0x0000 },
+ { 0x1a01, 0xd346, 0x0000 },
+ { 0x9a01, 0xd34b, 0x3000 },
+ { 0x9a01, 0xd349, 0x2000 },
+ { 0x1a01, 0xd348, 0x0000 },
+ { 0x1a01, 0xd34a, 0x0000 },
+ { 0x9a01, 0xd34d, 0x2000 },
+ { 0x1a01, 0xd34c, 0x0000 },
+ { 0x1a01, 0xd34e, 0x0000 },
+ { 0x8901, 0xd408, 0x5000 },
+ { 0x8901, 0xd400, 0x4000 },
+ { 0x9a01, 0xd353, 0x3000 },
+ { 0x9a01, 0xd351, 0x2000 },
+ { 0x1a01, 0xd350, 0x0000 },
+ { 0x1a01, 0xd352, 0x0000 },
+ { 0x9a01, 0xd355, 0x2000 },
+ { 0x1a01, 0xd354, 0x0000 },
+ { 0x1a01, 0xd356, 0x0000 },
+ { 0x8901, 0xd404, 0x3000 },
+ { 0x8901, 0xd402, 0x2000 },
+ { 0x0901, 0xd401, 0x0000 },
+ { 0x0901, 0xd403, 0x0000 },
+ { 0x8901, 0xd406, 0x2000 },
+ { 0x0901, 0xd405, 0x0000 },
+ { 0x0901, 0xd407, 0x0000 },
+ { 0x8901, 0xd410, 0x4000 },
+ { 0x8901, 0xd40c, 0x3000 },
+ { 0x8901, 0xd40a, 0x2000 },
+ { 0x0901, 0xd409, 0x0000 },
+ { 0x0901, 0xd40b, 0x0000 },
+ { 0x8901, 0xd40e, 0x2000 },
+ { 0x0901, 0xd40d, 0x0000 },
+ { 0x0901, 0xd40f, 0x0000 },
+ { 0x8901, 0xd414, 0x3000 },
+ { 0x8901, 0xd412, 0x2000 },
+ { 0x0901, 0xd411, 0x0000 },
+ { 0x0901, 0xd413, 0x0000 },
+ { 0x8901, 0xd416, 0x2000 },
+ { 0x0901, 0xd415, 0x0000 },
+ { 0x0901, 0xd417, 0x0000 },
+ { 0x8901, 0xd438, 0x6000 },
+ { 0x8501, 0xd428, 0x5000 },
+ { 0x8501, 0xd420, 0x4000 },
+ { 0x8501, 0xd41c, 0x3000 },
+ { 0x8501, 0xd41a, 0x2000 },
+ { 0x0901, 0xd419, 0x0000 },
+ { 0x0501, 0xd41b, 0x0000 },
+ { 0x8501, 0xd41e, 0x2000 },
+ { 0x0501, 0xd41d, 0x0000 },
+ { 0x0501, 0xd41f, 0x0000 },
+ { 0x8501, 0xd424, 0x3000 },
+ { 0x8501, 0xd422, 0x2000 },
+ { 0x0501, 0xd421, 0x0000 },
+ { 0x0501, 0xd423, 0x0000 },
+ { 0x8501, 0xd426, 0x2000 },
+ { 0x0501, 0xd425, 0x0000 },
+ { 0x0501, 0xd427, 0x0000 },
+ { 0x8501, 0xd430, 0x4000 },
+ { 0x8501, 0xd42c, 0x3000 },
+ { 0x8501, 0xd42a, 0x2000 },
+ { 0x0501, 0xd429, 0x0000 },
+ { 0x0501, 0xd42b, 0x0000 },
+ { 0x8501, 0xd42e, 0x2000 },
+ { 0x0501, 0xd42d, 0x0000 },
+ { 0x0501, 0xd42f, 0x0000 },
+ { 0x8901, 0xd434, 0x3000 },
+ { 0x8501, 0xd432, 0x2000 },
+ { 0x0501, 0xd431, 0x0000 },
+ { 0x0501, 0xd433, 0x0000 },
+ { 0x8901, 0xd436, 0x2000 },
+ { 0x0901, 0xd435, 0x0000 },
+ { 0x0901, 0xd437, 0x0000 },
+ { 0x8901, 0xd448, 0x5000 },
+ { 0x8901, 0xd440, 0x4000 },
+ { 0x8901, 0xd43c, 0x3000 },
+ { 0x8901, 0xd43a, 0x2000 },
+ { 0x0901, 0xd439, 0x0000 },
+ { 0x0901, 0xd43b, 0x0000 },
+ { 0x8901, 0xd43e, 0x2000 },
+ { 0x0901, 0xd43d, 0x0000 },
+ { 0x0901, 0xd43f, 0x0000 },
+ { 0x8901, 0xd444, 0x3000 },
+ { 0x8901, 0xd442, 0x2000 },
+ { 0x0901, 0xd441, 0x0000 },
+ { 0x0901, 0xd443, 0x0000 },
+ { 0x8901, 0xd446, 0x2000 },
+ { 0x0901, 0xd445, 0x0000 },
+ { 0x0901, 0xd447, 0x0000 },
+ { 0x8501, 0xd450, 0x4000 },
+ { 0x8901, 0xd44c, 0x3000 },
+ { 0x8901, 0xd44a, 0x2000 },
+ { 0x0901, 0xd449, 0x0000 },
+ { 0x0901, 0xd44b, 0x0000 },
+ { 0x8501, 0xd44e, 0x2000 },
+ { 0x0901, 0xd44d, 0x0000 },
+ { 0x0501, 0xd44f, 0x0000 },
+ { 0x8501, 0xd454, 0x3000 },
+ { 0x8501, 0xd452, 0x2000 },
+ { 0x0501, 0xd451, 0x0000 },
+ { 0x0501, 0xd453, 0x0000 },
+ { 0x8501, 0xd457, 0x2000 },
+ { 0x0501, 0xd456, 0x0000 },
+ { 0x0501, 0xd458, 0x0000 },
+ { 0x8702, 0xf876, 0xb000 },
+ { 0x8901, 0xd670, 0xa000 },
+ { 0x8901, 0xd570, 0x9000 },
+ { 0x8901, 0xd4e4, 0x8000 },
+ { 0x8501, 0xd499, 0x7000 },
+ { 0x8901, 0xd479, 0x6000 },
+ { 0x8901, 0xd469, 0x5000 },
+ { 0x8501, 0xd461, 0x4000 },
+ { 0x8501, 0xd45d, 0x3000 },
+ { 0x8501, 0xd45b, 0x2000 },
+ { 0x0501, 0xd45a, 0x0000 },
+ { 0x0501, 0xd45c, 0x0000 },
+ { 0x8501, 0xd45f, 0x2000 },
+ { 0x0501, 0xd45e, 0x0000 },
+ { 0x0501, 0xd460, 0x0000 },
+ { 0x8501, 0xd465, 0x3000 },
+ { 0x8501, 0xd463, 0x2000 },
+ { 0x0501, 0xd462, 0x0000 },
+ { 0x0501, 0xd464, 0x0000 },
+ { 0x8501, 0xd467, 0x2000 },
+ { 0x0501, 0xd466, 0x0000 },
+ { 0x0901, 0xd468, 0x0000 },
+ { 0x8901, 0xd471, 0x4000 },
+ { 0x8901, 0xd46d, 0x3000 },
+ { 0x8901, 0xd46b, 0x2000 },
+ { 0x0901, 0xd46a, 0x0000 },
+ { 0x0901, 0xd46c, 0x0000 },
+ { 0x8901, 0xd46f, 0x2000 },
+ { 0x0901, 0xd46e, 0x0000 },
+ { 0x0901, 0xd470, 0x0000 },
+ { 0x8901, 0xd475, 0x3000 },
+ { 0x8901, 0xd473, 0x2000 },
+ { 0x0901, 0xd472, 0x0000 },
+ { 0x0901, 0xd474, 0x0000 },
+ { 0x8901, 0xd477, 0x2000 },
+ { 0x0901, 0xd476, 0x0000 },
+ { 0x0901, 0xd478, 0x0000 },
+ { 0x8501, 0xd489, 0x5000 },
+ { 0x8901, 0xd481, 0x4000 },
+ { 0x8901, 0xd47d, 0x3000 },
+ { 0x8901, 0xd47b, 0x2000 },
+ { 0x0901, 0xd47a, 0x0000 },
+ { 0x0901, 0xd47c, 0x0000 },
+ { 0x8901, 0xd47f, 0x2000 },
+ { 0x0901, 0xd47e, 0x0000 },
+ { 0x0901, 0xd480, 0x0000 },
+ { 0x8501, 0xd485, 0x3000 },
+ { 0x8501, 0xd483, 0x2000 },
+ { 0x0501, 0xd482, 0x0000 },
+ { 0x0501, 0xd484, 0x0000 },
+ { 0x8501, 0xd487, 0x2000 },
+ { 0x0501, 0xd486, 0x0000 },
+ { 0x0501, 0xd488, 0x0000 },
+ { 0x8501, 0xd491, 0x4000 },
+ { 0x8501, 0xd48d, 0x3000 },
+ { 0x8501, 0xd48b, 0x2000 },
+ { 0x0501, 0xd48a, 0x0000 },
+ { 0x0501, 0xd48c, 0x0000 },
+ { 0x8501, 0xd48f, 0x2000 },
+ { 0x0501, 0xd48e, 0x0000 },
+ { 0x0501, 0xd490, 0x0000 },
+ { 0x8501, 0xd495, 0x3000 },
+ { 0x8501, 0xd493, 0x2000 },
+ { 0x0501, 0xd492, 0x0000 },
+ { 0x0501, 0xd494, 0x0000 },
+ { 0x8501, 0xd497, 0x2000 },
+ { 0x0501, 0xd496, 0x0000 },
+ { 0x0501, 0xd498, 0x0000 },
+ { 0x8501, 0xd4c3, 0x6000 },
+ { 0x8901, 0xd4b1, 0x5000 },
+ { 0x8901, 0xd4a6, 0x4000 },
+ { 0x8901, 0xd49e, 0x3000 },
+ { 0x8501, 0xd49b, 0x2000 },
+ { 0x0501, 0xd49a, 0x0000 },
+ { 0x0901, 0xd49c, 0x0000 },
+ { 0x8901, 0xd4a2, 0x2000 },
+ { 0x0901, 0xd49f, 0x0000 },
+ { 0x0901, 0xd4a5, 0x0000 },
+ { 0x8901, 0xd4ac, 0x3000 },
+ { 0x8901, 0xd4aa, 0x2000 },
+ { 0x0901, 0xd4a9, 0x0000 },
+ { 0x0901, 0xd4ab, 0x0000 },
+ { 0x8901, 0xd4af, 0x2000 },
+ { 0x0901, 0xd4ae, 0x0000 },
+ { 0x0901, 0xd4b0, 0x0000 },
+ { 0x8501, 0xd4b9, 0x4000 },
+ { 0x8901, 0xd4b5, 0x3000 },
+ { 0x8901, 0xd4b3, 0x2000 },
+ { 0x0901, 0xd4b2, 0x0000 },
+ { 0x0901, 0xd4b4, 0x0000 },
+ { 0x8501, 0xd4b7, 0x2000 },
+ { 0x0501, 0xd4b6, 0x0000 },
+ { 0x0501, 0xd4b8, 0x0000 },
+ { 0x8501, 0xd4bf, 0x3000 },
+ { 0x8501, 0xd4bd, 0x2000 },
+ { 0x0501, 0xd4bb, 0x0000 },
+ { 0x0501, 0xd4be, 0x0000 },
+ { 0x8501, 0xd4c1, 0x2000 },
+ { 0x0501, 0xd4c0, 0x0000 },
+ { 0x0501, 0xd4c2, 0x0000 },
+ { 0x8901, 0xd4d4, 0x5000 },
+ { 0x8501, 0xd4cc, 0x4000 },
+ { 0x8501, 0xd4c8, 0x3000 },
+ { 0x8501, 0xd4c6, 0x2000 },
+ { 0x0501, 0xd4c5, 0x0000 },
+ { 0x0501, 0xd4c7, 0x0000 },
+ { 0x8501, 0xd4ca, 0x2000 },
+ { 0x0501, 0xd4c9, 0x0000 },
+ { 0x0501, 0xd4cb, 0x0000 },
+ { 0x8901, 0xd4d0, 0x3000 },
+ { 0x8501, 0xd4ce, 0x2000 },
+ { 0x0501, 0xd4cd, 0x0000 },
+ { 0x0501, 0xd4cf, 0x0000 },
+ { 0x8901, 0xd4d2, 0x2000 },
+ { 0x0901, 0xd4d1, 0x0000 },
+ { 0x0901, 0xd4d3, 0x0000 },
+ { 0x8901, 0xd4dc, 0x4000 },
+ { 0x8901, 0xd4d8, 0x3000 },
+ { 0x8901, 0xd4d6, 0x2000 },
+ { 0x0901, 0xd4d5, 0x0000 },
+ { 0x0901, 0xd4d7, 0x0000 },
+ { 0x8901, 0xd4da, 0x2000 },
+ { 0x0901, 0xd4d9, 0x0000 },
+ { 0x0901, 0xd4db, 0x0000 },
+ { 0x8901, 0xd4e0, 0x3000 },
+ { 0x8901, 0xd4de, 0x2000 },
+ { 0x0901, 0xd4dd, 0x0000 },
+ { 0x0901, 0xd4df, 0x0000 },
+ { 0x8901, 0xd4e2, 0x2000 },
+ { 0x0901, 0xd4e1, 0x0000 },
+ { 0x0901, 0xd4e3, 0x0000 },
+ { 0x8501, 0xd529, 0x7000 },
+ { 0x8901, 0xd504, 0x6000 },
+ { 0x8501, 0xd4f4, 0x5000 },
+ { 0x8501, 0xd4ec, 0x4000 },
+ { 0x8901, 0xd4e8, 0x3000 },
+ { 0x8901, 0xd4e6, 0x2000 },
+ { 0x0901, 0xd4e5, 0x0000 },
+ { 0x0901, 0xd4e7, 0x0000 },
+ { 0x8501, 0xd4ea, 0x2000 },
+ { 0x0901, 0xd4e9, 0x0000 },
+ { 0x0501, 0xd4eb, 0x0000 },
+ { 0x8501, 0xd4f0, 0x3000 },
+ { 0x8501, 0xd4ee, 0x2000 },
+ { 0x0501, 0xd4ed, 0x0000 },
+ { 0x0501, 0xd4ef, 0x0000 },
+ { 0x8501, 0xd4f2, 0x2000 },
+ { 0x0501, 0xd4f1, 0x0000 },
+ { 0x0501, 0xd4f3, 0x0000 },
+ { 0x8501, 0xd4fc, 0x4000 },
+ { 0x8501, 0xd4f8, 0x3000 },
+ { 0x8501, 0xd4f6, 0x2000 },
+ { 0x0501, 0xd4f5, 0x0000 },
+ { 0x0501, 0xd4f7, 0x0000 },
+ { 0x8501, 0xd4fa, 0x2000 },
+ { 0x0501, 0xd4f9, 0x0000 },
+ { 0x0501, 0xd4fb, 0x0000 },
+ { 0x8501, 0xd500, 0x3000 },
+ { 0x8501, 0xd4fe, 0x2000 },
+ { 0x0501, 0xd4fd, 0x0000 },
+ { 0x0501, 0xd4ff, 0x0000 },
+ { 0x8501, 0xd502, 0x2000 },
+ { 0x0501, 0xd501, 0x0000 },
+ { 0x0501, 0xd503, 0x0000 },
+ { 0x8901, 0xd518, 0x5000 },
+ { 0x8901, 0xd50f, 0x4000 },
+ { 0x8901, 0xd509, 0x3000 },
+ { 0x8901, 0xd507, 0x2000 },
+ { 0x0901, 0xd505, 0x0000 },
+ { 0x0901, 0xd508, 0x0000 },
+ { 0x8901, 0xd50d, 0x2000 },
+ { 0x0901, 0xd50a, 0x0000 },
+ { 0x0901, 0xd50e, 0x0000 },
+ { 0x8901, 0xd513, 0x3000 },
+ { 0x8901, 0xd511, 0x2000 },
+ { 0x0901, 0xd510, 0x0000 },
+ { 0x0901, 0xd512, 0x0000 },
+ { 0x8901, 0xd516, 0x2000 },
+ { 0x0901, 0xd514, 0x0000 },
+ { 0x0901, 0xd517, 0x0000 },
+ { 0x8501, 0xd521, 0x4000 },
+ { 0x8901, 0xd51c, 0x3000 },
+ { 0x8901, 0xd51a, 0x2000 },
+ { 0x0901, 0xd519, 0x0000 },
+ { 0x0901, 0xd51b, 0x0000 },
+ { 0x8501, 0xd51f, 0x2000 },
+ { 0x0501, 0xd51e, 0x0000 },
+ { 0x0501, 0xd520, 0x0000 },
+ { 0x8501, 0xd525, 0x3000 },
+ { 0x8501, 0xd523, 0x2000 },
+ { 0x0501, 0xd522, 0x0000 },
+ { 0x0501, 0xd524, 0x0000 },
+ { 0x8501, 0xd527, 0x2000 },
+ { 0x0501, 0xd526, 0x0000 },
+ { 0x0501, 0xd528, 0x0000 },
+ { 0x8901, 0xd54f, 0x6000 },
+ { 0x8901, 0xd539, 0x5000 },
+ { 0x8501, 0xd531, 0x4000 },
+ { 0x8501, 0xd52d, 0x3000 },
+ { 0x8501, 0xd52b, 0x2000 },
+ { 0x0501, 0xd52a, 0x0000 },
+ { 0x0501, 0xd52c, 0x0000 },
+ { 0x8501, 0xd52f, 0x2000 },
+ { 0x0501, 0xd52e, 0x0000 },
+ { 0x0501, 0xd530, 0x0000 },
+ { 0x8501, 0xd535, 0x3000 },
+ { 0x8501, 0xd533, 0x2000 },
+ { 0x0501, 0xd532, 0x0000 },
+ { 0x0501, 0xd534, 0x0000 },
+ { 0x8501, 0xd537, 0x2000 },
+ { 0x0501, 0xd536, 0x0000 },
+ { 0x0901, 0xd538, 0x0000 },
+ { 0x8901, 0xd543, 0x4000 },
+ { 0x8901, 0xd53e, 0x3000 },
+ { 0x8901, 0xd53c, 0x2000 },
+ { 0x0901, 0xd53b, 0x0000 },
+ { 0x0901, 0xd53d, 0x0000 },
+ { 0x8901, 0xd541, 0x2000 },
+ { 0x0901, 0xd540, 0x0000 },
+ { 0x0901, 0xd542, 0x0000 },
+ { 0x8901, 0xd54b, 0x3000 },
+ { 0x8901, 0xd546, 0x2000 },
+ { 0x0901, 0xd544, 0x0000 },
+ { 0x0901, 0xd54a, 0x0000 },
+ { 0x8901, 0xd54d, 0x2000 },
+ { 0x0901, 0xd54c, 0x0000 },
+ { 0x0901, 0xd54e, 0x0000 },
+ { 0x8501, 0xd560, 0x5000 },
+ { 0x8501, 0xd558, 0x4000 },
+ { 0x8501, 0xd554, 0x3000 },
+ { 0x8501, 0xd552, 0x2000 },
+ { 0x0901, 0xd550, 0x0000 },
+ { 0x0501, 0xd553, 0x0000 },
+ { 0x8501, 0xd556, 0x2000 },
+ { 0x0501, 0xd555, 0x0000 },
+ { 0x0501, 0xd557, 0x0000 },
+ { 0x8501, 0xd55c, 0x3000 },
+ { 0x8501, 0xd55a, 0x2000 },
+ { 0x0501, 0xd559, 0x0000 },
+ { 0x0501, 0xd55b, 0x0000 },
+ { 0x8501, 0xd55e, 0x2000 },
+ { 0x0501, 0xd55d, 0x0000 },
+ { 0x0501, 0xd55f, 0x0000 },
+ { 0x8501, 0xd568, 0x4000 },
+ { 0x8501, 0xd564, 0x3000 },
+ { 0x8501, 0xd562, 0x2000 },
+ { 0x0501, 0xd561, 0x0000 },
+ { 0x0501, 0xd563, 0x0000 },
+ { 0x8501, 0xd566, 0x2000 },
+ { 0x0501, 0xd565, 0x0000 },
+ { 0x0501, 0xd567, 0x0000 },
+ { 0x8901, 0xd56c, 0x3000 },
+ { 0x8501, 0xd56a, 0x2000 },
+ { 0x0501, 0xd569, 0x0000 },
+ { 0x0501, 0xd56b, 0x0000 },
+ { 0x8901, 0xd56e, 0x2000 },
+ { 0x0901, 0xd56d, 0x0000 },
+ { 0x0901, 0xd56f, 0x0000 },
+ { 0x8501, 0xd5f0, 0x8000 },
+ { 0x8901, 0xd5b0, 0x7000 },
+ { 0x8501, 0xd590, 0x6000 },
+ { 0x8901, 0xd580, 0x5000 },
+ { 0x8901, 0xd578, 0x4000 },
+ { 0x8901, 0xd574, 0x3000 },
+ { 0x8901, 0xd572, 0x2000 },
+ { 0x0901, 0xd571, 0x0000 },
+ { 0x0901, 0xd573, 0x0000 },
+ { 0x8901, 0xd576, 0x2000 },
+ { 0x0901, 0xd575, 0x0000 },
+ { 0x0901, 0xd577, 0x0000 },
+ { 0x8901, 0xd57c, 0x3000 },
+ { 0x8901, 0xd57a, 0x2000 },
+ { 0x0901, 0xd579, 0x0000 },
+ { 0x0901, 0xd57b, 0x0000 },
+ { 0x8901, 0xd57e, 0x2000 },
+ { 0x0901, 0xd57d, 0x0000 },
+ { 0x0901, 0xd57f, 0x0000 },
+ { 0x8501, 0xd588, 0x4000 },
+ { 0x8901, 0xd584, 0x3000 },
+ { 0x8901, 0xd582, 0x2000 },
+ { 0x0901, 0xd581, 0x0000 },
+ { 0x0901, 0xd583, 0x0000 },
+ { 0x8501, 0xd586, 0x2000 },
+ { 0x0901, 0xd585, 0x0000 },
+ { 0x0501, 0xd587, 0x0000 },
+ { 0x8501, 0xd58c, 0x3000 },
+ { 0x8501, 0xd58a, 0x2000 },
+ { 0x0501, 0xd589, 0x0000 },
+ { 0x0501, 0xd58b, 0x0000 },
+ { 0x8501, 0xd58e, 0x2000 },
+ { 0x0501, 0xd58d, 0x0000 },
+ { 0x0501, 0xd58f, 0x0000 },
+ { 0x8901, 0xd5a0, 0x5000 },
+ { 0x8501, 0xd598, 0x4000 },
+ { 0x8501, 0xd594, 0x3000 },
+ { 0x8501, 0xd592, 0x2000 },
+ { 0x0501, 0xd591, 0x0000 },
+ { 0x0501, 0xd593, 0x0000 },
+ { 0x8501, 0xd596, 0x2000 },
+ { 0x0501, 0xd595, 0x0000 },
+ { 0x0501, 0xd597, 0x0000 },
+ { 0x8501, 0xd59c, 0x3000 },
+ { 0x8501, 0xd59a, 0x2000 },
+ { 0x0501, 0xd599, 0x0000 },
+ { 0x0501, 0xd59b, 0x0000 },
+ { 0x8501, 0xd59e, 0x2000 },
+ { 0x0501, 0xd59d, 0x0000 },
+ { 0x0501, 0xd59f, 0x0000 },
+ { 0x8901, 0xd5a8, 0x4000 },
+ { 0x8901, 0xd5a4, 0x3000 },
+ { 0x8901, 0xd5a2, 0x2000 },
+ { 0x0901, 0xd5a1, 0x0000 },
+ { 0x0901, 0xd5a3, 0x0000 },
+ { 0x8901, 0xd5a6, 0x2000 },
+ { 0x0901, 0xd5a5, 0x0000 },
+ { 0x0901, 0xd5a7, 0x0000 },
+ { 0x8901, 0xd5ac, 0x3000 },
+ { 0x8901, 0xd5aa, 0x2000 },
+ { 0x0901, 0xd5a9, 0x0000 },
+ { 0x0901, 0xd5ab, 0x0000 },
+ { 0x8901, 0xd5ae, 0x2000 },
+ { 0x0901, 0xd5ad, 0x0000 },
+ { 0x0901, 0xd5af, 0x0000 },
+ { 0x8501, 0xd5d0, 0x6000 },
+ { 0x8501, 0xd5c0, 0x5000 },
+ { 0x8901, 0xd5b8, 0x4000 },
+ { 0x8901, 0xd5b4, 0x3000 },
+ { 0x8901, 0xd5b2, 0x2000 },
+ { 0x0901, 0xd5b1, 0x0000 },
+ { 0x0901, 0xd5b3, 0x0000 },
+ { 0x8901, 0xd5b6, 0x2000 },
+ { 0x0901, 0xd5b5, 0x0000 },
+ { 0x0901, 0xd5b7, 0x0000 },
+ { 0x8501, 0xd5bc, 0x3000 },
+ { 0x8501, 0xd5ba, 0x2000 },
+ { 0x0901, 0xd5b9, 0x0000 },
+ { 0x0501, 0xd5bb, 0x0000 },
+ { 0x8501, 0xd5be, 0x2000 },
+ { 0x0501, 0xd5bd, 0x0000 },
+ { 0x0501, 0xd5bf, 0x0000 },
+ { 0x8501, 0xd5c8, 0x4000 },
+ { 0x8501, 0xd5c4, 0x3000 },
+ { 0x8501, 0xd5c2, 0x2000 },
+ { 0x0501, 0xd5c1, 0x0000 },
+ { 0x0501, 0xd5c3, 0x0000 },
+ { 0x8501, 0xd5c6, 0x2000 },
+ { 0x0501, 0xd5c5, 0x0000 },
+ { 0x0501, 0xd5c7, 0x0000 },
+ { 0x8501, 0xd5cc, 0x3000 },
+ { 0x8501, 0xd5ca, 0x2000 },
+ { 0x0501, 0xd5c9, 0x0000 },
+ { 0x0501, 0xd5cb, 0x0000 },
+ { 0x8501, 0xd5ce, 0x2000 },
+ { 0x0501, 0xd5cd, 0x0000 },
+ { 0x0501, 0xd5cf, 0x0000 },
+ { 0x8901, 0xd5e0, 0x5000 },
+ { 0x8901, 0xd5d8, 0x4000 },
+ { 0x8901, 0xd5d4, 0x3000 },
+ { 0x8501, 0xd5d2, 0x2000 },
+ { 0x0501, 0xd5d1, 0x0000 },
+ { 0x0501, 0xd5d3, 0x0000 },
+ { 0x8901, 0xd5d6, 0x2000 },
+ { 0x0901, 0xd5d5, 0x0000 },
+ { 0x0901, 0xd5d7, 0x0000 },
+ { 0x8901, 0xd5dc, 0x3000 },
+ { 0x8901, 0xd5da, 0x2000 },
+ { 0x0901, 0xd5d9, 0x0000 },
+ { 0x0901, 0xd5db, 0x0000 },
+ { 0x8901, 0xd5de, 0x2000 },
+ { 0x0901, 0xd5dd, 0x0000 },
+ { 0x0901, 0xd5df, 0x0000 },
+ { 0x8901, 0xd5e8, 0x4000 },
+ { 0x8901, 0xd5e4, 0x3000 },
+ { 0x8901, 0xd5e2, 0x2000 },
+ { 0x0901, 0xd5e1, 0x0000 },
+ { 0x0901, 0xd5e3, 0x0000 },
+ { 0x8901, 0xd5e6, 0x2000 },
+ { 0x0901, 0xd5e5, 0x0000 },
+ { 0x0901, 0xd5e7, 0x0000 },
+ { 0x8901, 0xd5ec, 0x3000 },
+ { 0x8901, 0xd5ea, 0x2000 },
+ { 0x0901, 0xd5e9, 0x0000 },
+ { 0x0901, 0xd5eb, 0x0000 },
+ { 0x8501, 0xd5ee, 0x2000 },
+ { 0x0901, 0xd5ed, 0x0000 },
+ { 0x0501, 0xd5ef, 0x0000 },
+ { 0x8501, 0xd630, 0x7000 },
+ { 0x8901, 0xd610, 0x6000 },
+ { 0x8501, 0xd600, 0x5000 },
+ { 0x8501, 0xd5f8, 0x4000 },
+ { 0x8501, 0xd5f4, 0x3000 },
+ { 0x8501, 0xd5f2, 0x2000 },
+ { 0x0501, 0xd5f1, 0x0000 },
+ { 0x0501, 0xd5f3, 0x0000 },
+ { 0x8501, 0xd5f6, 0x2000 },
+ { 0x0501, 0xd5f5, 0x0000 },
+ { 0x0501, 0xd5f7, 0x0000 },
+ { 0x8501, 0xd5fc, 0x3000 },
+ { 0x8501, 0xd5fa, 0x2000 },
+ { 0x0501, 0xd5f9, 0x0000 },
+ { 0x0501, 0xd5fb, 0x0000 },
+ { 0x8501, 0xd5fe, 0x2000 },
+ { 0x0501, 0xd5fd, 0x0000 },
+ { 0x0501, 0xd5ff, 0x0000 },
+ { 0x8901, 0xd608, 0x4000 },
+ { 0x8501, 0xd604, 0x3000 },
+ { 0x8501, 0xd602, 0x2000 },
+ { 0x0501, 0xd601, 0x0000 },
+ { 0x0501, 0xd603, 0x0000 },
+ { 0x8501, 0xd606, 0x2000 },
+ { 0x0501, 0xd605, 0x0000 },
+ { 0x0501, 0xd607, 0x0000 },
+ { 0x8901, 0xd60c, 0x3000 },
+ { 0x8901, 0xd60a, 0x2000 },
+ { 0x0901, 0xd609, 0x0000 },
+ { 0x0901, 0xd60b, 0x0000 },
+ { 0x8901, 0xd60e, 0x2000 },
+ { 0x0901, 0xd60d, 0x0000 },
+ { 0x0901, 0xd60f, 0x0000 },
+ { 0x8901, 0xd620, 0x5000 },
+ { 0x8901, 0xd618, 0x4000 },
+ { 0x8901, 0xd614, 0x3000 },
+ { 0x8901, 0xd612, 0x2000 },
+ { 0x0901, 0xd611, 0x0000 },
+ { 0x0901, 0xd613, 0x0000 },
+ { 0x8901, 0xd616, 0x2000 },
+ { 0x0901, 0xd615, 0x0000 },
+ { 0x0901, 0xd617, 0x0000 },
+ { 0x8901, 0xd61c, 0x3000 },
+ { 0x8901, 0xd61a, 0x2000 },
+ { 0x0901, 0xd619, 0x0000 },
+ { 0x0901, 0xd61b, 0x0000 },
+ { 0x8901, 0xd61e, 0x2000 },
+ { 0x0901, 0xd61d, 0x0000 },
+ { 0x0901, 0xd61f, 0x0000 },
+ { 0x8501, 0xd628, 0x4000 },
+ { 0x8501, 0xd624, 0x3000 },
+ { 0x8501, 0xd622, 0x2000 },
+ { 0x0901, 0xd621, 0x0000 },
+ { 0x0501, 0xd623, 0x0000 },
+ { 0x8501, 0xd626, 0x2000 },
+ { 0x0501, 0xd625, 0x0000 },
+ { 0x0501, 0xd627, 0x0000 },
+ { 0x8501, 0xd62c, 0x3000 },
+ { 0x8501, 0xd62a, 0x2000 },
+ { 0x0501, 0xd629, 0x0000 },
+ { 0x0501, 0xd62b, 0x0000 },
+ { 0x8501, 0xd62e, 0x2000 },
+ { 0x0501, 0xd62d, 0x0000 },
+ { 0x0501, 0xd62f, 0x0000 },
+ { 0x8901, 0xd650, 0x6000 },
+ { 0x8901, 0xd640, 0x5000 },
+ { 0x8501, 0xd638, 0x4000 },
+ { 0x8501, 0xd634, 0x3000 },
+ { 0x8501, 0xd632, 0x2000 },
+ { 0x0501, 0xd631, 0x0000 },
+ { 0x0501, 0xd633, 0x0000 },
+ { 0x8501, 0xd636, 0x2000 },
+ { 0x0501, 0xd635, 0x0000 },
+ { 0x0501, 0xd637, 0x0000 },
+ { 0x8901, 0xd63c, 0x3000 },
+ { 0x8501, 0xd63a, 0x2000 },
+ { 0x0501, 0xd639, 0x0000 },
+ { 0x0501, 0xd63b, 0x0000 },
+ { 0x8901, 0xd63e, 0x2000 },
+ { 0x0901, 0xd63d, 0x0000 },
+ { 0x0901, 0xd63f, 0x0000 },
+ { 0x8901, 0xd648, 0x4000 },
+ { 0x8901, 0xd644, 0x3000 },
+ { 0x8901, 0xd642, 0x2000 },
+ { 0x0901, 0xd641, 0x0000 },
+ { 0x0901, 0xd643, 0x0000 },
+ { 0x8901, 0xd646, 0x2000 },
+ { 0x0901, 0xd645, 0x0000 },
+ { 0x0901, 0xd647, 0x0000 },
+ { 0x8901, 0xd64c, 0x3000 },
+ { 0x8901, 0xd64a, 0x2000 },
+ { 0x0901, 0xd649, 0x0000 },
+ { 0x0901, 0xd64b, 0x0000 },
+ { 0x8901, 0xd64e, 0x2000 },
+ { 0x0901, 0xd64d, 0x0000 },
+ { 0x0901, 0xd64f, 0x0000 },
+ { 0x8501, 0xd660, 0x5000 },
+ { 0x8501, 0xd658, 0x4000 },
+ { 0x8901, 0xd654, 0x3000 },
+ { 0x8901, 0xd652, 0x2000 },
+ { 0x0901, 0xd651, 0x0000 },
+ { 0x0901, 0xd653, 0x0000 },
+ { 0x8501, 0xd656, 0x2000 },
+ { 0x0901, 0xd655, 0x0000 },
+ { 0x0501, 0xd657, 0x0000 },
+ { 0x8501, 0xd65c, 0x3000 },
+ { 0x8501, 0xd65a, 0x2000 },
+ { 0x0501, 0xd659, 0x0000 },
+ { 0x0501, 0xd65b, 0x0000 },
+ { 0x8501, 0xd65e, 0x2000 },
+ { 0x0501, 0xd65d, 0x0000 },
+ { 0x0501, 0xd65f, 0x0000 },
+ { 0x8501, 0xd668, 0x4000 },
+ { 0x8501, 0xd664, 0x3000 },
+ { 0x8501, 0xd662, 0x2000 },
+ { 0x0501, 0xd661, 0x0000 },
+ { 0x0501, 0xd663, 0x0000 },
+ { 0x8501, 0xd666, 0x2000 },
+ { 0x0501, 0xd665, 0x0000 },
+ { 0x0501, 0xd667, 0x0000 },
+ { 0x8501, 0xd66c, 0x3000 },
+ { 0x8501, 0xd66a, 0x2000 },
+ { 0x0501, 0xd669, 0x0000 },
+ { 0x0501, 0xd66b, 0x0000 },
+ { 0x8501, 0xd66e, 0x2000 },
+ { 0x0501, 0xd66d, 0x0000 },
+ { 0x0501, 0xd66f, 0x0000 },
+ { 0x8501, 0xd774, 0x9000 },
+ { 0x8901, 0xd6f4, 0x8000 },
+ { 0x8901, 0xd6b4, 0x7000 },
+ { 0x8501, 0xd690, 0x6000 },
+ { 0x8901, 0xd680, 0x5000 },
+ { 0x8901, 0xd678, 0x4000 },
+ { 0x8901, 0xd674, 0x3000 },
+ { 0x8901, 0xd672, 0x2000 },
+ { 0x0901, 0xd671, 0x0000 },
+ { 0x0901, 0xd673, 0x0000 },
+ { 0x8901, 0xd676, 0x2000 },
+ { 0x0901, 0xd675, 0x0000 },
+ { 0x0901, 0xd677, 0x0000 },
+ { 0x8901, 0xd67c, 0x3000 },
+ { 0x8901, 0xd67a, 0x2000 },
+ { 0x0901, 0xd679, 0x0000 },
+ { 0x0901, 0xd67b, 0x0000 },
+ { 0x8901, 0xd67e, 0x2000 },
+ { 0x0901, 0xd67d, 0x0000 },
+ { 0x0901, 0xd67f, 0x0000 },
+ { 0x8901, 0xd688, 0x4000 },
+ { 0x8901, 0xd684, 0x3000 },
+ { 0x8901, 0xd682, 0x2000 },
+ { 0x0901, 0xd681, 0x0000 },
+ { 0x0901, 0xd683, 0x0000 },
+ { 0x8901, 0xd686, 0x2000 },
+ { 0x0901, 0xd685, 0x0000 },
+ { 0x0901, 0xd687, 0x0000 },
+ { 0x8501, 0xd68c, 0x3000 },
+ { 0x8501, 0xd68a, 0x2000 },
+ { 0x0901, 0xd689, 0x0000 },
+ { 0x0501, 0xd68b, 0x0000 },
+ { 0x8501, 0xd68e, 0x2000 },
+ { 0x0501, 0xd68d, 0x0000 },
+ { 0x0501, 0xd68f, 0x0000 },
+ { 0x8501, 0xd6a0, 0x5000 },
+ { 0x8501, 0xd698, 0x4000 },
+ { 0x8501, 0xd694, 0x3000 },
+ { 0x8501, 0xd692, 0x2000 },
+ { 0x0501, 0xd691, 0x0000 },
+ { 0x0501, 0xd693, 0x0000 },
+ { 0x8501, 0xd696, 0x2000 },
+ { 0x0501, 0xd695, 0x0000 },
+ { 0x0501, 0xd697, 0x0000 },
+ { 0x8501, 0xd69c, 0x3000 },
+ { 0x8501, 0xd69a, 0x2000 },
+ { 0x0501, 0xd699, 0x0000 },
+ { 0x0501, 0xd69b, 0x0000 },
+ { 0x8501, 0xd69e, 0x2000 },
+ { 0x0501, 0xd69d, 0x0000 },
+ { 0x0501, 0xd69f, 0x0000 },
+ { 0x8901, 0xd6ac, 0x4000 },
+ { 0x8901, 0xd6a8, 0x3000 },
+ { 0x8501, 0xd6a2, 0x2000 },
+ { 0x0501, 0xd6a1, 0x0000 },
+ { 0x0501, 0xd6a3, 0x0000 },
+ { 0x8901, 0xd6aa, 0x2000 },
+ { 0x0901, 0xd6a9, 0x0000 },
+ { 0x0901, 0xd6ab, 0x0000 },
+ { 0x8901, 0xd6b0, 0x3000 },
+ { 0x8901, 0xd6ae, 0x2000 },
+ { 0x0901, 0xd6ad, 0x0000 },
+ { 0x0901, 0xd6af, 0x0000 },
+ { 0x8901, 0xd6b2, 0x2000 },
+ { 0x0901, 0xd6b1, 0x0000 },
+ { 0x0901, 0xd6b3, 0x0000 },
+ { 0x8501, 0xd6d4, 0x6000 },
+ { 0x8501, 0xd6c4, 0x5000 },
+ { 0x8901, 0xd6bc, 0x4000 },
+ { 0x8901, 0xd6b8, 0x3000 },
+ { 0x8901, 0xd6b6, 0x2000 },
+ { 0x0901, 0xd6b5, 0x0000 },
+ { 0x0901, 0xd6b7, 0x0000 },
+ { 0x8901, 0xd6ba, 0x2000 },
+ { 0x0901, 0xd6b9, 0x0000 },
+ { 0x0901, 0xd6bb, 0x0000 },
+ { 0x8901, 0xd6c0, 0x3000 },
+ { 0x8901, 0xd6be, 0x2000 },
+ { 0x0901, 0xd6bd, 0x0000 },
+ { 0x0901, 0xd6bf, 0x0000 },
+ { 0x8501, 0xd6c2, 0x2000 },
+ { 0x1901, 0xd6c1, 0x0000 },
+ { 0x0501, 0xd6c3, 0x0000 },
+ { 0x8501, 0xd6cc, 0x4000 },
+ { 0x8501, 0xd6c8, 0x3000 },
+ { 0x8501, 0xd6c6, 0x2000 },
+ { 0x0501, 0xd6c5, 0x0000 },
+ { 0x0501, 0xd6c7, 0x0000 },
+ { 0x8501, 0xd6ca, 0x2000 },
+ { 0x0501, 0xd6c9, 0x0000 },
+ { 0x0501, 0xd6cb, 0x0000 },
+ { 0x8501, 0xd6d0, 0x3000 },
+ { 0x8501, 0xd6ce, 0x2000 },
+ { 0x0501, 0xd6cd, 0x0000 },
+ { 0x0501, 0xd6cf, 0x0000 },
+ { 0x8501, 0xd6d2, 0x2000 },
+ { 0x0501, 0xd6d1, 0x0000 },
+ { 0x0501, 0xd6d3, 0x0000 },
+ { 0x8901, 0xd6e4, 0x5000 },
+ { 0x8501, 0xd6dc, 0x4000 },
+ { 0x8501, 0xd6d8, 0x3000 },
+ { 0x8501, 0xd6d6, 0x2000 },
+ { 0x0501, 0xd6d5, 0x0000 },
+ { 0x0501, 0xd6d7, 0x0000 },
+ { 0x8501, 0xd6da, 0x2000 },
+ { 0x0501, 0xd6d9, 0x0000 },
+ { 0x1901, 0xd6db, 0x0000 },
+ { 0x8501, 0xd6e0, 0x3000 },
+ { 0x8501, 0xd6de, 0x2000 },
+ { 0x0501, 0xd6dd, 0x0000 },
+ { 0x0501, 0xd6df, 0x0000 },
+ { 0x8901, 0xd6e2, 0x2000 },
+ { 0x0501, 0xd6e1, 0x0000 },
+ { 0x0901, 0xd6e3, 0x0000 },
+ { 0x8901, 0xd6ec, 0x4000 },
+ { 0x8901, 0xd6e8, 0x3000 },
+ { 0x8901, 0xd6e6, 0x2000 },
+ { 0x0901, 0xd6e5, 0x0000 },
+ { 0x0901, 0xd6e7, 0x0000 },
+ { 0x8901, 0xd6ea, 0x2000 },
+ { 0x0901, 0xd6e9, 0x0000 },
+ { 0x0901, 0xd6eb, 0x0000 },
+ { 0x8901, 0xd6f0, 0x3000 },
+ { 0x8901, 0xd6ee, 0x2000 },
+ { 0x0901, 0xd6ed, 0x0000 },
+ { 0x0901, 0xd6ef, 0x0000 },
+ { 0x8901, 0xd6f2, 0x2000 },
+ { 0x0901, 0xd6f1, 0x0000 },
+ { 0x0901, 0xd6f3, 0x0000 },
+ { 0x8901, 0xd734, 0x7000 },
+ { 0x8501, 0xd714, 0x6000 },
+ { 0x8501, 0xd704, 0x5000 },
+ { 0x8501, 0xd6fc, 0x4000 },
+ { 0x8901, 0xd6f8, 0x3000 },
+ { 0x8901, 0xd6f6, 0x2000 },
+ { 0x0901, 0xd6f5, 0x0000 },
+ { 0x0901, 0xd6f7, 0x0000 },
+ { 0x8901, 0xd6fa, 0x2000 },
+ { 0x0901, 0xd6f9, 0x0000 },
+ { 0x1901, 0xd6fb, 0x0000 },
+ { 0x8501, 0xd700, 0x3000 },
+ { 0x8501, 0xd6fe, 0x2000 },
+ { 0x0501, 0xd6fd, 0x0000 },
+ { 0x0501, 0xd6ff, 0x0000 },
+ { 0x8501, 0xd702, 0x2000 },
+ { 0x0501, 0xd701, 0x0000 },
+ { 0x0501, 0xd703, 0x0000 },
+ { 0x8501, 0xd70c, 0x4000 },
+ { 0x8501, 0xd708, 0x3000 },
+ { 0x8501, 0xd706, 0x2000 },
+ { 0x0501, 0xd705, 0x0000 },
+ { 0x0501, 0xd707, 0x0000 },
+ { 0x8501, 0xd70a, 0x2000 },
+ { 0x0501, 0xd709, 0x0000 },
+ { 0x0501, 0xd70b, 0x0000 },
+ { 0x8501, 0xd710, 0x3000 },
+ { 0x8501, 0xd70e, 0x2000 },
+ { 0x0501, 0xd70d, 0x0000 },
+ { 0x0501, 0xd70f, 0x0000 },
+ { 0x8501, 0xd712, 0x2000 },
+ { 0x0501, 0xd711, 0x0000 },
+ { 0x0501, 0xd713, 0x0000 },
+ { 0x8901, 0xd724, 0x5000 },
+ { 0x8901, 0xd71c, 0x4000 },
+ { 0x8501, 0xd718, 0x3000 },
+ { 0x8501, 0xd716, 0x2000 },
+ { 0x1901, 0xd715, 0x0000 },
+ { 0x0501, 0xd717, 0x0000 },
+ { 0x8501, 0xd71a, 0x2000 },
+ { 0x0501, 0xd719, 0x0000 },
+ { 0x0501, 0xd71b, 0x0000 },
+ { 0x8901, 0xd720, 0x3000 },
+ { 0x8901, 0xd71e, 0x2000 },
+ { 0x0901, 0xd71d, 0x0000 },
+ { 0x0901, 0xd71f, 0x0000 },
+ { 0x8901, 0xd722, 0x2000 },
+ { 0x0901, 0xd721, 0x0000 },
+ { 0x0901, 0xd723, 0x0000 },
+ { 0x8901, 0xd72c, 0x4000 },
+ { 0x8901, 0xd728, 0x3000 },
+ { 0x8901, 0xd726, 0x2000 },
+ { 0x0901, 0xd725, 0x0000 },
+ { 0x0901, 0xd727, 0x0000 },
+ { 0x8901, 0xd72a, 0x2000 },
+ { 0x0901, 0xd729, 0x0000 },
+ { 0x0901, 0xd72b, 0x0000 },
+ { 0x8901, 0xd730, 0x3000 },
+ { 0x8901, 0xd72e, 0x2000 },
+ { 0x0901, 0xd72d, 0x0000 },
+ { 0x0901, 0xd72f, 0x0000 },
+ { 0x8901, 0xd732, 0x2000 },
+ { 0x0901, 0xd731, 0x0000 },
+ { 0x0901, 0xd733, 0x0000 },
+ { 0x8501, 0xd754, 0x6000 },
+ { 0x8501, 0xd744, 0x5000 },
+ { 0x8501, 0xd73c, 0x4000 },
+ { 0x8501, 0xd738, 0x3000 },
+ { 0x8501, 0xd736, 0x2000 },
+ { 0x1901, 0xd735, 0x0000 },
+ { 0x0501, 0xd737, 0x0000 },
+ { 0x8501, 0xd73a, 0x2000 },
+ { 0x0501, 0xd739, 0x0000 },
+ { 0x0501, 0xd73b, 0x0000 },
+ { 0x8501, 0xd740, 0x3000 },
+ { 0x8501, 0xd73e, 0x2000 },
+ { 0x0501, 0xd73d, 0x0000 },
+ { 0x0501, 0xd73f, 0x0000 },
+ { 0x8501, 0xd742, 0x2000 },
+ { 0x0501, 0xd741, 0x0000 },
+ { 0x0501, 0xd743, 0x0000 },
+ { 0x8501, 0xd74c, 0x4000 },
+ { 0x8501, 0xd748, 0x3000 },
+ { 0x8501, 0xd746, 0x2000 },
+ { 0x0501, 0xd745, 0x0000 },
+ { 0x0501, 0xd747, 0x0000 },
+ { 0x8501, 0xd74a, 0x2000 },
+ { 0x0501, 0xd749, 0x0000 },
+ { 0x0501, 0xd74b, 0x0000 },
+ { 0x8501, 0xd750, 0x3000 },
+ { 0x8501, 0xd74e, 0x2000 },
+ { 0x0501, 0xd74d, 0x0000 },
+ { 0x1901, 0xd74f, 0x0000 },
+ { 0x8501, 0xd752, 0x2000 },
+ { 0x0501, 0xd751, 0x0000 },
+ { 0x0501, 0xd753, 0x0000 },
+ { 0x8901, 0xd764, 0x5000 },
+ { 0x8901, 0xd75c, 0x4000 },
+ { 0x8901, 0xd758, 0x3000 },
+ { 0x8901, 0xd756, 0x2000 },
+ { 0x0501, 0xd755, 0x0000 },
+ { 0x0901, 0xd757, 0x0000 },
+ { 0x8901, 0xd75a, 0x2000 },
+ { 0x0901, 0xd759, 0x0000 },
+ { 0x0901, 0xd75b, 0x0000 },
+ { 0x8901, 0xd760, 0x3000 },
+ { 0x8901, 0xd75e, 0x2000 },
+ { 0x0901, 0xd75d, 0x0000 },
+ { 0x0901, 0xd75f, 0x0000 },
+ { 0x8901, 0xd762, 0x2000 },
+ { 0x0901, 0xd761, 0x0000 },
+ { 0x0901, 0xd763, 0x0000 },
+ { 0x8901, 0xd76c, 0x4000 },
+ { 0x8901, 0xd768, 0x3000 },
+ { 0x8901, 0xd766, 0x2000 },
+ { 0x0901, 0xd765, 0x0000 },
+ { 0x0901, 0xd767, 0x0000 },
+ { 0x8901, 0xd76a, 0x2000 },
+ { 0x0901, 0xd769, 0x0000 },
+ { 0x0901, 0xd76b, 0x0000 },
+ { 0x8501, 0xd770, 0x3000 },
+ { 0x8901, 0xd76e, 0x2000 },
+ { 0x0901, 0xd76d, 0x0000 },
+ { 0x1901, 0xd76f, 0x0000 },
+ { 0x8501, 0xd772, 0x2000 },
+ { 0x0501, 0xd771, 0x0000 },
+ { 0x0501, 0xd773, 0x0000 },
+ { 0x8d01, 0xd7f8, 0x8000 },
+ { 0x8501, 0xd7b4, 0x7000 },
+ { 0x8901, 0xd794, 0x6000 },
+ { 0x8501, 0xd784, 0x5000 },
+ { 0x8501, 0xd77c, 0x4000 },
+ { 0x8501, 0xd778, 0x3000 },
+ { 0x8501, 0xd776, 0x2000 },
+ { 0x0501, 0xd775, 0x0000 },
+ { 0x0501, 0xd777, 0x0000 },
+ { 0x8501, 0xd77a, 0x2000 },
+ { 0x0501, 0xd779, 0x0000 },
+ { 0x0501, 0xd77b, 0x0000 },
+ { 0x8501, 0xd780, 0x3000 },
+ { 0x8501, 0xd77e, 0x2000 },
+ { 0x0501, 0xd77d, 0x0000 },
+ { 0x0501, 0xd77f, 0x0000 },
+ { 0x8501, 0xd782, 0x2000 },
+ { 0x0501, 0xd781, 0x0000 },
+ { 0x0501, 0xd783, 0x0000 },
+ { 0x8501, 0xd78c, 0x4000 },
+ { 0x8501, 0xd788, 0x3000 },
+ { 0x8501, 0xd786, 0x2000 },
+ { 0x0501, 0xd785, 0x0000 },
+ { 0x0501, 0xd787, 0x0000 },
+ { 0x8501, 0xd78a, 0x2000 },
+ { 0x1901, 0xd789, 0x0000 },
+ { 0x0501, 0xd78b, 0x0000 },
+ { 0x8901, 0xd790, 0x3000 },
+ { 0x8501, 0xd78e, 0x2000 },
+ { 0x0501, 0xd78d, 0x0000 },
+ { 0x0501, 0xd78f, 0x0000 },
+ { 0x8901, 0xd792, 0x2000 },
+ { 0x0901, 0xd791, 0x0000 },
+ { 0x0901, 0xd793, 0x0000 },
+ { 0x8901, 0xd7a4, 0x5000 },
+ { 0x8901, 0xd79c, 0x4000 },
+ { 0x8901, 0xd798, 0x3000 },
+ { 0x8901, 0xd796, 0x2000 },
+ { 0x0901, 0xd795, 0x0000 },
+ { 0x0901, 0xd797, 0x0000 },
+ { 0x8901, 0xd79a, 0x2000 },
+ { 0x0901, 0xd799, 0x0000 },
+ { 0x0901, 0xd79b, 0x0000 },
+ { 0x8901, 0xd7a0, 0x3000 },
+ { 0x8901, 0xd79e, 0x2000 },
+ { 0x0901, 0xd79d, 0x0000 },
+ { 0x0901, 0xd79f, 0x0000 },
+ { 0x8901, 0xd7a2, 0x2000 },
+ { 0x0901, 0xd7a1, 0x0000 },
+ { 0x0901, 0xd7a3, 0x0000 },
+ { 0x8501, 0xd7ac, 0x4000 },
+ { 0x8901, 0xd7a8, 0x3000 },
+ { 0x8901, 0xd7a6, 0x2000 },
+ { 0x0901, 0xd7a5, 0x0000 },
+ { 0x0901, 0xd7a7, 0x0000 },
+ { 0x8501, 0xd7aa, 0x2000 },
+ { 0x1901, 0xd7a9, 0x0000 },
+ { 0x0501, 0xd7ab, 0x0000 },
+ { 0x8501, 0xd7b0, 0x3000 },
+ { 0x8501, 0xd7ae, 0x2000 },
+ { 0x0501, 0xd7ad, 0x0000 },
+ { 0x0501, 0xd7af, 0x0000 },
+ { 0x8501, 0xd7b2, 0x2000 },
+ { 0x0501, 0xd7b1, 0x0000 },
+ { 0x0501, 0xd7b3, 0x0000 },
+ { 0x8d01, 0xd7d8, 0x6000 },
+ { 0x8501, 0xd7c4, 0x5000 },
+ { 0x8501, 0xd7bc, 0x4000 },
+ { 0x8501, 0xd7b8, 0x3000 },
+ { 0x8501, 0xd7b6, 0x2000 },
+ { 0x0501, 0xd7b5, 0x0000 },
+ { 0x0501, 0xd7b7, 0x0000 },
+ { 0x8501, 0xd7ba, 0x2000 },
+ { 0x0501, 0xd7b9, 0x0000 },
+ { 0x0501, 0xd7bb, 0x0000 },
+ { 0x8501, 0xd7c0, 0x3000 },
+ { 0x8501, 0xd7be, 0x2000 },
+ { 0x0501, 0xd7bd, 0x0000 },
+ { 0x0501, 0xd7bf, 0x0000 },
+ { 0x8501, 0xd7c2, 0x2000 },
+ { 0x0501, 0xd7c1, 0x0000 },
+ { 0x1901, 0xd7c3, 0x0000 },
+ { 0x8d01, 0xd7d0, 0x4000 },
+ { 0x8501, 0xd7c8, 0x3000 },
+ { 0x8501, 0xd7c6, 0x2000 },
+ { 0x0501, 0xd7c5, 0x0000 },
+ { 0x0501, 0xd7c7, 0x0000 },
+ { 0x8d01, 0xd7ce, 0x2000 },
+ { 0x0501, 0xd7c9, 0x0000 },
+ { 0x0d01, 0xd7cf, 0x0000 },
+ { 0x8d01, 0xd7d4, 0x3000 },
+ { 0x8d01, 0xd7d2, 0x2000 },
+ { 0x0d01, 0xd7d1, 0x0000 },
+ { 0x0d01, 0xd7d3, 0x0000 },
+ { 0x8d01, 0xd7d6, 0x2000 },
+ { 0x0d01, 0xd7d5, 0x0000 },
+ { 0x0d01, 0xd7d7, 0x0000 },
+ { 0x8d01, 0xd7e8, 0x5000 },
+ { 0x8d01, 0xd7e0, 0x4000 },
+ { 0x8d01, 0xd7dc, 0x3000 },
+ { 0x8d01, 0xd7da, 0x2000 },
+ { 0x0d01, 0xd7d9, 0x0000 },
+ { 0x0d01, 0xd7db, 0x0000 },
+ { 0x8d01, 0xd7de, 0x2000 },
+ { 0x0d01, 0xd7dd, 0x0000 },
+ { 0x0d01, 0xd7df, 0x0000 },
+ { 0x8d01, 0xd7e4, 0x3000 },
+ { 0x8d01, 0xd7e2, 0x2000 },
+ { 0x0d01, 0xd7e1, 0x0000 },
+ { 0x0d01, 0xd7e3, 0x0000 },
+ { 0x8d01, 0xd7e6, 0x2000 },
+ { 0x0d01, 0xd7e5, 0x0000 },
+ { 0x0d01, 0xd7e7, 0x0000 },
+ { 0x8d01, 0xd7f0, 0x4000 },
+ { 0x8d01, 0xd7ec, 0x3000 },
+ { 0x8d01, 0xd7ea, 0x2000 },
+ { 0x0d01, 0xd7e9, 0x0000 },
+ { 0x0d01, 0xd7eb, 0x0000 },
+ { 0x8d01, 0xd7ee, 0x2000 },
+ { 0x0d01, 0xd7ed, 0x0000 },
+ { 0x0d01, 0xd7ef, 0x0000 },
+ { 0x8d01, 0xd7f4, 0x3000 },
+ { 0x8d01, 0xd7f2, 0x2000 },
+ { 0x0d01, 0xd7f1, 0x0000 },
+ { 0x0d01, 0xd7f3, 0x0000 },
+ { 0x8d01, 0xd7f6, 0x2000 },
+ { 0x0d01, 0xd7f5, 0x0000 },
+ { 0x0d01, 0xd7f7, 0x0000 },
+ { 0x8702, 0xf836, 0x7000 },
+ { 0x8702, 0xf816, 0x6000 },
+ { 0x8702, 0xf806, 0x5000 },
+ { 0x8702, 0x0000, 0x4000 },
+ { 0x8d01, 0xd7fc, 0x3000 },
+ { 0x8d01, 0xd7fa, 0x2000 },
+ { 0x0d01, 0xd7f9, 0x0000 },
+ { 0x0d01, 0xd7fb, 0x0000 },
+ { 0x8d01, 0xd7fe, 0x2000 },
+ { 0x0d01, 0xd7fd, 0x0000 },
+ { 0x0d01, 0xd7ff, 0x0000 },
+ { 0x8702, 0xf802, 0x3000 },
+ { 0x8702, 0xf800, 0x2000 },
+ { 0x0702, 0xa6d6, 0x0000 },
+ { 0x0702, 0xf801, 0x0000 },
+ { 0x8702, 0xf804, 0x2000 },
+ { 0x0702, 0xf803, 0x0000 },
+ { 0x0702, 0xf805, 0x0000 },
+ { 0x8702, 0xf80e, 0x4000 },
+ { 0x8702, 0xf80a, 0x3000 },
+ { 0x8702, 0xf808, 0x2000 },
+ { 0x0702, 0xf807, 0x0000 },
+ { 0x0702, 0xf809, 0x0000 },
+ { 0x8702, 0xf80c, 0x2000 },
+ { 0x0702, 0xf80b, 0x0000 },
+ { 0x0702, 0xf80d, 0x0000 },
+ { 0x8702, 0xf812, 0x3000 },
+ { 0x8702, 0xf810, 0x2000 },
+ { 0x0702, 0xf80f, 0x0000 },
+ { 0x0702, 0xf811, 0x0000 },
+ { 0x8702, 0xf814, 0x2000 },
+ { 0x0702, 0xf813, 0x0000 },
+ { 0x0702, 0xf815, 0x0000 },
+ { 0x8702, 0xf826, 0x5000 },
+ { 0x8702, 0xf81e, 0x4000 },
+ { 0x8702, 0xf81a, 0x3000 },
+ { 0x8702, 0xf818, 0x2000 },
+ { 0x0702, 0xf817, 0x0000 },
+ { 0x0702, 0xf819, 0x0000 },
+ { 0x8702, 0xf81c, 0x2000 },
+ { 0x0702, 0xf81b, 0x0000 },
+ { 0x0702, 0xf81d, 0x0000 },
+ { 0x8702, 0xf822, 0x3000 },
+ { 0x8702, 0xf820, 0x2000 },
+ { 0x0702, 0xf81f, 0x0000 },
+ { 0x0702, 0xf821, 0x0000 },
+ { 0x8702, 0xf824, 0x2000 },
+ { 0x0702, 0xf823, 0x0000 },
+ { 0x0702, 0xf825, 0x0000 },
+ { 0x8702, 0xf82e, 0x4000 },
+ { 0x8702, 0xf82a, 0x3000 },
+ { 0x8702, 0xf828, 0x2000 },
+ { 0x0702, 0xf827, 0x0000 },
+ { 0x0702, 0xf829, 0x0000 },
+ { 0x8702, 0xf82c, 0x2000 },
+ { 0x0702, 0xf82b, 0x0000 },
+ { 0x0702, 0xf82d, 0x0000 },
+ { 0x8702, 0xf832, 0x3000 },
+ { 0x8702, 0xf830, 0x2000 },
+ { 0x0702, 0xf82f, 0x0000 },
+ { 0x0702, 0xf831, 0x0000 },
+ { 0x8702, 0xf834, 0x2000 },
+ { 0x0702, 0xf833, 0x0000 },
+ { 0x0702, 0xf835, 0x0000 },
+ { 0x8702, 0xf856, 0x6000 },
+ { 0x8702, 0xf846, 0x5000 },
+ { 0x8702, 0xf83e, 0x4000 },
+ { 0x8702, 0xf83a, 0x3000 },
+ { 0x8702, 0xf838, 0x2000 },
+ { 0x0702, 0xf837, 0x0000 },
+ { 0x0702, 0xf839, 0x0000 },
+ { 0x8702, 0xf83c, 0x2000 },
+ { 0x0702, 0xf83b, 0x0000 },
+ { 0x0702, 0xf83d, 0x0000 },
+ { 0x8702, 0xf842, 0x3000 },
+ { 0x8702, 0xf840, 0x2000 },
+ { 0x0702, 0xf83f, 0x0000 },
+ { 0x0702, 0xf841, 0x0000 },
+ { 0x8702, 0xf844, 0x2000 },
+ { 0x0702, 0xf843, 0x0000 },
+ { 0x0702, 0xf845, 0x0000 },
+ { 0x8702, 0xf84e, 0x4000 },
+ { 0x8702, 0xf84a, 0x3000 },
+ { 0x8702, 0xf848, 0x2000 },
+ { 0x0702, 0xf847, 0x0000 },
+ { 0x0702, 0xf849, 0x0000 },
+ { 0x8702, 0xf84c, 0x2000 },
+ { 0x0702, 0xf84b, 0x0000 },
+ { 0x0702, 0xf84d, 0x0000 },
+ { 0x8702, 0xf852, 0x3000 },
+ { 0x8702, 0xf850, 0x2000 },
+ { 0x0702, 0xf84f, 0x0000 },
+ { 0x0702, 0xf851, 0x0000 },
+ { 0x8702, 0xf854, 0x2000 },
+ { 0x0702, 0xf853, 0x0000 },
+ { 0x0702, 0xf855, 0x0000 },
+ { 0x8702, 0xf866, 0x5000 },
+ { 0x8702, 0xf85e, 0x4000 },
+ { 0x8702, 0xf85a, 0x3000 },
+ { 0x8702, 0xf858, 0x2000 },
+ { 0x0702, 0xf857, 0x0000 },
+ { 0x0702, 0xf859, 0x0000 },
+ { 0x8702, 0xf85c, 0x2000 },
+ { 0x0702, 0xf85b, 0x0000 },
+ { 0x0702, 0xf85d, 0x0000 },
+ { 0x8702, 0xf862, 0x3000 },
+ { 0x8702, 0xf860, 0x2000 },
+ { 0x0702, 0xf85f, 0x0000 },
+ { 0x0702, 0xf861, 0x0000 },
+ { 0x8702, 0xf864, 0x2000 },
+ { 0x0702, 0xf863, 0x0000 },
+ { 0x0702, 0xf865, 0x0000 },
+ { 0x8702, 0xf86e, 0x4000 },
+ { 0x8702, 0xf86a, 0x3000 },
+ { 0x8702, 0xf868, 0x2000 },
+ { 0x0702, 0xf867, 0x0000 },
+ { 0x0702, 0xf869, 0x0000 },
+ { 0x8702, 0xf86c, 0x2000 },
+ { 0x0702, 0xf86b, 0x0000 },
+ { 0x0702, 0xf86d, 0x0000 },
+ { 0x8702, 0xf872, 0x3000 },
+ { 0x8702, 0xf870, 0x2000 },
+ { 0x0702, 0xf86f, 0x0000 },
+ { 0x0702, 0xf871, 0x0000 },
+ { 0x8702, 0xf874, 0x2000 },
+ { 0x0702, 0xf873, 0x0000 },
+ { 0x0702, 0xf875, 0x0000 },
+ { 0x8702, 0xf976, 0x9000 },
+ { 0x8702, 0xf8f6, 0x8000 },
+ { 0x8702, 0xf8b6, 0x7000 },
+ { 0x8702, 0xf896, 0x6000 },
+ { 0x8702, 0xf886, 0x5000 },
+ { 0x8702, 0xf87e, 0x4000 },
+ { 0x8702, 0xf87a, 0x3000 },
+ { 0x8702, 0xf878, 0x2000 },
+ { 0x0702, 0xf877, 0x0000 },
+ { 0x0702, 0xf879, 0x0000 },
+ { 0x8702, 0xf87c, 0x2000 },
+ { 0x0702, 0xf87b, 0x0000 },
+ { 0x0702, 0xf87d, 0x0000 },
+ { 0x8702, 0xf882, 0x3000 },
+ { 0x8702, 0xf880, 0x2000 },
+ { 0x0702, 0xf87f, 0x0000 },
+ { 0x0702, 0xf881, 0x0000 },
+ { 0x8702, 0xf884, 0x2000 },
+ { 0x0702, 0xf883, 0x0000 },
+ { 0x0702, 0xf885, 0x0000 },
+ { 0x8702, 0xf88e, 0x4000 },
+ { 0x8702, 0xf88a, 0x3000 },
+ { 0x8702, 0xf888, 0x2000 },
+ { 0x0702, 0xf887, 0x0000 },
+ { 0x0702, 0xf889, 0x0000 },
+ { 0x8702, 0xf88c, 0x2000 },
+ { 0x0702, 0xf88b, 0x0000 },
+ { 0x0702, 0xf88d, 0x0000 },
+ { 0x8702, 0xf892, 0x3000 },
+ { 0x8702, 0xf890, 0x2000 },
+ { 0x0702, 0xf88f, 0x0000 },
+ { 0x0702, 0xf891, 0x0000 },
+ { 0x8702, 0xf894, 0x2000 },
+ { 0x0702, 0xf893, 0x0000 },
+ { 0x0702, 0xf895, 0x0000 },
+ { 0x8702, 0xf8a6, 0x5000 },
+ { 0x8702, 0xf89e, 0x4000 },
+ { 0x8702, 0xf89a, 0x3000 },
+ { 0x8702, 0xf898, 0x2000 },
+ { 0x0702, 0xf897, 0x0000 },
+ { 0x0702, 0xf899, 0x0000 },
+ { 0x8702, 0xf89c, 0x2000 },
+ { 0x0702, 0xf89b, 0x0000 },
+ { 0x0702, 0xf89d, 0x0000 },
+ { 0x8702, 0xf8a2, 0x3000 },
+ { 0x8702, 0xf8a0, 0x2000 },
+ { 0x0702, 0xf89f, 0x0000 },
+ { 0x0702, 0xf8a1, 0x0000 },
+ { 0x8702, 0xf8a4, 0x2000 },
+ { 0x0702, 0xf8a3, 0x0000 },
+ { 0x0702, 0xf8a5, 0x0000 },
+ { 0x8702, 0xf8ae, 0x4000 },
+ { 0x8702, 0xf8aa, 0x3000 },
+ { 0x8702, 0xf8a8, 0x2000 },
+ { 0x0702, 0xf8a7, 0x0000 },
+ { 0x0702, 0xf8a9, 0x0000 },
+ { 0x8702, 0xf8ac, 0x2000 },
+ { 0x0702, 0xf8ab, 0x0000 },
+ { 0x0702, 0xf8ad, 0x0000 },
+ { 0x8702, 0xf8b2, 0x3000 },
+ { 0x8702, 0xf8b0, 0x2000 },
+ { 0x0702, 0xf8af, 0x0000 },
+ { 0x0702, 0xf8b1, 0x0000 },
+ { 0x8702, 0xf8b4, 0x2000 },
+ { 0x0702, 0xf8b3, 0x0000 },
+ { 0x0702, 0xf8b5, 0x0000 },
+ { 0x8702, 0xf8d6, 0x6000 },
+ { 0x8702, 0xf8c6, 0x5000 },
+ { 0x8702, 0xf8be, 0x4000 },
+ { 0x8702, 0xf8ba, 0x3000 },
+ { 0x8702, 0xf8b8, 0x2000 },
+ { 0x0702, 0xf8b7, 0x0000 },
+ { 0x0702, 0xf8b9, 0x0000 },
+ { 0x8702, 0xf8bc, 0x2000 },
+ { 0x0702, 0xf8bb, 0x0000 },
+ { 0x0702, 0xf8bd, 0x0000 },
+ { 0x8702, 0xf8c2, 0x3000 },
+ { 0x8702, 0xf8c0, 0x2000 },
+ { 0x0702, 0xf8bf, 0x0000 },
+ { 0x0702, 0xf8c1, 0x0000 },
+ { 0x8702, 0xf8c4, 0x2000 },
+ { 0x0702, 0xf8c3, 0x0000 },
+ { 0x0702, 0xf8c5, 0x0000 },
+ { 0x8702, 0xf8ce, 0x4000 },
+ { 0x8702, 0xf8ca, 0x3000 },
+ { 0x8702, 0xf8c8, 0x2000 },
+ { 0x0702, 0xf8c7, 0x0000 },
+ { 0x0702, 0xf8c9, 0x0000 },
+ { 0x8702, 0xf8cc, 0x2000 },
+ { 0x0702, 0xf8cb, 0x0000 },
+ { 0x0702, 0xf8cd, 0x0000 },
+ { 0x8702, 0xf8d2, 0x3000 },
+ { 0x8702, 0xf8d0, 0x2000 },
+ { 0x0702, 0xf8cf, 0x0000 },
+ { 0x0702, 0xf8d1, 0x0000 },
+ { 0x8702, 0xf8d4, 0x2000 },
+ { 0x0702, 0xf8d3, 0x0000 },
+ { 0x0702, 0xf8d5, 0x0000 },
+ { 0x8702, 0xf8e6, 0x5000 },
+ { 0x8702, 0xf8de, 0x4000 },
+ { 0x8702, 0xf8da, 0x3000 },
+ { 0x8702, 0xf8d8, 0x2000 },
+ { 0x0702, 0xf8d7, 0x0000 },
+ { 0x0702, 0xf8d9, 0x0000 },
+ { 0x8702, 0xf8dc, 0x2000 },
+ { 0x0702, 0xf8db, 0x0000 },
+ { 0x0702, 0xf8dd, 0x0000 },
+ { 0x8702, 0xf8e2, 0x3000 },
+ { 0x8702, 0xf8e0, 0x2000 },
+ { 0x0702, 0xf8df, 0x0000 },
+ { 0x0702, 0xf8e1, 0x0000 },
+ { 0x8702, 0xf8e4, 0x2000 },
+ { 0x0702, 0xf8e3, 0x0000 },
+ { 0x0702, 0xf8e5, 0x0000 },
+ { 0x8702, 0xf8ee, 0x4000 },
+ { 0x8702, 0xf8ea, 0x3000 },
+ { 0x8702, 0xf8e8, 0x2000 },
+ { 0x0702, 0xf8e7, 0x0000 },
+ { 0x0702, 0xf8e9, 0x0000 },
+ { 0x8702, 0xf8ec, 0x2000 },
+ { 0x0702, 0xf8eb, 0x0000 },
+ { 0x0702, 0xf8ed, 0x0000 },
+ { 0x8702, 0xf8f2, 0x3000 },
+ { 0x8702, 0xf8f0, 0x2000 },
+ { 0x0702, 0xf8ef, 0x0000 },
+ { 0x0702, 0xf8f1, 0x0000 },
+ { 0x8702, 0xf8f4, 0x2000 },
+ { 0x0702, 0xf8f3, 0x0000 },
+ { 0x0702, 0xf8f5, 0x0000 },
+ { 0x8702, 0xf936, 0x7000 },
+ { 0x8702, 0xf916, 0x6000 },
+ { 0x8702, 0xf906, 0x5000 },
+ { 0x8702, 0xf8fe, 0x4000 },
+ { 0x8702, 0xf8fa, 0x3000 },
+ { 0x8702, 0xf8f8, 0x2000 },
+ { 0x0702, 0xf8f7, 0x0000 },
+ { 0x0702, 0xf8f9, 0x0000 },
+ { 0x8702, 0xf8fc, 0x2000 },
+ { 0x0702, 0xf8fb, 0x0000 },
+ { 0x0702, 0xf8fd, 0x0000 },
+ { 0x8702, 0xf902, 0x3000 },
+ { 0x8702, 0xf900, 0x2000 },
+ { 0x0702, 0xf8ff, 0x0000 },
+ { 0x0702, 0xf901, 0x0000 },
+ { 0x8702, 0xf904, 0x2000 },
+ { 0x0702, 0xf903, 0x0000 },
+ { 0x0702, 0xf905, 0x0000 },
+ { 0x8702, 0xf90e, 0x4000 },
+ { 0x8702, 0xf90a, 0x3000 },
+ { 0x8702, 0xf908, 0x2000 },
+ { 0x0702, 0xf907, 0x0000 },
+ { 0x0702, 0xf909, 0x0000 },
+ { 0x8702, 0xf90c, 0x2000 },
+ { 0x0702, 0xf90b, 0x0000 },
+ { 0x0702, 0xf90d, 0x0000 },
+ { 0x8702, 0xf912, 0x3000 },
+ { 0x8702, 0xf910, 0x2000 },
+ { 0x0702, 0xf90f, 0x0000 },
+ { 0x0702, 0xf911, 0x0000 },
+ { 0x8702, 0xf914, 0x2000 },
+ { 0x0702, 0xf913, 0x0000 },
+ { 0x0702, 0xf915, 0x0000 },
+ { 0x8702, 0xf926, 0x5000 },
+ { 0x8702, 0xf91e, 0x4000 },
+ { 0x8702, 0xf91a, 0x3000 },
+ { 0x8702, 0xf918, 0x2000 },
+ { 0x0702, 0xf917, 0x0000 },
+ { 0x0702, 0xf919, 0x0000 },
+ { 0x8702, 0xf91c, 0x2000 },
+ { 0x0702, 0xf91b, 0x0000 },
+ { 0x0702, 0xf91d, 0x0000 },
+ { 0x8702, 0xf922, 0x3000 },
+ { 0x8702, 0xf920, 0x2000 },
+ { 0x0702, 0xf91f, 0x0000 },
+ { 0x0702, 0xf921, 0x0000 },
+ { 0x8702, 0xf924, 0x2000 },
+ { 0x0702, 0xf923, 0x0000 },
+ { 0x0702, 0xf925, 0x0000 },
+ { 0x8702, 0xf92e, 0x4000 },
+ { 0x8702, 0xf92a, 0x3000 },
+ { 0x8702, 0xf928, 0x2000 },
+ { 0x0702, 0xf927, 0x0000 },
+ { 0x0702, 0xf929, 0x0000 },
+ { 0x8702, 0xf92c, 0x2000 },
+ { 0x0702, 0xf92b, 0x0000 },
+ { 0x0702, 0xf92d, 0x0000 },
+ { 0x8702, 0xf932, 0x3000 },
+ { 0x8702, 0xf930, 0x2000 },
+ { 0x0702, 0xf92f, 0x0000 },
+ { 0x0702, 0xf931, 0x0000 },
+ { 0x8702, 0xf934, 0x2000 },
+ { 0x0702, 0xf933, 0x0000 },
+ { 0x0702, 0xf935, 0x0000 },
+ { 0x8702, 0xf956, 0x6000 },
+ { 0x8702, 0xf946, 0x5000 },
+ { 0x8702, 0xf93e, 0x4000 },
+ { 0x8702, 0xf93a, 0x3000 },
+ { 0x8702, 0xf938, 0x2000 },
+ { 0x0702, 0xf937, 0x0000 },
+ { 0x0702, 0xf939, 0x0000 },
+ { 0x8702, 0xf93c, 0x2000 },
+ { 0x0702, 0xf93b, 0x0000 },
+ { 0x0702, 0xf93d, 0x0000 },
+ { 0x8702, 0xf942, 0x3000 },
+ { 0x8702, 0xf940, 0x2000 },
+ { 0x0702, 0xf93f, 0x0000 },
+ { 0x0702, 0xf941, 0x0000 },
+ { 0x8702, 0xf944, 0x2000 },
+ { 0x0702, 0xf943, 0x0000 },
+ { 0x0702, 0xf945, 0x0000 },
+ { 0x8702, 0xf94e, 0x4000 },
+ { 0x8702, 0xf94a, 0x3000 },
+ { 0x8702, 0xf948, 0x2000 },
+ { 0x0702, 0xf947, 0x0000 },
+ { 0x0702, 0xf949, 0x0000 },
+ { 0x8702, 0xf94c, 0x2000 },
+ { 0x0702, 0xf94b, 0x0000 },
+ { 0x0702, 0xf94d, 0x0000 },
+ { 0x8702, 0xf952, 0x3000 },
+ { 0x8702, 0xf950, 0x2000 },
+ { 0x0702, 0xf94f, 0x0000 },
+ { 0x0702, 0xf951, 0x0000 },
+ { 0x8702, 0xf954, 0x2000 },
+ { 0x0702, 0xf953, 0x0000 },
+ { 0x0702, 0xf955, 0x0000 },
+ { 0x8702, 0xf966, 0x5000 },
+ { 0x8702, 0xf95e, 0x4000 },
+ { 0x8702, 0xf95a, 0x3000 },
+ { 0x8702, 0xf958, 0x2000 },
+ { 0x0702, 0xf957, 0x0000 },
+ { 0x0702, 0xf959, 0x0000 },
+ { 0x8702, 0xf95c, 0x2000 },
+ { 0x0702, 0xf95b, 0x0000 },
+ { 0x0702, 0xf95d, 0x0000 },
+ { 0x8702, 0xf962, 0x3000 },
+ { 0x8702, 0xf960, 0x2000 },
+ { 0x0702, 0xf95f, 0x0000 },
+ { 0x0702, 0xf961, 0x0000 },
+ { 0x8702, 0xf964, 0x2000 },
+ { 0x0702, 0xf963, 0x0000 },
+ { 0x0702, 0xf965, 0x0000 },
+ { 0x8702, 0xf96e, 0x4000 },
+ { 0x8702, 0xf96a, 0x3000 },
+ { 0x8702, 0xf968, 0x2000 },
+ { 0x0702, 0xf967, 0x0000 },
+ { 0x0702, 0xf969, 0x0000 },
+ { 0x8702, 0xf96c, 0x2000 },
+ { 0x0702, 0xf96b, 0x0000 },
+ { 0x0702, 0xf96d, 0x0000 },
+ { 0x8702, 0xf972, 0x3000 },
+ { 0x8702, 0xf970, 0x2000 },
+ { 0x0702, 0xf96f, 0x0000 },
+ { 0x0702, 0xf971, 0x0000 },
+ { 0x8702, 0xf974, 0x2000 },
+ { 0x0702, 0xf973, 0x0000 },
+ { 0x0702, 0xf975, 0x0000 },
+ { 0x810e, 0x0077, 0x9000 },
+ { 0x8702, 0xf9f6, 0x8000 },
+ { 0x8702, 0xf9b6, 0x7000 },
+ { 0x8702, 0xf996, 0x6000 },
+ { 0x8702, 0xf986, 0x5000 },
+ { 0x8702, 0xf97e, 0x4000 },
+ { 0x8702, 0xf97a, 0x3000 },
+ { 0x8702, 0xf978, 0x2000 },
+ { 0x0702, 0xf977, 0x0000 },
+ { 0x0702, 0xf979, 0x0000 },
+ { 0x8702, 0xf97c, 0x2000 },
+ { 0x0702, 0xf97b, 0x0000 },
+ { 0x0702, 0xf97d, 0x0000 },
+ { 0x8702, 0xf982, 0x3000 },
+ { 0x8702, 0xf980, 0x2000 },
+ { 0x0702, 0xf97f, 0x0000 },
+ { 0x0702, 0xf981, 0x0000 },
+ { 0x8702, 0xf984, 0x2000 },
+ { 0x0702, 0xf983, 0x0000 },
+ { 0x0702, 0xf985, 0x0000 },
+ { 0x8702, 0xf98e, 0x4000 },
+ { 0x8702, 0xf98a, 0x3000 },
+ { 0x8702, 0xf988, 0x2000 },
+ { 0x0702, 0xf987, 0x0000 },
+ { 0x0702, 0xf989, 0x0000 },
+ { 0x8702, 0xf98c, 0x2000 },
+ { 0x0702, 0xf98b, 0x0000 },
+ { 0x0702, 0xf98d, 0x0000 },
+ { 0x8702, 0xf992, 0x3000 },
+ { 0x8702, 0xf990, 0x2000 },
+ { 0x0702, 0xf98f, 0x0000 },
+ { 0x0702, 0xf991, 0x0000 },
+ { 0x8702, 0xf994, 0x2000 },
+ { 0x0702, 0xf993, 0x0000 },
+ { 0x0702, 0xf995, 0x0000 },
+ { 0x8702, 0xf9a6, 0x5000 },
+ { 0x8702, 0xf99e, 0x4000 },
+ { 0x8702, 0xf99a, 0x3000 },
+ { 0x8702, 0xf998, 0x2000 },
+ { 0x0702, 0xf997, 0x0000 },
+ { 0x0702, 0xf999, 0x0000 },
+ { 0x8702, 0xf99c, 0x2000 },
+ { 0x0702, 0xf99b, 0x0000 },
+ { 0x0702, 0xf99d, 0x0000 },
+ { 0x8702, 0xf9a2, 0x3000 },
+ { 0x8702, 0xf9a0, 0x2000 },
+ { 0x0702, 0xf99f, 0x0000 },
+ { 0x0702, 0xf9a1, 0x0000 },
+ { 0x8702, 0xf9a4, 0x2000 },
+ { 0x0702, 0xf9a3, 0x0000 },
+ { 0x0702, 0xf9a5, 0x0000 },
+ { 0x8702, 0xf9ae, 0x4000 },
+ { 0x8702, 0xf9aa, 0x3000 },
+ { 0x8702, 0xf9a8, 0x2000 },
+ { 0x0702, 0xf9a7, 0x0000 },
+ { 0x0702, 0xf9a9, 0x0000 },
+ { 0x8702, 0xf9ac, 0x2000 },
+ { 0x0702, 0xf9ab, 0x0000 },
+ { 0x0702, 0xf9ad, 0x0000 },
+ { 0x8702, 0xf9b2, 0x3000 },
+ { 0x8702, 0xf9b0, 0x2000 },
+ { 0x0702, 0xf9af, 0x0000 },
+ { 0x0702, 0xf9b1, 0x0000 },
+ { 0x8702, 0xf9b4, 0x2000 },
+ { 0x0702, 0xf9b3, 0x0000 },
+ { 0x0702, 0xf9b5, 0x0000 },
+ { 0x8702, 0xf9d6, 0x6000 },
+ { 0x8702, 0xf9c6, 0x5000 },
+ { 0x8702, 0xf9be, 0x4000 },
+ { 0x8702, 0xf9ba, 0x3000 },
+ { 0x8702, 0xf9b8, 0x2000 },
+ { 0x0702, 0xf9b7, 0x0000 },
+ { 0x0702, 0xf9b9, 0x0000 },
+ { 0x8702, 0xf9bc, 0x2000 },
+ { 0x0702, 0xf9bb, 0x0000 },
+ { 0x0702, 0xf9bd, 0x0000 },
+ { 0x8702, 0xf9c2, 0x3000 },
+ { 0x8702, 0xf9c0, 0x2000 },
+ { 0x0702, 0xf9bf, 0x0000 },
+ { 0x0702, 0xf9c1, 0x0000 },
+ { 0x8702, 0xf9c4, 0x2000 },
+ { 0x0702, 0xf9c3, 0x0000 },
+ { 0x0702, 0xf9c5, 0x0000 },
+ { 0x8702, 0xf9ce, 0x4000 },
+ { 0x8702, 0xf9ca, 0x3000 },
+ { 0x8702, 0xf9c8, 0x2000 },
+ { 0x0702, 0xf9c7, 0x0000 },
+ { 0x0702, 0xf9c9, 0x0000 },
+ { 0x8702, 0xf9cc, 0x2000 },
+ { 0x0702, 0xf9cb, 0x0000 },
+ { 0x0702, 0xf9cd, 0x0000 },
+ { 0x8702, 0xf9d2, 0x3000 },
+ { 0x8702, 0xf9d0, 0x2000 },
+ { 0x0702, 0xf9cf, 0x0000 },
+ { 0x0702, 0xf9d1, 0x0000 },
+ { 0x8702, 0xf9d4, 0x2000 },
+ { 0x0702, 0xf9d3, 0x0000 },
+ { 0x0702, 0xf9d5, 0x0000 },
+ { 0x8702, 0xf9e6, 0x5000 },
+ { 0x8702, 0xf9de, 0x4000 },
+ { 0x8702, 0xf9da, 0x3000 },
+ { 0x8702, 0xf9d8, 0x2000 },
+ { 0x0702, 0xf9d7, 0x0000 },
+ { 0x0702, 0xf9d9, 0x0000 },
+ { 0x8702, 0xf9dc, 0x2000 },
+ { 0x0702, 0xf9db, 0x0000 },
+ { 0x0702, 0xf9dd, 0x0000 },
+ { 0x8702, 0xf9e2, 0x3000 },
+ { 0x8702, 0xf9e0, 0x2000 },
+ { 0x0702, 0xf9df, 0x0000 },
+ { 0x0702, 0xf9e1, 0x0000 },
+ { 0x8702, 0xf9e4, 0x2000 },
+ { 0x0702, 0xf9e3, 0x0000 },
+ { 0x0702, 0xf9e5, 0x0000 },
+ { 0x8702, 0xf9ee, 0x4000 },
+ { 0x8702, 0xf9ea, 0x3000 },
+ { 0x8702, 0xf9e8, 0x2000 },
+ { 0x0702, 0xf9e7, 0x0000 },
+ { 0x0702, 0xf9e9, 0x0000 },
+ { 0x8702, 0xf9ec, 0x2000 },
+ { 0x0702, 0xf9eb, 0x0000 },
+ { 0x0702, 0xf9ed, 0x0000 },
+ { 0x8702, 0xf9f2, 0x3000 },
+ { 0x8702, 0xf9f0, 0x2000 },
+ { 0x0702, 0xf9ef, 0x0000 },
+ { 0x0702, 0xf9f1, 0x0000 },
+ { 0x8702, 0xf9f4, 0x2000 },
+ { 0x0702, 0xf9f3, 0x0000 },
+ { 0x0702, 0xf9f5, 0x0000 },
+ { 0x810e, 0x0037, 0x7000 },
+ { 0x8702, 0xfa16, 0x6000 },
+ { 0x8702, 0xfa06, 0x5000 },
+ { 0x8702, 0xf9fe, 0x4000 },
+ { 0x8702, 0xf9fa, 0x3000 },
+ { 0x8702, 0xf9f8, 0x2000 },
+ { 0x0702, 0xf9f7, 0x0000 },
+ { 0x0702, 0xf9f9, 0x0000 },
+ { 0x8702, 0xf9fc, 0x2000 },
+ { 0x0702, 0xf9fb, 0x0000 },
+ { 0x0702, 0xf9fd, 0x0000 },
+ { 0x8702, 0xfa02, 0x3000 },
+ { 0x8702, 0xfa00, 0x2000 },
+ { 0x0702, 0xf9ff, 0x0000 },
+ { 0x0702, 0xfa01, 0x0000 },
+ { 0x8702, 0xfa04, 0x2000 },
+ { 0x0702, 0xfa03, 0x0000 },
+ { 0x0702, 0xfa05, 0x0000 },
+ { 0x8702, 0xfa0e, 0x4000 },
+ { 0x8702, 0xfa0a, 0x3000 },
+ { 0x8702, 0xfa08, 0x2000 },
+ { 0x0702, 0xfa07, 0x0000 },
+ { 0x0702, 0xfa09, 0x0000 },
+ { 0x8702, 0xfa0c, 0x2000 },
+ { 0x0702, 0xfa0b, 0x0000 },
+ { 0x0702, 0xfa0d, 0x0000 },
+ { 0x8702, 0xfa12, 0x3000 },
+ { 0x8702, 0xfa10, 0x2000 },
+ { 0x0702, 0xfa0f, 0x0000 },
+ { 0x0702, 0xfa11, 0x0000 },
+ { 0x8702, 0xfa14, 0x2000 },
+ { 0x0702, 0xfa13, 0x0000 },
+ { 0x0702, 0xfa15, 0x0000 },
+ { 0x810e, 0x0027, 0x5000 },
+ { 0x810e, 0x0001, 0x4000 },
+ { 0x8702, 0xfa1a, 0x3000 },
+ { 0x8702, 0xfa18, 0x2000 },
+ { 0x0702, 0xfa17, 0x0000 },
+ { 0x0702, 0xfa19, 0x0000 },
+ { 0x8702, 0xfa1c, 0x2000 },
+ { 0x0702, 0xfa1b, 0x0000 },
+ { 0x0702, 0xfa1d, 0x0000 },
+ { 0x810e, 0x0023, 0x3000 },
+ { 0x810e, 0x0021, 0x2000 },
+ { 0x010e, 0x0020, 0x0000 },
+ { 0x010e, 0x0022, 0x0000 },
+ { 0x810e, 0x0025, 0x2000 },
+ { 0x010e, 0x0024, 0x0000 },
+ { 0x010e, 0x0026, 0x0000 },
+ { 0x810e, 0x002f, 0x4000 },
+ { 0x810e, 0x002b, 0x3000 },
+ { 0x810e, 0x0029, 0x2000 },
+ { 0x010e, 0x0028, 0x0000 },
+ { 0x010e, 0x002a, 0x0000 },
+ { 0x810e, 0x002d, 0x2000 },
+ { 0x010e, 0x002c, 0x0000 },
+ { 0x010e, 0x002e, 0x0000 },
+ { 0x810e, 0x0033, 0x3000 },
+ { 0x810e, 0x0031, 0x2000 },
+ { 0x010e, 0x0030, 0x0000 },
+ { 0x010e, 0x0032, 0x0000 },
+ { 0x810e, 0x0035, 0x2000 },
+ { 0x010e, 0x0034, 0x0000 },
+ { 0x010e, 0x0036, 0x0000 },
+ { 0x810e, 0x0057, 0x6000 },
+ { 0x810e, 0x0047, 0x5000 },
+ { 0x810e, 0x003f, 0x4000 },
+ { 0x810e, 0x003b, 0x3000 },
+ { 0x810e, 0x0039, 0x2000 },
+ { 0x010e, 0x0038, 0x0000 },
+ { 0x010e, 0x003a, 0x0000 },
+ { 0x810e, 0x003d, 0x2000 },
+ { 0x010e, 0x003c, 0x0000 },
+ { 0x010e, 0x003e, 0x0000 },
+ { 0x810e, 0x0043, 0x3000 },
+ { 0x810e, 0x0041, 0x2000 },
+ { 0x010e, 0x0040, 0x0000 },
+ { 0x010e, 0x0042, 0x0000 },
+ { 0x810e, 0x0045, 0x2000 },
+ { 0x010e, 0x0044, 0x0000 },
+ { 0x010e, 0x0046, 0x0000 },
+ { 0x810e, 0x004f, 0x4000 },
+ { 0x810e, 0x004b, 0x3000 },
+ { 0x810e, 0x0049, 0x2000 },
+ { 0x010e, 0x0048, 0x0000 },
+ { 0x010e, 0x004a, 0x0000 },
+ { 0x810e, 0x004d, 0x2000 },
+ { 0x010e, 0x004c, 0x0000 },
+ { 0x010e, 0x004e, 0x0000 },
+ { 0x810e, 0x0053, 0x3000 },
+ { 0x810e, 0x0051, 0x2000 },
+ { 0x010e, 0x0050, 0x0000 },
+ { 0x010e, 0x0052, 0x0000 },
+ { 0x810e, 0x0055, 0x2000 },
+ { 0x010e, 0x0054, 0x0000 },
+ { 0x010e, 0x0056, 0x0000 },
+ { 0x810e, 0x0067, 0x5000 },
+ { 0x810e, 0x005f, 0x4000 },
+ { 0x810e, 0x005b, 0x3000 },
+ { 0x810e, 0x0059, 0x2000 },
+ { 0x010e, 0x0058, 0x0000 },
+ { 0x010e, 0x005a, 0x0000 },
+ { 0x810e, 0x005d, 0x2000 },
+ { 0x010e, 0x005c, 0x0000 },
+ { 0x010e, 0x005e, 0x0000 },
+ { 0x810e, 0x0063, 0x3000 },
+ { 0x810e, 0x0061, 0x2000 },
+ { 0x010e, 0x0060, 0x0000 },
+ { 0x010e, 0x0062, 0x0000 },
+ { 0x810e, 0x0065, 0x2000 },
+ { 0x010e, 0x0064, 0x0000 },
+ { 0x010e, 0x0066, 0x0000 },
+ { 0x810e, 0x006f, 0x4000 },
+ { 0x810e, 0x006b, 0x3000 },
+ { 0x810e, 0x0069, 0x2000 },
+ { 0x010e, 0x0068, 0x0000 },
+ { 0x010e, 0x006a, 0x0000 },
+ { 0x810e, 0x006d, 0x2000 },
+ { 0x010e, 0x006c, 0x0000 },
+ { 0x010e, 0x006e, 0x0000 },
+ { 0x810e, 0x0073, 0x3000 },
+ { 0x810e, 0x0071, 0x2000 },
+ { 0x010e, 0x0070, 0x0000 },
+ { 0x010e, 0x0072, 0x0000 },
+ { 0x810e, 0x0075, 0x2000 },
+ { 0x010e, 0x0074, 0x0000 },
+ { 0x010e, 0x0076, 0x0000 },
+ { 0x8c0e, 0x0177, 0x8000 },
+ { 0x8c0e, 0x0137, 0x7000 },
+ { 0x8c0e, 0x0117, 0x6000 },
+ { 0x8c0e, 0x0107, 0x5000 },
+ { 0x810e, 0x007f, 0x4000 },
+ { 0x810e, 0x007b, 0x3000 },
+ { 0x810e, 0x0079, 0x2000 },
+ { 0x010e, 0x0078, 0x0000 },
+ { 0x010e, 0x007a, 0x0000 },
+ { 0x810e, 0x007d, 0x2000 },
+ { 0x010e, 0x007c, 0x0000 },
+ { 0x010e, 0x007e, 0x0000 },
+ { 0x8c0e, 0x0103, 0x3000 },
+ { 0x8c0e, 0x0101, 0x2000 },
+ { 0x0c0e, 0x0100, 0x0000 },
+ { 0x0c0e, 0x0102, 0x0000 },
+ { 0x8c0e, 0x0105, 0x2000 },
+ { 0x0c0e, 0x0104, 0x0000 },
+ { 0x0c0e, 0x0106, 0x0000 },
+ { 0x8c0e, 0x010f, 0x4000 },
+ { 0x8c0e, 0x010b, 0x3000 },
+ { 0x8c0e, 0x0109, 0x2000 },
+ { 0x0c0e, 0x0108, 0x0000 },
+ { 0x0c0e, 0x010a, 0x0000 },
+ { 0x8c0e, 0x010d, 0x2000 },
+ { 0x0c0e, 0x010c, 0x0000 },
+ { 0x0c0e, 0x010e, 0x0000 },
+ { 0x8c0e, 0x0113, 0x3000 },
+ { 0x8c0e, 0x0111, 0x2000 },
+ { 0x0c0e, 0x0110, 0x0000 },
+ { 0x0c0e, 0x0112, 0x0000 },
+ { 0x8c0e, 0x0115, 0x2000 },
+ { 0x0c0e, 0x0114, 0x0000 },
+ { 0x0c0e, 0x0116, 0x0000 },
+ { 0x8c0e, 0x0127, 0x5000 },
+ { 0x8c0e, 0x011f, 0x4000 },
+ { 0x8c0e, 0x011b, 0x3000 },
+ { 0x8c0e, 0x0119, 0x2000 },
+ { 0x0c0e, 0x0118, 0x0000 },
+ { 0x0c0e, 0x011a, 0x0000 },
+ { 0x8c0e, 0x011d, 0x2000 },
+ { 0x0c0e, 0x011c, 0x0000 },
+ { 0x0c0e, 0x011e, 0x0000 },
+ { 0x8c0e, 0x0123, 0x3000 },
+ { 0x8c0e, 0x0121, 0x2000 },
+ { 0x0c0e, 0x0120, 0x0000 },
+ { 0x0c0e, 0x0122, 0x0000 },
+ { 0x8c0e, 0x0125, 0x2000 },
+ { 0x0c0e, 0x0124, 0x0000 },
+ { 0x0c0e, 0x0126, 0x0000 },
+ { 0x8c0e, 0x012f, 0x4000 },
+ { 0x8c0e, 0x012b, 0x3000 },
+ { 0x8c0e, 0x0129, 0x2000 },
+ { 0x0c0e, 0x0128, 0x0000 },
+ { 0x0c0e, 0x012a, 0x0000 },
+ { 0x8c0e, 0x012d, 0x2000 },
+ { 0x0c0e, 0x012c, 0x0000 },
+ { 0x0c0e, 0x012e, 0x0000 },
+ { 0x8c0e, 0x0133, 0x3000 },
+ { 0x8c0e, 0x0131, 0x2000 },
+ { 0x0c0e, 0x0130, 0x0000 },
+ { 0x0c0e, 0x0132, 0x0000 },
+ { 0x8c0e, 0x0135, 0x2000 },
+ { 0x0c0e, 0x0134, 0x0000 },
+ { 0x0c0e, 0x0136, 0x0000 },
+ { 0x8c0e, 0x0157, 0x6000 },
+ { 0x8c0e, 0x0147, 0x5000 },
+ { 0x8c0e, 0x013f, 0x4000 },
+ { 0x8c0e, 0x013b, 0x3000 },
+ { 0x8c0e, 0x0139, 0x2000 },
+ { 0x0c0e, 0x0138, 0x0000 },
+ { 0x0c0e, 0x013a, 0x0000 },
+ { 0x8c0e, 0x013d, 0x2000 },
+ { 0x0c0e, 0x013c, 0x0000 },
+ { 0x0c0e, 0x013e, 0x0000 },
+ { 0x8c0e, 0x0143, 0x3000 },
+ { 0x8c0e, 0x0141, 0x2000 },
+ { 0x0c0e, 0x0140, 0x0000 },
+ { 0x0c0e, 0x0142, 0x0000 },
+ { 0x8c0e, 0x0145, 0x2000 },
+ { 0x0c0e, 0x0144, 0x0000 },
+ { 0x0c0e, 0x0146, 0x0000 },
+ { 0x8c0e, 0x014f, 0x4000 },
+ { 0x8c0e, 0x014b, 0x3000 },
+ { 0x8c0e, 0x0149, 0x2000 },
+ { 0x0c0e, 0x0148, 0x0000 },
+ { 0x0c0e, 0x014a, 0x0000 },
+ { 0x8c0e, 0x014d, 0x2000 },
+ { 0x0c0e, 0x014c, 0x0000 },
+ { 0x0c0e, 0x014e, 0x0000 },
+ { 0x8c0e, 0x0153, 0x3000 },
+ { 0x8c0e, 0x0151, 0x2000 },
+ { 0x0c0e, 0x0150, 0x0000 },
+ { 0x0c0e, 0x0152, 0x0000 },
+ { 0x8c0e, 0x0155, 0x2000 },
+ { 0x0c0e, 0x0154, 0x0000 },
+ { 0x0c0e, 0x0156, 0x0000 },
+ { 0x8c0e, 0x0167, 0x5000 },
+ { 0x8c0e, 0x015f, 0x4000 },
+ { 0x8c0e, 0x015b, 0x3000 },
+ { 0x8c0e, 0x0159, 0x2000 },
+ { 0x0c0e, 0x0158, 0x0000 },
+ { 0x0c0e, 0x015a, 0x0000 },
+ { 0x8c0e, 0x015d, 0x2000 },
+ { 0x0c0e, 0x015c, 0x0000 },
+ { 0x0c0e, 0x015e, 0x0000 },
+ { 0x8c0e, 0x0163, 0x3000 },
+ { 0x8c0e, 0x0161, 0x2000 },
+ { 0x0c0e, 0x0160, 0x0000 },
+ { 0x0c0e, 0x0162, 0x0000 },
+ { 0x8c0e, 0x0165, 0x2000 },
+ { 0x0c0e, 0x0164, 0x0000 },
+ { 0x0c0e, 0x0166, 0x0000 },
+ { 0x8c0e, 0x016f, 0x4000 },
+ { 0x8c0e, 0x016b, 0x3000 },
+ { 0x8c0e, 0x0169, 0x2000 },
+ { 0x0c0e, 0x0168, 0x0000 },
+ { 0x0c0e, 0x016a, 0x0000 },
+ { 0x8c0e, 0x016d, 0x2000 },
+ { 0x0c0e, 0x016c, 0x0000 },
+ { 0x0c0e, 0x016e, 0x0000 },
+ { 0x8c0e, 0x0173, 0x3000 },
+ { 0x8c0e, 0x0171, 0x2000 },
+ { 0x0c0e, 0x0170, 0x0000 },
+ { 0x0c0e, 0x0172, 0x0000 },
+ { 0x8c0e, 0x0175, 0x2000 },
+ { 0x0c0e, 0x0174, 0x0000 },
+ { 0x0c0e, 0x0176, 0x0000 },
+ { 0x8c0e, 0x01b7, 0x7000 },
+ { 0x8c0e, 0x0197, 0x6000 },
+ { 0x8c0e, 0x0187, 0x5000 },
+ { 0x8c0e, 0x017f, 0x4000 },
+ { 0x8c0e, 0x017b, 0x3000 },
+ { 0x8c0e, 0x0179, 0x2000 },
+ { 0x0c0e, 0x0178, 0x0000 },
+ { 0x0c0e, 0x017a, 0x0000 },
+ { 0x8c0e, 0x017d, 0x2000 },
+ { 0x0c0e, 0x017c, 0x0000 },
+ { 0x0c0e, 0x017e, 0x0000 },
+ { 0x8c0e, 0x0183, 0x3000 },
+ { 0x8c0e, 0x0181, 0x2000 },
+ { 0x0c0e, 0x0180, 0x0000 },
+ { 0x0c0e, 0x0182, 0x0000 },
+ { 0x8c0e, 0x0185, 0x2000 },
+ { 0x0c0e, 0x0184, 0x0000 },
+ { 0x0c0e, 0x0186, 0x0000 },
+ { 0x8c0e, 0x018f, 0x4000 },
+ { 0x8c0e, 0x018b, 0x3000 },
+ { 0x8c0e, 0x0189, 0x2000 },
+ { 0x0c0e, 0x0188, 0x0000 },
+ { 0x0c0e, 0x018a, 0x0000 },
+ { 0x8c0e, 0x018d, 0x2000 },
+ { 0x0c0e, 0x018c, 0x0000 },
+ { 0x0c0e, 0x018e, 0x0000 },
+ { 0x8c0e, 0x0193, 0x3000 },
+ { 0x8c0e, 0x0191, 0x2000 },
+ { 0x0c0e, 0x0190, 0x0000 },
+ { 0x0c0e, 0x0192, 0x0000 },
+ { 0x8c0e, 0x0195, 0x2000 },
+ { 0x0c0e, 0x0194, 0x0000 },
+ { 0x0c0e, 0x0196, 0x0000 },
+ { 0x8c0e, 0x01a7, 0x5000 },
+ { 0x8c0e, 0x019f, 0x4000 },
+ { 0x8c0e, 0x019b, 0x3000 },
+ { 0x8c0e, 0x0199, 0x2000 },
+ { 0x0c0e, 0x0198, 0x0000 },
+ { 0x0c0e, 0x019a, 0x0000 },
+ { 0x8c0e, 0x019d, 0x2000 },
+ { 0x0c0e, 0x019c, 0x0000 },
+ { 0x0c0e, 0x019e, 0x0000 },
+ { 0x8c0e, 0x01a3, 0x3000 },
+ { 0x8c0e, 0x01a1, 0x2000 },
+ { 0x0c0e, 0x01a0, 0x0000 },
+ { 0x0c0e, 0x01a2, 0x0000 },
+ { 0x8c0e, 0x01a5, 0x2000 },
+ { 0x0c0e, 0x01a4, 0x0000 },
+ { 0x0c0e, 0x01a6, 0x0000 },
+ { 0x8c0e, 0x01af, 0x4000 },
+ { 0x8c0e, 0x01ab, 0x3000 },
+ { 0x8c0e, 0x01a9, 0x2000 },
+ { 0x0c0e, 0x01a8, 0x0000 },
+ { 0x0c0e, 0x01aa, 0x0000 },
+ { 0x8c0e, 0x01ad, 0x2000 },
+ { 0x0c0e, 0x01ac, 0x0000 },
+ { 0x0c0e, 0x01ae, 0x0000 },
+ { 0x8c0e, 0x01b3, 0x3000 },
+ { 0x8c0e, 0x01b1, 0x2000 },
+ { 0x0c0e, 0x01b0, 0x0000 },
+ { 0x0c0e, 0x01b2, 0x0000 },
+ { 0x8c0e, 0x01b5, 0x2000 },
+ { 0x0c0e, 0x01b4, 0x0000 },
+ { 0x0c0e, 0x01b6, 0x0000 },
+ { 0x8c0e, 0x01d7, 0x6000 },
+ { 0x8c0e, 0x01c7, 0x5000 },
+ { 0x8c0e, 0x01bf, 0x4000 },
+ { 0x8c0e, 0x01bb, 0x3000 },
+ { 0x8c0e, 0x01b9, 0x2000 },
+ { 0x0c0e, 0x01b8, 0x0000 },
+ { 0x0c0e, 0x01ba, 0x0000 },
+ { 0x8c0e, 0x01bd, 0x2000 },
+ { 0x0c0e, 0x01bc, 0x0000 },
+ { 0x0c0e, 0x01be, 0x0000 },
+ { 0x8c0e, 0x01c3, 0x3000 },
+ { 0x8c0e, 0x01c1, 0x2000 },
+ { 0x0c0e, 0x01c0, 0x0000 },
+ { 0x0c0e, 0x01c2, 0x0000 },
+ { 0x8c0e, 0x01c5, 0x2000 },
+ { 0x0c0e, 0x01c4, 0x0000 },
+ { 0x0c0e, 0x01c6, 0x0000 },
+ { 0x8c0e, 0x01cf, 0x4000 },
+ { 0x8c0e, 0x01cb, 0x3000 },
+ { 0x8c0e, 0x01c9, 0x2000 },
+ { 0x0c0e, 0x01c8, 0x0000 },
+ { 0x0c0e, 0x01ca, 0x0000 },
+ { 0x8c0e, 0x01cd, 0x2000 },
+ { 0x0c0e, 0x01cc, 0x0000 },
+ { 0x0c0e, 0x01ce, 0x0000 },
+ { 0x8c0e, 0x01d3, 0x3000 },
+ { 0x8c0e, 0x01d1, 0x2000 },
+ { 0x0c0e, 0x01d0, 0x0000 },
+ { 0x0c0e, 0x01d2, 0x0000 },
+ { 0x8c0e, 0x01d5, 0x2000 },
+ { 0x0c0e, 0x01d4, 0x0000 },
+ { 0x0c0e, 0x01d6, 0x0000 },
+ { 0x8c0e, 0x01e7, 0x5000 },
+ { 0x8c0e, 0x01df, 0x4000 },
+ { 0x8c0e, 0x01db, 0x3000 },
+ { 0x8c0e, 0x01d9, 0x2000 },
+ { 0x0c0e, 0x01d8, 0x0000 },
+ { 0x0c0e, 0x01da, 0x0000 },
+ { 0x8c0e, 0x01dd, 0x2000 },
+ { 0x0c0e, 0x01dc, 0x0000 },
+ { 0x0c0e, 0x01de, 0x0000 },
+ { 0x8c0e, 0x01e3, 0x3000 },
+ { 0x8c0e, 0x01e1, 0x2000 },
+ { 0x0c0e, 0x01e0, 0x0000 },
+ { 0x0c0e, 0x01e2, 0x0000 },
+ { 0x8c0e, 0x01e5, 0x2000 },
+ { 0x0c0e, 0x01e4, 0x0000 },
+ { 0x0c0e, 0x01e6, 0x0000 },
+ { 0x8c0e, 0x01ef, 0x4000 },
+ { 0x8c0e, 0x01eb, 0x3000 },
+ { 0x8c0e, 0x01e9, 0x2000 },
+ { 0x0c0e, 0x01e8, 0x0000 },
+ { 0x0c0e, 0x01ea, 0x0000 },
+ { 0x8c0e, 0x01ed, 0x2000 },
+ { 0x0c0e, 0x01ec, 0x0000 },
+ { 0x0c0e, 0x01ee, 0x0000 },
+ { 0x830f, 0xfffd, 0x2000 },
+ { 0x030f, 0x0000, 0x0000 },
+ { 0x0310, 0x0000, 0x1000 },
+ { 0x0310, 0xfffd, 0x0000 },
+};
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/ucptypetable.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/ucptypetable.c
new file mode 100644
index 00000000..129529b5
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/iis/pcre/ucptypetable.c
@@ -0,0 +1,93 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/*
+This is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language. See
+the file Tech.Notes for some information on the internals.
+
+Written by: Philip Hazel <ph10@cam.ac.uk>
+
+ Copyright (c) 1997-2004 University of Cambridge
+
+-----------------------------------------------------------------------------
+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.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+-----------------------------------------------------------------------------
+*/
+
+/* This module contains a table for translating Unicode property names into
+code values for the ucp_findchar function. It is in a separate module so that
+it can be included both in the main pcre library, and into pcretest (for
+printing out internals). */
+
+typedef struct {
+ const char *name;
+ int value;
+} ucp_type_table;
+
+static ucp_type_table utt[] = {
+ { "C", 128 + ucp_C },
+ { "Cc", ucp_Cc },
+ { "Cf", ucp_Cf },
+ { "Cn", ucp_Cn },
+ { "Co", ucp_Co },
+ { "Cs", ucp_Cs },
+ { "L", 128 + ucp_L },
+ { "Ll", ucp_Ll },
+ { "Lm", ucp_Lm },
+ { "Lo", ucp_Lo },
+ { "Lt", ucp_Lt },
+ { "Lu", ucp_Lu },
+ { "M", 128 + ucp_M },
+ { "Mc", ucp_Mc },
+ { "Me", ucp_Me },
+ { "Mn", ucp_Mn },
+ { "N", 128 + ucp_N },
+ { "Nd", ucp_Nd },
+ { "Nl", ucp_Nl },
+ { "No", ucp_No },
+ { "P", 128 + ucp_P },
+ { "Pc", ucp_Pc },
+ { "Pd", ucp_Pd },
+ { "Pe", ucp_Pe },
+ { "Pf", ucp_Pf },
+ { "Pi", ucp_Pi },
+ { "Po", ucp_Po },
+ { "Ps", ucp_Ps },
+ { "S", 128 + ucp_S },
+ { "Sc", ucp_Sc },
+ { "Sk", ucp_Sk },
+ { "Sm", ucp_Sm },
+ { "So", ucp_So },
+ { "Z", 128 + ucp_Z },
+ { "Zl", ucp_Zl },
+ { "Zp", ucp_Zp },
+ { "Zs", ucp_Zs }
+};
+
+/* End of ucptypetable.c */
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/.libs/jk_jnicb.a b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/.libs/jk_jnicb.a
new file mode 100644
index 00000000..7a91d73f
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/.libs/jk_jnicb.a
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/.libs/jk_jnicb.la b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/.libs/jk_jnicb.la
new file mode 100644
index 00000000..32781996
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/.libs/jk_jnicb.la
@@ -0,0 +1,35 @@
+# jk_jnicb.la - a libtool library file
+# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18)
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='jk_jnicb.so'
+
+# Names of this library.
+library_names='jk_jnicb.so jk_jnicb.so jk_jnicb.so'
+
+# The name of the static archive.
+old_library='jk_jnicb.a'
+
+# Libraries that this one depends upon.
+dependency_libs=''
+
+# Version information for jk_jnicb.
+current=0
+age=0
+revision=0
+
+# Is this an already installed library?
+installed=yes
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=yes
+
+# Files to dlopen/dlpreopen
+dlopen=''
+dlpreopen=''
+
+# Directory that this library needs to be installed in:
+libdir='/bottlenecks/rubbos/app/tomcat-connectors-1.2.32-src/native/jni'
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/.libs/jk_jnicb.lai b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/.libs/jk_jnicb.lai
new file mode 100644
index 00000000..32781996
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/.libs/jk_jnicb.lai
@@ -0,0 +1,35 @@
+# jk_jnicb.la - a libtool library file
+# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18)
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='jk_jnicb.so'
+
+# Names of this library.
+library_names='jk_jnicb.so jk_jnicb.so jk_jnicb.so'
+
+# The name of the static archive.
+old_library='jk_jnicb.a'
+
+# Libraries that this one depends upon.
+dependency_libs=''
+
+# Version information for jk_jnicb.
+current=0
+age=0
+revision=0
+
+# Is this an already installed library?
+installed=yes
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=yes
+
+# Files to dlopen/dlpreopen
+dlopen=''
+dlpreopen=''
+
+# Directory that this library needs to be installed in:
+libdir='/bottlenecks/rubbos/app/tomcat-connectors-1.2.32-src/native/jni'
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/.libs/jk_jnicb.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/.libs/jk_jnicb.o
new file mode 100644
index 00000000..857e8997
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/.libs/jk_jnicb.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/.libs/jk_jnicb.so b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/.libs/jk_jnicb.so
new file mode 100755
index 00000000..8c6b89e9
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/.libs/jk_jnicb.so
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/Makefile b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/Makefile
new file mode 100644
index 00000000..892bac18
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/Makefile
@@ -0,0 +1,45 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+OEXT=.lo
+include /bottlenecks/rubbos/app/apache2/build/config_vars.mk
+
+JK=../common/
+COMMON_OBJECTS=${JK}jk_map${OEXT} ${JK}jk_util${OEXT} ${JK}jk_pool${OEXT}
+JNI_OBJECTS=jk_jnicb${OEXT} ${COMMON_OBJECTS}
+
+
+JAVA_INCL=-I /bottlenecks/rubbos/app/jdk1.6.0_27/include -I /bottlenecks/rubbos/app/jdk1.6.0_27/include/linux -I../common
+CFLAGS=-I/bottlenecks/rubbos/app/apache2/include -DHAVE_CONFIG_H -DHAVE_JNI ${JAVA_INCL} -D_REENTRANT
+
+include ../scripts/build/rules.mk
+
+all: Makefile jni_connect.so
+
+Makefile: Makefile.in
+ echo Regenerating Makefile
+ ( cd ..; ./config.status )
+
+jk_jnicb.la: ${JNI_OBJECTS}
+ $(LIBTOOL) --mode=link $(COMPILE) -module -o $@ -rpath `pwd` -g -O2 -avoid-version ${JNI_OBJECTS}
+
+jni_connect.so: jk_jnicb.la
+ $(LIBTOOL) --mode=install cp $< `pwd`/jni_connect.so
+
+install:
+
+clean:
+ rm -f *.o *.lo *.a *.la *.so *.so.* *.slo
+ rm -rf .libs
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/Makefile.in b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/Makefile.in
new file mode 100644
index 00000000..7d2a675c
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/Makefile.in
@@ -0,0 +1,45 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+OEXT=.lo
+include @APACHE_CONFIG_VARS@
+
+JK=../common/
+COMMON_OBJECTS=${JK}jk_map${OEXT} ${JK}jk_util${OEXT} ${JK}jk_pool${OEXT}
+JNI_OBJECTS=jk_jnicb${OEXT} ${COMMON_OBJECTS}
+
+
+JAVA_INCL=-I @JAVA_HOME@/include -I @JAVA_HOME@/include/@OS@ -I../common
+CFLAGS=@apache_include@ @CFLAGS@ ${JAVA_INCL} -D_REENTRANT
+
+include ../scripts/build/rules.mk
+
+all: Makefile jni_connect.so
+
+Makefile: Makefile.in
+ echo Regenerating Makefile
+ ( cd ..; ./config.status )
+
+jk_jnicb.la: ${JNI_OBJECTS}
+ $(LIBTOOL) --mode=link $(COMPILE) -module -o $@ -rpath `pwd` -g -O2 -avoid-version ${JNI_OBJECTS}
+
+jni_connect.so: jk_jnicb.la
+ $(LIBTOOL) --mode=install cp $< `pwd`/jni_connect.so
+
+install:
+
+clean:
+ rm -f *.o *.lo *.a *.la *.so *.so.* *.slo
+ rm -rf .libs
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/Makefile.linux b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/Makefile.linux
new file mode 100644
index 00000000..6b2174b8
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/Makefile.linux
@@ -0,0 +1,46 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Defines for example NSAPI programs running under SOLARIS
+
+CC_CMD=gcc -D_REENTRANT
+LD_SHAREDCMD=ld -G
+
+all:
+
+prepare:
+
+OS_TYPE=linux
+INCLUDEDIR=../common
+JAVA_INCLUDE=$(JAVA_HOME)/include
+
+JK_OBJS = ../common/jk_map.o ../common/jk_util.o ../common/jk_pool.o jk_jnicb.o
+
+INCLUDE_FLAGS=-I$(INCLUDEDIR) -I$(JAVA_INCLUDE) -I$(JAVA_INCLUDE)/$(OS_TYPE)
+COMMON_DEFS=
+
+
+all: jni_connect.so
+
+
+jni_connect.so: $(JK_OBJS)
+# $(MAKE) prepare
+ $(LD_SHAREDCMD) $(JK_OBJS) -o jni_connect.so $(EXTRA_LDDEFINES)
+
+.c.o:
+ $(CC_CMD) $(COMMON_DEFS) $(INCLUDE_FLAGS) -c $<
+
+clean:
+ rm $(JK_OBJS)
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/Makefile.netware b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/Makefile.netware
new file mode 100644
index 00000000..2be42237
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/Makefile.netware
@@ -0,0 +1,266 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+#
+# Makefile for jk_nsapi_plugin (NetWare version - gnu make)
+# created by Guenter Knauf <fuankg@apache.org>
+#
+
+# Edit the path below to point to the base of your Netscape includes.
+ifndef NS_HOME
+NS_HOME = c:/projects/sdks/netscape
+endif
+# Edit the path below to point to the base of your NetWare Java SDK.
+ifndef NW_JDK
+NW_JDK = c:/projects/sdks/java-nw
+endif
+# Edit the path below to point to the base of your Novell NDK.
+ifndef NDKBASE
+NDKBASE = c:/novell
+endif
+
+ifndef INSTDIR
+INSTDIR = s:/sys/novonyx/modules
+endif
+
+# Edit the vars below to change NLM target settings.
+TARGET = jni_conn
+VERSION = $(JK_VERSION)
+COPYR = Licensed under the Apache License, Version 2.0
+DESCR = JNI natives for Tomcat $(JK_VERSION_STR)
+MTSAFE = NO
+STACK = 64000
+#SCREEN = System Console
+MODULES = nsapi
+EXPORTS = \
+ Java_org_apache_tomcat_modules_server_JNIConnectionHandler_write \
+ Java_org_apache_tomcat_modules_server_JNIConnectionHandler_startReasponse \
+ Java_org_apache_tomcat_modules_server_JNIConnectionHandler_readHeaders \
+ Java_org_apache_tomcat_modules_server_JNIConnectionHandler_readEnvironment \
+ Java_org_apache_tomcat_modules_server_JNIConnectionHandler_read \
+ Java_org_apache_tomcat_modules_server_JNIConnectionHandler_getNumberOfHeaders
+
+#IMPORTS = __nsapi30_table
+
+# Edit the var below to point to your lib architecture.
+ifndef LIBARCH
+LIBARCH = CLIB
+# LIBARCH = LIBC
+endif
+
+# must be equal to DEBUG or NDEBUG
+DB = NDEBUG
+# DB = DEBUG
+# Optimization: -O<n> or debugging: -g
+ifeq ($(DB),NDEBUG)
+ OPT = -O2
+ OBJDIR = release
+else
+ OPT = -g
+ OBJDIR = debug
+endif
+
+# Include the version info retrieved from jk_version.h
+-include $(OBJDIR)/version.inc
+
+# The following line defines your compiler.
+ifdef METROWERKS
+ CC = mwccnlm
+else
+ CC = gcc
+endif
+# RM = rm -f
+# CP = cp -fv
+# if you want to mark the target as MTSAFE you will need a tool for
+# generating the xdc data for the linker; here's a minimal tool:
+# http://www.gknw.net/development/prgtools/mkxdc.zip
+MPKXDC = mkxdc
+AWK = awk
+
+# Global flags for all compilers
+CFLAGS = $(OPT) -D$(DB) -DNETWARE -DXP_NETWARE -nostdinc
+
+ifeq ($(CC),mwccnlm)
+LD = mwldnlm
+LDFLAGS = -nostdlib $(OBJS) $(PRELUDE) $(LDLIBS) -o $@ -commandfile
+CFLAGS += -gccinc -inline off -opt nointrinsics
+#CFLAGS += -w on
+ifeq ($(LIBARCH),LIBC)
+ PRELUDE = $(SDK_LIBC)/imports/libcpre.o
+ CFLAGS += -align 4 -inst mmx -proc 686
+# CFLAGS += -D__ANSIC__
+else
+ PRELUDE = "$(METROWERKS)/Novell Support/libraries/runtime/prelude.obj"
+ LDLIBS = "$(METROWERKS)/Novell Support/libraries/runtime/mwcrtl.lib"
+# CFLAGS += -include "$(METROWERKS)/Novell Support/headers/nlm_prefix.h"
+ CFLAGS += -align 1 -proc 586
+endif
+else
+LD = nlmconv
+LDFLAGS = -T
+CFLAGS += -fno-builtin -fpack-struct -fpcc-struct-return
+CFLAGS += -Wall -Wno-main # -pedantic
+ifeq ($(LIBARCH),LIBC)
+ PRELUDE = $(SDK_LIBC)/imports/libcpre.gcc.o
+# CFLAGS += -D__ANSIC__
+else
+ PRELUDE = $(SDK_CLIB)/imports/clibpre.gcc.o
+ CFLAGS += -include $(NDKBASE)/nlmconv/genlm.h
+endif
+endif
+
+NDK_ROOT = $(NDKBASE)/ndk
+SDK_CLIB = $(NDK_ROOT)/nwsdk
+SDK_LIBC = $(NDK_ROOT)/libc
+JKCOMMON = ../common
+
+INCLUDES = -I$(NS_HOME)/include -I$(NS_HOME)/include/base
+INCLUDES += -I$(JKCOMMON) -I$(NW_JDK)/include -I$(NW_JDK)/include/netware
+
+ifeq ($(LIBARCH),LIBC)
+ INCLUDES += -I$(SDK_LIBC)/include
+ INCLUDES += -I$(SDK_LIBC)/include/winsock
+else
+ INCLUDES += -I$(SDK_CLIB)/include/nlm
+ # INCLUDES += -I$(NDKBASE)/ws295sdk/include
+ CFLAGS += -DNETDB_USE_INTERNET
+ CFLAGS += -DNO_GETTIMEOFDAY
+ CFLAGS += -DJK_PREFORK
+endif
+CFLAGS += $(INCLUDES)
+
+ifeq ($(MTSAFE),YES)
+ XDCDATA = $(OBJDIR)/$(TARGET).xdc
+endif
+
+ifeq ($(findstring linux,$(OSTYPE)),linux)
+DL = '
+#-include $(NDKBASE)/nlmconv/ncpfs.inc
+endif
+
+OBJS = \
+ $(OBJDIR)/jk_jnicb.o \
+ $(OBJDIR)/jk_nwmain.o \
+ $(OBJDIR)/jk_map.o \
+ $(OBJDIR)/jk_pool.o \
+ $(OBJDIR)/jk_util.o \
+ $(OBJDIR)/ap_snprintf.o
+
+vpath %.c . $(JKCOMMON)
+
+
+all: $(OBJDIR) $(OBJDIR)/version.inc $(OBJDIR)/$(TARGET).nlm
+
+$(OBJDIR)/%.o: %.c
+ @echo Compiling $<
+ @$(CC) $(CFLAGS) -c $< -o $@
+
+$(OBJDIR)/version.inc: $(JKCOMMON)/jk_version.h $(OBJDIR)
+ @echo Creating $@
+ @$(AWK) -f ../../support/get_ver.awk $< > $@
+
+dist: all
+ -$(RM) $(OBJDIR)/*.o $(OBJDIR)/$(TARGET).map $(OBJDIR)/$(TARGET).ncv
+ -$(RM) $(OBJDIR)/$(TARGET).def $(OBJDIR)/version.inc $(XDCDATA)
+# -$(CP) ../changes.txt $(OBJDIR)/
+
+install: all
+ @[ -d $(INSTDIR) ] || mkdir $(INSTDIR)
+ @$(CP) $(TARGET).nlm $(INSTDIR)
+
+clean:
+ -$(RM) -r $(OBJDIR)
+
+$(OBJDIR):
+ @mkdir $(OBJDIR)
+
+$(OBJDIR)/$(TARGET).nlm: $(OBJS) $(OBJDIR)/$(TARGET).def $(XDCDATA)
+ @echo Linking $@
+ @-$(RM) $@
+ @$(LD) $(LDFLAGS) $(OBJDIR)/$(TARGET).def
+
+$(OBJDIR)/%.xdc: Makefile.netware
+ @echo Creating $@
+ @$(MPKXDC) $(XDCOPT) $@
+
+$(OBJDIR)/%.def: Makefile.netware
+ @echo $(DL)# DEF file for linking with $(LD)$(DL) > $@
+ @echo $(DL)# Do not edit this file - it is created by make!$(DL) >> $@
+ @echo $(DL)# All your changes will be lost!!$(DL) >> $@
+ @echo $(DL)#$(DL) >> $@
+ @echo $(DL)copyright "$(COPYR)"$(DL) >> $@
+ @echo $(DL)description "$(DESCR)"$(DL) >> $@
+ @echo $(DL)version $(VERSION)$(DL) >> $@
+ifdef NLMTYPE
+ @echo $(DL)type $(NLMTYPE)$(DL) >> $@
+endif
+ifdef STACK
+ @echo $(DL)stack $(STACK)$(DL) >> $@
+endif
+ifdef SCREEN
+ @echo $(DL)screenname "$(SCREEN)"$(DL) >> $@
+else
+ @echo $(DL)screenname "DEFAULT"$(DL) >> $@
+endif
+ifeq ($(DB),DEBUG)
+ @echo $(DL)debug$(DL) >> $@
+endif
+ @echo $(DL)threadname "$(TARGET)"$(DL) >> $@
+ifdef XDCDATA
+ @echo $(DL)xdcdata $(XDCDATA)$(DL) >> $@
+endif
+ifeq ($(LIBARCH),CLIB)
+ @echo $(DL)start _Prelude$(DL) >> $@
+ @echo $(DL)exit _Stop$(DL) >> $@
+ @echo $(DL)import @$(NDK_ROOT)/nwsdk/imports/clib.imp$(DL) >> $@
+ @echo $(DL)import @$(NDK_ROOT)/nwsdk/imports/threads.imp$(DL) >> $@
+ @echo $(DL)import @$(NDK_ROOT)/nwsdk/imports/nlmlib.imp$(DL) >> $@
+ @echo $(DL)import @$(NDK_ROOT)/nwsdk/imports/socklib.imp$(DL) >> $@
+ @echo $(DL)module clib$(DL) >> $@
+else
+ifeq ($(LD),nlmconv)
+ @echo $(DL)flag_on 64$(DL) >> $@
+else
+ @echo $(DL)autounload$(DL) >> $@
+endif
+ @echo $(DL)pseudopreemption$(DL) >> $@
+ @echo $(DL)start _LibCPrelude$(DL) >> $@
+ @echo $(DL)exit _LibCPostlude$(DL) >> $@
+ @echo $(DL)check _LibCCheckUnload$(DL) >> $@
+ @echo $(DL)import @$(NDK_ROOT)/libc/imports/libc.imp$(DL) >> $@
+ @echo $(DL)import @$(NDK_ROOT)/libc/imports/netware.imp$(DL) >> $@
+ @echo $(DL)module libc$(DL) >> $@
+endif
+ifdef MODULES
+ @echo $(DL)module $(MODULES)$(DL) >> $@
+endif
+ifdef EXPORTS
+ @echo $(DL)export $(EXPORTS)$(DL) >> $@
+endif
+ifdef IMPORTS
+ @echo $(DL)import $(IMPORTS)$(DL) >> $@
+endif
+ifeq ($(LD),nlmconv)
+ @echo $(DL)input $(OBJS)$(DL) >> $@
+ @echo $(DL)input $(PRELUDE)$(DL) >> $@
+ifdef LDLIBS
+ @echo $(DL)input $(LDLIBS)$(DL) >> $@
+endif
+ @echo $(DL)output $*.nlm$(DL) >> $@
+endif
+
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/Makefile.solaris b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/Makefile.solaris
new file mode 100644
index 00000000..2c7dcb09
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/Makefile.solaris
@@ -0,0 +1,45 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Defines for example NSAPI programs running under SOLARIS
+
+CC_CMD=gcc -DSOLARIS -D_REENTRANT
+LD_SHAREDCMD=ld -G
+
+all:
+prepare:
+
+OS_TYPE=solaris
+INCLUDEDIR=../common
+JAVA_INCLUDE=$(JAVA_HOME)/include
+
+JK_OBJS = ../common/jk_map.o ../common/jk_util.o ../common/jk_pool.o jk_jnicb.o
+
+INCLUDE_FLAGS=-I$(INCLUDEDIR) -I$(JAVA_INCLUDE) -I$(JAVA_INCLUDE)/$(OS_TYPE)
+COMMON_DEFS=
+
+
+all: jni_connect.so
+
+
+jni_connect.so: $(JK_OBJS)
+ $(MAKE) prepare
+ $(LD_SHAREDCMD) $(JK_OBJS) -o jni_connect.so $(EXTRA_LDDEFINES)
+
+.c.o:
+ $(CC_CMD) $(COMMON_DEFS) $(INCLUDE_FLAGS) -c $<
+
+clean:
+ rm $(JK_OBJS)
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/jk_jnicb.a b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/jk_jnicb.a
new file mode 100644
index 00000000..44765de7
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/jk_jnicb.a
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/jk_jnicb.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/jk_jnicb.c
new file mode 100644
index 00000000..9a40c95f
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/jk_jnicb.c
@@ -0,0 +1,495 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: JNI callbacks implementation for the JNI in process adapter*
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Version: $Revision: 466585 $ *
+ ***************************************************************************/
+
+#include "jk_jnicb.h"
+#include "jk_service.h"
+#include "jk_util.h"
+#include "jk_pool.h"
+
+/*
+ * Class: org_apache_tomcat_modules_server_JNIConnectionHandler
+ * Method: getNumberOfHeaders
+ * Signature: (JJ)I
+ */
+JNIEXPORT jint JNICALL
+ Java_org_apache_tomcat_modules_server_JNIConnectionHandler_getNumberOfHeaders
+ (JNIEnv * env, jobject o, jlong s, jlong l)
+{
+ /* [V] Convert indirectly from jlong -> int -> pointer to shut up gcc */
+ /* I hope it's okay on other compilers and/or machines... */
+ jk_ws_service_t *ps = (jk_ws_service_t *)(int)s;
+ jk_logger_t *pl = (jk_logger_t *)(int)l;
+
+ jk_log(pl, JK_LOG_DEBUG,
+ "Into JNIConnectionHandler::getNumberOfHeaders\n");
+
+ if (!ps) {
+ jk_log(pl, JK_LOG_ERROR,
+ "In JNIConnectionHandler::getNumberOfHeaders, NULL ws service object\n");
+ /* [V] JNIConnectionHandler doesn't handle this */
+ return -1;
+ }
+
+ jk_log(pl, JK_LOG_DEBUG,
+ "Done JNIConnectionHandler::getNumberOfHeaders, found %d headers\n",
+ ps->num_headers);
+ return (jint) ps->num_headers;
+}
+
+/*
+ * Class: org_apache_tomcat_modules_server_JNIConnectionHandler
+ * Method: read
+ * Signature: (JJ[BII)I
+ */
+JNIEXPORT jint JNICALL
+ Java_org_apache_tomcat_modules_server_JNIConnectionHandler_read
+ (JNIEnv * env, jobject o, jlong s, jlong l, jbyteArray buf, jint from,
+ jint cnt)
+{
+ jk_ws_service_t *ps = (jk_ws_service_t *)(int)s;
+ jk_logger_t *pl = (jk_logger_t *)(int)l;
+ jint rc = -1;
+ jboolean iscommit;
+ jbyte *nbuf;
+ unsigned nfrom = (unsigned)from;
+ unsigned ncnt = (unsigned)cnt;
+ unsigned acc = 0;
+
+ jk_log(pl, JK_LOG_DEBUG, "Into JNIConnectionHandler::read\n");
+
+ if (!ps) {
+ jk_log(pl, JK_LOG_ERROR,
+ "In JNIConnectionHandler::read, NULL ws service object\n");
+ return -1;
+ }
+
+ nbuf = (*env)->GetByteArrayElements(env, buf, &iscommit);
+
+ if (!nbuf) {
+ jk_log(pl, JK_LOG_ERROR,
+ "In JNIConnectionHandler::read, GetByteArrayElements error\n");
+ return -1;
+ }
+
+ if (!ps->read(ps, nbuf + nfrom, ncnt, &acc)) {
+ jk_log(pl, JK_LOG_ERROR,
+ "In JNIConnectionHandler::read, failed to read from web server\n");
+ }
+ else {
+ rc = (jint) acc;
+ }
+
+ (*env)->ReleaseByteArrayElements(env, buf, nbuf, 0);
+
+ jk_log(pl, JK_LOG_DEBUG, "Done JNIConnectionHandler::read\n");
+ return rc;
+}
+
+/*
+ * Class: org_apache_tomcat_modules_server_JNIConnectionHandler
+ * Method: readEnvironment
+ * Signature: (JJ[Ljava/lang/String;)I
+ */
+JNIEXPORT jint JNICALL
+ Java_org_apache_tomcat_modules_server_JNIConnectionHandler_readEnvironment
+ (JNIEnv * env, jobject o, jlong s, jlong l, jobjectArray envbuf)
+{
+ jk_ws_service_t *ps = (jk_ws_service_t *)(int)s;
+ jk_logger_t *pl = (jk_logger_t *)(int)l;
+ char port[10];
+
+ jk_log(pl, JK_LOG_DEBUG,
+ "Into JNIConnectionHandler::readEnvironment. Environment follows --->\n");
+
+ if (!ps) {
+ jk_log(pl, JK_LOG_ERROR,
+ "In JNIConnectionHandler::readEnvironment, NULL ws service object\n");
+ return JK_FALSE;
+ }
+
+ sprintf(port, "%d", ps->server_port);
+
+ if (ps->method) {
+ (*env)->SetObjectArrayElement(env,
+ envbuf,
+ 0,
+ (*env)->NewStringUTF(env, ps->method));
+ jk_log(pl, JK_LOG_DEBUG, "---> method: %s\n", ps->method);
+ }
+ if (ps->req_uri) {
+ (*env)->SetObjectArrayElement(env,
+ envbuf,
+ 1,
+ (*env)->NewStringUTF(env, ps->req_uri));
+ jk_log(pl, JK_LOG_DEBUG, "---> req_uri: %s\n", ps->req_uri);
+ }
+ if (ps->query_string) {
+ (*env)->SetObjectArrayElement(env,
+ envbuf,
+ 2,
+ (*env)->NewStringUTF(env,
+ ps->query_string));
+ jk_log(pl, JK_LOG_DEBUG, "---> query_string: %s\n", ps->query_string);
+ }
+ if (ps->remote_addr) {
+ (*env)->SetObjectArrayElement(env,
+ envbuf,
+ 3,
+ (*env)->NewStringUTF(env,
+ ps->remote_addr));
+ jk_log(pl, JK_LOG_DEBUG, "---> remote_addr: %s\n", ps->remote_addr);
+ }
+ if (ps->remote_host) {
+ (*env)->SetObjectArrayElement(env,
+ envbuf,
+ 4,
+ (*env)->NewStringUTF(env,
+ ps->remote_host));
+ jk_log(pl, JK_LOG_DEBUG, "---> remote_host: %s\n", ps->remote_host);
+ }
+ if (ps->server_name) {
+ (*env)->SetObjectArrayElement(env,
+ envbuf,
+ 5,
+ (*env)->NewStringUTF(env,
+ ps->server_name));
+ jk_log(pl, JK_LOG_DEBUG, "---> server_name: %s\n", ps->server_name);
+ }
+
+ (*env)->SetObjectArrayElement(env,
+ envbuf, 6, (*env)->NewStringUTF(env, port));
+ jk_log(pl, JK_LOG_DEBUG, "---> server_port: %s\n", port);
+
+ if (ps->auth_type) {
+ (*env)->SetObjectArrayElement(env,
+ envbuf,
+ 7,
+ (*env)->NewStringUTF(env,
+ ps->auth_type));
+ jk_log(pl, JK_LOG_DEBUG, "---> auth_type: %s\n", ps->auth_type);
+ }
+ if (ps->remote_user) {
+ (*env)->SetObjectArrayElement(env,
+ envbuf,
+ 8,
+ (*env)->NewStringUTF(env,
+ ps->remote_user));
+ jk_log(pl, JK_LOG_DEBUG, "---> remote_user: %s\n", ps->remote_user);
+ }
+ if (ps->is_ssl) {
+ (*env)->SetObjectArrayElement(env,
+ envbuf,
+ 9, (*env)->NewStringUTF(env, "https"));
+ }
+ else {
+ (*env)->SetObjectArrayElement(env,
+ envbuf,
+ 9, (*env)->NewStringUTF(env, "http"));
+ }
+ jk_log(pl, JK_LOG_DEBUG, "---> is_ssl: %s\n", ps->is_ssl ? "yes" : "no");
+
+ if (ps->protocol) {
+ (*env)->SetObjectArrayElement(env,
+ envbuf,
+ 10,
+ (*env)->NewStringUTF(env,
+ ps->protocol));
+ jk_log(pl, JK_LOG_DEBUG, "---> protocol: %s\n", ps->protocol);
+ }
+ if (ps->server_software) {
+ (*env)->SetObjectArrayElement(env,
+ envbuf,
+ 11,
+ (*env)->NewStringUTF(env,
+ ps->
+ server_software));
+ jk_log(pl, JK_LOG_DEBUG, "---> server_software: %s\n",
+ ps->server_software);
+ }
+ if (ps->is_ssl) {
+ if (ps->ssl_cert) {
+ (*env)->SetObjectArrayElement(env,
+ envbuf,
+ 12,
+ (*env)->NewStringUTF(env,
+ ps->ssl_cert));
+ jk_log(pl, JK_LOG_DEBUG, "---> ssl_cert: %s\n", ps->ssl_cert);
+ }
+
+ if (ps->ssl_cipher) {
+ (*env)->SetObjectArrayElement(env,
+ envbuf,
+ 13,
+ (*env)->NewStringUTF(env,
+ ps->
+ ssl_cipher));
+ jk_log(pl, JK_LOG_DEBUG, "---> ssl_cipher: %s\n", ps->ssl_cipher);
+ }
+
+ if (ps->ssl_session) {
+ (*env)->SetObjectArrayElement(env,
+ envbuf,
+ 14,
+ (*env)->NewStringUTF(env,
+ ps->
+ ssl_session));
+ jk_log(pl, JK_LOG_DEBUG, "---> ssl_session: %s\n",
+ ps->ssl_session);
+ }
+ }
+
+ jk_log(pl, JK_LOG_DEBUG, "Done JNIConnectionHandler::readEnvironment\n");
+
+
+ return JK_TRUE;
+}
+
+/*
+ * Class: org_apache_tomcat_modules_server_JNIConnectionHandler
+ * Method: readHeaders
+ * Signature: (JJ[Ljava/lang/String;[Ljava/lang/String;)I
+ */
+JNIEXPORT jint JNICALL
+ Java_org_apache_tomcat_modules_server_JNIConnectionHandler_readHeaders
+ (JNIEnv * env, jobject o, jlong s, jlong l, jobjectArray hnames,
+ jobjectArray hvalues)
+{
+ jk_ws_service_t *ps = (jk_ws_service_t *)(int)s;
+ jk_logger_t *pl = (jk_logger_t *)(int)l;
+ unsigned i;
+
+ jk_log(pl, JK_LOG_DEBUG, "Into JNIConnectionHandler::readHeaders\n");
+
+ if (!ps) {
+ jk_log(pl, JK_LOG_ERROR,
+ "In JNIConnectionHandler::readHeaders, NULL ws service object\n");
+ return JK_FALSE;
+ }
+
+ jk_log(pl, JK_LOG_DEBUG,
+ "In JNIConnectionHandler::readHeaders, %d headers follow --->\n",
+ ps->num_headers);
+
+ for (i = 0; i < ps->num_headers; i++) {
+ (*env)->SetObjectArrayElement(env,
+ hnames,
+ i,
+ (*env)->NewStringUTF(env,
+ ps->
+ headers_names[i]));
+ (*env)->SetObjectArrayElement(env, hvalues, i,
+ (*env)->NewStringUTF(env,
+ ps->
+ headers_values
+ [i]));
+ jk_log(pl, JK_LOG_DEBUG, "---> %s = %s\n", ps->headers_names[i],
+ ps->headers_values[i]);
+ }
+ jk_log(pl, JK_LOG_DEBUG, "Done JNIConnectionHandler::readHeaders\n");
+
+ return JK_TRUE;
+}
+
+/*
+ * Class: org_apache_tomcat_modules_server_JNIConnectionHandler
+ * Method: startReasponse
+ * Signature: (JJILjava/lang/String;[Ljava/lang/String;[Ljava/lang/String;I)I
+ */
+JNIEXPORT jint JNICALL
+ Java_org_apache_tomcat_modules_server_JNIConnectionHandler_startReasponse
+ (JNIEnv * env, jobject o, jlong s, jlong l,
+ jint sc, jstring msg, jobjectArray hnames, jobjectArray hvalues,
+ jint hcnt)
+{
+ jk_ws_service_t *ps = (jk_ws_service_t *)(int)s;
+ jk_logger_t *pl = (jk_logger_t *)(int)l;
+ const char *nmsg = NULL;
+ char **nhnames = NULL;
+ char **nhvalues = NULL;
+ jstring *shnames = NULL;
+ jstring *shvalues = NULL;
+ int i = 0;
+ int ok = JK_TRUE;
+
+ jk_log(pl, JK_LOG_DEBUG, "Into JNIConnectionHandler::startReasponse\n");
+
+ if (!ps) {
+ jk_log(pl, JK_LOG_ERROR,
+ "In JNIConnectionHandler::startReasponse, NULL ws service object\n");
+ return JK_FALSE;
+ }
+
+ jk_log(pl, JK_LOG_DEBUG,
+ "In JNIConnectionHandler::startReasponse, %d headers follow --->\n",
+ hcnt);
+
+ if (hcnt) {
+ ok = JK_FALSE;
+
+ nhnames = (char **)jk_pool_alloc(ps->pool, hcnt * sizeof(char *));
+ nhvalues = (char **)jk_pool_alloc(ps->pool, hcnt * sizeof(char *));
+ shnames = (jstring *) jk_pool_alloc(ps->pool, hcnt * sizeof(jstring));
+ shvalues =
+ (jstring *) jk_pool_alloc(ps->pool, hcnt * sizeof(jstring));
+
+ if (nhvalues && nhnames && shnames && shnames) {
+ for (; i < hcnt; i++) {
+ jboolean iscommit;
+
+ shvalues[i] = shnames[i] = NULL;
+ nhnames[i] = nhvalues[i] = NULL;
+
+ shnames[i] = (*env)->GetObjectArrayElement(env, hnames, i);
+ shvalues[i] = (*env)->GetObjectArrayElement(env, hvalues, i);
+
+ if (!shvalues[i] || !shnames[i]) {
+ jk_log(pl, JK_LOG_ERROR,
+ "In JNIConnectionHandler::startReasponse, GetObjectArrayElement error\n");
+ break;
+ }
+
+ nhnames[i] =
+ (char *)(*env)->GetStringUTFChars(env, shnames[i],
+ &iscommit);
+ nhvalues[i] =
+ (char *)(*env)->GetStringUTFChars(env, shvalues[i],
+ &iscommit);
+
+ if (!nhvalues[i] || !nhnames[i]) {
+ jk_log(pl, JK_LOG_ERROR,
+ "In JNIConnectionHandler::startReasponse, GetStringUTFChars error\n");
+ break;
+ }
+
+ jk_log(pl, JK_LOG_DEBUG, "---> %s=%s\n", nhnames[i],
+ nhvalues[i]);
+ }
+ if (i == hcnt) {
+ ok = JK_TRUE;
+ jk_log(pl, JK_LOG_DEBUG,
+ "In JNIConnectionHandler::startReasponse. ----- End headers.\n",
+ hcnt);
+ }
+ }
+ else {
+ jk_log(pl, JK_LOG_ERROR,
+ "In JNIConnectionHandler::startReasponse, memory allocation error\n");
+ }
+ }
+
+ if (msg && ok) {
+ jboolean iscommit;
+ nmsg = (*env)->GetStringUTFChars(env, msg, &iscommit);
+ if (!nmsg) {
+ ok = JK_FALSE;
+ }
+ }
+
+ if (ok) {
+ if (!ps->
+ start_response(ps, sc, nmsg, (const char **)nhnames,
+ (const char **)nhvalues, hcnt)) {
+ ok = JK_FALSE;
+ jk_log(pl, JK_LOG_ERROR,
+ "In JNIConnectionHandler::startReasponse, servers startReasponse failed\n");
+ }
+ }
+
+ if (nmsg) {
+ (*env)->ReleaseStringUTFChars(env, msg, nmsg);
+ }
+
+ if (i < hcnt) {
+ i++;
+ }
+
+ if (nhvalues) {
+ int j;
+
+ for (j = 0; j < i; j++) {
+ if (nhvalues[j]) {
+ (*env)->ReleaseStringUTFChars(env, shvalues[j], nhvalues[j]);
+ }
+ }
+ }
+
+ if (nhnames) {
+ int j;
+
+ for (j = 0; j < i; j++) {
+ if (nhnames[j]) {
+ (*env)->ReleaseStringUTFChars(env, shnames[j], nhnames[j]);
+ }
+ }
+ }
+ jk_log(pl, JK_LOG_DEBUG, "Done JNIConnectionHandler::startReasponse.\n");
+
+ return ok;
+}
+
+/*
+ * Class: org_apache_tomcat_modules_server_JNIConnectionHandler
+ * Method: write
+ * Signature: (JJ[BII)I
+ */
+JNIEXPORT jint JNICALL
+ Java_org_apache_tomcat_modules_server_JNIConnectionHandler_write
+ (JNIEnv * env, jobject o, jlong s, jlong l, jbyteArray buf, jint from,
+ jint cnt)
+{
+ jk_ws_service_t *ps = (jk_ws_service_t *)(int)s;
+ jk_logger_t *pl = (jk_logger_t *)(int)l;
+ jint rc = JK_FALSE;
+ jboolean iscommit;
+ jbyte *nbuf;
+ unsigned nfrom = (unsigned)from;
+ unsigned ncnt = (unsigned)cnt;
+
+ jk_log(pl, JK_LOG_DEBUG, "In JNIConnectionHandler::write\n");
+
+ if (!ps) {
+ jk_log(pl, JK_LOG_ERROR,
+ "In JNIConnectionHandler::write, NULL ws service object\n");
+ return JK_FALSE;
+ }
+
+ nbuf = (*env)->GetByteArrayElements(env, buf, &iscommit);
+
+ if (!nbuf) {
+ jk_log(pl, JK_LOG_ERROR,
+ "In JNIConnectionHandler::write, GetByteArrayElements error\n");
+ return JK_FALSE;
+ }
+
+ if (!ps->write(ps, nbuf + nfrom, ncnt)) {
+ jk_log(pl, JK_LOG_ERROR,
+ "In JNIConnectionHandler::write, failed to write to the web server\n");
+ }
+ else {
+ rc = (jint) JK_TRUE;
+ }
+
+ (*env)->ReleaseByteArrayElements(env, buf, nbuf, JNI_ABORT);
+
+ return rc;
+}
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/jk_jnicb.exp b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/jk_jnicb.exp
new file mode 100644
index 00000000..fd709784
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/jk_jnicb.exp
@@ -0,0 +1,7 @@
+Java_org_apache_tomcat_modules_server_JNIConnectionHandler_getNumberOfHeaders,
+Java_org_apache_tomcat_modules_server_JNIConnectionHandler_read,
+Java_org_apache_tomcat_modules_server_JNIConnectionHandler_readEnvironment,
+Java_org_apache_tomcat_modules_server_JNIConnectionHandler_readHeaders,
+Java_org_apache_tomcat_modules_server_JNIConnectionHandler_startReasponse,
+Java_org_apache_tomcat_modules_server_JNIConnectionHandler_write
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/jk_jnicb.h b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/jk_jnicb.h
new file mode 100644
index 00000000..2b2061df
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/jk_jnicb.h
@@ -0,0 +1,61 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class org_apache_tomcat_modules_server_JNIConnectionHandler */
+
+#ifndef _Included_org_apache_tomcat_modules_server_JNIConnectionHandler
+#define _Included_org_apache_tomcat_modules_server_JNIConnectionHandler
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class: org_apache_tomcat_modules_server_JNIConnectionHandler
+ * Method: getNumberOfHeaders
+ * Signature: (JJ)I
+ */
+JNIEXPORT jint JNICALL Java_org_apache_tomcat_modules_server_JNIConnectionHandler_getNumberOfHeaders
+ (JNIEnv *, jobject, jlong, jlong);
+
+/*
+ * Class: org_apache_tomcat_modules_server_JNIConnectionHandler
+ * Method: read
+ * Signature: (JJ[BII)I
+ */
+JNIEXPORT jint JNICALL Java_org_apache_tomcat_modules_server_JNIConnectionHandler_read
+ (JNIEnv *, jobject, jlong, jlong, jbyteArray, jint, jint);
+
+/*
+ * Class: org_apache_tomcat_modules_server_JNIConnectionHandler
+ * Method: readEnvironment
+ * Signature: (JJ[Ljava/lang/String;)I
+ */
+JNIEXPORT jint JNICALL Java_org_apache_tomcat_modules_server_JNIConnectionHandler_readEnvironment
+ (JNIEnv *, jobject, jlong, jlong, jobjectArray);
+
+/*
+ * Class: org_apache_tomcat_modules_server_JNIConnectionHandler
+ * Method: readHeaders
+ * Signature: (JJ[Ljava/lang/String;[Ljava/lang/String;)I
+ */
+JNIEXPORT jint JNICALL Java_org_apache_tomcat_modules_server_JNIConnectionHandler_readHeaders
+ (JNIEnv *, jobject, jlong, jlong, jobjectArray, jobjectArray);
+
+/*
+ * Class: org_apache_tomcat_modules_server_JNIConnectionHandler
+ * Method: startReasponse
+ * Signature: (JJILjava/lang/String;[Ljava/lang/String;[Ljava/lang/String;I)I
+ */
+JNIEXPORT jint JNICALL Java_org_apache_tomcat_modules_server_JNIConnectionHandler_startReasponse
+ (JNIEnv *, jobject, jlong, jlong, jint, jstring, jobjectArray, jobjectArray, jint);
+
+/*
+ * Class: org_apache_tomcat_modules_server_JNIConnectionHandler
+ * Method: write
+ * Signature: (JJ[BII)I
+ */
+JNIEXPORT jint JNICALL Java_org_apache_tomcat_modules_server_JNIConnectionHandler_write
+ (JNIEnv *, jobject, jlong, jlong, jbyteArray, jint, jint);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/jk_jnicb.la b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/jk_jnicb.la
new file mode 100644
index 00000000..32781996
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/jk_jnicb.la
@@ -0,0 +1,35 @@
+# jk_jnicb.la - a libtool library file
+# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18)
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='jk_jnicb.so'
+
+# Names of this library.
+library_names='jk_jnicb.so jk_jnicb.so jk_jnicb.so'
+
+# The name of the static archive.
+old_library='jk_jnicb.a'
+
+# Libraries that this one depends upon.
+dependency_libs=''
+
+# Version information for jk_jnicb.
+current=0
+age=0
+revision=0
+
+# Is this an already installed library?
+installed=yes
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=yes
+
+# Files to dlopen/dlpreopen
+dlopen=''
+dlpreopen=''
+
+# Directory that this library needs to be installed in:
+libdir='/bottlenecks/rubbos/app/tomcat-connectors-1.2.32-src/native/jni'
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/jk_jnicb.lo b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/jk_jnicb.lo
new file mode 100644
index 00000000..902ab51e
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/jk_jnicb.lo
@@ -0,0 +1,12 @@
+# jk_jnicb.lo - a libtool object file
+# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18)
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object='.libs/jk_jnicb.o'
+
+# Name of the non-PIC object.
+non_pic_object='jk_jnicb.o'
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/jk_jnicb.o b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/jk_jnicb.o
new file mode 100644
index 00000000..92cc5fe5
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/jk_jnicb.o
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/jk_jnicb.so b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/jk_jnicb.so
new file mode 100755
index 00000000..8c6b89e9
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/jk_jnicb.so
Binary files differ
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/jni_connect.dsp b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/jni_connect.dsp
new file mode 100644
index 00000000..0090c848
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/jni/jni_connect.dsp
@@ -0,0 +1,151 @@
+# Microsoft Developer Studio Project File - Name="jni_connect" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=jni_connect - 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 "jni_connect.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 "jni_connect.mak" CFG="jni_connect - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "jni_connect - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "jni_connect - 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)" == "jni_connect - 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 /MD /W3 /GX /Zi /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "JNI_CONNECT_EXPORTS" /FD /c
+# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /I "$(JAVA_HOME)\include" /I "$(JAVA_HOME)\include\win32" /I "..\common" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "JNI_CONNECT_EXPORTS" /Fd"Release/jni_connect_src" /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# 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 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 /base:"0x6A6E0000" /subsystem:windows /dll /incremental:no /debug /machine:I386 /opt:ref
+
+!ELSEIF "$(CFG)" == "jni_connect - 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 /MDd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "JNI_CONNECT_EXPORTS" /FD /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "$(JAVA_HOME)\include" /I "$(JAVA_HOME)\include\win32" /I "..\common" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "JNI_CONNECT_EXPORTS" /Fd"Debug/jni_connect_src" /FD /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# 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 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 /base:"0x6A6E0000" /subsystem:windows /dll /incremental:no /debug /machine:I386
+
+!ENDIF
+
+# Begin Target
+
+# Name "jni_connect - Win32 Release"
+# Name "jni_connect - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\jk_jnicb.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_map.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_pool.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_util.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\common\jk_ajp12_worker.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_global.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\jk_jnicb.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_logger.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_map.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_pool.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_service.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_util.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"
+# End Group
+# End Target
+# End Project
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/libtool b/rubbos/app/tomcat-connectors-1.2.32-src/native/libtool
new file mode 100755
index 00000000..0476d927
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/libtool
@@ -0,0 +1,7065 @@
+#! /bin/bash
+
+# libtoolT - Provide generalized library-building support services.
+# Generated automatically by (GNU mod_jk 1.2.32)
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
+# Free Software Foundation, Inc.
+#
+# This file is part of GNU Libtool:
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# This program 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 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# A sed program that does not truncate output.
+SED="/bin/sed"
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="/bin/sed -e s/^X//"
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+if test "X${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi
+
+# The names of the tagged configurations supported by this script.
+available_tags=" CXX"
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Libtool was configured on host ubuntu:
+
+# Shell to use when invoking shell scripts.
+SHELL="/bin/bash"
+
+# Whether or not to build shared libraries.
+build_libtool_libs=yes
+
+# Whether or not to build static libraries.
+build_old_libs=yes
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=no
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=no
+
+# Whether or not to optimize for fast installation.
+fast_install=yes
+
+# The host system.
+host_alias=
+host=x86_64-unknown-linux-gnu
+
+# An echo program that does not interpret backslashes.
+echo="echo"
+
+# The archiver.
+AR="ar"
+AR_FLAGS="cru"
+
+# A C compiler.
+LTCC="gcc"
+
+# A language-specific compiler.
+CC="gcc"
+
+# Is the compiler the GNU C compiler?
+with_gcc=yes
+
+# An ERE matcher.
+EGREP="grep -E"
+
+# The linker used to build libraries.
+LD="/usr/bin/ld -m elf_x86_64"
+
+# Whether we need hard or soft links.
+LN_S="ln -s"
+
+# A BSD-compatible nm program.
+NM="/usr/bin/nm -B"
+
+# A symbol stripping program
+STRIP="strip"
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=file
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="dlltool"
+
+# Used on cygwin: object dumper.
+OBJDUMP="objdump"
+
+# Used on cygwin: assembler.
+AS="as"
+
+# The name of the directory that contains temporary libtool files.
+objdir=.libs
+
+# How to create reloadable object files.
+reload_flag=" -r"
+reload_cmds="\$LD\$reload_flag -o \$output\$reload_objs"
+
+# How to pass a linker flag through the compiler.
+wl="-Wl,"
+
+# Object file suffix (normally "o").
+objext="o"
+
+# Old archive suffix (normally "a").
+libext="a"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='.so'
+
+# Executable file suffix (normally "").
+exeext=""
+
+# Additional compiler flags for building library objects.
+pic_flag=" -fPIC -DPIC"
+pic_mode=default
+
+# What is the maximum length of a command?
+max_cmd_len=32768
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o="yes"
+
+# Must we lock files when doing compilation ?
+need_locks="no"
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=no
+
+# Do we need a version for libraries?
+need_version=no
+
+# Whether dlopen is supported.
+dlopen_support=yes
+
+# Whether dlopen of programs is supported.
+dlopen_self=yes
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=yes
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag="-static"
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=" -fno-builtin"
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec="\${wl}--export-dynamic"
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec="\${wl}--whole-archive\$convenience \${wl}--no-whole-archive"
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=""
+
+# Library versioning type.
+version_type=linux
+
+# Format of library name prefix.
+libname_spec="lib\$name"
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec="\${libname}\${release}\${shared_ext}\$versuffix \${libname}\${release}\${shared_ext}\$major \$libname\${shared_ext}"
+
+# The coded name of the library, if different from the real name.
+soname_spec="\${libname}\${release}\${shared_ext}\$major"
+
+# Commands used to build and install an old-style archive.
+RANLIB="ranlib"
+old_archive_cmds="\$AR \$AR_FLAGS \$oldlib\$oldobjs\$old_deplibs~\$RANLIB \$oldlib"
+old_postinstall_cmds="\$RANLIB \$oldlib~chmod 644 \$oldlib"
+old_postuninstall_cmds=""
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=""
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=""
+
+# Commands used to build and install a shared archive.
+archive_cmds="\$CC -shared \$libobjs \$deplibs \$compiler_flags \${wl}-soname \$wl\$soname -o \$lib"
+archive_expsym_cmds="\$echo \\\"{ global:\\\" > \$output_objdir/\$libname.ver~
+cat \$export_symbols | sed -e \\\"s/\\\\(.*\\\\)/\\\\1;/\\\" >> \$output_objdir/\$libname.ver~
+\$echo \\\"local: *; };\\\" >> \$output_objdir/\$libname.ver~
+ \$CC -shared \$libobjs \$deplibs \$compiler_flags \${wl}-soname \$wl\$soname \${wl}-version-script \${wl}\$output_objdir/\$libname.ver -o \$lib"
+postinstall_cmds=""
+postuninstall_cmds=""
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=""
+module_expsym_cmds=""
+
+# Commands to strip libraries.
+old_striplib="strip --strip-debug"
+striplib="strip --strip-unneeded"
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=""
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=""
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=""
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=""
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=""
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method="pass_all"
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd="\$MAGIC_CMD"
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=""
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=""
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds="PATH=\\\"\\\$PATH:/sbin\\\" ldconfig -n \$libdir"
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=""
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe="sed -n -e 's/^.*[ ]\\([ABCDGIRSTW][ABCDGIRSTW]*\\)[ ][ ]*\\(\\)\\([_A-Za-z][_A-Za-z0-9]*\\)\$/\\1 \\2\\3 \\3/p'"
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl="sed -n -e 's/^. .* \\(.*\\)\$/extern int \\1;/p'"
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address="sed -n -e 's/^: \\([^ ]*\\) \$/ {\\\"\\1\\\", (lt_ptr) 0},/p' -e 's/^[BCDEGRST] \\([^ ]*\\) \\([^ ]*\\)\$/ {\"\\2\", (lt_ptr) \\&\\2},/p'"
+
+# This is the shared library runtime path variable.
+runpath_var=LD_RUN_PATH
+
+# This is the shared library path variable.
+shlibpath_var=LD_LIBRARY_PATH
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=no
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=immediate
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=yes
+
+# Flag to hardcode $libdir into a binary during linking.
+# This must work even if $libdir does not exist.
+hardcode_libdir_flag_spec="\${wl}--rpath \${wl}\$libdir"
+
+# If ld is used when linking, flag to hardcode $libdir into
+# a binary during linking. This must work even if $libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=""
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=""
+
+# Set to yes if using DIR/libNAME during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=no
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=no
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=unsupported
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=no
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="PATH LD_RUN_PATH GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=unknown
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec="/lib64 /usr/lib64 /usr/local/lib64"
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 include /etc/ld.so.conf.d/*.conf "
+
+# Fix the shell variable $srcfile for the compiler.
+fix_srcfile_path=""
+
+# Set to yes if exported symbols are required.
+always_export_symbols=no
+
+# The commands to list exported symbols.
+export_symbols_cmds="\$NM \$libobjs \$convenience | \$global_symbol_pipe | \$SED 's/.* //' | sort | uniq > \$export_symbols"
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=""
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms="_GLOBAL_OFFSET_TABLE_"
+
+# Symbols that must always be exported.
+include_expsyms=""
+
+# ### END LIBTOOL CONFIG
+
+# ltmain.sh - Provide generalized library-building support services.
+# NOTE: Changing this file will not affect anything until you rerun configure.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004
+# Free Software Foundation, Inc.
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# This program 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 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+basename="s,^.*/,,g"
+
+# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
+# is ksh but when the shell is invoked as "sh" and the current value of
+# the _XPG environment variable is not equal to 1 (one), the special
+# positional parameter $0, within a function call, is the name of the
+# function.
+progpath="$0"
+
+# RH: define SED for historic ltconfig's generated by Libtool 1.3
+[ -z "$SED" ] && SED=sed
+
+# The name of this program:
+progname=`echo "$progpath" | $SED $basename`
+modename="$progname"
+
+# Global variables:
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+PROGRAM=ltmain.sh
+PACKAGE=libtool
+VERSION=1.5.6
+TIMESTAMP=" (1.1220.2.95 2004/04/11 05:50:42)"
+EGREP="grep -E"
+
+
+# Check that we have a working $echo.
+if test "X$1" = X--no-reexec; then
+ # Discard the --no-reexec flag, and continue.
+ shift
+elif test "X$1" = X--fallback-echo; then
+ # Avoid inline document here, it may be left over
+ :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
+ # Yippee, $echo works!
+ :
+else
+ # Restart under the correct shell, and then maybe $echo will work.
+ exec $SHELL "$progpath" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+ # used as fallback echo
+ shift
+ cat <<EOF
+$*
+EOF
+ exit $EXIT_SUCCESS
+fi
+
+default_mode=
+help="Try \`$progname --help' for more information."
+magic="%%%MAGIC variable%%%"
+mkdir="mkdir"
+mv="mv -f"
+rm="rm -f"
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed="${SED}"' -e 1s/^X//'
+sed_quote_subst='s/\([\\`\\"$\\\\]\)/\\\1/g'
+# test EBCDIC or ASCII
+case `echo A|tr A '\301'` in
+ A) # EBCDIC based system
+ SP2NL="tr '\100' '\n'"
+ NL2SP="tr '\r\n' '\100\100'"
+ ;;
+ *) # Assume ASCII based system
+ SP2NL="tr '\040' '\012'"
+ NL2SP="tr '\015\012' '\040\040'"
+ ;;
+esac
+
+# NLS nuisances.
+# Only set LANG and LC_ALL to C if already set.
+# These must not be set unconditionally because not all systems understand
+# e.g. LANG=C (notably SCO).
+# We save the old values to restore during execute mode.
+if test "${LC_ALL+set}" = set; then
+ save_LC_ALL="$LC_ALL"; LC_ALL=C; export LC_ALL
+fi
+if test "${LANG+set}" = set; then
+ save_LANG="$LANG"; LANG=C; export LANG
+fi
+
+# Make sure IFS has a sensible default
+: ${IFS="
+"}
+
+if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
+ $echo "$modename: not configured to build any kind of library" 1>&2
+ $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2
+ exit $EXIT_FAILURE
+fi
+
+# Global variables.
+mode=$default_mode
+nonopt=
+prev=
+prevopt=
+run=
+show="$echo"
+show_help=
+execute_dlfiles=
+lo2o="s/\\.lo\$/.${objext}/"
+o2lo="s/\\.${objext}\$/.lo/"
+
+#####################################
+# Shell function definitions:
+# This seems to be the best place for them
+
+# func_win32_libid arg
+# return the library type of file 'arg'
+#
+# Need a lot of goo to handle *both* DLLs and import libs
+# Has to be a shell function in order to 'eat' the argument
+# that is supplied when $file_magic_command is called.
+func_win32_libid () {
+ win32_libid_type="unknown"
+ win32_fileres=`file -L $1 2>/dev/null`
+ case $win32_fileres in
+ *ar\ archive\ import\ library*) # definitely import
+ win32_libid_type="x86 archive import"
+ ;;
+ *ar\ archive*) # could be an import, or static
+ if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \
+ $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then
+ win32_nmres=`eval $NM -f posix -A $1 | \
+ sed -n -e '1,100{/ I /{x;/import/!{s/^/import/;h;p;};x;};}'`
+ if test "X$win32_nmres" = "Ximport" ; then
+ win32_libid_type="x86 archive import"
+ else
+ win32_libid_type="x86 archive static"
+ fi
+ fi
+ ;;
+ *DLL*)
+ win32_libid_type="x86 DLL"
+ ;;
+ *executable*) # but shell scripts are "executable" too...
+ case $win32_fileres in
+ *MS\ Windows\ PE\ Intel*)
+ win32_libid_type="x86 DLL"
+ ;;
+ esac
+ ;;
+ esac
+ $echo $win32_libid_type
+}
+
+
+# func_infer_tag arg
+# Infer tagged configuration to use if any are available and
+# if one wasn't chosen via the "--tag" command line option.
+# Only attempt this if the compiler in the base compile
+# command doesn't match the default compiler.
+# arg is usually of the form 'gcc ...'
+func_infer_tag () {
+ if test -n "$available_tags" && test -z "$tagname"; then
+ CC_quoted=
+ for arg in $CC; do
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ CC_quoted="$CC_quoted $arg"
+ done
+ case $@ in
+ # Blanks in the command may have been stripped by the calling shell,
+ # but not from the CC environment variable when configure was run.
+ " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;;
+ # Blanks at the start of $base_compile will cause this to fail
+ # if we don't check for them as well.
+ *)
+ for z in $available_tags; do
+ if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
+ # Evaluate the configuration.
+ eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
+ CC_quoted=
+ for arg in $CC; do
+ # Double-quote args containing other shell metacharacters.
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ CC_quoted="$CC_quoted $arg"
+ done
+ case "$@ " in
+ " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*)
+ # The compiler in the base compile command matches
+ # the one in the tagged configuration.
+ # Assume this is the tagged configuration we want.
+ tagname=$z
+ break
+ ;;
+ esac
+ fi
+ done
+ # If $tagname still isn't set, then no tagged configuration
+ # was found and let the user know that the "--tag" command
+ # line option must be used.
+ if test -z "$tagname"; then
+ $echo "$modename: unable to infer tagged configuration"
+ $echo "$modename: specify a tag with \`--tag'" 1>&2
+ exit $EXIT_FAILURE
+# else
+# $echo "$modename: using $tagname tagged configuration"
+ fi
+ ;;
+ esac
+ fi
+}
+# End of Shell function definitions
+#####################################
+
+# Darwin sucks
+eval std_shrext=\"$shrext_cmds\"
+
+# Parse our command line options once, thoroughly.
+while test "$#" -gt 0
+do
+ arg="$1"
+ shift
+
+ case $arg in
+ -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) optarg= ;;
+ esac
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$prev"; then
+ case $prev in
+ execute_dlfiles)
+ execute_dlfiles="$execute_dlfiles $arg"
+ ;;
+ tag)
+ tagname="$arg"
+ preserve_args="${preserve_args}=$arg"
+
+ # Check whether tagname contains only valid characters
+ case $tagname in
+ *[!-_A-Za-z0-9,/]*)
+ $echo "$progname: invalid tag name: $tagname" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ case $tagname in
+ CC)
+ # Don't test for the "default" C tag, as we know, it's there, but
+ # not specially marked.
+ ;;
+ *)
+ if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then
+ taglist="$taglist $tagname"
+ # Evaluate the configuration.
+ eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`"
+ else
+ $echo "$progname: ignoring unknown tag $tagname" 1>&2
+ fi
+ ;;
+ esac
+ ;;
+ *)
+ eval "$prev=\$arg"
+ ;;
+ esac
+
+ prev=
+ prevopt=
+ continue
+ fi
+
+ # Have we seen a non-optional argument yet?
+ case $arg in
+ --help)
+ show_help=yes
+ ;;
+
+ --version)
+ $echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP"
+ $echo
+ $echo "Copyright (C) 2003 Free Software Foundation, Inc."
+ $echo "This is free software; see the source for copying conditions. There is NO"
+ $echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+ exit $EXIT_SUCCESS
+ ;;
+
+ --config)
+ ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath
+ # Now print the configurations for the tags.
+ for tagname in $taglist; do
+ ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath"
+ done
+ exit $EXIT_SUCCESS
+ ;;
+
+ --debug)
+ $echo "$progname: enabling shell trace mode"
+ set -x
+ preserve_args="$preserve_args $arg"
+ ;;
+
+ --dry-run | -n)
+ run=:
+ ;;
+
+ --features)
+ $echo "host: $host"
+ if test "$build_libtool_libs" = yes; then
+ $echo "enable shared libraries"
+ else
+ $echo "disable shared libraries"
+ fi
+ if test "$build_old_libs" = yes; then
+ $echo "enable static libraries"
+ else
+ $echo "disable static libraries"
+ fi
+ exit $EXIT_SUCCESS
+ ;;
+
+ --finish) mode="finish" ;;
+
+ --mode) prevopt="--mode" prev=mode ;;
+ --mode=*) mode="$optarg" ;;
+
+ --preserve-dup-deps) duplicate_deps="yes" ;;
+
+ --quiet | --silent)
+ show=:
+ preserve_args="$preserve_args $arg"
+ ;;
+
+ --tag) prevopt="--tag" prev=tag ;;
+ --tag=*)
+ set tag "$optarg" ${1+"$@"}
+ shift
+ prev=tag
+ preserve_args="$preserve_args --tag"
+ ;;
+
+ -dlopen)
+ prevopt="-dlopen"
+ prev=execute_dlfiles
+ ;;
+
+ -*)
+ $echo "$modename: unrecognized option \`$arg'" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+
+ *)
+ nonopt="$arg"
+ break
+ ;;
+ esac
+done
+
+if test -n "$prevopt"; then
+ $echo "$modename: option \`$prevopt' requires an argument" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+fi
+
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end. This prevents here-documents from being
+# left over by shells.
+exec_cmd=
+
+if test -z "$show_help"; then
+
+ # Infer the operation mode.
+ if test -z "$mode"; then
+ $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2
+ $echo "*** Future versions of Libtool will require -mode=MODE be specified." 1>&2
+ case $nonopt in
+ *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*)
+ mode=link
+ for arg
+ do
+ case $arg in
+ -c)
+ mode=compile
+ break
+ ;;
+ esac
+ done
+ ;;
+ *db | *dbx | *strace | *truss)
+ mode=execute
+ ;;
+ *install*|cp|mv)
+ mode=install
+ ;;
+ *rm)
+ mode=uninstall
+ ;;
+ *)
+ # If we have no mode, but dlfiles were specified, then do execute mode.
+ test -n "$execute_dlfiles" && mode=execute
+
+ # Just use the default operation mode.
+ if test -z "$mode"; then
+ if test -n "$nonopt"; then
+ $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2
+ else
+ $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2
+ fi
+ fi
+ ;;
+ esac
+ fi
+
+ # Only execute mode is allowed to have -dlopen flags.
+ if test -n "$execute_dlfiles" && test "$mode" != execute; then
+ $echo "$modename: unrecognized option \`-dlopen'" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Change the help message to a mode-specific one.
+ generic_help="$help"
+ help="Try \`$modename --help --mode=$mode' for more information."
+
+ # These modes are in order of execution frequency so that they run quickly.
+ case $mode in
+ # libtool compile mode
+ compile)
+ modename="$modename: compile"
+ # Get the compilation command and the source file.
+ base_compile=
+ srcfile="$nonopt" # always keep a non-empty value in "srcfile"
+ suppress_opt=yes
+ suppress_output=
+ arg_mode=normal
+ libobj=
+ later=
+
+ for arg
+ do
+ case "$arg_mode" in
+ arg )
+ # do not "continue". Instead, add this to base_compile
+ lastarg="$arg"
+ arg_mode=normal
+ ;;
+
+ target )
+ libobj="$arg"
+ arg_mode=normal
+ continue
+ ;;
+
+ normal )
+ # Accept any command-line options.
+ case $arg in
+ -o)
+ if test -n "$libobj" ; then
+ $echo "$modename: you cannot specify \`-o' more than once" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ arg_mode=target
+ continue
+ ;;
+
+ -static | -prefer-pic | -prefer-non-pic)
+ later="$later $arg"
+ continue
+ ;;
+
+ -no-suppress)
+ suppress_opt=no
+ continue
+ ;;
+
+ -Xcompiler)
+ arg_mode=arg # the next one goes into the "base_compile" arg list
+ continue # The current "srcfile" will either be retained or
+ ;; # replaced later. I would guess that would be a bug.
+
+ -Wc,*)
+ args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"`
+ lastarg=
+ save_ifs="$IFS"; IFS=','
+ for arg in $args; do
+ IFS="$save_ifs"
+
+ # Double-quote args containing other shell metacharacters.
+ # Many Bourne shells cannot handle close brackets correctly
+ # in scan sets, so we specify it separately.
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ lastarg="$lastarg $arg"
+ done
+ IFS="$save_ifs"
+ lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"`
+
+ # Add the arguments to base_compile.
+ base_compile="$base_compile $lastarg"
+ continue
+ ;;
+
+ * )
+ # Accept the current argument as the source file.
+ # The previous "srcfile" becomes the current argument.
+ #
+ lastarg="$srcfile"
+ srcfile="$arg"
+ ;;
+ esac # case $arg
+ ;;
+ esac # case $arg_mode
+
+ # Aesthetically quote the previous argument.
+ lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"`
+
+ case $lastarg in
+ # Double-quote args containing other shell metacharacters.
+ # Many Bourne shells cannot handle close brackets correctly
+ # in scan sets, so we specify it separately.
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ lastarg="\"$lastarg\""
+ ;;
+ esac
+
+ base_compile="$base_compile $lastarg"
+ done # for arg
+
+ case $arg_mode in
+ arg)
+ $echo "$modename: you must specify an argument for -Xcompile"
+ exit $EXIT_FAILURE
+ ;;
+ target)
+ $echo "$modename: you must specify a target with \`-o'" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ *)
+ # Get the name of the library object.
+ [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'`
+ ;;
+ esac
+
+ # Recognize several different file suffixes.
+ # If the user specifies -o file.o, it is replaced with file.lo
+ xform='[cCFSifmso]'
+ case $libobj in
+ *.ada) xform=ada ;;
+ *.adb) xform=adb ;;
+ *.ads) xform=ads ;;
+ *.asm) xform=asm ;;
+ *.c++) xform=c++ ;;
+ *.cc) xform=cc ;;
+ *.ii) xform=ii ;;
+ *.class) xform=class ;;
+ *.cpp) xform=cpp ;;
+ *.cxx) xform=cxx ;;
+ *.f90) xform=f90 ;;
+ *.for) xform=for ;;
+ *.java) xform=java ;;
+ esac
+
+ libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"`
+
+ case $libobj in
+ *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;;
+ *)
+ $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ func_infer_tag $base_compile
+
+ for arg in $later; do
+ case $arg in
+ -static)
+ build_old_libs=yes
+ continue
+ ;;
+
+ -prefer-pic)
+ pic_mode=yes
+ continue
+ ;;
+
+ -prefer-non-pic)
+ pic_mode=no
+ continue
+ ;;
+ esac
+ done
+
+ objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'`
+ xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$obj"; then
+ xdir=
+ else
+ xdir=$xdir/
+ fi
+ lobj=${xdir}$objdir/$objname
+
+ if test -z "$base_compile"; then
+ $echo "$modename: you must specify a compilation command" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Delete any leftover library objects.
+ if test "$build_old_libs" = yes; then
+ removelist="$obj $lobj $libobj ${libobj}T"
+ else
+ removelist="$lobj $libobj ${libobj}T"
+ fi
+
+ $run $rm $removelist
+ trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15
+
+ # On Cygwin there's no "real" PIC flag so we must build both object types
+ case $host_os in
+ cygwin* | mingw* | pw32* | os2*)
+ pic_mode=default
+ ;;
+ esac
+ if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
+ # non-PIC code in shared libraries is not supported
+ pic_mode=default
+ fi
+
+ # Calculate the filename of the output object if compiler does
+ # not support -o with -c
+ if test "$compiler_c_o" = no; then
+ output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext}
+ lockfile="$output_obj.lock"
+ removelist="$removelist $output_obj $lockfile"
+ trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15
+ else
+ output_obj=
+ need_locks=no
+ lockfile=
+ fi
+
+ # Lock this critical section if it is needed
+ # We use this script file to make the link, it avoids creating a new file
+ if test "$need_locks" = yes; then
+ until $run ln "$progpath" "$lockfile" 2>/dev/null; do
+ $show "Waiting for $lockfile to be removed"
+ sleep 2
+ done
+ elif test "$need_locks" = warn; then
+ if test -f "$lockfile"; then
+ $echo "\
+*** ERROR, $lockfile exists and contains:
+`cat $lockfile 2>/dev/null`
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together. If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+ $run $rm $removelist
+ exit $EXIT_FAILURE
+ fi
+ $echo $srcfile > "$lockfile"
+ fi
+
+ if test -n "$fix_srcfile_path"; then
+ eval srcfile=\"$fix_srcfile_path\"
+ fi
+
+ $run $rm "$libobj" "${libobj}T"
+
+ # Create a libtool object file (analogous to a ".la" file),
+ # but don't create it if we're doing a dry run.
+ test -z "$run" && cat > ${libobj}T <<EOF
+# $libobj - a libtool object file
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+EOF
+
+ # Only build a PIC object if we are building libtool libraries.
+ if test "$build_libtool_libs" = yes; then
+ # Without this assignment, base_compile gets emptied.
+ fbsd_hideous_sh_bug=$base_compile
+
+ if test "$pic_mode" != no; then
+ command="$base_compile $srcfile $pic_flag"
+ else
+ # Don't build PIC code
+ command="$base_compile $srcfile"
+ fi
+
+ if test ! -d "${xdir}$objdir"; then
+ $show "$mkdir ${xdir}$objdir"
+ $run $mkdir ${xdir}$objdir
+ status=$?
+ if test "$status" -ne 0 && test ! -d "${xdir}$objdir"; then
+ exit $status
+ fi
+ fi
+
+ if test -z "$output_obj"; then
+ # Place PIC objects in $objdir
+ command="$command -o $lobj"
+ fi
+
+ $run $rm "$lobj" "$output_obj"
+
+ $show "$command"
+ if $run eval "$command"; then :
+ else
+ test -n "$output_obj" && $run $rm $removelist
+ exit $EXIT_FAILURE
+ fi
+
+ if test "$need_locks" = warn &&
+ test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+ $echo "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together. If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+ $run $rm $removelist
+ exit $EXIT_FAILURE
+ fi
+
+ # Just move the object if needed, then go on to compile the next one
+ if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
+ $show "$mv $output_obj $lobj"
+ if $run $mv $output_obj $lobj; then :
+ else
+ error=$?
+ $run $rm $removelist
+ exit $error
+ fi
+ fi
+
+ # Append the name of the PIC object to the libtool object file.
+ test -z "$run" && cat >> ${libobj}T <<EOF
+pic_object='$objdir/$objname'
+
+EOF
+
+ # Allow error messages only from the first compilation.
+ if test "$suppress_opt" = yes; then
+ suppress_output=' >/dev/null 2>&1'
+ fi
+ else
+ # No PIC object so indicate it doesn't exist in the libtool
+ # object file.
+ test -z "$run" && cat >> ${libobj}T <<EOF
+pic_object=none
+
+EOF
+ fi
+
+ # Only build a position-dependent object if we build old libraries.
+ if test "$build_old_libs" = yes; then
+ if test "$pic_mode" != yes; then
+ # Don't build PIC code
+ command="$base_compile $srcfile"
+ else
+ command="$base_compile $srcfile $pic_flag"
+ fi
+ if test "$compiler_c_o" = yes; then
+ command="$command -o $obj"
+ fi
+
+ # Suppress compiler output if we already did a PIC compilation.
+ command="$command$suppress_output"
+ $run $rm "$obj" "$output_obj"
+ $show "$command"
+ if $run eval "$command"; then :
+ else
+ $run $rm $removelist
+ exit $EXIT_FAILURE
+ fi
+
+ if test "$need_locks" = warn &&
+ test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+ $echo "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together. If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+ $run $rm $removelist
+ exit $EXIT_FAILURE
+ fi
+
+ # Just move the object if needed
+ if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
+ $show "$mv $output_obj $obj"
+ if $run $mv $output_obj $obj; then :
+ else
+ error=$?
+ $run $rm $removelist
+ exit $error
+ fi
+ fi
+
+ # Append the name of the non-PIC object the libtool object file.
+ # Only append if the libtool object file exists.
+ test -z "$run" && cat >> ${libobj}T <<EOF
+# Name of the non-PIC object.
+non_pic_object='$objname'
+
+EOF
+ else
+ # Append the name of the non-PIC object the libtool object file.
+ # Only append if the libtool object file exists.
+ test -z "$run" && cat >> ${libobj}T <<EOF
+# Name of the non-PIC object.
+non_pic_object=none
+
+EOF
+ fi
+
+ $run $mv "${libobj}T" "${libobj}"
+
+ # Unlock the critical section if it was locked
+ if test "$need_locks" != no; then
+ $run $rm "$lockfile"
+ fi
+
+ exit $EXIT_SUCCESS
+ ;;
+
+ # libtool link mode
+ link | relink)
+ modename="$modename: link"
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+ # It is impossible to link a dll without this setting, and
+ # we shouldn't force the makefile maintainer to figure out
+ # which system we are compiling for in order to pass an extra
+ # flag for every libtool invocation.
+ # allow_undefined=no
+
+ # FIXME: Unfortunately, there are problems with the above when trying
+ # to make a dll which has undefined symbols, in which case not
+ # even a static library is built. For now, we need to specify
+ # -no-undefined on the libtool link line when we can be certain
+ # that all symbols are satisfied, otherwise we get a static library.
+ allow_undefined=yes
+ ;;
+ *)
+ allow_undefined=yes
+ ;;
+ esac
+ libtool_args="$nonopt"
+ base_compile="$nonopt $@"
+ compile_command="$nonopt"
+ finalize_command="$nonopt"
+
+ compile_rpath=
+ finalize_rpath=
+ compile_shlibpath=
+ finalize_shlibpath=
+ convenience=
+ old_convenience=
+ deplibs=
+ old_deplibs=
+ compiler_flags=
+ linker_flags=
+ dllsearchpath=
+ lib_search_path=`pwd`
+ inst_prefix_dir=
+
+ avoid_version=no
+ dlfiles=
+ dlprefiles=
+ dlself=no
+ export_dynamic=no
+ export_symbols=
+ export_symbols_regex=
+ generated=
+ libobjs=
+ ltlibs=
+ module=no
+ no_install=no
+ objs=
+ non_pic_objects=
+ precious_files_regex=
+ prefer_static_libs=no
+ preload=no
+ prev=
+ prevarg=
+ release=
+ rpath=
+ xrpath=
+ perm_rpath=
+ temp_rpath=
+ thread_safe=no
+ vinfo=
+ vinfo_number=no
+
+ func_infer_tag $base_compile
+
+ # We need to know -static, to get the right output filenames.
+ for arg
+ do
+ case $arg in
+ -all-static | -static)
+ if test "X$arg" = "X-all-static"; then
+ if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+ $echo "$modename: warning: complete static linking is impossible in this configuration" 1>&2
+ fi
+ if test -n "$link_static_flag"; then
+ dlopen_self=$dlopen_self_static
+ fi
+ else
+ if test -z "$pic_flag" && test -n "$link_static_flag"; then
+ dlopen_self=$dlopen_self_static
+ fi
+ fi
+ build_libtool_libs=no
+ build_old_libs=yes
+ prefer_static_libs=yes
+ break
+ ;;
+ esac
+ done
+
+ # See if our shared archives depend on static archives.
+ test -n "$old_archive_from_new_cmds" && build_old_libs=yes
+
+ # Go through the arguments, transforming them on the way.
+ while test "$#" -gt 0; do
+ arg="$1"
+ shift
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test
+ ;;
+ *) qarg=$arg ;;
+ esac
+ libtool_args="$libtool_args $qarg"
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$prev"; then
+ case $prev in
+ output)
+ compile_command="$compile_command @OUTPUT@"
+ finalize_command="$finalize_command @OUTPUT@"
+ ;;
+ esac
+
+ case $prev in
+ dlfiles|dlprefiles)
+ if test "$preload" = no; then
+ # Add the symbol object into the linking commands.
+ compile_command="$compile_command @SYMFILE@"
+ finalize_command="$finalize_command @SYMFILE@"
+ preload=yes
+ fi
+ case $arg in
+ *.la | *.lo) ;; # We handle these cases below.
+ force)
+ if test "$dlself" = no; then
+ dlself=needless
+ export_dynamic=yes
+ fi
+ prev=
+ continue
+ ;;
+ self)
+ if test "$prev" = dlprefiles; then
+ dlself=yes
+ elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
+ dlself=yes
+ else
+ dlself=needless
+ export_dynamic=yes
+ fi
+ prev=
+ continue
+ ;;
+ *)
+ if test "$prev" = dlfiles; then
+ dlfiles="$dlfiles $arg"
+ else
+ dlprefiles="$dlprefiles $arg"
+ fi
+ prev=
+ continue
+ ;;
+ esac
+ ;;
+ expsyms)
+ export_symbols="$arg"
+ if test ! -f "$arg"; then
+ $echo "$modename: symbol file \`$arg' does not exist"
+ exit $EXIT_FAILURE
+ fi
+ prev=
+ continue
+ ;;
+ expsyms_regex)
+ export_symbols_regex="$arg"
+ prev=
+ continue
+ ;;
+ inst_prefix)
+ inst_prefix_dir="$arg"
+ prev=
+ continue
+ ;;
+ precious_regex)
+ precious_files_regex="$arg"
+ prev=
+ continue
+ ;;
+ release)
+ release="-$arg"
+ prev=
+ continue
+ ;;
+ objectlist)
+ if test -f "$arg"; then
+ save_arg=$arg
+ moreargs=
+ for fil in `cat $save_arg`
+ do
+# moreargs="$moreargs $fil"
+ arg=$fil
+ # A libtool-controlled object.
+
+ # Check to see that this really is a libtool object.
+ if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ pic_object=
+ non_pic_object=
+
+ # Read the .lo file
+ # If there is no directory component, then add one.
+ case $arg in
+ */* | *\\*) . $arg ;;
+ *) . ./$arg ;;
+ esac
+
+ if test -z "$pic_object" || \
+ test -z "$non_pic_object" ||
+ test "$pic_object" = none && \
+ test "$non_pic_object" = none; then
+ $echo "$modename: cannot find name of object for \`$arg'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Extract subdirectory from the argument.
+ xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$arg"; then
+ xdir=
+ else
+ xdir="$xdir/"
+ fi
+
+ if test "$pic_object" != none; then
+ # Prepend the subdirectory the object is found in.
+ pic_object="$xdir$pic_object"
+
+ if test "$prev" = dlfiles; then
+ if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+ dlfiles="$dlfiles $pic_object"
+ prev=
+ continue
+ else
+ # If libtool objects are unsupported, then we need to preload.
+ prev=dlprefiles
+ fi
+ fi
+
+ # CHECK ME: I think I busted this. -Ossama
+ if test "$prev" = dlprefiles; then
+ # Preload the old-style object.
+ dlprefiles="$dlprefiles $pic_object"
+ prev=
+ fi
+
+ # A PIC object.
+ libobjs="$libobjs $pic_object"
+ arg="$pic_object"
+ fi
+
+ # Non-PIC object.
+ if test "$non_pic_object" != none; then
+ # Prepend the subdirectory the object is found in.
+ non_pic_object="$xdir$non_pic_object"
+
+ # A standard non-PIC object
+ non_pic_objects="$non_pic_objects $non_pic_object"
+ if test -z "$pic_object" || test "$pic_object" = none ; then
+ arg="$non_pic_object"
+ fi
+ fi
+ else
+ # Only an error if not doing a dry-run.
+ if test -z "$run"; then
+ $echo "$modename: \`$arg' is not a valid libtool object" 1>&2
+ exit $EXIT_FAILURE
+ else
+ # Dry-run case.
+
+ # Extract subdirectory from the argument.
+ xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$arg"; then
+ xdir=
+ else
+ xdir="$xdir/"
+ fi
+
+ pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"`
+ non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"`
+ libobjs="$libobjs $pic_object"
+ non_pic_objects="$non_pic_objects $non_pic_object"
+ fi
+ fi
+ done
+ else
+ $echo "$modename: link input file \`$save_arg' does not exist"
+ exit $EXIT_FAILURE
+ fi
+ arg=$save_arg
+ prev=
+ continue
+ ;;
+ rpath | xrpath)
+ # We need an absolute path.
+ case $arg in
+ [\\/]* | [A-Za-z]:[\\/]*) ;;
+ *)
+ $echo "$modename: only absolute run-paths are allowed" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+ if test "$prev" = rpath; then
+ case "$rpath " in
+ *" $arg "*) ;;
+ *) rpath="$rpath $arg" ;;
+ esac
+ else
+ case "$xrpath " in
+ *" $arg "*) ;;
+ *) xrpath="$xrpath $arg" ;;
+ esac
+ fi
+ prev=
+ continue
+ ;;
+ xcompiler)
+ compiler_flags="$compiler_flags $qarg"
+ prev=
+ compile_command="$compile_command $qarg"
+ finalize_command="$finalize_command $qarg"
+ continue
+ ;;
+ xlinker)
+ linker_flags="$linker_flags $qarg"
+ compiler_flags="$compiler_flags $wl$qarg"
+ prev=
+ compile_command="$compile_command $wl$qarg"
+ finalize_command="$finalize_command $wl$qarg"
+ continue
+ ;;
+ xcclinker)
+ linker_flags="$linker_flags $qarg"
+ compiler_flags="$compiler_flags $qarg"
+ prev=
+ compile_command="$compile_command $qarg"
+ finalize_command="$finalize_command $qarg"
+ continue
+ ;;
+ shrext)
+ shrext_cmds="$arg"
+ prev=
+ continue
+ ;;
+ *)
+ eval "$prev=\"\$arg\""
+ prev=
+ continue
+ ;;
+ esac
+ fi # test -n "$prev"
+
+ prevarg="$arg"
+
+ case $arg in
+ -all-static)
+ if test -n "$link_static_flag"; then
+ compile_command="$compile_command $link_static_flag"
+ finalize_command="$finalize_command $link_static_flag"
+ fi
+ continue
+ ;;
+
+ -allow-undefined)
+ # FIXME: remove this flag sometime in the future.
+ $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2
+ continue
+ ;;
+
+ -avoid-version)
+ avoid_version=yes
+ continue
+ ;;
+
+ -dlopen)
+ prev=dlfiles
+ continue
+ ;;
+
+ -dlpreopen)
+ prev=dlprefiles
+ continue
+ ;;
+
+ -export-dynamic)
+ export_dynamic=yes
+ continue
+ ;;
+
+ -export-symbols | -export-symbols-regex)
+ if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+ $echo "$modename: more than one -exported-symbols argument is not allowed"
+ exit $EXIT_FAILURE
+ fi
+ if test "X$arg" = "X-export-symbols"; then
+ prev=expsyms
+ else
+ prev=expsyms_regex
+ fi
+ continue
+ ;;
+
+ -inst-prefix-dir)
+ prev=inst_prefix
+ continue
+ ;;
+
+ # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
+ # so, if we see these flags be careful not to treat them like -L
+ -L[A-Z][A-Z]*:*)
+ case $with_gcc/$host in
+ no/*-*-irix* | /*-*-irix*)
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ ;;
+ esac
+ continue
+ ;;
+
+ -L*)
+ dir=`$echo "X$arg" | $Xsed -e 's/^-L//'`
+ # We need an absolute path.
+ case $dir in
+ [\\/]* | [A-Za-z]:[\\/]*) ;;
+ *)
+ absdir=`cd "$dir" && pwd`
+ if test -z "$absdir"; then
+ $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ dir="$absdir"
+ ;;
+ esac
+ case "$deplibs " in
+ *" -L$dir "*) ;;
+ *)
+ deplibs="$deplibs -L$dir"
+ lib_search_path="$lib_search_path $dir"
+ ;;
+ esac
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+ case :$dllsearchpath: in
+ *":$dir:"*) ;;
+ *) dllsearchpath="$dllsearchpath:$dir";;
+ esac
+ ;;
+ esac
+ continue
+ ;;
+
+ -l*)
+ if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
+ case $host in
+ *-*-cygwin* | *-*-pw32* | *-*-beos*)
+ # These systems don't actually have a C or math library (as such)
+ continue
+ ;;
+ *-*-mingw* | *-*-os2*)
+ # These systems don't actually have a C library (as such)
+ test "X$arg" = "X-lc" && continue
+ ;;
+ *-*-openbsd* | *-*-freebsd*)
+ # Do not include libc due to us having libc/libc_r.
+ test "X$arg" = "X-lc" && continue
+ ;;
+ *-*-rhapsody* | *-*-darwin1.[012])
+ # Rhapsody C and math libraries are in the System framework
+ deplibs="$deplibs -framework System"
+ continue
+ esac
+ elif test "X$arg" = "X-lc_r"; then
+ case $host in
+ *-*-openbsd* | *-*-freebsd*)
+ # Do not include libc_r directly, use -pthread flag.
+ continue
+ ;;
+ esac
+ fi
+ deplibs="$deplibs $arg"
+ continue
+ ;;
+
+ -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe)
+ deplibs="$deplibs $arg"
+ continue
+ ;;
+
+ -module)
+ module=yes
+ continue
+ ;;
+
+ # gcc -m* arguments should be passed to the linker via $compiler_flags
+ # in order to pass architecture information to the linker
+ # (e.g. 32 vs 64-bit). This may also be accomplished via -Wl,-mfoo
+ # but this is not reliable with gcc because gcc may use -mfoo to
+ # select a different linker, different libraries, etc, while
+ # -Wl,-mfoo simply passes -mfoo to the linker.
+ -m*)
+ # Unknown arguments in both finalize_command and compile_command need
+ # to be aesthetically quoted because they are evaled later.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ if test "$with_gcc" = "yes" ; then
+ compiler_flags="$compiler_flags $arg"
+ fi
+ continue
+ ;;
+
+ -shrext)
+ prev=shrext
+ continue
+ ;;
+
+ -no-fast-install)
+ fast_install=no
+ continue
+ ;;
+
+ -no-install)
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+ # The PATH hackery in wrapper scripts is required on Windows
+ # in order for the loader to find any dlls it needs.
+ $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2
+ $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2
+ fast_install=no
+ ;;
+ *) no_install=yes ;;
+ esac
+ continue
+ ;;
+
+ -no-undefined)
+ allow_undefined=no
+ continue
+ ;;
+
+ -objectlist)
+ prev=objectlist
+ continue
+ ;;
+
+ -o) prev=output ;;
+
+ -precious-files-regex)
+ prev=precious_regex
+ continue
+ ;;
+
+ -release)
+ prev=release
+ continue
+ ;;
+
+ -rpath)
+ prev=rpath
+ continue
+ ;;
+
+ -R)
+ prev=xrpath
+ continue
+ ;;
+
+ -R*)
+ dir=`$echo "X$arg" | $Xsed -e 's/^-R//'`
+ # We need an absolute path.
+ case $dir in
+ [\\/]* | [A-Za-z]:[\\/]*) ;;
+ *)
+ $echo "$modename: only absolute run-paths are allowed" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+ case "$xrpath " in
+ *" $dir "*) ;;
+ *) xrpath="$xrpath $dir" ;;
+ esac
+ continue
+ ;;
+
+ -static)
+ # The effects of -static are defined in a previous loop.
+ # We used to do the same as -all-static on platforms that
+ # didn't have a PIC flag, but the assumption that the effects
+ # would be equivalent was wrong. It would break on at least
+ # Digital Unix and AIX.
+ continue
+ ;;
+
+ -thread-safe)
+ thread_safe=yes
+ continue
+ ;;
+
+ -version-info)
+ prev=vinfo
+ continue
+ ;;
+ -version-number)
+ prev=vinfo
+ vinfo_number=yes
+ continue
+ ;;
+
+ -Wc,*)
+ args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'`
+ arg=
+ save_ifs="$IFS"; IFS=','
+ for flag in $args; do
+ IFS="$save_ifs"
+ case $flag in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ flag="\"$flag\""
+ ;;
+ esac
+ arg="$arg $wl$flag"
+ compiler_flags="$compiler_flags $flag"
+ done
+ IFS="$save_ifs"
+ arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
+ ;;
+
+ -Wl,*)
+ args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'`
+ arg=
+ save_ifs="$IFS"; IFS=','
+ for flag in $args; do
+ IFS="$save_ifs"
+ case $flag in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ flag="\"$flag\""
+ ;;
+ esac
+ arg="$arg $wl$flag"
+ compiler_flags="$compiler_flags $wl$flag"
+ linker_flags="$linker_flags $flag"
+ done
+ IFS="$save_ifs"
+ arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
+ ;;
+
+ -Xcompiler)
+ prev=xcompiler
+ continue
+ ;;
+
+ -Xlinker)
+ prev=xlinker
+ continue
+ ;;
+
+ -XCClinker)
+ prev=xcclinker
+ continue
+ ;;
+
+ # Some other compiler flag.
+ -* | +*)
+ # Unknown arguments in both finalize_command and compile_command need
+ # to be aesthetically quoted because they are evaled later.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ ;;
+
+ *.$objext)
+ # A standard object.
+ objs="$objs $arg"
+ ;;
+
+ *.lo)
+ # A libtool-controlled object.
+
+ # Check to see that this really is a libtool object.
+ if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ pic_object=
+ non_pic_object=
+
+ # Read the .lo file
+ # If there is no directory component, then add one.
+ case $arg in
+ */* | *\\*) . $arg ;;
+ *) . ./$arg ;;
+ esac
+
+ if test -z "$pic_object" || \
+ test -z "$non_pic_object" ||
+ test "$pic_object" = none && \
+ test "$non_pic_object" = none; then
+ $echo "$modename: cannot find name of object for \`$arg'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Extract subdirectory from the argument.
+ xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$arg"; then
+ xdir=
+ else
+ xdir="$xdir/"
+ fi
+
+ if test "$pic_object" != none; then
+ # Prepend the subdirectory the object is found in.
+ pic_object="$xdir$pic_object"
+
+ if test "$prev" = dlfiles; then
+ if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+ dlfiles="$dlfiles $pic_object"
+ prev=
+ continue
+ else
+ # If libtool objects are unsupported, then we need to preload.
+ prev=dlprefiles
+ fi
+ fi
+
+ # CHECK ME: I think I busted this. -Ossama
+ if test "$prev" = dlprefiles; then
+ # Preload the old-style object.
+ dlprefiles="$dlprefiles $pic_object"
+ prev=
+ fi
+
+ # A PIC object.
+ libobjs="$libobjs $pic_object"
+ arg="$pic_object"
+ fi
+
+ # Non-PIC object.
+ if test "$non_pic_object" != none; then
+ # Prepend the subdirectory the object is found in.
+ non_pic_object="$xdir$non_pic_object"
+
+ # A standard non-PIC object
+ non_pic_objects="$non_pic_objects $non_pic_object"
+ if test -z "$pic_object" || test "$pic_object" = none ; then
+ arg="$non_pic_object"
+ fi
+ fi
+ else
+ # Only an error if not doing a dry-run.
+ if test -z "$run"; then
+ $echo "$modename: \`$arg' is not a valid libtool object" 1>&2
+ exit $EXIT_FAILURE
+ else
+ # Dry-run case.
+
+ # Extract subdirectory from the argument.
+ xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$arg"; then
+ xdir=
+ else
+ xdir="$xdir/"
+ fi
+
+ pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"`
+ non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"`
+ libobjs="$libobjs $pic_object"
+ non_pic_objects="$non_pic_objects $non_pic_object"
+ fi
+ fi
+ ;;
+
+ *.$libext)
+ # An archive.
+ deplibs="$deplibs $arg"
+ old_deplibs="$old_deplibs $arg"
+ continue
+ ;;
+
+ *.la)
+ # A libtool-controlled library.
+
+ if test "$prev" = dlfiles; then
+ # This library was specified with -dlopen.
+ dlfiles="$dlfiles $arg"
+ prev=
+ elif test "$prev" = dlprefiles; then
+ # The library was specified with -dlpreopen.
+ dlprefiles="$dlprefiles $arg"
+ prev=
+ else
+ deplibs="$deplibs $arg"
+ fi
+ continue
+ ;;
+
+ # Some other compiler argument.
+ *)
+ # Unknown arguments in both finalize_command and compile_command need
+ # to be aesthetically quoted because they are evaled later.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ ;;
+ esac # arg
+
+ # Now actually substitute the argument into the commands.
+ if test -n "$arg"; then
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ fi
+ done # argument parsing loop
+
+ if test -n "$prev"; then
+ $echo "$modename: the \`$prevarg' option requires an argument" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+ eval arg=\"$export_dynamic_flag_spec\"
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ fi
+
+ oldlibs=
+ # calculate the name of the file, without its directory
+ outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'`
+ libobjs_save="$libobjs"
+
+ if test -n "$shlibpath_var"; then
+ # get the directories listed in $shlibpath_var
+ eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\`
+ else
+ shlib_search_path=
+ fi
+ eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
+ eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
+
+ output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$output_objdir" = "X$output"; then
+ output_objdir="$objdir"
+ else
+ output_objdir="$output_objdir/$objdir"
+ fi
+ # Create the object directory.
+ if test ! -d "$output_objdir"; then
+ $show "$mkdir $output_objdir"
+ $run $mkdir $output_objdir
+ status=$?
+ if test "$status" -ne 0 && test ! -d "$output_objdir"; then
+ exit $status
+ fi
+ fi
+
+ # Determine the type of output
+ case $output in
+ "")
+ $echo "$modename: you must specify an output file" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ *.$libext) linkmode=oldlib ;;
+ *.lo | *.$objext) linkmode=obj ;;
+ *.la) linkmode=lib ;;
+ *) linkmode=prog ;; # Anything else should be a program.
+ esac
+
+ case $host in
+ *cygwin* | *mingw* | *pw32*)
+ # don't eliminate duplications in $postdeps and $predeps
+ duplicate_compiler_generated_deps=yes
+ ;;
+ *)
+ duplicate_compiler_generated_deps=$duplicate_deps
+ ;;
+ esac
+ specialdeplibs=
+
+ libs=
+ # Find all interdependent deplibs by searching for libraries
+ # that are linked more than once (e.g. -la -lb -la)
+ for deplib in $deplibs; do
+ if test "X$duplicate_deps" = "Xyes" ; then
+ case "$libs " in
+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ esac
+ fi
+ libs="$libs $deplib"
+ done
+
+ if test "$linkmode" = lib; then
+ libs="$predeps $libs $compiler_lib_search_path $postdeps"
+
+ # Compute libraries that are listed more than once in $predeps
+ # $postdeps and mark them as special (i.e., whose duplicates are
+ # not to be eliminated).
+ pre_post_deps=
+ if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then
+ for pre_post_dep in $predeps $postdeps; do
+ case "$pre_post_deps " in
+ *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;;
+ esac
+ pre_post_deps="$pre_post_deps $pre_post_dep"
+ done
+ fi
+ pre_post_deps=
+ fi
+
+ deplibs=
+ newdependency_libs=
+ newlib_search_path=
+ need_relink=no # whether we're linking any uninstalled libtool libraries
+ notinst_deplibs= # not-installed libtool libraries
+ notinst_path= # paths that contain not-installed libtool libraries
+ case $linkmode in
+ lib)
+ passes="conv link"
+ for file in $dlfiles $dlprefiles; do
+ case $file in
+ *.la) ;;
+ *)
+ $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+ done
+ ;;
+ prog)
+ compile_deplibs=
+ finalize_deplibs=
+ alldeplibs=no
+ newdlfiles=
+ newdlprefiles=
+ passes="conv scan dlopen dlpreopen link"
+ ;;
+ *) passes="conv"
+ ;;
+ esac
+ for pass in $passes; do
+ if test "$linkmode,$pass" = "lib,link" ||
+ test "$linkmode,$pass" = "prog,scan"; then
+ libs="$deplibs"
+ deplibs=
+ fi
+ if test "$linkmode" = prog; then
+ case $pass in
+ dlopen) libs="$dlfiles" ;;
+ dlpreopen) libs="$dlprefiles" ;;
+ link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
+ esac
+ fi
+ if test "$pass" = dlopen; then
+ # Collect dlpreopened libraries
+ save_deplibs="$deplibs"
+ deplibs=
+ fi
+ for deplib in $libs; do
+ lib=
+ found=no
+ case $deplib in
+ -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe)
+ if test "$linkmode,$pass" = "prog,link"; then
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ deplibs="$deplib $deplibs"
+ fi
+ continue
+ ;;
+ -l*)
+ if test "$linkmode" != lib && test "$linkmode" != prog; then
+ $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2
+ continue
+ fi
+ if test "$pass" = conv; then
+ deplibs="$deplib $deplibs"
+ continue
+ fi
+ name=`$echo "X$deplib" | $Xsed -e 's/^-l//'`
+ for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do
+ for search_ext in .la $std_shrext .so .a; do
+ # Search the libtool library
+ lib="$searchdir/lib${name}${search_ext}"
+ if test -f "$lib"; then
+ if test "$search_ext" = ".la"; then
+ found=yes
+ else
+ found=no
+ fi
+ break 2
+ fi
+ done
+ done
+ if test "$found" != yes; then
+ # deplib doesn't seem to be a libtool library
+ if test "$linkmode,$pass" = "prog,link"; then
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ deplibs="$deplib $deplibs"
+ test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+ fi
+ continue
+ else # deplib is a libtool library
+ # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
+ # We need to do some special things here, and not later.
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ case " $predeps $postdeps " in
+ *" $deplib "*)
+ if (${SED} -e '2q' $lib |
+ grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ library_names=
+ old_library=
+ case $lib in
+ */* | *\\*) . $lib ;;
+ *) . ./$lib ;;
+ esac
+ for l in $old_library $library_names; do
+ ll="$l"
+ done
+ if test "X$ll" = "X$old_library" ; then # only static version available
+ found=no
+ ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$ladir" = "X$lib" && ladir="."
+ lib=$ladir/$old_library
+ if test "$linkmode,$pass" = "prog,link"; then
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ deplibs="$deplib $deplibs"
+ test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+ fi
+ continue
+ fi
+ fi
+ ;;
+ *) ;;
+ esac
+ fi
+ fi
+ ;; # -l
+ -L*)
+ case $linkmode in
+ lib)
+ deplibs="$deplib $deplibs"
+ test "$pass" = conv && continue
+ newdependency_libs="$deplib $newdependency_libs"
+ newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
+ ;;
+ prog)
+ if test "$pass" = conv; then
+ deplibs="$deplib $deplibs"
+ continue
+ fi
+ if test "$pass" = scan; then
+ deplibs="$deplib $deplibs"
+ else
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ fi
+ newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
+ ;;
+ *)
+ $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2
+ ;;
+ esac # linkmode
+ continue
+ ;; # -L
+ -R*)
+ if test "$pass" = link; then
+ dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'`
+ # Make sure the xrpath contains only unique directories.
+ case "$xrpath " in
+ *" $dir "*) ;;
+ *) xrpath="$xrpath $dir" ;;
+ esac
+ fi
+ deplibs="$deplib $deplibs"
+ continue
+ ;;
+ *.la) lib="$deplib" ;;
+ *.$libext)
+ if test "$pass" = conv; then
+ deplibs="$deplib $deplibs"
+ continue
+ fi
+ case $linkmode in
+ lib)
+ if test "$deplibs_check_method" != pass_all; then
+ $echo
+ $echo "*** Warning: Trying to link with static lib archive $deplib."
+ $echo "*** I have the capability to make that library automatically link in when"
+ $echo "*** you link to this library. But I can only do this if you have a"
+ $echo "*** shared version of the library, which you do not appear to have"
+ $echo "*** because the file extensions .$libext of this argument makes me believe"
+ $echo "*** that it is just a static archive that I should not used here."
+ else
+ $echo
+ $echo "*** Warning: Linking the shared library $output against the"
+ $echo "*** static library $deplib is not portable!"
+ deplibs="$deplib $deplibs"
+ fi
+ continue
+ ;;
+ prog)
+ if test "$pass" != link; then
+ deplibs="$deplib $deplibs"
+ else
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ fi
+ continue
+ ;;
+ esac # linkmode
+ ;; # *.$libext
+ *.lo | *.$objext)
+ if test "$pass" = conv; then
+ deplibs="$deplib $deplibs"
+ elif test "$linkmode" = prog; then
+ if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+ # If there is no dlopen support or we're linking statically,
+ # we need to preload.
+ newdlprefiles="$newdlprefiles $deplib"
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ newdlfiles="$newdlfiles $deplib"
+ fi
+ fi
+ continue
+ ;;
+ %DEPLIBS%)
+ alldeplibs=yes
+ continue
+ ;;
+ esac # case $deplib
+ if test "$found" = yes || test -f "$lib"; then :
+ else
+ $echo "$modename: cannot find the library \`$lib'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Check to see that this really is a libtool archive.
+ if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+ else
+ $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$ladir" = "X$lib" && ladir="."
+
+ dlname=
+ dlopen=
+ dlpreopen=
+ libdir=
+ library_names=
+ old_library=
+ # If the library was installed with an old release of libtool,
+ # it will not redefine variables installed, or shouldnotlink
+ installed=yes
+ shouldnotlink=no
+
+ # Read the .la file
+ case $lib in
+ */* | *\\*) . $lib ;;
+ *) . ./$lib ;;
+ esac
+
+ if test "$linkmode,$pass" = "lib,link" ||
+ test "$linkmode,$pass" = "prog,scan" ||
+ { test "$linkmode" != prog && test "$linkmode" != lib; }; then
+ test -n "$dlopen" && dlfiles="$dlfiles $dlopen"
+ test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen"
+ fi
+
+ if test "$pass" = conv; then
+ # Only check for convenience libraries
+ deplibs="$lib $deplibs"
+ if test -z "$libdir"; then
+ if test -z "$old_library"; then
+ $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ # It is a libtool convenience library, so add in its objects.
+ convenience="$convenience $ladir/$objdir/$old_library"
+ old_convenience="$old_convenience $ladir/$objdir/$old_library"
+ tmp_libs=
+ for deplib in $dependency_libs; do
+ deplibs="$deplib $deplibs"
+ if test "X$duplicate_deps" = "Xyes" ; then
+ case "$tmp_libs " in
+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ esac
+ fi
+ tmp_libs="$tmp_libs $deplib"
+ done
+ elif test "$linkmode" != prog && test "$linkmode" != lib; then
+ $echo "$modename: \`$lib' is not a convenience library" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ continue
+ fi # $pass = conv
+
+
+ # Get the name of the library we link against.
+ linklib=
+ for l in $old_library $library_names; do
+ linklib="$l"
+ done
+ if test -z "$linklib"; then
+ $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # This library was specified with -dlopen.
+ if test "$pass" = dlopen; then
+ if test -z "$libdir"; then
+ $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ if test -z "$dlname" ||
+ test "$dlopen_support" != yes ||
+ test "$build_libtool_libs" = no; then
+ # If there is no dlname, no dlopen support or we're linking
+ # statically, we need to preload. We also need to preload any
+ # dependent libraries so libltdl's deplib preloader doesn't
+ # bomb out in the load deplibs phase.
+ dlprefiles="$dlprefiles $lib $dependency_libs"
+ else
+ newdlfiles="$newdlfiles $lib"
+ fi
+ continue
+ fi # $pass = dlopen
+
+ # We need an absolute path.
+ case $ladir in
+ [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
+ *)
+ abs_ladir=`cd "$ladir" && pwd`
+ if test -z "$abs_ladir"; then
+ $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2
+ $echo "$modename: passing it literally to the linker, although it might fail" 1>&2
+ abs_ladir="$ladir"
+ fi
+ ;;
+ esac
+ laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+
+ # Find the relevant object directory and library name.
+ if test "X$installed" = Xyes; then
+ if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+ $echo "$modename: warning: library \`$lib' was moved." 1>&2
+ dir="$ladir"
+ absdir="$abs_ladir"
+ libdir="$abs_ladir"
+ else
+ dir="$libdir"
+ absdir="$libdir"
+ fi
+ else
+ dir="$ladir/$objdir"
+ absdir="$abs_ladir/$objdir"
+ # Remove this search path later
+ notinst_path="$notinst_path $abs_ladir"
+ fi # $installed = yes
+ name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
+
+ # This library was specified with -dlpreopen.
+ if test "$pass" = dlpreopen; then
+ if test -z "$libdir"; then
+ $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ # Prefer using a static library (so that no silly _DYNAMIC symbols
+ # are required to link).
+ if test -n "$old_library"; then
+ newdlprefiles="$newdlprefiles $dir/$old_library"
+ # Otherwise, use the dlname, so that lt_dlopen finds it.
+ elif test -n "$dlname"; then
+ newdlprefiles="$newdlprefiles $dir/$dlname"
+ else
+ newdlprefiles="$newdlprefiles $dir/$linklib"
+ fi
+ fi # $pass = dlpreopen
+
+ if test -z "$libdir"; then
+ # Link the convenience library
+ if test "$linkmode" = lib; then
+ deplibs="$dir/$old_library $deplibs"
+ elif test "$linkmode,$pass" = "prog,link"; then
+ compile_deplibs="$dir/$old_library $compile_deplibs"
+ finalize_deplibs="$dir/$old_library $finalize_deplibs"
+ else
+ deplibs="$lib $deplibs" # used for prog,scan pass
+ fi
+ continue
+ fi
+
+
+ if test "$linkmode" = prog && test "$pass" != link; then
+ newlib_search_path="$newlib_search_path $ladir"
+ deplibs="$lib $deplibs"
+
+ linkalldeplibs=no
+ if test "$link_all_deplibs" != no || test -z "$library_names" ||
+ test "$build_libtool_libs" = no; then
+ linkalldeplibs=yes
+ fi
+
+ tmp_libs=
+ for deplib in $dependency_libs; do
+ case $deplib in
+ -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test
+ esac
+ # Need to link against all dependency_libs?
+ if test "$linkalldeplibs" = yes; then
+ deplibs="$deplib $deplibs"
+ else
+ # Need to hardcode shared library paths
+ # or/and link against static libraries
+ newdependency_libs="$deplib $newdependency_libs"
+ fi
+ if test "X$duplicate_deps" = "Xyes" ; then
+ case "$tmp_libs " in
+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ esac
+ fi
+ tmp_libs="$tmp_libs $deplib"
+ done # for deplib
+ continue
+ fi # $linkmode = prog...
+
+ if test "$linkmode,$pass" = "prog,link"; then
+ if test -n "$library_names" &&
+ { test "$prefer_static_libs" = no || test -z "$old_library"; }; then
+ # We need to hardcode the library path
+ if test -n "$shlibpath_var"; then
+ # Make sure the rpath contains only unique directories.
+ case "$temp_rpath " in
+ *" $dir "*) ;;
+ *" $absdir "*) ;;
+ *) temp_rpath="$temp_rpath $dir" ;;
+ esac
+ fi
+
+ # Hardcode the library path.
+ # Skip directories that are in the system default run-time
+ # search path.
+ case " $sys_lib_dlsearch_path " in
+ *" $absdir "*) ;;
+ *)
+ case "$compile_rpath " in
+ *" $absdir "*) ;;
+ *) compile_rpath="$compile_rpath $absdir"
+ esac
+ ;;
+ esac
+ case " $sys_lib_dlsearch_path " in
+ *" $libdir "*) ;;
+ *)
+ case "$finalize_rpath " in
+ *" $libdir "*) ;;
+ *) finalize_rpath="$finalize_rpath $libdir"
+ esac
+ ;;
+ esac
+ fi # $linkmode,$pass = prog,link...
+
+ if test "$alldeplibs" = yes &&
+ { test "$deplibs_check_method" = pass_all ||
+ { test "$build_libtool_libs" = yes &&
+ test -n "$library_names"; }; }; then
+ # We only need to search for static libraries
+ continue
+ fi
+ fi
+
+ link_static=no # Whether the deplib will be linked statically
+ if test -n "$library_names" &&
+ { test "$prefer_static_libs" = no || test -z "$old_library"; }; then
+ if test "$installed" = no; then
+ notinst_deplibs="$notinst_deplibs $lib"
+ need_relink=yes
+ fi
+ # This is a shared library
+
+ # Warn about portability, can't link against -module's on
+ # some systems (darwin)
+ if test "$shouldnotlink" = yes && test "$pass" = link ; then
+ $echo
+ if test "$linkmode" = prog; then
+ $echo "*** Warning: Linking the executable $output against the loadable module"
+ else
+ $echo "*** Warning: Linking the shared library $output against the loadable module"
+ fi
+ $echo "*** $linklib is not portable!"
+ fi
+ if test "$linkmode" = lib &&
+ test "$hardcode_into_libs" = yes; then
+ # Hardcode the library path.
+ # Skip directories that are in the system default run-time
+ # search path.
+ case " $sys_lib_dlsearch_path " in
+ *" $absdir "*) ;;
+ *)
+ case "$compile_rpath " in
+ *" $absdir "*) ;;
+ *) compile_rpath="$compile_rpath $absdir"
+ esac
+ ;;
+ esac
+ case " $sys_lib_dlsearch_path " in
+ *" $libdir "*) ;;
+ *)
+ case "$finalize_rpath " in
+ *" $libdir "*) ;;
+ *) finalize_rpath="$finalize_rpath $libdir"
+ esac
+ ;;
+ esac
+ fi
+
+ if test -n "$old_archive_from_expsyms_cmds"; then
+ # figure out the soname
+ set dummy $library_names
+ realname="$2"
+ shift; shift
+ libname=`eval \\$echo \"$libname_spec\"`
+ # use dlname if we got it. it's perfectly good, no?
+ if test -n "$dlname"; then
+ soname="$dlname"
+ elif test -n "$soname_spec"; then
+ # bleh windows
+ case $host in
+ *cygwin* | mingw*)
+ major=`expr $current - $age`
+ versuffix="-$major"
+ ;;
+ esac
+ eval soname=\"$soname_spec\"
+ else
+ soname="$realname"
+ fi
+
+ # Make a new name for the extract_expsyms_cmds to use
+ soroot="$soname"
+ soname=`$echo $soroot | ${SED} -e 's/^.*\///'`
+ newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a"
+
+ # If the library has no export list, then create one now
+ if test -f "$output_objdir/$soname-def"; then :
+ else
+ $show "extracting exported symbol list from \`$soname'"
+ save_ifs="$IFS"; IFS='~'
+ cmds=$extract_expsyms_cmds
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ fi
+
+ # Create $newlib
+ if test -f "$output_objdir/$newlib"; then :; else
+ $show "generating import library for \`$soname'"
+ save_ifs="$IFS"; IFS='~'
+ cmds=$old_archive_from_expsyms_cmds
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ fi
+ # make sure the library variables are pointing to the new library
+ dir=$output_objdir
+ linklib=$newlib
+ fi # test -n "$old_archive_from_expsyms_cmds"
+
+ if test "$linkmode" = prog || test "$mode" != relink; then
+ add_shlibpath=
+ add_dir=
+ add=
+ lib_linked=yes
+ case $hardcode_action in
+ immediate | unsupported)
+ if test "$hardcode_direct" = no; then
+ add="$dir/$linklib"
+ case $host in
+ *-*-sco3.2v5* ) add_dir="-L$dir" ;;
+ *-*-darwin* )
+ # if the lib is a module then we can not link against
+ # it, someone is ignoring the new warnings I added
+ if /usr/bin/file -L $add 2> /dev/null | $EGREP "bundle" >/dev/null ; then
+ $echo "** Warning, lib $linklib is a module, not a shared library"
+ if test -z "$old_library" ; then
+ $echo
+ $echo "** And there doesn't seem to be a static archive available"
+ $echo "** The link will probably fail, sorry"
+ else
+ add="$dir/$old_library"
+ fi
+ fi
+ esac
+ elif test "$hardcode_minus_L" = no; then
+ case $host in
+ *-*-sunos*) add_shlibpath="$dir" ;;
+ esac
+ add_dir="-L$dir"
+ add="-l$name"
+ elif test "$hardcode_shlibpath_var" = no; then
+ add_shlibpath="$dir"
+ add="-l$name"
+ else
+ lib_linked=no
+ fi
+ ;;
+ relink)
+ if test "$hardcode_direct" = yes; then
+ add="$dir/$linklib"
+ elif test "$hardcode_minus_L" = yes; then
+ add_dir="-L$dir"
+ # Try looking first in the location we're being installed to.
+ if test -n "$inst_prefix_dir"; then
+ case "$libdir" in
+ [\\/]*)
+ add_dir="$add_dir -L$inst_prefix_dir$libdir"
+ ;;
+ esac
+ fi
+ add="-l$name"
+ elif test "$hardcode_shlibpath_var" = yes; then
+ add_shlibpath="$dir"
+ add="-l$name"
+ else
+ lib_linked=no
+ fi
+ ;;
+ *) lib_linked=no ;;
+ esac
+
+ if test "$lib_linked" != yes; then
+ $echo "$modename: configuration error: unsupported hardcode properties"
+ exit $EXIT_FAILURE
+ fi
+
+ if test -n "$add_shlibpath"; then
+ case :$compile_shlibpath: in
+ *":$add_shlibpath:"*) ;;
+ *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;;
+ esac
+ fi
+ if test "$linkmode" = prog; then
+ test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
+ test -n "$add" && compile_deplibs="$add $compile_deplibs"
+ else
+ test -n "$add_dir" && deplibs="$add_dir $deplibs"
+ test -n "$add" && deplibs="$add $deplibs"
+ if test "$hardcode_direct" != yes && \
+ test "$hardcode_minus_L" != yes && \
+ test "$hardcode_shlibpath_var" = yes; then
+ case :$finalize_shlibpath: in
+ *":$libdir:"*) ;;
+ *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+ esac
+ fi
+ fi
+ fi
+
+ if test "$linkmode" = prog || test "$mode" = relink; then
+ add_shlibpath=
+ add_dir=
+ add=
+ # Finalize command for both is simple: just hardcode it.
+ if test "$hardcode_direct" = yes; then
+ add="$libdir/$linklib"
+ elif test "$hardcode_minus_L" = yes; then
+ add_dir="-L$libdir"
+ add="-l$name"
+ elif test "$hardcode_shlibpath_var" = yes; then
+ case :$finalize_shlibpath: in
+ *":$libdir:"*) ;;
+ *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+ esac
+ add="-l$name"
+ elif test "$hardcode_automatic" = yes; then
+ if test -n "$inst_prefix_dir" &&
+ test -f "$inst_prefix_dir$libdir/$linklib" ; then
+ add="$inst_prefix_dir$libdir/$linklib"
+ else
+ add="$libdir/$linklib"
+ fi
+ else
+ # We cannot seem to hardcode it, guess we'll fake it.
+ add_dir="-L$libdir"
+ # Try looking first in the location we're being installed to.
+ if test -n "$inst_prefix_dir"; then
+ case "$libdir" in
+ [\\/]*)
+ add_dir="$add_dir -L$inst_prefix_dir$libdir"
+ ;;
+ esac
+ fi
+ add="-l$name"
+ fi
+
+ if test "$linkmode" = prog; then
+ test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
+ test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
+ else
+ test -n "$add_dir" && deplibs="$add_dir $deplibs"
+ test -n "$add" && deplibs="$add $deplibs"
+ fi
+ fi
+ elif test "$linkmode" = prog; then
+ # Here we assume that one of hardcode_direct or hardcode_minus_L
+ # is not unsupported. This is valid on all known static and
+ # shared platforms.
+ if test "$hardcode_direct" != unsupported; then
+ test -n "$old_library" && linklib="$old_library"
+ compile_deplibs="$dir/$linklib $compile_deplibs"
+ finalize_deplibs="$dir/$linklib $finalize_deplibs"
+ else
+ compile_deplibs="-l$name -L$dir $compile_deplibs"
+ finalize_deplibs="-l$name -L$dir $finalize_deplibs"
+ fi
+ elif test "$build_libtool_libs" = yes; then
+ # Not a shared library
+ if test "$deplibs_check_method" != pass_all; then
+ # We're trying link a shared library against a static one
+ # but the system doesn't support it.
+
+ # Just print a warning and add the library to dependency_libs so
+ # that the program can be linked against the static library.
+ $echo
+ $echo "*** Warning: This system can not link to static lib archive $lib."
+ $echo "*** I have the capability to make that library automatically link in when"
+ $echo "*** you link to this library. But I can only do this if you have a"
+ $echo "*** shared version of the library, which you do not appear to have."
+ if test "$module" = yes; then
+ $echo "*** But as you try to build a module library, libtool will still create "
+ $echo "*** a static module, that should work as long as the dlopening application"
+ $echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
+ if test -z "$global_symbol_pipe"; then
+ $echo
+ $echo "*** However, this would only work if libtool was able to extract symbol"
+ $echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+ $echo "*** not find such a program. So, this module is probably useless."
+ $echo "*** \`nm' from GNU binutils and a full rebuild may help."
+ fi
+ if test "$build_old_libs" = no; then
+ build_libtool_libs=module
+ build_old_libs=yes
+ else
+ build_libtool_libs=no
+ fi
+ fi
+ else
+ convenience="$convenience $dir/$old_library"
+ old_convenience="$old_convenience $dir/$old_library"
+ deplibs="$dir/$old_library $deplibs"
+ link_static=yes
+ fi
+ fi # link shared/static library?
+
+ if test "$linkmode" = lib; then
+ if test -n "$dependency_libs" &&
+ { test "$hardcode_into_libs" != yes ||
+ test "$build_old_libs" = yes ||
+ test "$link_static" = yes; }; then
+ # Extract -R from dependency_libs
+ temp_deplibs=
+ for libdir in $dependency_libs; do
+ case $libdir in
+ -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'`
+ case " $xrpath " in
+ *" $temp_xrpath "*) ;;
+ *) xrpath="$xrpath $temp_xrpath";;
+ esac;;
+ *) temp_deplibs="$temp_deplibs $libdir";;
+ esac
+ done
+ dependency_libs="$temp_deplibs"
+ fi
+
+ newlib_search_path="$newlib_search_path $absdir"
+ # Link against this library
+ test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+ # ... and its dependency_libs
+ tmp_libs=
+ for deplib in $dependency_libs; do
+ newdependency_libs="$deplib $newdependency_libs"
+ if test "X$duplicate_deps" = "Xyes" ; then
+ case "$tmp_libs " in
+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ esac
+ fi
+ tmp_libs="$tmp_libs $deplib"
+ done
+
+ if test "$link_all_deplibs" != no; then
+ # Add the search paths of all dependency libraries
+ for deplib in $dependency_libs; do
+ case $deplib in
+ -L*) path="$deplib" ;;
+ *.la)
+ dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$dir" = "X$deplib" && dir="."
+ # We need an absolute path.
+ case $dir in
+ [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+ *)
+ absdir=`cd "$dir" && pwd`
+ if test -z "$absdir"; then
+ $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2
+ absdir="$dir"
+ fi
+ ;;
+ esac
+ if grep "^installed=no" $deplib > /dev/null; then
+ path="$absdir/$objdir"
+ else
+ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+ if test -z "$libdir"; then
+ $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ if test "$absdir" != "$libdir"; then
+ $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2
+ fi
+ path="$absdir"
+ fi
+ depdepl=
+ case $host in
+ *-*-darwin*)
+ # we do not want to link against static libs,
+ # but need to link against shared
+ eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
+ if test -n "$deplibrary_names" ; then
+ for tmp in $deplibrary_names ; do
+ depdepl=$tmp
+ done
+ if test -f "$path/$depdepl" ; then
+ depdepl="$path/$depdepl"
+ fi
+ # do not add paths which are already there
+ case " $newlib_search_path " in
+ *" $path "*) ;;
+ *) newlib_search_path="$newlib_search_path $path";;
+ esac
+ fi
+ path=""
+ ;;
+ *)
+ path="-L$path"
+ ;;
+ esac
+ ;;
+ -l*)
+ case $host in
+ *-*-darwin*)
+ # Again, we only want to link against shared libraries
+ eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"`
+ for tmp in $newlib_search_path ; do
+ if test -f "$tmp/lib$tmp_libs.dylib" ; then
+ eval depdepl="$tmp/lib$tmp_libs.dylib"
+ break
+ fi
+ done
+ path=""
+ ;;
+ *) continue ;;
+ esac
+ ;;
+ *) continue ;;
+ esac
+ case " $deplibs " in
+ *" $depdepl "*) ;;
+ *) deplibs="$depdepl $deplibs" ;;
+ esac
+ case " $deplibs " in
+ *" $path "*) ;;
+ *) deplibs="$deplibs $path" ;;
+ esac
+ done
+ fi # link_all_deplibs != no
+ fi # linkmode = lib
+ done # for deplib in $libs
+ dependency_libs="$newdependency_libs"
+ if test "$pass" = dlpreopen; then
+ # Link the dlpreopened libraries before other libraries
+ for deplib in $save_deplibs; do
+ deplibs="$deplib $deplibs"
+ done
+ fi
+ if test "$pass" != dlopen; then
+ if test "$pass" != conv; then
+ # Make sure lib_search_path contains only unique directories.
+ lib_search_path=
+ for dir in $newlib_search_path; do
+ case "$lib_search_path " in
+ *" $dir "*) ;;
+ *) lib_search_path="$lib_search_path $dir" ;;
+ esac
+ done
+ newlib_search_path=
+ fi
+
+ if test "$linkmode,$pass" != "prog,link"; then
+ vars="deplibs"
+ else
+ vars="compile_deplibs finalize_deplibs"
+ fi
+ for var in $vars dependency_libs; do
+ # Add libraries to $var in reverse order
+ eval tmp_libs=\"\$$var\"
+ new_libs=
+ for deplib in $tmp_libs; do
+ # FIXME: Pedantically, this is the right thing to do, so
+ # that some nasty dependency loop isn't accidentally
+ # broken:
+ #new_libs="$deplib $new_libs"
+ # Pragmatically, this seems to cause very few problems in
+ # practice:
+ case $deplib in
+ -L*) new_libs="$deplib $new_libs" ;;
+ -R*) ;;
+ *)
+ # And here is the reason: when a library appears more
+ # than once as an explicit dependence of a library, or
+ # is implicitly linked in more than once by the
+ # compiler, it is considered special, and multiple
+ # occurrences thereof are not removed. Compare this
+ # with having the same library being listed as a
+ # dependency of multiple other libraries: in this case,
+ # we know (pedantically, we assume) the library does not
+ # need to be listed more than once, so we keep only the
+ # last copy. This is not always right, but it is rare
+ # enough that we require users that really mean to play
+ # such unportable linking tricks to link the library
+ # using -Wl,-lname, so that libtool does not consider it
+ # for duplicate removal.
+ case " $specialdeplibs " in
+ *" $deplib "*) new_libs="$deplib $new_libs" ;;
+ *)
+ case " $new_libs " in
+ *" $deplib "*) ;;
+ *) new_libs="$deplib $new_libs" ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ done
+ tmp_libs=
+ for deplib in $new_libs; do
+ case $deplib in
+ -L*)
+ case " $tmp_libs " in
+ *" $deplib "*) ;;
+ *) tmp_libs="$tmp_libs $deplib" ;;
+ esac
+ ;;
+ *) tmp_libs="$tmp_libs $deplib" ;;
+ esac
+ done
+ eval $var=\"$tmp_libs\"
+ done # for var
+ fi
+ # Last step: remove runtime libs from dependency_libs
+ # (they stay in deplibs)
+ tmp_libs=
+ for i in $dependency_libs ; do
+ case " $predeps $postdeps $compiler_lib_search_path " in
+ *" $i "*)
+ i=""
+ ;;
+ esac
+ if test -n "$i" ; then
+ tmp_libs="$tmp_libs $i"
+ fi
+ done
+ dependency_libs=$tmp_libs
+ done # for pass
+ if test "$linkmode" = prog; then
+ dlfiles="$newdlfiles"
+ dlprefiles="$newdlprefiles"
+ fi
+
+ case $linkmode in
+ oldlib)
+ if test -n "$deplibs"; then
+ $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2
+ fi
+
+ if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+ $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2
+ fi
+
+ if test -n "$rpath"; then
+ $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2
+ fi
+
+ if test -n "$xrpath"; then
+ $echo "$modename: warning: \`-R' is ignored for archives" 1>&2
+ fi
+
+ if test -n "$vinfo"; then
+ $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2
+ fi
+
+ if test -n "$release"; then
+ $echo "$modename: warning: \`-release' is ignored for archives" 1>&2
+ fi
+
+ if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+ $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2
+ fi
+
+ # Now set the variables for building old libraries.
+ build_libtool_libs=no
+ oldlibs="$output"
+ objs="$objs$old_deplibs"
+ ;;
+
+ lib)
+ # Make sure we only generate libraries of the form `libNAME.la'.
+ case $outputname in
+ lib*)
+ name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
+ eval shared_ext=\"$shrext_cmds\"
+ eval libname=\"$libname_spec\"
+ ;;
+ *)
+ if test "$module" = no; then
+ $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ if test "$need_lib_prefix" != no; then
+ # Add the "lib" prefix for modules if required
+ name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
+ eval shared_ext=\"$shrext_cmds\"
+ eval libname=\"$libname_spec\"
+ else
+ libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
+ fi
+ ;;
+ esac
+
+ if test -n "$objs"; then
+ if test "$deplibs_check_method" != pass_all; then
+ $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1
+ exit $EXIT_FAILURE
+ else
+ $echo
+ $echo "*** Warning: Linking the shared library $output against the non-libtool"
+ $echo "*** objects $objs is not portable!"
+ libobjs="$libobjs $objs"
+ fi
+ fi
+
+ if test "$dlself" != no; then
+ $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2
+ fi
+
+ set dummy $rpath
+ if test "$#" -gt 2; then
+ $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2
+ fi
+ install_libdir="$2"
+
+ oldlibs=
+ if test -z "$rpath"; then
+ if test "$build_libtool_libs" = yes; then
+ # Building a libtool convenience library.
+ # Some compilers have problems with a `.al' extension so
+ # convenience libraries should have the same extension an
+ # archive normally would.
+ oldlibs="$output_objdir/$libname.$libext $oldlibs"
+ build_libtool_libs=convenience
+ build_old_libs=yes
+ fi
+
+ if test -n "$vinfo"; then
+ $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2
+ fi
+
+ if test -n "$release"; then
+ $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2
+ fi
+ else
+
+ # Parse the version information argument.
+ save_ifs="$IFS"; IFS=':'
+ set dummy $vinfo 0 0 0
+ IFS="$save_ifs"
+
+ if test -n "$8"; then
+ $echo "$modename: too many parameters to \`-version-info'" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # convert absolute version numbers to libtool ages
+ # this retains compatibility with .la files and attempts
+ # to make the code below a bit more comprehensible
+
+ case $vinfo_number in
+ yes)
+ number_major="$2"
+ number_minor="$3"
+ number_revision="$4"
+ #
+ # There are really only two kinds -- those that
+ # use the current revision as the major version
+ # and those that subtract age and use age as
+ # a minor version. But, then there is irix
+ # which has an extra 1 added just for fun
+ #
+ case $version_type in
+ darwin|linux|osf|windows)
+ current=`expr $number_major + $number_minor`
+ age="$number_minor"
+ revision="$number_revision"
+ ;;
+ freebsd-aout|freebsd-elf|sunos)
+ current="$number_major"
+ revision="$number_minor"
+ age="0"
+ ;;
+ irix|nonstopux)
+ current=`expr $number_major + $number_minor - 1`
+ age="$number_minor"
+ revision="$number_minor"
+ ;;
+ esac
+ ;;
+ no)
+ current="$2"
+ revision="$3"
+ age="$4"
+ ;;
+ esac
+
+ # Check that each of the things are valid numbers.
+ case $current in
+ [0-9]*) ;;
+ *)
+ $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2
+ $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ case $revision in
+ [0-9]*) ;;
+ *)
+ $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2
+ $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ case $age in
+ [0-9]*) ;;
+ *)
+ $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2
+ $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ if test "$age" -gt "$current"; then
+ $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2
+ $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Calculate the version variables.
+ major=
+ versuffix=
+ verstring=
+ case $version_type in
+ none) ;;
+
+ darwin)
+ # Like Linux, but with the current version available in
+ # verstring for coding it into the library header
+ major=.`expr $current - $age`
+ versuffix="$major.$age.$revision"
+ # Darwin ld doesn't like 0 for these options...
+ minor_current=`expr $current + 1`
+ verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+ ;;
+
+ freebsd-aout)
+ major=".$current"
+ versuffix=".$current.$revision";
+ ;;
+
+ freebsd-elf)
+ major=".$current"
+ versuffix=".$current";
+ ;;
+
+ irix | nonstopux)
+ major=`expr $current - $age + 1`
+
+ case $version_type in
+ nonstopux) verstring_prefix=nonstopux ;;
+ *) verstring_prefix=sgi ;;
+ esac
+ verstring="$verstring_prefix$major.$revision"
+
+ # Add in all the interfaces that we are compatible with.
+ loop=$revision
+ while test "$loop" -ne 0; do
+ iface=`expr $revision - $loop`
+ loop=`expr $loop - 1`
+ verstring="$verstring_prefix$major.$iface:$verstring"
+ done
+
+ # Before this point, $major must not contain `.'.
+ major=.$major
+ versuffix="$major.$revision"
+ ;;
+
+ linux)
+ major=.`expr $current - $age`
+ versuffix="$major.$age.$revision"
+ ;;
+
+ osf)
+ major=.`expr $current - $age`
+ versuffix=".$current.$age.$revision"
+ verstring="$current.$age.$revision"
+
+ # Add in all the interfaces that we are compatible with.
+ loop=$age
+ while test "$loop" -ne 0; do
+ iface=`expr $current - $loop`
+ loop=`expr $loop - 1`
+ verstring="$verstring:${iface}.0"
+ done
+
+ # Make executables depend on our current version.
+ verstring="$verstring:${current}.0"
+ ;;
+
+ sunos)
+ major=".$current"
+ versuffix=".$current.$revision"
+ ;;
+
+ windows)
+ # Use '-' rather than '.', since we only want one
+ # extension on DOS 8.3 filesystems.
+ major=`expr $current - $age`
+ versuffix="-$major"
+ ;;
+
+ *)
+ $echo "$modename: unknown library version type \`$version_type'" 1>&2
+ $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ # Clear the version info if we defaulted, and they specified a release.
+ if test -z "$vinfo" && test -n "$release"; then
+ major=
+ case $version_type in
+ darwin)
+ # we can't check for "0.0" in archive_cmds due to quoting
+ # problems, so we reset it completely
+ verstring=
+ ;;
+ *)
+ verstring="0.0"
+ ;;
+ esac
+ if test "$need_version" = no; then
+ versuffix=
+ else
+ versuffix=".0.0"
+ fi
+ fi
+
+ # Remove version info from name if versioning should be avoided
+ if test "$avoid_version" = yes && test "$need_version" = no; then
+ major=
+ versuffix=
+ verstring=""
+ fi
+
+ # Check to see if the archive will have undefined symbols.
+ if test "$allow_undefined" = yes; then
+ if test "$allow_undefined_flag" = unsupported; then
+ $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2
+ build_libtool_libs=no
+ build_old_libs=yes
+ fi
+ else
+ # Don't allow undefined symbols.
+ allow_undefined_flag="$no_undefined_flag"
+ fi
+ fi
+
+ if test "$mode" != relink; then
+ # Remove our outputs, but don't remove object files since they
+ # may have been created when compiling PIC objects.
+ removelist=
+ tempremovelist=`$echo "$output_objdir/*"`
+ for p in $tempremovelist; do
+ case $p in
+ *.$objext)
+ ;;
+ $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
+ if test "X$precious_files_regex" != "X"; then
+ if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
+ then
+ continue
+ fi
+ fi
+ removelist="$removelist $p"
+ ;;
+ *) ;;
+ esac
+ done
+ if test -n "$removelist"; then
+ $show "${rm}r $removelist"
+ $run ${rm}r $removelist
+ fi
+ fi
+
+ # Now set the variables for building old libraries.
+ if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+ oldlibs="$oldlibs $output_objdir/$libname.$libext"
+
+ # Transform .lo files to .o files.
+ oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP`
+ fi
+
+ # Eliminate all temporary directories.
+ for path in $notinst_path; do
+ lib_search_path=`$echo "$lib_search_path " | ${SED} -e 's% $path % %g'`
+ deplibs=`$echo "$deplibs " | ${SED} -e 's% -L$path % %g'`
+ dependency_libs=`$echo "$dependency_libs " | ${SED} -e 's% -L$path % %g'`
+ done
+
+ if test -n "$xrpath"; then
+ # If the user specified any rpath flags, then add them.
+ temp_xrpath=
+ for libdir in $xrpath; do
+ temp_xrpath="$temp_xrpath -R$libdir"
+ case "$finalize_rpath " in
+ *" $libdir "*) ;;
+ *) finalize_rpath="$finalize_rpath $libdir" ;;
+ esac
+ done
+ if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
+ dependency_libs="$temp_xrpath $dependency_libs"
+ fi
+ fi
+
+ # Make sure dlfiles contains only unique files that won't be dlpreopened
+ old_dlfiles="$dlfiles"
+ dlfiles=
+ for lib in $old_dlfiles; do
+ case " $dlprefiles $dlfiles " in
+ *" $lib "*) ;;
+ *) dlfiles="$dlfiles $lib" ;;
+ esac
+ done
+
+ # Make sure dlprefiles contains only unique files
+ old_dlprefiles="$dlprefiles"
+ dlprefiles=
+ for lib in $old_dlprefiles; do
+ case "$dlprefiles " in
+ *" $lib "*) ;;
+ *) dlprefiles="$dlprefiles $lib" ;;
+ esac
+ done
+
+ if test "$build_libtool_libs" = yes; then
+ if test -n "$rpath"; then
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*)
+ # these systems don't actually have a c library (as such)!
+ ;;
+ *-*-rhapsody* | *-*-darwin1.[012])
+ # Rhapsody C library is in the System framework
+ deplibs="$deplibs -framework System"
+ ;;
+ *-*-netbsd*)
+ # Don't link with libc until the a.out ld.so is fixed.
+ ;;
+ *-*-openbsd* | *-*-freebsd*)
+ # Do not include libc due to us having libc/libc_r.
+ test "X$arg" = "X-lc" && continue
+ ;;
+ *)
+ # Add libc to deplibs on all other systems if necessary.
+ if test "$build_libtool_need_lc" = "yes"; then
+ deplibs="$deplibs -lc"
+ fi
+ ;;
+ esac
+ fi
+
+ # Transform deplibs into only deplibs that can be linked in shared.
+ name_save=$name
+ libname_save=$libname
+ release_save=$release
+ versuffix_save=$versuffix
+ major_save=$major
+ # I'm not sure if I'm treating the release correctly. I think
+ # release should show up in the -l (ie -lgmp5) so we don't want to
+ # add it in twice. Is that correct?
+ release=""
+ versuffix=""
+ major=""
+ newdeplibs=
+ droppeddeps=no
+ case $deplibs_check_method in
+ pass_all)
+ # Don't check for shared/static. Everything works.
+ # This might be a little naive. We might want to check
+ # whether the library exists or not. But this is on
+ # osf3 & osf4 and I'm not really sure... Just
+ # implementing what was already the behavior.
+ newdeplibs=$deplibs
+ ;;
+ test_compile)
+ # This code stresses the "libraries are programs" paradigm to its
+ # limits. Maybe even breaks it. We compile a program, linking it
+ # against the deplibs as a proxy for the library. Then we can check
+ # whether they linked in statically or dynamically with ldd.
+ $rm conftest.c
+ cat > conftest.c <<EOF
+ int main() { return 0; }
+EOF
+ $rm conftest
+ $LTCC -o conftest conftest.c $deplibs
+ if test "$?" -eq 0 ; then
+ ldd_output=`ldd conftest`
+ for i in $deplibs; do
+ name="`expr $i : '-l\(.*\)'`"
+ # If $name is empty we are operating on a -L argument.
+ if test "$name" != "" && test "$name" -ne "0"; then
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ case " $predeps $postdeps " in
+ *" $i "*)
+ newdeplibs="$newdeplibs $i"
+ i=""
+ ;;
+ esac
+ fi
+ if test -n "$i" ; then
+ libname=`eval \\$echo \"$libname_spec\"`
+ deplib_matches=`eval \\$echo \"$library_names_spec\"`
+ set dummy $deplib_matches
+ deplib_match=$2
+ if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+ newdeplibs="$newdeplibs $i"
+ else
+ droppeddeps=yes
+ $echo
+ $echo "*** Warning: dynamic linker does not accept needed library $i."
+ $echo "*** I have the capability to make that library automatically link in when"
+ $echo "*** you link to this library. But I can only do this if you have a"
+ $echo "*** shared version of the library, which I believe you do not have"
+ $echo "*** because a test_compile did reveal that the linker did not use it for"
+ $echo "*** its dynamic dependency list that programs get resolved with at runtime."
+ fi
+ fi
+ else
+ newdeplibs="$newdeplibs $i"
+ fi
+ done
+ else
+ # Error occurred in the first compile. Let's try to salvage
+ # the situation: Compile a separate program for each library.
+ for i in $deplibs; do
+ name="`expr $i : '-l\(.*\)'`"
+ # If $name is empty we are operating on a -L argument.
+ if test "$name" != "" && test "$name" != "0"; then
+ $rm conftest
+ $LTCC -o conftest conftest.c $i
+ # Did it work?
+ if test "$?" -eq 0 ; then
+ ldd_output=`ldd conftest`
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ case " $predeps $postdeps " in
+ *" $i "*)
+ newdeplibs="$newdeplibs $i"
+ i=""
+ ;;
+ esac
+ fi
+ if test -n "$i" ; then
+ libname=`eval \\$echo \"$libname_spec\"`
+ deplib_matches=`eval \\$echo \"$library_names_spec\"`
+ set dummy $deplib_matches
+ deplib_match=$2
+ if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+ newdeplibs="$newdeplibs $i"
+ else
+ droppeddeps=yes
+ $echo
+ $echo "*** Warning: dynamic linker does not accept needed library $i."
+ $echo "*** I have the capability to make that library automatically link in when"
+ $echo "*** you link to this library. But I can only do this if you have a"
+ $echo "*** shared version of the library, which you do not appear to have"
+ $echo "*** because a test_compile did reveal that the linker did not use this one"
+ $echo "*** as a dynamic dependency that programs can get resolved with at runtime."
+ fi
+ fi
+ else
+ droppeddeps=yes
+ $echo
+ $echo "*** Warning! Library $i is needed by this library but I was not able to"
+ $echo "*** make it link in! You will probably need to install it or some"
+ $echo "*** library that it depends on before this library will be fully"
+ $echo "*** functional. Installing it before continuing would be even better."
+ fi
+ else
+ newdeplibs="$newdeplibs $i"
+ fi
+ done
+ fi
+ ;;
+ file_magic*)
+ set dummy $deplibs_check_method
+ file_magic_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
+ for a_deplib in $deplibs; do
+ name="`expr $a_deplib : '-l\(.*\)'`"
+ # If $name is empty we are operating on a -L argument.
+ if test "$name" != "" && test "$name" != "0"; then
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ case " $predeps $postdeps " in
+ *" $a_deplib "*)
+ newdeplibs="$newdeplibs $a_deplib"
+ a_deplib=""
+ ;;
+ esac
+ fi
+ if test -n "$a_deplib" ; then
+ libname=`eval \\$echo \"$libname_spec\"`
+ for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+ potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+ for potent_lib in $potential_libs; do
+ # Follow soft links.
+ if ls -lLd "$potent_lib" 2>/dev/null \
+ | grep " -> " >/dev/null; then
+ continue
+ fi
+ # The statement above tries to avoid entering an
+ # endless loop below, in case of cyclic links.
+ # We might still enter an endless loop, since a link
+ # loop can be closed while we follow links,
+ # but so what?
+ potlib="$potent_lib"
+ while test -h "$potlib" 2>/dev/null; do
+ potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
+ case $potliblink in
+ [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
+ *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";;
+ esac
+ done
+ if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \
+ | ${SED} 10q \
+ | $EGREP "$file_magic_regex" > /dev/null; then
+ newdeplibs="$newdeplibs $a_deplib"
+ a_deplib=""
+ break 2
+ fi
+ done
+ done
+ fi
+ if test -n "$a_deplib" ; then
+ droppeddeps=yes
+ $echo
+ $echo "*** Warning: linker path does not have real file for library $a_deplib."
+ $echo "*** I have the capability to make that library automatically link in when"
+ $echo "*** you link to this library. But I can only do this if you have a"
+ $echo "*** shared version of the library, which you do not appear to have"
+ $echo "*** because I did check the linker path looking for a file starting"
+ if test -z "$potlib" ; then
+ $echo "*** with $libname but no candidates were found. (...for file magic test)"
+ else
+ $echo "*** with $libname and none of the candidates passed a file format test"
+ $echo "*** using a file magic. Last file checked: $potlib"
+ fi
+ fi
+ else
+ # Add a -L argument.
+ newdeplibs="$newdeplibs $a_deplib"
+ fi
+ done # Gone through all deplibs.
+ ;;
+ match_pattern*)
+ set dummy $deplibs_check_method
+ match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
+ for a_deplib in $deplibs; do
+ name="`expr $a_deplib : '-l\(.*\)'`"
+ # If $name is empty we are operating on a -L argument.
+ if test -n "$name" && test "$name" != "0"; then
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ case " $predeps $postdeps " in
+ *" $a_deplib "*)
+ newdeplibs="$newdeplibs $a_deplib"
+ a_deplib=""
+ ;;
+ esac
+ fi
+ if test -n "$a_deplib" ; then
+ libname=`eval \\$echo \"$libname_spec\"`
+ for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+ potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+ for potent_lib in $potential_libs; do
+ potlib="$potent_lib" # see symlink-check above in file_magic test
+ if eval $echo \"$potent_lib\" 2>/dev/null \
+ | ${SED} 10q \
+ | $EGREP "$match_pattern_regex" > /dev/null; then
+ newdeplibs="$newdeplibs $a_deplib"
+ a_deplib=""
+ break 2
+ fi
+ done
+ done
+ fi
+ if test -n "$a_deplib" ; then
+ droppeddeps=yes
+ $echo
+ $echo "*** Warning: linker path does not have real file for library $a_deplib."
+ $echo "*** I have the capability to make that library automatically link in when"
+ $echo "*** you link to this library. But I can only do this if you have a"
+ $echo "*** shared version of the library, which you do not appear to have"
+ $echo "*** because I did check the linker path looking for a file starting"
+ if test -z "$potlib" ; then
+ $echo "*** with $libname but no candidates were found. (...for regex pattern test)"
+ else
+ $echo "*** with $libname and none of the candidates passed a file format test"
+ $echo "*** using a regex pattern. Last file checked: $potlib"
+ fi
+ fi
+ else
+ # Add a -L argument.
+ newdeplibs="$newdeplibs $a_deplib"
+ fi
+ done # Gone through all deplibs.
+ ;;
+ none | unknown | *)
+ newdeplibs=""
+ tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \
+ -e 's/ -[LR][^ ]*//g'`
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ for i in $predeps $postdeps ; do
+ # can't use Xsed below, because $i might contain '/'
+ tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"`
+ done
+ fi
+ if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \
+ | grep . >/dev/null; then
+ $echo
+ if test "X$deplibs_check_method" = "Xnone"; then
+ $echo "*** Warning: inter-library dependencies are not supported in this platform."
+ else
+ $echo "*** Warning: inter-library dependencies are not known to be supported."
+ fi
+ $echo "*** All declared inter-library dependencies are being dropped."
+ droppeddeps=yes
+ fi
+ ;;
+ esac
+ versuffix=$versuffix_save
+ major=$major_save
+ release=$release_save
+ libname=$libname_save
+ name=$name_save
+
+ case $host in
+ *-*-rhapsody* | *-*-darwin1.[012])
+ # On Rhapsody replace the C library is the System framework
+ newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'`
+ ;;
+ esac
+
+ if test "$droppeddeps" = yes; then
+ if test "$module" = yes; then
+ $echo
+ $echo "*** Warning: libtool could not satisfy all declared inter-library"
+ $echo "*** dependencies of module $libname. Therefore, libtool will create"
+ $echo "*** a static module, that should work as long as the dlopening"
+ $echo "*** application is linked with the -dlopen flag."
+ if test -z "$global_symbol_pipe"; then
+ $echo
+ $echo "*** However, this would only work if libtool was able to extract symbol"
+ $echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+ $echo "*** not find such a program. So, this module is probably useless."
+ $echo "*** \`nm' from GNU binutils and a full rebuild may help."
+ fi
+ if test "$build_old_libs" = no; then
+ oldlibs="$output_objdir/$libname.$libext"
+ build_libtool_libs=module
+ build_old_libs=yes
+ else
+ build_libtool_libs=no
+ fi
+ else
+ $echo "*** The inter-library dependencies that have been dropped here will be"
+ $echo "*** automatically added whenever a program is linked with this library"
+ $echo "*** or is declared to -dlopen it."
+
+ if test "$allow_undefined" = no; then
+ $echo
+ $echo "*** Since this library must not contain undefined symbols,"
+ $echo "*** because either the platform does not support them or"
+ $echo "*** it was explicitly requested with -no-undefined,"
+ $echo "*** libtool will only create a static version of it."
+ if test "$build_old_libs" = no; then
+ oldlibs="$output_objdir/$libname.$libext"
+ build_libtool_libs=module
+ build_old_libs=yes
+ else
+ build_libtool_libs=no
+ fi
+ fi
+ fi
+ fi
+ # Done checking deplibs!
+ deplibs=$newdeplibs
+ fi
+
+ # All the library-specific variables (install_libdir is set above).
+ library_names=
+ old_library=
+ dlname=
+
+ # Test again, we may have decided not to build it any more
+ if test "$build_libtool_libs" = yes; then
+ if test "$hardcode_into_libs" = yes; then
+ # Hardcode the library paths
+ hardcode_libdirs=
+ dep_rpath=
+ rpath="$finalize_rpath"
+ test "$mode" != relink && rpath="$compile_rpath$rpath"
+ for libdir in $rpath; do
+ if test -n "$hardcode_libdir_flag_spec"; then
+ if test -n "$hardcode_libdir_separator"; then
+ if test -z "$hardcode_libdirs"; then
+ hardcode_libdirs="$libdir"
+ else
+ # Just accumulate the unique libdirs.
+ case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+ *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+ ;;
+ *)
+ hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+ ;;
+ esac
+ fi
+ else
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ dep_rpath="$dep_rpath $flag"
+ fi
+ elif test -n "$runpath_var"; then
+ case "$perm_rpath " in
+ *" $libdir "*) ;;
+ *) perm_rpath="$perm_rpath $libdir" ;;
+ esac
+ fi
+ done
+ # Substitute the hardcoded libdirs into the rpath.
+ if test -n "$hardcode_libdir_separator" &&
+ test -n "$hardcode_libdirs"; then
+ libdir="$hardcode_libdirs"
+ if test -n "$hardcode_libdir_flag_spec_ld"; then
+ eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\"
+ else
+ eval dep_rpath=\"$hardcode_libdir_flag_spec\"
+ fi
+ fi
+ if test -n "$runpath_var" && test -n "$perm_rpath"; then
+ # We should set the runpath_var.
+ rpath=
+ for dir in $perm_rpath; do
+ rpath="$rpath$dir:"
+ done
+ eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
+ fi
+ test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
+ fi
+
+ shlibpath="$finalize_shlibpath"
+ test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+ if test -n "$shlibpath"; then
+ eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
+ fi
+
+ # Get the real and link names of the library.
+ eval shared_ext=\"$shrext_cmds\"
+ eval library_names=\"$library_names_spec\"
+ set dummy $library_names
+ realname="$2"
+ shift; shift
+
+ if test -n "$soname_spec"; then
+ eval soname=\"$soname_spec\"
+ else
+ soname="$realname"
+ fi
+ if test -z "$dlname"; then
+ dlname=$soname
+ fi
+
+ lib="$output_objdir/$realname"
+ for link
+ do
+ linknames="$linknames $link"
+ done
+
+ # Use standard objects if they are pic
+ test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+
+ # Prepare the list of exported symbols
+ if test -z "$export_symbols"; then
+ if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
+ $show "generating symbol list for \`$libname.la'"
+ export_symbols="$output_objdir/$libname.exp"
+ $run $rm $export_symbols
+ cmds=$export_symbols_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ if len=`expr "X$cmd" : ".*"` &&
+ test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ skipped_export=false
+ else
+ # The command line is too long to execute in one step.
+ $show "using reloadable object file for export list..."
+ skipped_export=:
+ fi
+ done
+ IFS="$save_ifs"
+ if test -n "$export_symbols_regex"; then
+ $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\""
+ $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+ $show "$mv \"${export_symbols}T\" \"$export_symbols\""
+ $run eval '$mv "${export_symbols}T" "$export_symbols"'
+ fi
+ fi
+ fi
+
+ if test -n "$export_symbols" && test -n "$include_expsyms"; then
+ $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"'
+ fi
+
+ tmp_deplibs=
+ for test_deplib in $deplibs; do
+ case " $convenience " in
+ *" $test_deplib "*) ;;
+ *)
+ tmp_deplibs="$tmp_deplibs $test_deplib"
+ ;;
+ esac
+ done
+ deplibs="$tmp_deplibs"
+
+ if test -n "$convenience"; then
+ if test -n "$whole_archive_flag_spec"; then
+ save_libobjs=$libobjs
+ eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+ else
+ gentop="$output_objdir/${outputname}x"
+ $show "${rm}r $gentop"
+ $run ${rm}r "$gentop"
+ $show "$mkdir $gentop"
+ $run $mkdir "$gentop"
+ status=$?
+ if test "$status" -ne 0 && test ! -d "$gentop"; then
+ exit $status
+ fi
+ generated="$generated $gentop"
+
+ for xlib in $convenience; do
+ # Extract the objects.
+ case $xlib in
+ [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;;
+ *) xabs=`pwd`"/$xlib" ;;
+ esac
+ xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'`
+ xdir="$gentop/$xlib"
+
+ $show "${rm}r $xdir"
+ $run ${rm}r "$xdir"
+ $show "$mkdir $xdir"
+ $run $mkdir "$xdir"
+ status=$?
+ if test "$status" -ne 0 && test ! -d "$xdir"; then
+ exit $status
+ fi
+ # We will extract separately just the conflicting names and we will no
+ # longer touch any unique names. It is faster to leave these extract
+ # automatically by $AR in one run.
+ $show "(cd $xdir && $AR x $xabs)"
+ $run eval "(cd \$xdir && $AR x \$xabs)" || exit $?
+ if ($AR t "$xabs" | sort | sort -uc >/dev/null 2>&1); then
+ :
+ else
+ $echo "$modename: warning: object name conflicts; renaming object files" 1>&2
+ $echo "$modename: warning: to ensure that they will not overwrite" 1>&2
+ $AR t "$xabs" | sort | uniq -cd | while read -r count name
+ do
+ i=1
+ while test "$i" -le "$count"
+ do
+ # Put our $i before any first dot (extension)
+ # Never overwrite any file
+ name_to="$name"
+ while test "X$name_to" = "X$name" || test -f "$xdir/$name_to"
+ do
+ name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"`
+ done
+ $show "(cd $xdir && $AR xN $i $xabs '$name' && $mv '$name' '$name_to')"
+ $run eval "(cd \$xdir && $AR xN $i \$xabs '$name' && $mv '$name' '$name_to')" || exit $?
+ i=`expr $i + 1`
+ done
+ done
+ fi
+
+ libobjs="$libobjs "`find $xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP`
+ done
+ fi
+ fi
+
+ if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+ eval flag=\"$thread_safe_flag_spec\"
+ linker_flags="$linker_flags $flag"
+ fi
+
+ # Make a backup of the uninstalled library when relinking
+ if test "$mode" = relink; then
+ $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $?
+ fi
+
+ # Do each of the archive commands.
+ if test "$module" = yes && test -n "$module_cmds" ; then
+ if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+ eval test_cmds=\"$module_expsym_cmds\"
+ cmds=$module_expsym_cmds
+ else
+ eval test_cmds=\"$module_cmds\"
+ cmds=$module_cmds
+ fi
+ else
+ if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+ eval test_cmds=\"$archive_expsym_cmds\"
+ cmds=$archive_expsym_cmds
+ else
+ eval test_cmds=\"$archive_cmds\"
+ cmds=$archive_cmds
+ fi
+ fi
+
+ if test "X$skipped_export" != "X:" && len=`expr "X$test_cmds" : ".*"` &&
+ test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+ :
+ else
+ # The command line is too long to link in one step, link piecewise.
+ $echo "creating reloadable object files..."
+
+ # Save the value of $output and $libobjs because we want to
+ # use them later. If we have whole_archive_flag_spec, we
+ # want to use save_libobjs as it was before
+ # whole_archive_flag_spec was expanded, because we can't
+ # assume the linker understands whole_archive_flag_spec.
+ # This may have to be revisited, in case too many
+ # convenience libraries get linked in and end up exceeding
+ # the spec.
+ if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
+ save_libobjs=$libobjs
+ fi
+ save_output=$output
+
+ # Clear the reloadable object creation command queue and
+ # initialize k to one.
+ test_cmds=
+ concat_cmds=
+ objlist=
+ delfiles=
+ last_robj=
+ k=1
+ output=$output_objdir/$save_output-${k}.$objext
+ # Loop over the list of objects to be linked.
+ for obj in $save_libobjs
+ do
+ eval test_cmds=\"$reload_cmds $objlist $last_robj\"
+ if test "X$objlist" = X ||
+ { len=`expr "X$test_cmds" : ".*"` &&
+ test "$len" -le "$max_cmd_len"; }; then
+ objlist="$objlist $obj"
+ else
+ # The command $test_cmds is almost too long, add a
+ # command to the queue.
+ if test "$k" -eq 1 ; then
+ # The first file doesn't have a previous command to add.
+ eval concat_cmds=\"$reload_cmds $objlist $last_robj\"
+ else
+ # All subsequent reloadable object files will link in
+ # the last one created.
+ eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\"
+ fi
+ last_robj=$output_objdir/$save_output-${k}.$objext
+ k=`expr $k + 1`
+ output=$output_objdir/$save_output-${k}.$objext
+ objlist=$obj
+ len=1
+ fi
+ done
+ # Handle the remaining objects by creating one last
+ # reloadable object file. All subsequent reloadable object
+ # files will link in the last one created.
+ test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+ eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\"
+
+ if ${skipped_export-false}; then
+ $show "generating symbol list for \`$libname.la'"
+ export_symbols="$output_objdir/$libname.exp"
+ $run $rm $export_symbols
+ libobjs=$output
+ # Append the command to create the export file.
+ eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\"
+ fi
+
+ # Set up a command to remove the reloadale object files
+ # after they are used.
+ i=0
+ while test "$i" -lt "$k"
+ do
+ i=`expr $i + 1`
+ delfiles="$delfiles $output_objdir/$save_output-${i}.$objext"
+ done
+
+ $echo "creating a temporary reloadable object file: $output"
+
+ # Loop through the commands generated above and execute them.
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $concat_cmds; do
+ IFS="$save_ifs"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+
+ libobjs=$output
+ # Restore the value of output.
+ output=$save_output
+
+ if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
+ eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+ fi
+ # Expand the library linking commands again to reset the
+ # value of $libobjs for piecewise linking.
+
+ # Do each of the archive commands.
+ if test "$module" = yes && test -n "$module_cmds" ; then
+ if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+ cmds=$module_expsym_cmds
+ else
+ cmds=$module_cmds
+ fi
+ else
+ if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+ cmds=$archive_expsym_cmds
+ else
+ cmds=$archive_cmds
+ fi
+ fi
+
+ # Append the command to remove the reloadable object files
+ # to the just-reset $cmds.
+ eval cmds=\"\$cmds~\$rm $delfiles\"
+ fi
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+
+ # Restore the uninstalled library and exit
+ if test "$mode" = relink; then
+ $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $?
+ exit $EXIT_SUCCESS
+ fi
+
+ # Create links to the real library.
+ for linkname in $linknames; do
+ if test "$realname" != "$linkname"; then
+ $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)"
+ $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $?
+ fi
+ done
+
+ # If -module or -export-dynamic was specified, set the dlname.
+ if test "$module" = yes || test "$export_dynamic" = yes; then
+ # On all known operating systems, these are identical.
+ dlname="$soname"
+ fi
+ fi
+ ;;
+
+ obj)
+ if test -n "$deplibs"; then
+ $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2
+ fi
+
+ if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+ $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2
+ fi
+
+ if test -n "$rpath"; then
+ $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2
+ fi
+
+ if test -n "$xrpath"; then
+ $echo "$modename: warning: \`-R' is ignored for objects" 1>&2
+ fi
+
+ if test -n "$vinfo"; then
+ $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2
+ fi
+
+ if test -n "$release"; then
+ $echo "$modename: warning: \`-release' is ignored for objects" 1>&2
+ fi
+
+ case $output in
+ *.lo)
+ if test -n "$objs$old_deplibs"; then
+ $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ libobj="$output"
+ obj=`$echo "X$output" | $Xsed -e "$lo2o"`
+ ;;
+ *)
+ libobj=
+ obj="$output"
+ ;;
+ esac
+
+ # Delete the old objects.
+ $run $rm $obj $libobj
+
+ # Objects from convenience libraries. This assumes
+ # single-version convenience libraries. Whenever we create
+ # different ones for PIC/non-PIC, this we'll have to duplicate
+ # the extraction.
+ reload_conv_objs=
+ gentop=
+ # reload_cmds runs $LD directly, so let us get rid of
+ # -Wl from whole_archive_flag_spec
+ wl=
+
+ if test -n "$convenience"; then
+ if test -n "$whole_archive_flag_spec"; then
+ eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\"
+ else
+ gentop="$output_objdir/${obj}x"
+ $show "${rm}r $gentop"
+ $run ${rm}r "$gentop"
+ $show "$mkdir $gentop"
+ $run $mkdir "$gentop"
+ status=$?
+ if test "$status" -ne 0 && test ! -d "$gentop"; then
+ exit $status
+ fi
+ generated="$generated $gentop"
+
+ for xlib in $convenience; do
+ # Extract the objects.
+ case $xlib in
+ [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;;
+ *) xabs=`pwd`"/$xlib" ;;
+ esac
+ xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'`
+ xdir="$gentop/$xlib"
+
+ $show "${rm}r $xdir"
+ $run ${rm}r "$xdir"
+ $show "$mkdir $xdir"
+ $run $mkdir "$xdir"
+ status=$?
+ if test "$status" -ne 0 && test ! -d "$xdir"; then
+ exit $status
+ fi
+ # We will extract separately just the conflicting names and we will no
+ # longer touch any unique names. It is faster to leave these extract
+ # automatically by $AR in one run.
+ $show "(cd $xdir && $AR x $xabs)"
+ $run eval "(cd \$xdir && $AR x \$xabs)" || exit $?
+ if ($AR t "$xabs" | sort | sort -uc >/dev/null 2>&1); then
+ :
+ else
+ $echo "$modename: warning: object name conflicts; renaming object files" 1>&2
+ $echo "$modename: warning: to ensure that they will not overwrite" 1>&2
+ $AR t "$xabs" | sort | uniq -cd | while read -r count name
+ do
+ i=1
+ while test "$i" -le "$count"
+ do
+ # Put our $i before any first dot (extension)
+ # Never overwrite any file
+ name_to="$name"
+ while test "X$name_to" = "X$name" || test -f "$xdir/$name_to"
+ do
+ name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"`
+ done
+ $show "(cd $xdir && $AR xN $i $xabs '$name' && $mv '$name' '$name_to')"
+ $run eval "(cd \$xdir && $AR xN $i \$xabs '$name' && $mv '$name' '$name_to')" || exit $?
+ i=`expr $i + 1`
+ done
+ done
+ fi
+
+ reload_conv_objs="$reload_objs "`find $xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP`
+ done
+ fi
+ fi
+
+ # Create the old-style object.
+ reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+
+ output="$obj"
+ cmds=$reload_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+
+ # Exit if we aren't doing a library object file.
+ if test -z "$libobj"; then
+ if test -n "$gentop"; then
+ $show "${rm}r $gentop"
+ $run ${rm}r $gentop
+ fi
+
+ exit $EXIT_SUCCESS
+ fi
+
+ if test "$build_libtool_libs" != yes; then
+ if test -n "$gentop"; then
+ $show "${rm}r $gentop"
+ $run ${rm}r $gentop
+ fi
+
+ # Create an invalid libtool object if no PIC, so that we don't
+ # accidentally link it into a program.
+ # $show "echo timestamp > $libobj"
+ # $run eval "echo timestamp > $libobj" || exit $?
+ exit $EXIT_SUCCESS
+ fi
+
+ if test -n "$pic_flag" || test "$pic_mode" != default; then
+ # Only do commands if we really have different PIC objects.
+ reload_objs="$libobjs $reload_conv_objs"
+ output="$libobj"
+ cmds=$reload_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ fi
+
+ if test -n "$gentop"; then
+ $show "${rm}r $gentop"
+ $run ${rm}r $gentop
+ fi
+
+ exit $EXIT_SUCCESS
+ ;;
+
+ prog)
+ case $host in
+ *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;;
+ esac
+ if test -n "$vinfo"; then
+ $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2
+ fi
+
+ if test -n "$release"; then
+ $echo "$modename: warning: \`-release' is ignored for programs" 1>&2
+ fi
+
+ if test "$preload" = yes; then
+ if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown &&
+ test "$dlopen_self_static" = unknown; then
+ $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support."
+ fi
+ fi
+
+ case $host in
+ *-*-rhapsody* | *-*-darwin1.[012])
+ # On Rhapsody replace the C library is the System framework
+ compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
+ finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
+ ;;
+ esac
+
+ case $host in
+ *darwin*)
+ # Don't allow lazy linking, it breaks C++ global constructors
+ if test "$tagname" = CXX ; then
+ compile_command="$compile_command ${wl}-bind_at_load"
+ finalize_command="$finalize_command ${wl}-bind_at_load"
+ fi
+ ;;
+ esac
+
+ compile_command="$compile_command $compile_deplibs"
+ finalize_command="$finalize_command $finalize_deplibs"
+
+ if test -n "$rpath$xrpath"; then
+ # If the user specified any rpath flags, then add them.
+ for libdir in $rpath $xrpath; do
+ # This is the magic to use -rpath.
+ case "$finalize_rpath " in
+ *" $libdir "*) ;;
+ *) finalize_rpath="$finalize_rpath $libdir" ;;
+ esac
+ done
+ fi
+
+ # Now hardcode the library paths
+ rpath=
+ hardcode_libdirs=
+ for libdir in $compile_rpath $finalize_rpath; do
+ if test -n "$hardcode_libdir_flag_spec"; then
+ if test -n "$hardcode_libdir_separator"; then
+ if test -z "$hardcode_libdirs"; then
+ hardcode_libdirs="$libdir"
+ else
+ # Just accumulate the unique libdirs.
+ case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+ *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+ ;;
+ *)
+ hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+ ;;
+ esac
+ fi
+ else
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ rpath="$rpath $flag"
+ fi
+ elif test -n "$runpath_var"; then
+ case "$perm_rpath " in
+ *" $libdir "*) ;;
+ *) perm_rpath="$perm_rpath $libdir" ;;
+ esac
+ fi
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+ case :$dllsearchpath: in
+ *":$libdir:"*) ;;
+ *) dllsearchpath="$dllsearchpath:$libdir";;
+ esac
+ ;;
+ esac
+ done
+ # Substitute the hardcoded libdirs into the rpath.
+ if test -n "$hardcode_libdir_separator" &&
+ test -n "$hardcode_libdirs"; then
+ libdir="$hardcode_libdirs"
+ eval rpath=\" $hardcode_libdir_flag_spec\"
+ fi
+ compile_rpath="$rpath"
+
+ rpath=
+ hardcode_libdirs=
+ for libdir in $finalize_rpath; do
+ if test -n "$hardcode_libdir_flag_spec"; then
+ if test -n "$hardcode_libdir_separator"; then
+ if test -z "$hardcode_libdirs"; then
+ hardcode_libdirs="$libdir"
+ else
+ # Just accumulate the unique libdirs.
+ case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+ *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+ ;;
+ *)
+ hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+ ;;
+ esac
+ fi
+ else
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ rpath="$rpath $flag"
+ fi
+ elif test -n "$runpath_var"; then
+ case "$finalize_perm_rpath " in
+ *" $libdir "*) ;;
+ *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
+ esac
+ fi
+ done
+ # Substitute the hardcoded libdirs into the rpath.
+ if test -n "$hardcode_libdir_separator" &&
+ test -n "$hardcode_libdirs"; then
+ libdir="$hardcode_libdirs"
+ eval rpath=\" $hardcode_libdir_flag_spec\"
+ fi
+ finalize_rpath="$rpath"
+
+ if test -n "$libobjs" && test "$build_old_libs" = yes; then
+ # Transform all the library objects into standard objects.
+ compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+ finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+ fi
+
+ dlsyms=
+ if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+ if test -n "$NM" && test -n "$global_symbol_pipe"; then
+ dlsyms="${outputname}S.c"
+ else
+ $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2
+ fi
+ fi
+
+ if test -n "$dlsyms"; then
+ case $dlsyms in
+ "") ;;
+ *.c)
+ # Discover the nlist of each of the dlfiles.
+ nlist="$output_objdir/${outputname}.nm"
+
+ $show "$rm $nlist ${nlist}S ${nlist}T"
+ $run $rm "$nlist" "${nlist}S" "${nlist}T"
+
+ # Parse the name list into a source file.
+ $show "creating $output_objdir/$dlsyms"
+
+ test -z "$run" && $echo > "$output_objdir/$dlsyms" "\
+/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */
+/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+/* Prevent the only kind of declaration conflicts we can make. */
+#define lt_preloaded_symbols some_other_symbol
+
+/* External symbol declarations for the compiler. */\
+"
+
+ if test "$dlself" = yes; then
+ $show "generating symbol list for \`$output'"
+
+ test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist"
+
+ # Add our own program objects to the symbol list.
+ progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+ for arg in $progfiles; do
+ $show "extracting global C symbols from \`$arg'"
+ $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
+ done
+
+ if test -n "$exclude_expsyms"; then
+ $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
+ $run eval '$mv "$nlist"T "$nlist"'
+ fi
+
+ if test -n "$export_symbols_regex"; then
+ $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
+ $run eval '$mv "$nlist"T "$nlist"'
+ fi
+
+ # Prepare the list of exported symbols
+ if test -z "$export_symbols"; then
+ export_symbols="$output_objdir/$output.exp"
+ $run $rm $export_symbols
+ $run eval "${SED} -n -e '/^: @PROGRAM@$/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+ else
+ $run eval "${SED} -e 's/\([][.*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$output.exp"'
+ $run eval 'grep -f "$output_objdir/$output.exp" < "$nlist" > "$nlist"T'
+ $run eval 'mv "$nlist"T "$nlist"'
+ fi
+ fi
+
+ for arg in $dlprefiles; do
+ $show "extracting global C symbols from \`$arg'"
+ name=`$echo "$arg" | ${SED} -e 's%^.*/%%'`
+ $run eval '$echo ": $name " >> "$nlist"'
+ $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
+ done
+
+ if test -z "$run"; then
+ # Make sure we have at least an empty file.
+ test -f "$nlist" || : > "$nlist"
+
+ if test -n "$exclude_expsyms"; then
+ $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
+ $mv "$nlist"T "$nlist"
+ fi
+
+ # Try sorting and uniquifying the output.
+ if grep -v "^: " < "$nlist" |
+ if sort -k 3 </dev/null >/dev/null 2>&1; then
+ sort -k 3
+ else
+ sort +2
+ fi |
+ uniq > "$nlist"S; then
+ :
+ else
+ grep -v "^: " < "$nlist" > "$nlist"S
+ fi
+
+ if test -f "$nlist"S; then
+ eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"'
+ else
+ $echo '/* NONE */' >> "$output_objdir/$dlsyms"
+ fi
+
+ $echo >> "$output_objdir/$dlsyms" "\
+
+#undef lt_preloaded_symbols
+
+#if defined (__STDC__) && __STDC__
+# define lt_ptr void *
+#else
+# define lt_ptr char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+ const char *name;
+ lt_ptr address;
+}
+lt_preloaded_symbols[] =
+{\
+"
+
+ eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms"
+
+ $echo >> "$output_objdir/$dlsyms" "\
+ {0, (lt_ptr) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+ return lt_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif\
+"
+ fi
+
+ pic_flag_for_symtable=
+ case $host in
+ # compiling the symbol table file with pic_flag works around
+ # a FreeBSD bug that causes programs to crash when -lm is
+ # linked before any other PIC object. But we must not use
+ # pic_flag when linking with -static. The problem exists in
+ # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
+ *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+ case "$compile_command " in
+ *" -static "*) ;;
+ *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";;
+ esac;;
+ *-*-hpux*)
+ case "$compile_command " in
+ *" -static "*) ;;
+ *) pic_flag_for_symtable=" $pic_flag";;
+ esac
+ esac
+
+ # Now compile the dynamic symbol file.
+ $show "(cd $output_objdir && $LTCC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")"
+ $run eval '(cd $output_objdir && $LTCC -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $?
+
+ # Clean up the generated files.
+ $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T"
+ $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T"
+
+ # Transform the symbol file into the correct name.
+ compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+ finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+ ;;
+ *)
+ $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+ else
+ # We keep going just in case the user didn't refer to
+ # lt_preloaded_symbols. The linker will fail if global_symbol_pipe
+ # really was required.
+
+ # Nullify the symbol file.
+ compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
+ finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
+ fi
+
+ if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
+ # Replace the output file specification.
+ compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+ link_command="$compile_command$compile_rpath"
+
+ # We have no uninstalled library dependencies, so finalize right now.
+ $show "$link_command"
+ $run eval "$link_command"
+ status=$?
+
+ # Delete the generated files.
+ if test -n "$dlsyms"; then
+ $show "$rm $output_objdir/${outputname}S.${objext}"
+ $run $rm "$output_objdir/${outputname}S.${objext}"
+ fi
+
+ exit $status
+ fi
+
+ if test -n "$shlibpath_var"; then
+ # We should set the shlibpath_var
+ rpath=
+ for dir in $temp_rpath; do
+ case $dir in
+ [\\/]* | [A-Za-z]:[\\/]*)
+ # Absolute path.
+ rpath="$rpath$dir:"
+ ;;
+ *)
+ # Relative path: add a thisdir entry.
+ rpath="$rpath\$thisdir/$dir:"
+ ;;
+ esac
+ done
+ temp_rpath="$rpath"
+ fi
+
+ if test -n "$compile_shlibpath$finalize_shlibpath"; then
+ compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
+ fi
+ if test -n "$finalize_shlibpath"; then
+ finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
+ fi
+
+ compile_var=
+ finalize_var=
+ if test -n "$runpath_var"; then
+ if test -n "$perm_rpath"; then
+ # We should set the runpath_var.
+ rpath=
+ for dir in $perm_rpath; do
+ rpath="$rpath$dir:"
+ done
+ compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
+ fi
+ if test -n "$finalize_perm_rpath"; then
+ # We should set the runpath_var.
+ rpath=
+ for dir in $finalize_perm_rpath; do
+ rpath="$rpath$dir:"
+ done
+ finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
+ fi
+ fi
+
+ if test "$no_install" = yes; then
+ # We don't need to create a wrapper script.
+ link_command="$compile_var$compile_command$compile_rpath"
+ # Replace the output file specification.
+ link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+ # Delete the old output file.
+ $run $rm $output
+ # Link the executable and exit
+ $show "$link_command"
+ $run eval "$link_command" || exit $?
+ exit $EXIT_SUCCESS
+ fi
+
+ if test "$hardcode_action" = relink; then
+ # Fast installation is not supported
+ link_command="$compile_var$compile_command$compile_rpath"
+ relink_command="$finalize_var$finalize_command$finalize_rpath"
+
+ $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2
+ $echo "$modename: \`$output' will be relinked during installation" 1>&2
+ else
+ if test "$fast_install" != no; then
+ link_command="$finalize_var$compile_command$finalize_rpath"
+ if test "$fast_install" = yes; then
+ relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'`
+ else
+ # fast_install is set to needless
+ relink_command=
+ fi
+ else
+ link_command="$compile_var$compile_command$compile_rpath"
+ relink_command="$finalize_var$finalize_command$finalize_rpath"
+ fi
+ fi
+
+ # Replace the output file specification.
+ link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+
+ # Delete the old output files.
+ $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname
+
+ $show "$link_command"
+ $run eval "$link_command" || exit $?
+
+ # Now create the wrapper script.
+ $show "creating $output"
+
+ # Quote the relink command for shipping.
+ if test -n "$relink_command"; then
+ # Preserve any variables that may affect compiler behavior
+ for var in $variables_saved_for_relink; do
+ if eval test -z \"\${$var+set}\"; then
+ relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command"
+ elif eval var_value=\$$var; test -z "$var_value"; then
+ relink_command="$var=; export $var; $relink_command"
+ else
+ var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
+ relink_command="$var=\"$var_value\"; export $var; $relink_command"
+ fi
+ done
+ relink_command="(cd `pwd`; $relink_command)"
+ relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+ fi
+
+ # Quote $echo for shipping.
+ if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then
+ case $progpath in
+ [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";;
+ *) qecho="$SHELL `pwd`/$progpath --fallback-echo";;
+ esac
+ qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"`
+ else
+ qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"`
+ fi
+
+ # Only actually do things if our run command is non-null.
+ if test -z "$run"; then
+ # win32 will think the script is a binary if it has
+ # a .exe suffix, so we strip it off here.
+ case $output in
+ *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;;
+ esac
+ # test for cygwin because mv fails w/o .exe extensions
+ case $host in
+ *cygwin*)
+ exeext=.exe
+ outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;;
+ *) exeext= ;;
+ esac
+ case $host in
+ *cygwin* | *mingw* )
+ cwrappersource=`$echo ${objdir}/lt-${output}.c`
+ cwrapper=`$echo ${output}.exe`
+ $rm $cwrappersource $cwrapper
+ trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
+
+ cat > $cwrappersource <<EOF
+
+/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
+ Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+
+ The $output program cannot be directly executed until all the libtool
+ libraries that it depends on are installed.
+
+ This wrapper executable should never be moved out of the build directory.
+ If it is, it will not operate correctly.
+
+ Currently, it simply execs the wrapper *script* "/bin/sh $output",
+ but could eventually absorb all of the scripts functionality and
+ exec $objdir/$outputname directly.
+*/
+EOF
+ cat >> $cwrappersource<<"EOF"
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <malloc.h>
+#include <stdarg.h>
+#include <assert.h>
+
+#if defined(PATH_MAX)
+# define LT_PATHMAX PATH_MAX
+#elif defined(MAXPATHLEN)
+# define LT_PATHMAX MAXPATHLEN
+#else
+# define LT_PATHMAX 1024
+#endif
+
+#ifndef DIR_SEPARATOR
+#define DIR_SEPARATOR '/'
+#endif
+
+#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
+ defined (__OS2__)
+#define HAVE_DOS_BASED_FILE_SYSTEM
+#ifndef DIR_SEPARATOR_2
+#define DIR_SEPARATOR_2 '\\'
+#endif
+#endif
+
+#ifndef DIR_SEPARATOR_2
+# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+#else /* DIR_SEPARATOR_2 */
+# define IS_DIR_SEPARATOR(ch) \
+ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+#endif /* DIR_SEPARATOR_2 */
+
+#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type)))
+#define XFREE(stale) do { \
+ if (stale) { free ((void *) stale); stale = 0; } \
+} while (0)
+
+const char *program_name = NULL;
+
+void * xmalloc (size_t num);
+char * xstrdup (const char *string);
+char * basename (const char *name);
+char * fnqualify(const char *path);
+char * strendzap(char *str, const char *pat);
+void lt_fatal (const char *message, ...);
+
+int
+main (int argc, char *argv[])
+{
+ char **newargz;
+ int i;
+
+ program_name = (char *) xstrdup ((char *) basename (argv[0]));
+ newargz = XMALLOC(char *, argc+2);
+EOF
+
+ cat >> $cwrappersource <<EOF
+ newargz[0] = "$SHELL";
+EOF
+
+ cat >> $cwrappersource <<"EOF"
+ newargz[1] = fnqualify(argv[0]);
+ /* we know the script has the same name, without the .exe */
+ /* so make sure newargz[1] doesn't end in .exe */
+ strendzap(newargz[1],".exe");
+ for (i = 1; i < argc; i++)
+ newargz[i+1] = xstrdup(argv[i]);
+ newargz[argc+1] = NULL;
+EOF
+
+ cat >> $cwrappersource <<EOF
+ execv("$SHELL",newargz);
+EOF
+
+ cat >> $cwrappersource <<"EOF"
+}
+
+void *
+xmalloc (size_t num)
+{
+ void * p = (void *) malloc (num);
+ if (!p)
+ lt_fatal ("Memory exhausted");
+
+ return p;
+}
+
+char *
+xstrdup (const char *string)
+{
+ return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL
+;
+}
+
+char *
+basename (const char *name)
+{
+ const char *base;
+
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+ /* Skip over the disk name in MSDOS pathnames. */
+ if (isalpha (name[0]) && name[1] == ':')
+ name += 2;
+#endif
+
+ for (base = name; *name; name++)
+ if (IS_DIR_SEPARATOR (*name))
+ base = name + 1;
+ return (char *) base;
+}
+
+char *
+fnqualify(const char *path)
+{
+ size_t size;
+ char *p;
+ char tmp[LT_PATHMAX + 1];
+
+ assert(path != NULL);
+
+ /* Is it qualified already? */
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+ if (isalpha (path[0]) && path[1] == ':')
+ return xstrdup (path);
+#endif
+ if (IS_DIR_SEPARATOR (path[0]))
+ return xstrdup (path);
+
+ /* prepend the current directory */
+ /* doesn't handle '~' */
+ if (getcwd (tmp, LT_PATHMAX) == NULL)
+ lt_fatal ("getcwd failed");
+ size = strlen(tmp) + 1 + strlen(path) + 1; /* +2 for '/' and '\0' */
+ p = XMALLOC(char, size);
+ sprintf(p, "%s%c%s", tmp, DIR_SEPARATOR, path);
+ return p;
+}
+
+char *
+strendzap(char *str, const char *pat)
+{
+ size_t len, patlen;
+
+ assert(str != NULL);
+ assert(pat != NULL);
+
+ len = strlen(str);
+ patlen = strlen(pat);
+
+ if (patlen <= len)
+ {
+ str += len - patlen;
+ if (strcmp(str, pat) == 0)
+ *str = '\0';
+ }
+ return str;
+}
+
+static void
+lt_error_core (int exit_status, const char * mode,
+ const char * message, va_list ap)
+{
+ fprintf (stderr, "%s: %s: ", program_name, mode);
+ vfprintf (stderr, message, ap);
+ fprintf (stderr, ".\n");
+
+ if (exit_status >= 0)
+ exit (exit_status);
+}
+
+void
+lt_fatal (const char *message, ...)
+{
+ va_list ap;
+ va_start (ap, message);
+ lt_error_core (EXIT_FAILURE, "FATAL", message, ap);
+ va_end (ap);
+}
+EOF
+ # we should really use a build-platform specific compiler
+ # here, but OTOH, the wrappers (shell script and this C one)
+ # are only useful if you want to execute the "real" binary.
+ # Since the "real" binary is built for $host, then this
+ # wrapper might as well be built for $host, too.
+ $run $LTCC -s -o $cwrapper $cwrappersource
+ ;;
+ esac
+ $rm $output
+ trap "$rm $output; exit $EXIT_FAILURE" 1 2 15
+
+ $echo > $output "\
+#! $SHELL
+
+# $output - temporary wrapper script for $objdir/$outputname
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# The $output program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='${SED} -e 1s/^X//'
+sed_quote_subst='$sed_quote_subst'
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+if test \"\${CDPATH+set}\" = set; then CDPATH=:; export CDPATH; fi
+
+relink_command=\"$relink_command\"
+
+# This environment variable determines our operation mode.
+if test \"\$libtool_install_magic\" = \"$magic\"; then
+ # install mode needs the following variable:
+ notinst_deplibs='$notinst_deplibs'
+else
+ # When we are sourced in execute mode, \$file and \$echo are already set.
+ if test \"\$libtool_execute_magic\" != \"$magic\"; then
+ echo=\"$qecho\"
+ file=\"\$0\"
+ # Make sure echo works.
+ if test \"X\$1\" = X--no-reexec; then
+ # Discard the --no-reexec flag, and continue.
+ shift
+ elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then
+ # Yippee, \$echo works!
+ :
+ else
+ # Restart under the correct shell, and then maybe \$echo will work.
+ exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"}
+ fi
+ fi\
+"
+ $echo >> $output "\
+
+ # Find the directory that this script lives in.
+ thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\`
+ test \"x\$thisdir\" = \"x\$file\" && thisdir=.
+
+ # Follow symbolic links until we get to the real thisdir.
+ file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\`
+ while test -n \"\$file\"; do
+ destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\`
+
+ # If there was a directory component, then change thisdir.
+ if test \"x\$destdir\" != \"x\$file\"; then
+ case \"\$destdir\" in
+ [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
+ *) thisdir=\"\$thisdir/\$destdir\" ;;
+ esac
+ fi
+
+ file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
+ file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\`
+ done
+
+ # Try to get the absolute directory name.
+ absdir=\`cd \"\$thisdir\" && pwd\`
+ test -n \"\$absdir\" && thisdir=\"\$absdir\"
+"
+
+ if test "$fast_install" = yes; then
+ $echo >> $output "\
+ program=lt-'$outputname'$exeext
+ progdir=\"\$thisdir/$objdir\"
+
+ if test ! -f \"\$progdir/\$program\" || \\
+ { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
+ test \"X\$file\" != \"X\$progdir/\$program\"; }; then
+
+ file=\"\$\$-\$program\"
+
+ if test ! -d \"\$progdir\"; then
+ $mkdir \"\$progdir\"
+ else
+ $rm \"\$progdir/\$file\"
+ fi"
+
+ $echo >> $output "\
+
+ # relink executable if necessary
+ if test -n \"\$relink_command\"; then
+ if relink_command_output=\`eval \$relink_command 2>&1\`; then :
+ else
+ $echo \"\$relink_command_output\" >&2
+ $rm \"\$progdir/\$file\"
+ exit $EXIT_FAILURE
+ fi
+ fi
+
+ $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
+ { $rm \"\$progdir/\$program\";
+ $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; }
+ $rm \"\$progdir/\$file\"
+ fi"
+ else
+ $echo >> $output "\
+ program='$outputname'
+ progdir=\"\$thisdir/$objdir\"
+"
+ fi
+
+ $echo >> $output "\
+
+ if test -f \"\$progdir/\$program\"; then"
+
+ # Export our shlibpath_var if we have one.
+ if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+ $echo >> $output "\
+ # Add our own library path to $shlibpath_var
+ $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
+
+ # Some systems cannot cope with colon-terminated $shlibpath_var
+ # The second colon is a workaround for a bug in BeOS R4 sed
+ $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\`
+
+ export $shlibpath_var
+"
+ fi
+
+ # fixup the dll searchpath if we need to.
+ if test -n "$dllsearchpath"; then
+ $echo >> $output "\
+ # Add the dll search path components to the executable PATH
+ PATH=$dllsearchpath:\$PATH
+"
+ fi
+
+ $echo >> $output "\
+ if test \"\$libtool_execute_magic\" != \"$magic\"; then
+ # Run the actual program with our arguments.
+"
+ case $host in
+ # Backslashes separate directories on plain windows
+ *-*-mingw | *-*-os2*)
+ $echo >> $output "\
+ exec \$progdir\\\\\$program \${1+\"\$@\"}
+"
+ ;;
+
+ *)
+ $echo >> $output "\
+ exec \$progdir/\$program \${1+\"\$@\"}
+"
+ ;;
+ esac
+ $echo >> $output "\
+ \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\"
+ exit $EXIT_FAILURE
+ fi
+ else
+ # The program doesn't exist.
+ \$echo \"\$0: error: \$progdir/\$program does not exist\" 1>&2
+ \$echo \"This script is just a wrapper for \$program.\" 1>&2
+ $echo \"See the $PACKAGE documentation for more information.\" 1>&2
+ exit $EXIT_FAILURE
+ fi
+fi\
+"
+ chmod +x $output
+ fi
+ exit $EXIT_SUCCESS
+ ;;
+ esac
+
+ # See if we need to build an old-fashioned archive.
+ for oldlib in $oldlibs; do
+
+ if test "$build_libtool_libs" = convenience; then
+ oldobjs="$libobjs_save"
+ addlibs="$convenience"
+ build_libtool_libs=no
+ else
+ if test "$build_libtool_libs" = module; then
+ oldobjs="$libobjs_save"
+ build_libtool_libs=no
+ else
+ oldobjs="$old_deplibs $non_pic_objects"
+ fi
+ addlibs="$old_convenience"
+ fi
+
+ if test -n "$addlibs"; then
+ gentop="$output_objdir/${outputname}x"
+ $show "${rm}r $gentop"
+ $run ${rm}r "$gentop"
+ $show "$mkdir $gentop"
+ $run $mkdir "$gentop"
+ status=$?
+ if test "$status" -ne 0 && test ! -d "$gentop"; then
+ exit $status
+ fi
+ generated="$generated $gentop"
+
+ # Add in members from convenience archives.
+ for xlib in $addlibs; do
+ # Extract the objects.
+ case $xlib in
+ [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;;
+ *) xabs=`pwd`"/$xlib" ;;
+ esac
+ xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'`
+ xdir="$gentop/$xlib"
+
+ $show "${rm}r $xdir"
+ $run ${rm}r "$xdir"
+ $show "$mkdir $xdir"
+ $run $mkdir "$xdir"
+ status=$?
+ if test "$status" -ne 0 && test ! -d "$xdir"; then
+ exit $status
+ fi
+ # We will extract separately just the conflicting names and we will no
+ # longer touch any unique names. It is faster to leave these extract
+ # automatically by $AR in one run.
+ $show "(cd $xdir && $AR x $xabs)"
+ $run eval "(cd \$xdir && $AR x \$xabs)" || exit $?
+ if ($AR t "$xabs" | sort | sort -uc >/dev/null 2>&1); then
+ :
+ else
+ $echo "$modename: warning: object name conflicts; renaming object files" 1>&2
+ $echo "$modename: warning: to ensure that they will not overwrite" 1>&2
+ $AR t "$xabs" | sort | uniq -cd | while read -r count name
+ do
+ i=1
+ while test "$i" -le "$count"
+ do
+ # Put our $i before any first dot (extension)
+ # Never overwrite any file
+ name_to="$name"
+ while test "X$name_to" = "X$name" || test -f "$xdir/$name_to"
+ do
+ name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"`
+ done
+ $show "(cd $xdir && $AR xN $i $xabs '$name' && $mv '$name' '$name_to')"
+ $run eval "(cd \$xdir && $AR xN $i \$xabs '$name' && $mv '$name' '$name_to')" || exit $?
+ i=`expr $i + 1`
+ done
+ done
+ fi
+
+ oldobjs="$oldobjs "`find $xdir -name \*.${objext} -print -o -name \*.lo -print | $NL2SP`
+ done
+ fi
+
+ # Do each command in the archive commands.
+ if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+ cmds=$old_archive_from_new_cmds
+ else
+ eval cmds=\"$old_archive_cmds\"
+
+ if len=`expr "X$cmds" : ".*"` &&
+ test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+ cmds=$old_archive_cmds
+ else
+ # the command line is too long to link in one step, link in parts
+ $echo "using piecewise archive linking..."
+ save_RANLIB=$RANLIB
+ RANLIB=:
+ objlist=
+ concat_cmds=
+ save_oldobjs=$oldobjs
+ # GNU ar 2.10+ was changed to match POSIX; thus no paths are
+ # encoded into archives. This makes 'ar r' malfunction in
+ # this piecewise linking case whenever conflicting object
+ # names appear in distinct ar calls; check, warn and compensate.
+ if (for obj in $save_oldobjs
+ do
+ $echo "X$obj" | $Xsed -e 's%^.*/%%'
+ done | sort | sort -uc >/dev/null 2>&1); then
+ :
+ else
+ $echo "$modename: warning: object name conflicts; overriding AR_FLAGS to 'cq'" 1>&2
+ $echo "$modename: warning: to ensure that POSIX-compatible ar will work" 1>&2
+ AR_FLAGS=cq
+ fi
+ # Is there a better way of finding the last object in the list?
+ for obj in $save_oldobjs
+ do
+ last_oldobj=$obj
+ done
+ for obj in $save_oldobjs
+ do
+ oldobjs="$objlist $obj"
+ objlist="$objlist $obj"
+ eval test_cmds=\"$old_archive_cmds\"
+ if len=`expr "X$test_cmds" : ".*"` &&
+ test "$len" -le "$max_cmd_len"; then
+ :
+ else
+ # the above command should be used before it gets too long
+ oldobjs=$objlist
+ if test "$obj" = "$last_oldobj" ; then
+ RANLIB=$save_RANLIB
+ fi
+ test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
+ objlist=
+ fi
+ done
+ RANLIB=$save_RANLIB
+ oldobjs=$objlist
+ if test "X$oldobjs" = "X" ; then
+ eval cmds=\"\$concat_cmds\"
+ else
+ eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
+ fi
+ fi
+ fi
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ eval cmd=\"$cmd\"
+ IFS="$save_ifs"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ done
+
+ if test -n "$generated"; then
+ $show "${rm}r$generated"
+ $run ${rm}r$generated
+ fi
+
+ # Now create the libtool archive.
+ case $output in
+ *.la)
+ old_library=
+ test "$build_old_libs" = yes && old_library="$libname.$libext"
+ $show "creating $output"
+
+ # Preserve any variables that may affect compiler behavior
+ for var in $variables_saved_for_relink; do
+ if eval test -z \"\${$var+set}\"; then
+ relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command"
+ elif eval var_value=\$$var; test -z "$var_value"; then
+ relink_command="$var=; export $var; $relink_command"
+ else
+ var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
+ relink_command="$var=\"$var_value\"; export $var; $relink_command"
+ fi
+ done
+ # Quote the link command for shipping.
+ relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+ relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+ if test "$hardcode_automatic" = yes ; then
+ relink_command=
+ fi
+
+
+ # Only create the output if not a dry run.
+ if test -z "$run"; then
+ for installed in no yes; do
+ if test "$installed" = yes; then
+ if test -z "$install_libdir"; then
+ break
+ fi
+ output="$output_objdir/$outputname"i
+ # Replace all uninstalled libtool libraries with the installed ones
+ newdependency_libs=
+ for deplib in $dependency_libs; do
+ case $deplib in
+ *.la)
+ name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'`
+ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+ if test -z "$libdir"; then
+ $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ newdependency_libs="$newdependency_libs $libdir/$name"
+ ;;
+ *) newdependency_libs="$newdependency_libs $deplib" ;;
+ esac
+ done
+ dependency_libs="$newdependency_libs"
+ newdlfiles=
+ for lib in $dlfiles; do
+ name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+ if test -z "$libdir"; then
+ $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ newdlfiles="$newdlfiles $libdir/$name"
+ done
+ dlfiles="$newdlfiles"
+ newdlprefiles=
+ for lib in $dlprefiles; do
+ name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+ if test -z "$libdir"; then
+ $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ newdlprefiles="$newdlprefiles $libdir/$name"
+ done
+ dlprefiles="$newdlprefiles"
+ else
+ newdlfiles=
+ for lib in $dlfiles; do
+ case $lib in
+ [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+ *) abs=`pwd`"/$lib" ;;
+ esac
+ newdlfiles="$newdlfiles $abs"
+ done
+ dlfiles="$newdlfiles"
+ newdlprefiles=
+ for lib in $dlprefiles; do
+ case $lib in
+ [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+ *) abs=`pwd`"/$lib" ;;
+ esac
+ newdlprefiles="$newdlprefiles $abs"
+ done
+ dlprefiles="$newdlprefiles"
+ fi
+ $rm $output
+ # place dlname in correct position for cygwin
+ tdlname=$dlname
+ case $host,$output,$installed,$module,$dlname in
+ *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;
+ esac
+ $echo > $output "\
+# $outputname - a libtool library file
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='$tdlname'
+
+# Names of this library.
+library_names='$library_names'
+
+# The name of the static archive.
+old_library='$old_library'
+
+# Libraries that this one depends upon.
+dependency_libs='$dependency_libs'
+
+# Version information for $libname.
+current=$current
+age=$age
+revision=$revision
+
+# Is this an already installed library?
+installed=$installed
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=$module
+
+# Files to dlopen/dlpreopen
+dlopen='$dlfiles'
+dlpreopen='$dlprefiles'
+
+# Directory that this library needs to be installed in:
+libdir='$install_libdir'"
+ if test "$installed" = no && test "$need_relink" = yes; then
+ $echo >> $output "\
+relink_command=\"$relink_command\""
+ fi
+ done
+ fi
+
+ # Do a symbolic link so that the libtool archive can be found in
+ # LD_LIBRARY_PATH before the program is installed.
+ $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)"
+ $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $?
+ ;;
+ esac
+ exit $EXIT_SUCCESS
+ ;;
+
+ # libtool install mode
+ install)
+ modename="$modename: install"
+
+ # There may be an optional sh(1) argument at the beginning of
+ # install_prog (especially on Windows NT).
+ if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
+ # Allow the use of GNU shtool's install command.
+ $echo "X$nonopt" | $Xsed | grep shtool > /dev/null; then
+ # Aesthetically quote it.
+ arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*)
+ arg="\"$arg\""
+ ;;
+ esac
+ install_prog="$arg "
+ arg="$1"
+ shift
+ else
+ install_prog=
+ arg="$nonopt"
+ fi
+
+ # The real first argument should be the name of the installation program.
+ # Aesthetically quote it.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*)
+ arg="\"$arg\""
+ ;;
+ esac
+ install_prog="$install_prog$arg"
+
+ # We need to accept at least all the BSD install flags.
+ dest=
+ files=
+ opts=
+ prev=
+ install_type=
+ isdir=no
+ stripme=
+ for arg
+ do
+ if test -n "$dest"; then
+ files="$files $dest"
+ dest="$arg"
+ continue
+ fi
+
+ case $arg in
+ -d) isdir=yes ;;
+ -f) prev="-f" ;;
+ -g) prev="-g" ;;
+ -m) prev="-m" ;;
+ -o) prev="-o" ;;
+ -s)
+ stripme=" -s"
+ continue
+ ;;
+ -*) ;;
+
+ *)
+ # If the previous option needed an argument, then skip it.
+ if test -n "$prev"; then
+ prev=
+ else
+ dest="$arg"
+ continue
+ fi
+ ;;
+ esac
+
+ # Aesthetically quote the argument.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*)
+ arg="\"$arg\""
+ ;;
+ esac
+ install_prog="$install_prog $arg"
+ done
+
+ if test -z "$install_prog"; then
+ $echo "$modename: you must specify an install program" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ if test -n "$prev"; then
+ $echo "$modename: the \`$prev' option requires an argument" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ if test -z "$files"; then
+ if test -z "$dest"; then
+ $echo "$modename: no file or destination specified" 1>&2
+ else
+ $echo "$modename: you must specify a destination" 1>&2
+ fi
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Strip any trailing slash from the destination.
+ dest=`$echo "X$dest" | $Xsed -e 's%/$%%'`
+
+ # Check to see that the destination is a directory.
+ test -d "$dest" && isdir=yes
+ if test "$isdir" = yes; then
+ destdir="$dest"
+ destname=
+ else
+ destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$destdir" = "X$dest" && destdir=.
+ destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'`
+
+ # Not a directory, so check to see that there is only one file specified.
+ set dummy $files
+ if test "$#" -gt 2; then
+ $echo "$modename: \`$dest' is not a directory" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ fi
+ case $destdir in
+ [\\/]* | [A-Za-z]:[\\/]*) ;;
+ *)
+ for file in $files; do
+ case $file in
+ *.lo) ;;
+ *)
+ $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+ done
+ ;;
+ esac
+
+ # This variable tells wrapper scripts just to set variables rather
+ # than running their programs.
+ libtool_install_magic="$magic"
+
+ staticlibs=
+ future_libdirs=
+ current_libdirs=
+ for file in $files; do
+
+ # Do each installation.
+ case $file in
+ *.$libext)
+ # Do the static libraries later.
+ staticlibs="$staticlibs $file"
+ ;;
+
+ *.la)
+ # Check to see that this really is a libtool archive.
+ if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+ else
+ $echo "$modename: \`$file' is not a valid libtool archive" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ library_names=
+ old_library=
+ relink_command=
+ # If there is no directory component, then add one.
+ case $file in
+ */* | *\\*) . $file ;;
+ *) . ./$file ;;
+ esac
+
+ # Add the libdir to current_libdirs if it is the destination.
+ if test "X$destdir" = "X$libdir"; then
+ case "$current_libdirs " in
+ *" $libdir "*) ;;
+ *) current_libdirs="$current_libdirs $libdir" ;;
+ esac
+ else
+ # Note the libdir as a future libdir.
+ case "$future_libdirs " in
+ *" $libdir "*) ;;
+ *) future_libdirs="$future_libdirs $libdir" ;;
+ esac
+ fi
+
+ dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/
+ test "X$dir" = "X$file/" && dir=
+ dir="$dir$objdir"
+
+ if test -n "$relink_command"; then
+ # Determine the prefix the user has applied to our future dir.
+ inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"`
+
+ # Don't allow the user to place us outside of our expected
+ # location b/c this prevents finding dependent libraries that
+ # are installed to the same prefix.
+ # At present, this check doesn't affect windows .dll's that
+ # are installed into $libdir/../bin (currently, that works fine)
+ # but it's something to keep an eye on.
+ if test "$inst_prefix_dir" = "$destdir"; then
+ $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ if test -n "$inst_prefix_dir"; then
+ # Stick the inst_prefix_dir data into the link command.
+ relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
+ else
+ relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
+ fi
+
+ $echo "$modename: warning: relinking \`$file'" 1>&2
+ $show "$relink_command"
+ if $run eval "$relink_command"; then :
+ else
+ $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ fi
+
+ # See the names of the shared library.
+ set dummy $library_names
+ if test -n "$2"; then
+ realname="$2"
+ shift
+ shift
+
+ srcname="$realname"
+ test -n "$relink_command" && srcname="$realname"T
+
+ # Install the shared library and build the symlinks.
+ $show "$install_prog $dir/$srcname $destdir/$realname"
+ $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $?
+ if test -n "$stripme" && test -n "$striplib"; then
+ $show "$striplib $destdir/$realname"
+ $run eval "$striplib $destdir/$realname" || exit $?
+ fi
+
+ if test "$#" -gt 0; then
+ # Delete the old symlinks, and create new ones.
+ for linkname
+ do
+ if test "$linkname" != "$realname"; then
+ $show "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)"
+ $run eval "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)"
+ fi
+ done
+ fi
+
+ # Do each command in the postinstall commands.
+ lib="$destdir/$realname"
+ cmds=$postinstall_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ fi
+
+ # Install the pseudo-library for information purposes.
+ name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+ instname="$dir/$name"i
+ $show "$install_prog $instname $destdir/$name"
+ $run eval "$install_prog $instname $destdir/$name" || exit $?
+
+ # Maybe install the static library, too.
+ test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
+ ;;
+
+ *.lo)
+ # Install (i.e. copy) a libtool object.
+
+ # Figure out destination file name, if it wasn't already specified.
+ if test -n "$destname"; then
+ destfile="$destdir/$destname"
+ else
+ destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+ destfile="$destdir/$destfile"
+ fi
+
+ # Deduce the name of the destination old-style object file.
+ case $destfile in
+ *.lo)
+ staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"`
+ ;;
+ *.$objext)
+ staticdest="$destfile"
+ destfile=
+ ;;
+ *)
+ $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ # Install the libtool object if requested.
+ if test -n "$destfile"; then
+ $show "$install_prog $file $destfile"
+ $run eval "$install_prog $file $destfile" || exit $?
+ fi
+
+ # Install the old object if enabled.
+ if test "$build_old_libs" = yes; then
+ # Deduce the name of the old-style object file.
+ staticobj=`$echo "X$file" | $Xsed -e "$lo2o"`
+
+ $show "$install_prog $staticobj $staticdest"
+ $run eval "$install_prog \$staticobj \$staticdest" || exit $?
+ fi
+ exit $EXIT_SUCCESS
+ ;;
+
+ *)
+ # Figure out destination file name, if it wasn't already specified.
+ if test -n "$destname"; then
+ destfile="$destdir/$destname"
+ else
+ destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+ destfile="$destdir/$destfile"
+ fi
+
+ # If the file is missing, and there is a .exe on the end, strip it
+ # because it is most likely a libtool script we actually want to
+ # install
+ stripped_ext=""
+ case $file in
+ *.exe)
+ if test ! -f "$file"; then
+ file=`$echo $file|${SED} 's,.exe$,,'`
+ stripped_ext=".exe"
+ fi
+ ;;
+ esac
+
+ # Do a test to see if this is really a libtool program.
+ case $host in
+ *cygwin*|*mingw*)
+ wrapper=`$echo $file | ${SED} -e 's,.exe$,,'`
+ ;;
+ *)
+ wrapper=$file
+ ;;
+ esac
+ if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then
+ notinst_deplibs=
+ relink_command=
+
+ # To insure that "foo" is sourced, and not "foo.exe",
+ # finese the cygwin/MSYS system by explicitly sourcing "foo."
+ # which disallows the automatic-append-.exe behavior.
+ case $build in
+ *cygwin* | *mingw*) wrapperdot=${wrapper}. ;;
+ *) wrapperdot=${wrapper} ;;
+ esac
+ # If there is no directory component, then add one.
+ case $file in
+ */* | *\\*) . ${wrapperdot} ;;
+ *) . ./${wrapperdot} ;;
+ esac
+
+ # Check the variables that should have been set.
+ if test -z "$notinst_deplibs"; then
+ $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ finalize=yes
+ for lib in $notinst_deplibs; do
+ # Check to see that each library is installed.
+ libdir=
+ if test -f "$lib"; then
+ # If there is no directory component, then add one.
+ case $lib in
+ */* | *\\*) . $lib ;;
+ *) . ./$lib ;;
+ esac
+ fi
+ libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test
+ if test -n "$libdir" && test ! -f "$libfile"; then
+ $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2
+ finalize=no
+ fi
+ done
+
+ relink_command=
+ # To insure that "foo" is sourced, and not "foo.exe",
+ # finese the cygwin/MSYS system by explicitly sourcing "foo."
+ # which disallows the automatic-append-.exe behavior.
+ case $build in
+ *cygwin* | *mingw*) wrapperdot=${wrapper}. ;;
+ *) wrapperdot=${wrapper} ;;
+ esac
+ # If there is no directory component, then add one.
+ case $file in
+ */* | *\\*) . ${wrapperdot} ;;
+ *) . ./${wrapperdot} ;;
+ esac
+
+ outputname=
+ if test "$fast_install" = no && test -n "$relink_command"; then
+ if test "$finalize" = yes && test -z "$run"; then
+ tmpdir="/tmp"
+ test -n "$TMPDIR" && tmpdir="$TMPDIR"
+ tmpdir="$tmpdir/libtool-$$"
+ save_umask=`umask`
+ umask 0077
+ if $mkdir "$tmpdir"; then
+ umask $save_umask
+ else
+ umask $save_umask
+ $echo "$modename: error: cannot create temporary directory \`$tmpdir'" 1>&2
+ continue
+ fi
+ file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'`
+ outputname="$tmpdir/$file"
+ # Replace the output file specification.
+ relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'`
+
+ $show "$relink_command"
+ if $run eval "$relink_command"; then :
+ else
+ $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
+ ${rm}r "$tmpdir"
+ continue
+ fi
+ file="$outputname"
+ else
+ $echo "$modename: warning: cannot relink \`$file'" 1>&2
+ fi
+ else
+ # Install the binary that we compiled earlier.
+ file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"`
+ fi
+ fi
+
+ # remove .exe since cygwin /usr/bin/install will append another
+ # one anyways
+ case $install_prog,$host in
+ */usr/bin/install*,*cygwin*)
+ case $file:$destfile in
+ *.exe:*.exe)
+ # this is ok
+ ;;
+ *.exe:*)
+ destfile=$destfile.exe
+ ;;
+ *:*.exe)
+ destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'`
+ ;;
+ esac
+ ;;
+ esac
+ $show "$install_prog$stripme $file $destfile"
+ $run eval "$install_prog\$stripme \$file \$destfile" || exit $?
+ test -n "$outputname" && ${rm}r "$tmpdir"
+ ;;
+ esac
+ done
+
+ for file in $staticlibs; do
+ name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+
+ # Set up the ranlib parameters.
+ oldlib="$destdir/$name"
+
+ $show "$install_prog $file $oldlib"
+ $run eval "$install_prog \$file \$oldlib" || exit $?
+
+ if test -n "$stripme" && test -n "$old_striplib"; then
+ $show "$old_striplib $oldlib"
+ $run eval "$old_striplib $oldlib" || exit $?
+ fi
+
+ # Do each command in the postinstall commands.
+ cmds=$old_postinstall_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ done
+
+ if test -n "$future_libdirs"; then
+ $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2
+ fi
+
+ if test -n "$current_libdirs"; then
+ # Maybe just do a dry run.
+ test -n "$run" && current_libdirs=" -n$current_libdirs"
+ exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
+ else
+ exit $EXIT_SUCCESS
+ fi
+ ;;
+
+ # libtool finish mode
+ finish)
+ modename="$modename: finish"
+ libdirs="$nonopt"
+ admincmds=
+
+ if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+ for dir
+ do
+ libdirs="$libdirs $dir"
+ done
+
+ for libdir in $libdirs; do
+ if test -n "$finish_cmds"; then
+ # Do each command in the finish commands.
+ cmds=$finish_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || admincmds="$admincmds
+ $cmd"
+ done
+ IFS="$save_ifs"
+ fi
+ if test -n "$finish_eval"; then
+ # Do the single finish_eval.
+ eval cmds=\"$finish_eval\"
+ $run eval "$cmds" || admincmds="$admincmds
+ $cmds"
+ fi
+ done
+ fi
+
+ # Exit here if they wanted silent mode.
+ test "$show" = : && exit $EXIT_SUCCESS
+
+ $echo "----------------------------------------------------------------------"
+ $echo "Libraries have been installed in:"
+ for libdir in $libdirs; do
+ $echo " $libdir"
+ done
+ $echo
+ $echo "If you ever happen to want to link against installed libraries"
+ $echo "in a given directory, LIBDIR, you must either use libtool, and"
+ $echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
+ $echo "flag during linking and do at least one of the following:"
+ if test -n "$shlibpath_var"; then
+ $echo " - add LIBDIR to the \`$shlibpath_var' environment variable"
+ $echo " during execution"
+ fi
+ if test -n "$runpath_var"; then
+ $echo " - add LIBDIR to the \`$runpath_var' environment variable"
+ $echo " during linking"
+ fi
+ if test -n "$hardcode_libdir_flag_spec"; then
+ libdir=LIBDIR
+ eval flag=\"$hardcode_libdir_flag_spec\"
+
+ $echo " - use the \`$flag' linker flag"
+ fi
+ if test -n "$admincmds"; then
+ $echo " - have your system administrator run these commands:$admincmds"
+ fi
+ if test -f /etc/ld.so.conf; then
+ $echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+ fi
+ $echo
+ $echo "See any operating system documentation about shared libraries for"
+ $echo "more information, such as the ld(1) and ld.so(8) manual pages."
+ $echo "----------------------------------------------------------------------"
+ exit $EXIT_SUCCESS
+ ;;
+
+ # libtool execute mode
+ execute)
+ modename="$modename: execute"
+
+ # The first argument is the command name.
+ cmd="$nonopt"
+ if test -z "$cmd"; then
+ $echo "$modename: you must specify a COMMAND" 1>&2
+ $echo "$help"
+ exit $EXIT_FAILURE
+ fi
+
+ # Handle -dlopen flags immediately.
+ for file in $execute_dlfiles; do
+ if test ! -f "$file"; then
+ $echo "$modename: \`$file' is not a file" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ dir=
+ case $file in
+ *.la)
+ # Check to see that this really is a libtool archive.
+ if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+ else
+ $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Read the libtool library.
+ dlname=
+ library_names=
+
+ # If there is no directory component, then add one.
+ case $file in
+ */* | *\\*) . $file ;;
+ *) . ./$file ;;
+ esac
+
+ # Skip this library if it cannot be dlopened.
+ if test -z "$dlname"; then
+ # Warn if it was a shared library.
+ test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'"
+ continue
+ fi
+
+ dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$dir" = "X$file" && dir=.
+
+ if test -f "$dir/$objdir/$dlname"; then
+ dir="$dir/$objdir"
+ else
+ $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ ;;
+
+ *.lo)
+ # Just add the directory containing the .lo file.
+ dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$dir" = "X$file" && dir=.
+ ;;
+
+ *)
+ $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2
+ continue
+ ;;
+ esac
+
+ # Get the absolute pathname.
+ absdir=`cd "$dir" && pwd`
+ test -n "$absdir" && dir="$absdir"
+
+ # Now add the directory to shlibpath_var.
+ if eval "test -z \"\$$shlibpath_var\""; then
+ eval "$shlibpath_var=\"\$dir\""
+ else
+ eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
+ fi
+ done
+
+ # This variable tells wrapper scripts just to set shlibpath_var
+ # rather than running their programs.
+ libtool_execute_magic="$magic"
+
+ # Check if any of the arguments is a wrapper script.
+ args=
+ for file
+ do
+ case $file in
+ -*) ;;
+ *)
+ # Do a test to see if this is really a libtool program.
+ if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ # If there is no directory component, then add one.
+ case $file in
+ */* | *\\*) . $file ;;
+ *) . ./$file ;;
+ esac
+
+ # Transform arg to wrapped name.
+ file="$progdir/$program"
+ fi
+ ;;
+ esac
+ # Quote arguments (to preserve shell metacharacters).
+ file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"`
+ args="$args \"$file\""
+ done
+
+ if test -z "$run"; then
+ if test -n "$shlibpath_var"; then
+ # Export the shlibpath_var.
+ eval "export $shlibpath_var"
+ fi
+
+ # Restore saved environment variables
+ if test "${save_LC_ALL+set}" = set; then
+ LC_ALL="$save_LC_ALL"; export LC_ALL
+ fi
+ if test "${save_LANG+set}" = set; then
+ LANG="$save_LANG"; export LANG
+ fi
+
+ # Now prepare to actually exec the command.
+ exec_cmd="\$cmd$args"
+ else
+ # Display what would be done.
+ if test -n "$shlibpath_var"; then
+ eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\""
+ $echo "export $shlibpath_var"
+ fi
+ $echo "$cmd$args"
+ exit $EXIT_SUCCESS
+ fi
+ ;;
+
+ # libtool clean and uninstall mode
+ clean | uninstall)
+ modename="$modename: $mode"
+ rm="$nonopt"
+ files=
+ rmforce=
+ exit_status=0
+
+ # This variable tells wrapper scripts just to set variables rather
+ # than running their programs.
+ libtool_install_magic="$magic"
+
+ for arg
+ do
+ case $arg in
+ -f) rm="$rm $arg"; rmforce=yes ;;
+ -*) rm="$rm $arg" ;;
+ *) files="$files $arg" ;;
+ esac
+ done
+
+ if test -z "$rm"; then
+ $echo "$modename: you must specify an RM program" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ rmdirs=
+
+ origobjdir="$objdir"
+ for file in $files; do
+ dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$dir" = "X$file"; then
+ dir=.
+ objdir="$origobjdir"
+ else
+ objdir="$dir/$origobjdir"
+ fi
+ name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+ test "$mode" = uninstall && objdir="$dir"
+
+ # Remember objdir for removal later, being careful to avoid duplicates
+ if test "$mode" = clean; then
+ case " $rmdirs " in
+ *" $objdir "*) ;;
+ *) rmdirs="$rmdirs $objdir" ;;
+ esac
+ fi
+
+ # Don't error if the file doesn't exist and rm -f was used.
+ if (test -L "$file") >/dev/null 2>&1 \
+ || (test -h "$file") >/dev/null 2>&1 \
+ || test -f "$file"; then
+ :
+ elif test -d "$file"; then
+ exit_status=1
+ continue
+ elif test "$rmforce" = yes; then
+ continue
+ fi
+
+ rmfiles="$file"
+
+ case $name in
+ *.la)
+ # Possibly a libtool archive, so verify it.
+ if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ . $dir/$name
+
+ # Delete the libtool libraries and symlinks.
+ for n in $library_names; do
+ rmfiles="$rmfiles $objdir/$n"
+ done
+ test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library"
+ test "$mode" = clean && rmfiles="$rmfiles $objdir/$name $objdir/${name}i"
+
+ if test "$mode" = uninstall; then
+ if test -n "$library_names"; then
+ # Do each command in the postuninstall commands.
+ cmds=$postuninstall_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd"
+ if test "$?" -ne 0 && test "$rmforce" != yes; then
+ exit_status=1
+ fi
+ done
+ IFS="$save_ifs"
+ fi
+
+ if test -n "$old_library"; then
+ # Do each command in the old_postuninstall commands.
+ cmds=$old_postuninstall_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd"
+ if test "$?" -ne 0 && test "$rmforce" != yes; then
+ exit_status=1
+ fi
+ done
+ IFS="$save_ifs"
+ fi
+ # FIXME: should reinstall the best remaining shared library.
+ fi
+ fi
+ ;;
+
+ *.lo)
+ # Possibly a libtool object, so verify it.
+ if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+
+ # Read the .lo file
+ . $dir/$name
+
+ # Add PIC object to the list of files to remove.
+ if test -n "$pic_object" \
+ && test "$pic_object" != none; then
+ rmfiles="$rmfiles $dir/$pic_object"
+ fi
+
+ # Add non-PIC object to the list of files to remove.
+ if test -n "$non_pic_object" \
+ && test "$non_pic_object" != none; then
+ rmfiles="$rmfiles $dir/$non_pic_object"
+ fi
+ fi
+ ;;
+
+ *)
+ if test "$mode" = clean ; then
+ noexename=$name
+ case $file in
+ *.exe)
+ file=`$echo $file|${SED} 's,.exe$,,'`
+ noexename=`$echo $name|${SED} 's,.exe$,,'`
+ # $file with .exe has already been added to rmfiles,
+ # add $file without .exe
+ rmfiles="$rmfiles $file"
+ ;;
+ esac
+ # Do a test to see if this is a libtool program.
+ if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ relink_command=
+ . $dir/$noexename
+
+ # note $name still contains .exe if it was in $file originally
+ # as does the version of $file that was added into $rmfiles
+ rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
+ if test "$fast_install" = yes && test -n "$relink_command"; then
+ rmfiles="$rmfiles $objdir/lt-$name"
+ fi
+ if test "X$noexename" != "X$name" ; then
+ rmfiles="$rmfiles $objdir/lt-${noexename}.c"
+ fi
+ fi
+ fi
+ ;;
+ esac
+ $show "$rm $rmfiles"
+ $run $rm $rmfiles || exit_status=1
+ done
+ objdir="$origobjdir"
+
+ # Try to remove the ${objdir}s in the directories where we deleted files
+ for dir in $rmdirs; do
+ if test -d "$dir"; then
+ $show "rmdir $dir"
+ $run rmdir $dir >/dev/null 2>&1
+ fi
+ done
+
+ exit $exit_status
+ ;;
+
+ "")
+ $echo "$modename: you must specify a MODE" 1>&2
+ $echo "$generic_help" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ if test -z "$exec_cmd"; then
+ $echo "$modename: invalid operation mode \`$mode'" 1>&2
+ $echo "$generic_help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+fi # test -z "$show_help"
+
+if test -n "$exec_cmd"; then
+ eval exec $exec_cmd
+ exit $EXIT_FAILURE
+fi
+
+# We need to display help for each of the modes.
+case $mode in
+"") $echo \
+"Usage: $modename [OPTION]... [MODE-ARG]...
+
+Provide generalized library-building support services.
+
+ --config show all configuration variables
+ --debug enable verbose shell tracing
+-n, --dry-run display commands without modifying any files
+ --features display basic configuration information and exit
+ --finish same as \`--mode=finish'
+ --help display this help message and exit
+ --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS]
+ --quiet same as \`--silent'
+ --silent don't print informational messages
+ --tag=TAG use configuration variables from tag TAG
+ --version print version information
+
+MODE must be one of the following:
+
+ clean remove files from the build directory
+ compile compile a source file into a libtool object
+ execute automatically set library path, then run a program
+ finish complete the installation of libtool libraries
+ install install libraries or executables
+ link create a library or an executable
+ uninstall remove libraries from an installed directory
+
+MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for
+a more detailed description of MODE.
+
+Report bugs to <bug-libtool@gnu.org>."
+ exit $EXIT_SUCCESS
+ ;;
+
+clean)
+ $echo \
+"Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
+
+Remove files from the build directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, object or program, all the files associated
+with it are deleted. Otherwise, only FILE itself is deleted using RM."
+ ;;
+
+compile)
+ $echo \
+"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
+
+Compile a source file into a libtool library object.
+
+This mode accepts the following additional options:
+
+ -o OUTPUT-FILE set the output file name to OUTPUT-FILE
+ -prefer-pic try to building PIC objects only
+ -prefer-non-pic try to building non-PIC objects only
+ -static always build a \`.o' file suitable for static linking
+
+COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+from the given SOURCEFILE.
+
+The output file name is determined by removing the directory component from
+SOURCEFILE, then substituting the C source code suffix \`.c' with the
+library object suffix, \`.lo'."
+ ;;
+
+execute)
+ $echo \
+"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]...
+
+Automatically set library path, then run a program.
+
+This mode accepts the following additional options:
+
+ -dlopen FILE add the directory containing FILE to the library path
+
+This mode sets the library path environment variable according to \`-dlopen'
+flags.
+
+If any of the ARGS are libtool executable wrappers, then they are translated
+into their corresponding uninstalled binary, and any of their required library
+directories are added to the library path.
+
+Then, COMMAND is executed, with ARGS as arguments."
+ ;;
+
+finish)
+ $echo \
+"Usage: $modename [OPTION]... --mode=finish [LIBDIR]...
+
+Complete the installation of libtool libraries.
+
+Each LIBDIR is a directory that contains libtool libraries.
+
+The commands that this mode executes may require superuser privileges. Use
+the \`--dry-run' option if you just want to see what would be executed."
+ ;;
+
+install)
+ $echo \
+"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND...
+
+Install executables or libraries.
+
+INSTALL-COMMAND is the installation command. The first component should be
+either the \`install' or \`cp' program.
+
+The rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+ ;;
+
+link)
+ $echo \
+"Usage: $modename [OPTION]... --mode=link LINK-COMMAND...
+
+Link object files or libraries together to form another library, or to
+create an executable program.
+
+LINK-COMMAND is a command using the C compiler that you would use to create
+a program from several object files.
+
+The following components of LINK-COMMAND are treated specially:
+
+ -all-static do not do any dynamic linking at all
+ -avoid-version do not add a version suffix if possible
+ -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime
+ -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols
+ -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
+ -export-symbols SYMFILE
+ try to export only the symbols listed in SYMFILE
+ -export-symbols-regex REGEX
+ try to export only the symbols matching REGEX
+ -LLIBDIR search LIBDIR for required installed libraries
+ -lNAME OUTPUT-FILE requires the installed library libNAME
+ -module build a library that can dlopened
+ -no-fast-install disable the fast-install mode
+ -no-install link a not-installable executable
+ -no-undefined declare that a library does not refer to external symbols
+ -o OUTPUT-FILE create OUTPUT-FILE from the specified objects
+ -objectlist FILE Use a list of object files found in FILE to specify objects
+ -precious-files-regex REGEX
+ don't remove output files matching REGEX
+ -release RELEASE specify package release information
+ -rpath LIBDIR the created library will eventually be installed in LIBDIR
+ -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries
+ -static do not do any dynamic linking of libtool libraries
+ -version-info CURRENT[:REVISION[:AGE]]
+ specify library version info [each variable defaults to 0]
+
+All other options (arguments beginning with \`-') are ignored.
+
+Every other argument is treated as a filename. Files ending in \`.la' are
+treated as uninstalled libtool libraries, other files are standard or library
+object files.
+
+If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
+only library objects (\`.lo' files) may be specified, and \`-rpath' is
+required, except when creating a convenience library.
+
+If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
+using \`ar' and \`ranlib', or on Windows using \`lib'.
+
+If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+is created, otherwise an executable program is created."
+ ;;
+
+uninstall)
+ $echo \
+"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
+
+Remove libraries from an installation directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, all the files associated with it are deleted.
+Otherwise, only FILE itself is deleted using RM."
+ ;;
+
+*)
+ $echo "$modename: invalid operation mode \`$mode'" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+esac
+
+$echo
+$echo "Try \`$modename --help' for more information about other modes."
+
+exit $EXIT_SUCCESS
+
+# The TAGs below are defined such that we never get into a situation
+# in which we disable both kinds of libraries. Given conflicting
+# choices, we go for a static library, that is the most portable,
+# since we can't tell whether shared libraries were disabled because
+# the user asked for that or because the platform doesn't support
+# them. This is particularly important on AIX, because we don't
+# support having both static and shared libraries enabled at the same
+# time on that platform, so we default to a shared-only configuration.
+# If a disable-shared tag is given, we'll fallback to a static-only
+# configuration. But we'll never go from static-only to shared-only.
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
+build_libtool_libs=no
+build_old_libs=yes
+# ### END LIBTOOL TAG CONFIG: disable-shared
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-static
+build_old_libs=`case $build_libtool_libs in yes) $echo no;; *) $echo yes;; esac`
+# ### END LIBTOOL TAG CONFIG: disable-static
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
+# ### BEGIN LIBTOOL TAG CONFIG: CXX
+
+# Libtool was configured on host ubuntu:
+
+# Shell to use when invoking shell scripts.
+SHELL="/bin/bash"
+
+# Whether or not to build shared libraries.
+build_libtool_libs=yes
+
+# Whether or not to build static libraries.
+build_old_libs=yes
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=no
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=no
+
+# Whether or not to optimize for fast installation.
+fast_install=yes
+
+# The host system.
+host_alias=
+host=x86_64-unknown-linux-gnu
+
+# An echo program that does not interpret backslashes.
+echo="echo"
+
+# The archiver.
+AR="ar"
+AR_FLAGS="cru"
+
+# A C compiler.
+LTCC="gcc"
+
+# A language-specific compiler.
+CC="g++"
+
+# Is the compiler the GNU C compiler?
+with_gcc=yes
+
+# An ERE matcher.
+EGREP="grep -E"
+
+# The linker used to build libraries.
+LD="/usr/bin/ld -m elf_x86_64"
+
+# Whether we need hard or soft links.
+LN_S="ln -s"
+
+# A BSD-compatible nm program.
+NM="/usr/bin/nm -B"
+
+# A symbol stripping program
+STRIP="strip"
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=file
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="dlltool"
+
+# Used on cygwin: object dumper.
+OBJDUMP="objdump"
+
+# Used on cygwin: assembler.
+AS="as"
+
+# The name of the directory that contains temporary libtool files.
+objdir=.libs
+
+# How to create reloadable object files.
+reload_flag=" -r"
+reload_cmds="\$LD\$reload_flag -o \$output\$reload_objs"
+
+# How to pass a linker flag through the compiler.
+wl="-Wl,"
+
+# Object file suffix (normally "o").
+objext="o"
+
+# Old archive suffix (normally "a").
+libext="a"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='.so'
+
+# Executable file suffix (normally "").
+exeext=""
+
+# Additional compiler flags for building library objects.
+pic_flag=" -fPIC -DPIC"
+pic_mode=default
+
+# What is the maximum length of a command?
+max_cmd_len=32768
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o="yes"
+
+# Must we lock files when doing compilation ?
+need_locks="no"
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=no
+
+# Do we need a version for libraries?
+need_version=no
+
+# Whether dlopen is supported.
+dlopen_support=yes
+
+# Whether dlopen of programs is supported.
+dlopen_self=yes
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=yes
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag="-static"
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=" -fno-builtin"
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec="\${wl}--export-dynamic"
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec="\${wl}--whole-archive\$convenience \${wl}--no-whole-archive"
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=""
+
+# Library versioning type.
+version_type=linux
+
+# Format of library name prefix.
+libname_spec="lib\$name"
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec="\${libname}\${release}\${shared_ext}\$versuffix \${libname}\${release}\${shared_ext}\$major \$libname\${shared_ext}"
+
+# The coded name of the library, if different from the real name.
+soname_spec="\${libname}\${release}\${shared_ext}\$major"
+
+# Commands used to build and install an old-style archive.
+RANLIB="ranlib"
+old_archive_cmds="\$AR \$AR_FLAGS \$oldlib\$oldobjs\$old_deplibs~\$RANLIB \$oldlib"
+old_postinstall_cmds="\$RANLIB \$oldlib~chmod 644 \$oldlib"
+old_postuninstall_cmds=""
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=""
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=""
+
+# Commands used to build and install a shared archive.
+archive_cmds="\$CC -shared -nostdlib \$predep_objects \$libobjs \$deplibs \$postdep_objects \$compiler_flags \${wl}-soname \$wl\$soname -o \$lib"
+archive_expsym_cmds="\$CC -shared -nostdlib \$predep_objects \$libobjs \$deplibs \$postdep_objects \$compiler_flags \${wl}-soname \$wl\$soname \${wl}-retain-symbols-file \$wl\$export_symbols -o \$lib"
+postinstall_cmds=""
+postuninstall_cmds=""
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=""
+module_expsym_cmds=""
+
+# Commands to strip libraries.
+old_striplib="strip --strip-debug"
+striplib="strip --strip-unneeded"
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects="/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.8/crtbeginS.o"
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects="/usr/lib/gcc/x86_64-linux-gnu/4.8/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o"
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=""
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps="-lstdc++ -lm -lgcc_s -lc -lgcc_s"
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path="-L/usr/lib/gcc/x86_64-linux-gnu/4.8 -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../.."
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method="pass_all"
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd="\$MAGIC_CMD"
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=""
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=""
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds="PATH=\\\"\\\$PATH:/sbin\\\" ldconfig -n \$libdir"
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=""
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe="sed -n -e 's/^.*[ ]\\([ABCDGIRSTW][ABCDGIRSTW]*\\)[ ][ ]*\\(\\)\\([_A-Za-z][_A-Za-z0-9]*\\)\$/\\1 \\2\\3 \\3/p'"
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl="sed -n -e 's/^. .* \\(.*\\)\$/extern int \\1;/p'"
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address="sed -n -e 's/^: \\([^ ]*\\) \$/ {\\\"\\1\\\", (lt_ptr) 0},/p' -e 's/^[BCDEGRST] \\([^ ]*\\) \\([^ ]*\\)\$/ {\"\\2\", (lt_ptr) \\&\\2},/p'"
+
+# This is the shared library runtime path variable.
+runpath_var=LD_RUN_PATH
+
+# This is the shared library path variable.
+shlibpath_var=LD_LIBRARY_PATH
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=no
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=immediate
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=yes
+
+# Flag to hardcode $libdir into a binary during linking.
+# This must work even if $libdir does not exist.
+hardcode_libdir_flag_spec="\${wl}--rpath \${wl}\$libdir"
+
+# If ld is used when linking, flag to hardcode $libdir into
+# a binary during linking. This must work even if $libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=""
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=""
+
+# Set to yes if using DIR/libNAME during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=no
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=no
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=no
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="PATH LD_LIBRARY_PATH LD_RUN_PATH GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=unknown
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec="/lib64 /usr/lib64 /usr/local/lib64"
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 include /etc/ld.so.conf.d/*.conf "
+
+# Fix the shell variable $srcfile for the compiler.
+fix_srcfile_path=""
+
+# Set to yes if exported symbols are required.
+always_export_symbols=no
+
+# The commands to list exported symbols.
+export_symbols_cmds="\$NM \$libobjs \$convenience | \$global_symbol_pipe | \$SED 's/.* //' | sort | uniq > \$export_symbols"
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=""
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=""
+
+# Symbols that must always be exported.
+include_expsyms=""
+
+# ### END LIBTOOL TAG CONFIG: CXX
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/netscape/Makefile.linux b/rubbos/app/tomcat-connectors-1.2.32-src/native/netscape/Makefile.linux
new file mode 100644
index 00000000..43e0d0bf
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/netscape/Makefile.linux
@@ -0,0 +1,59 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Defines for example NSAPI programs running under Linux
+
+# gcc
+# If you get relocation errors, try:
+# 1. compiling with Sun's cc
+# 2. statically linking with libgcc
+# 3. Adjusting LD_LIBRARY_PATH to grab libgcc_s
+CC=gcc
+# For 64 Bit builds, add "-m64" to EXTRA_CFLAGS
+EXTRA_CFLAGS=-fPIC -pthread
+LDFLAGS=-shared
+
+CC_CMD=$(CC) $(CFLAGS) $(EXTRA_CFLAGS) \
+ -DNET_SSL -DSOLARIS -D_REENTRANT -DXP_UNIX -DMCC_HTTPD -DSPAPI20 -DJK_NSAPI
+
+LD_SHAREDCMD=$(CC) $(LDFLAGS) $(CFLAGS) $(EXTRA_CFLAGS)
+
+OS_TYPE=linux
+INCLUDEDIR=$(IPLANET_HOME)/include
+JAVA_INCLUDE=$(JAVA_HOME)/include
+JK_DIR=../common
+VPATH=.:$(JK_DIR)
+
+JK_SRCS = $(shell \ls $(JK_DIR)/*.c)
+JK_OBJECTS = $(patsubst $(JK_DIR)/%.c,%.o,$(JK_SRCS))
+JK_JNI_OBJECTS = jk_jni_worker.o jk_nwmain.o
+JK_OBJS = $(filter-out $(JK_JNI_OBJECTS),$(JK_OBJECTS))
+
+PLUGIN_OBJ = jk_nsapi_plugin.o
+
+INCLUDE_FLAGS= -I$(JK_DIR) -I$(INCLUDEDIR) -I$(INCLUDEDIR)/base \
+ -I$(INCLUDEDIR)/frame -I$(JAVA_INCLUDE) -I$(JAVA_INCLUDE)/$(OS_TYPE)
+
+all: nsapi_redirector.so
+
+
+nsapi_redirector.so: $(JK_OBJS) $(PLUGIN_OBJ)
+ $(LD_SHAREDCMD) $(JK_OBJS) $(PLUGIN_OBJ) -o nsapi_redirector.so $(EXTRA_LDDEFINES)
+
+clean:
+ rm -f *.o nsapi_redirector.so $(JK_OBJS)
+
+%.o : %.c
+ $(CC_CMD) $(INCLUDE_FLAGS) -c $<
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/netscape/Makefile.netware b/rubbos/app/tomcat-connectors-1.2.32-src/native/netscape/Makefile.netware
new file mode 100644
index 00000000..b3244bed
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/netscape/Makefile.netware
@@ -0,0 +1,277 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+#
+# Makefile for jk_nsapi_plugin (NetWare version - gnu make)
+# created by Guenter Knauf <fuankg@apache.org>
+#
+
+# Edit the path below to point to the base of your Netscape includes.
+ifndef NS_HOME
+NS_HOME = c:/projects/sdks/netscape
+endif
+# Edit the path below to point to the base of your NetWare Java SDK.
+ifndef NW_JDK
+NW_JDK = c:/projects/sdks/java-nw
+endif
+# Edit the path below to point to the base of your Novell NDK.
+ifndef NDKBASE
+NDKBASE = c:/novell
+endif
+
+ifndef INSTDIR
+INSTDIR = s:/sys/novonyx/modules
+endif
+
+# Edit the vars below to change NLM target settings.
+TARGET = nsapi_rd
+VERSION = $(JK_VERSION)
+COPYR = Licensed under the Apache License, Version 2.0
+DESCR = Netscape plugin for Tomcat $(JK_VERSION_STR)
+MTSAFE = NO
+STACK = 65536
+#SCREEN = System Console
+MODULES = nshttpd
+EXPORTS = jk_init jk_service
+IMPORTS = __nsapi30_table
+
+# Edit the var below to point to your lib architecture.
+ifndef LIBARCH
+LIBARCH = CLIB
+# LIBARCH = LIBC
+endif
+
+# must be equal to DEBUG or NDEBUG
+DB = NDEBUG
+# DB = DEBUG
+# Optimization: -O<n> or debugging: -g
+ifeq ($(DB),NDEBUG)
+ OPT = -O2
+ OBJDIR = release
+else
+ OPT = -g
+ OBJDIR = debug
+endif
+
+# Include the version info retrieved from jk_version.h
+-include $(OBJDIR)/version.inc
+
+# The following line defines your compiler.
+ifdef METROWERKS
+ CC = mwccnlm
+else
+ CC = gcc
+endif
+# RM = rm -f
+# CP = cp -fv
+# if you want to mark the target as MTSAFE you will need a tool for
+# generating the xdc data for the linker; here's a minimal tool:
+# http://www.gknw.net/development/prgtools/mkxdc.zip
+MPKXDC = mkxdc
+AWK = awk
+
+# Global flags for all compilers
+CFLAGS = $(OPT) -D$(DB) -DNETWARE -DXP_NETWARE -nostdinc -DJK_NSAPI
+
+ifeq ($(CC),mwccnlm)
+LD = mwldnlm
+LDFLAGS = -nostdlib $(OBJS) $(PRELUDE) $(LDLIBS) -o $@ -commandfile
+CFLAGS += -gccinc -inline off -opt nointrinsics
+#CFLAGS += -w on
+ifeq ($(LIBARCH),LIBC)
+ PRELUDE = $(SDK_LIBC)/imports/libcpre.o
+ CFLAGS += -align 4 -inst mmx -proc 686
+# CFLAGS += -D__ANSIC__
+else
+ PRELUDE = "$(METROWERKS)/Novell Support/libraries/runtime/prelude.obj"
+ LDLIBS = "$(METROWERKS)/Novell Support/libraries/runtime/mwcrtl.lib"
+# CFLAGS += -include "$(METROWERKS)/Novell Support/headers/nlm_prefix.h"
+ CFLAGS += -align 1 -proc 586
+endif
+else
+LD = nlmconv
+LDFLAGS = -T
+CFLAGS += -fno-builtin -fpack-struct -fpcc-struct-return
+CFLAGS += -Wall -Wno-main # -pedantic
+ifeq ($(LIBARCH),LIBC)
+ PRELUDE = $(SDK_LIBC)/imports/libcpre.gcc.o
+# CFLAGS += -D__ANSIC__
+else
+ PRELUDE = $(SDK_CLIB)/imports/clibpre.gcc.o
+ CFLAGS += -include $(NDKBASE)/nlmconv/genlm.h
+endif
+endif
+
+NDK_ROOT = $(NDKBASE)/ndk
+SDK_CLIB = $(NDK_ROOT)/nwsdk
+SDK_LIBC = $(NDK_ROOT)/libc
+JKCOMMON = ../common
+
+INCLUDES = -I$(NS_HOME)/include -I$(NS_HOME)/include/base
+INCLUDES += -I$(JKCOMMON) -I$(NW_JDK)/include -I$(NW_JDK)/include/netware
+
+ifeq ($(LIBARCH),LIBC)
+ INCLUDES += -I$(SDK_LIBC)/include
+ INCLUDES += -I$(SDK_LIBC)/include/winsock
+else
+ INCLUDES += -I$(SDK_CLIB)/include/nlm
+ # INCLUDES += -I$(NDKBASE)/ws295sdk/include
+ CFLAGS += -DNETDB_USE_INTERNET
+ CFLAGS += -DNO_GETTIMEOFDAY
+ CFLAGS += -DJK_PREFORK
+endif
+CFLAGS += $(INCLUDES)
+
+ifeq ($(MTSAFE),YES)
+ XDCDATA = $(OBJDIR)/$(TARGET).xdc
+endif
+
+ifeq ($(findstring linux,$(OSTYPE)),linux)
+DL = '
+#-include $(NDKBASE)/nlmconv/ncpfs.inc
+endif
+
+OBJS = \
+ $(OBJDIR)/jk_nsapi_plugin.o \
+ $(OBJDIR)/jk_nwmain.o \
+ $(OBJDIR)/jk_ajp12_worker.o \
+ $(OBJDIR)/jk_ajp13.o \
+ $(OBJDIR)/jk_ajp13_worker.o \
+ $(OBJDIR)/jk_ajp14.o \
+ $(OBJDIR)/jk_ajp14_worker.o \
+ $(OBJDIR)/jk_ajp_common.o \
+ $(OBJDIR)/jk_connect.o \
+ $(OBJDIR)/jk_context.o \
+ $(OBJDIR)/jk_jni_worker.o \
+ $(OBJDIR)/jk_lb_worker.o \
+ $(OBJDIR)/jk_map.o \
+ $(OBJDIR)/jk_md5.o \
+ $(OBJDIR)/jk_msg_buff.o \
+ $(OBJDIR)/jk_pool.o \
+ $(OBJDIR)/jk_shm.o \
+ $(OBJDIR)/jk_sockbuf.o \
+ $(OBJDIR)/jk_status.o \
+ $(OBJDIR)/jk_uri_worker_map.o \
+ $(OBJDIR)/jk_url.o \
+ $(OBJDIR)/jk_util.o \
+ $(OBJDIR)/jk_worker.o \
+ $(OBJDIR)/ap_snprintf.o
+
+vpath %.c . $(JKCOMMON)
+
+
+all: $(OBJDIR) $(OBJDIR)/version.inc $(OBJDIR)/$(TARGET).nlm
+
+$(OBJDIR)/%.o: %.c
+ @echo Compiling $<
+ @$(CC) $(CFLAGS) -c $< -o $@
+
+$(OBJDIR)/version.inc: $(JKCOMMON)/jk_version.h $(OBJDIR)
+ @echo Creating $@
+ @$(AWK) -f ../../support/get_ver.awk $< > $@
+
+dist: all
+ -$(RM) $(OBJDIR)/*.o $(OBJDIR)/$(TARGET).map $(OBJDIR)/$(TARGET).ncv
+ -$(RM) $(OBJDIR)/$(TARGET).def $(OBJDIR)/version.inc $(XDCDATA)
+# -$(CP) ../changes.txt $(OBJDIR)/
+
+install: all
+ @[ -d $(INSTDIR) ] || mkdir $(INSTDIR)
+ @$(CP) $(TARGET).nlm $(INSTDIR)
+
+clean:
+ -$(RM) -r $(OBJDIR)
+
+$(OBJDIR):
+ @mkdir $(OBJDIR)
+
+$(OBJDIR)/$(TARGET).nlm: $(OBJS) $(OBJDIR)/$(TARGET).def $(XDCDATA)
+ @echo Linking $@
+ @-$(RM) $@
+ @$(LD) $(LDFLAGS) $(OBJDIR)/$(TARGET).def
+
+$(OBJDIR)/%.xdc: Makefile.netware
+ @echo Creating $@
+ @$(MPKXDC) $(XDCOPT) $@
+
+$(OBJDIR)/%.def: Makefile.netware
+ @echo $(DL)# DEF file for linking with $(LD)$(DL) > $@
+ @echo $(DL)# Do not edit this file - it is created by make!$(DL) >> $@
+ @echo $(DL)# All your changes will be lost!!$(DL) >> $@
+ @echo $(DL)#$(DL) >> $@
+ @echo $(DL)copyright "$(COPYR)"$(DL) >> $@
+ @echo $(DL)description "$(DESCR)"$(DL) >> $@
+ @echo $(DL)version $(VERSION)$(DL) >> $@
+ifdef NLMTYPE
+ @echo $(DL)type $(NLMTYPE)$(DL) >> $@
+endif
+ifdef STACK
+ @echo $(DL)stack $(STACK)$(DL) >> $@
+endif
+ifdef SCREEN
+ @echo $(DL)screenname "$(SCREEN)"$(DL) >> $@
+else
+ @echo $(DL)screenname "DEFAULT"$(DL) >> $@
+endif
+ifeq ($(DB),DEBUG)
+ @echo $(DL)debug$(DL) >> $@
+endif
+ @echo $(DL)threadname "$(TARGET)"$(DL) >> $@
+ifdef XDCDATA
+ @echo $(DL)xdcdata $(XDCDATA)$(DL) >> $@
+endif
+ifeq ($(LIBARCH),CLIB)
+ @echo $(DL)start _Prelude$(DL) >> $@
+ @echo $(DL)exit _Stop$(DL) >> $@
+ @echo $(DL)import @$(NDK_ROOT)/nwsdk/imports/clib.imp$(DL) >> $@
+ @echo $(DL)import @$(NDK_ROOT)/nwsdk/imports/threads.imp$(DL) >> $@
+ @echo $(DL)import @$(NDK_ROOT)/nwsdk/imports/nlmlib.imp$(DL) >> $@
+ @echo $(DL)import @$(NDK_ROOT)/nwsdk/imports/socklib.imp$(DL) >> $@
+ @echo $(DL)module clib$(DL) >> $@
+else
+ifeq ($(LD),nlmconv)
+ @echo $(DL)flag_on 64$(DL) >> $@
+else
+ @echo $(DL)autounload$(DL) >> $@
+endif
+ @echo $(DL)pseudopreemption$(DL) >> $@
+ @echo $(DL)start _LibCPrelude$(DL) >> $@
+ @echo $(DL)exit _LibCPostlude$(DL) >> $@
+ @echo $(DL)check _LibCCheckUnload$(DL) >> $@
+ @echo $(DL)import @$(NDK_ROOT)/libc/imports/libc.imp$(DL) >> $@
+ @echo $(DL)import @$(NDK_ROOT)/libc/imports/netware.imp$(DL) >> $@
+ @echo $(DL)module libc$(DL) >> $@
+endif
+ifdef MODULES
+ @echo $(DL)module $(MODULES)$(DL) >> $@
+endif
+ifdef EXPORTS
+ @echo $(DL)export $(EXPORTS)$(DL) >> $@
+endif
+ifdef IMPORTS
+ @echo $(DL)import $(IMPORTS)$(DL) >> $@
+endif
+ifeq ($(LD),nlmconv)
+ @echo $(DL)input $(OBJS)$(DL) >> $@
+ @echo $(DL)input $(PRELUDE)$(DL) >> $@
+ifdef LDLIBS
+ @echo $(DL)input $(LDLIBS)$(DL) >> $@
+endif
+ @echo $(DL)output $*.nlm$(DL) >> $@
+endif
+
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/netscape/Makefile.solaris b/rubbos/app/tomcat-connectors-1.2.32-src/native/netscape/Makefile.solaris
new file mode 100644
index 00000000..eeb7c1ae
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/netscape/Makefile.solaris
@@ -0,0 +1,85 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Defines for example NSAPI programs running under SOLARIS
+
+# Choose between the settings for gcc or Sun Studio compiler
+
+# gcc
+# If you get relocation errors, try:
+# 1. compiling with Sun's cc
+# 2. statically linking with libgcc
+# 3. Adjusting LD_LIBRARY_PATH to grab libgcc_s
+CC=gcc
+# For 64 Bit builds, add "-m64" to EXTRA_CFLAGS
+EXTRA_CFLAGS=-fPIC -pthread
+LDFLAGS=-shared
+
+# Sun Studio cc compiler
+#CC=cc
+# For 64 Bit builds, add "-xtarget=generic64" to EXTRA_CFLAGS
+#EXTRA_CFLAGS=-xcode=pic32 -mt
+#LDFLAGS=-G
+
+# Change this according to location where on installed the server.
+# Don't forget to do the ./configure --enable-netscape=/opt/SUNWwbsvr/plugins
+# before doing gmake -f Makefile.solaris
+
+CC_CMD=$(CC) $(CFLAGS) $(EXTRA_CFLAGS) \
+ -DNET_SSL -DSOLARIS -D_REENTRANT -DXP_UNIX -DMCC_HTTPD -DSPAPI20 -DJK_NSAPI
+
+LD_SHAREDCMD=$(CC) $(LDFLAGS) $(CFLAGS) $(EXTRA_CFLAGS)
+
+all:
+
+prepare:
+
+OS_TYPE=solaris
+INCLUDEDIR=$(IPLANET_HOME)/include
+JAVA_INCLUDE=$(JAVA_HOME)/include
+JK_DIR=../common
+VPATH=.:$(JK_DIR)
+
+JK_OBJS = ap_snprintf.o jk_md5.o \
+jk_ajp12_worker.o jk_msg_buff.o \
+jk_ajp13.o jk_nwmain.o \
+jk_ajp13_worker.o jk_pool.o \
+jk_ajp14.o jk_shm.o \
+jk_ajp14_worker.o jk_sockbuf.o \
+jk_ajp_common.o jk_status.o \
+jk_connect.o jk_uri_worker_map.o \
+jk_context.o jk_url.o \
+jk_jni_worker.o jk_util.o \
+jk_lb_worker.o jk_worker.o \
+jk_map.o
+
+
+PLUGIN_OBJ = jk_nsapi_plugin.o
+
+INCLUDE_FLAGS= -I$(JK_DIR) -I$(INCLUDEDIR) -I$(INCLUDEDIR)/base \
+ -I$(INCLUDEDIR)/frame -I$(JAVA_INCLUDE) -I$(JAVA_INCLUDE)/$(OS_TYPE)
+
+all: nsapi_redirector.so
+
+
+nsapi_redirector.so: $(JK_OBJS) $(PLUGIN_OBJ)
+ $(LD_SHAREDCMD) $(JK_OBJS) $(PLUGIN_OBJ) -o nsapi_redirector.so $(EXTRA_LDDEFINES)
+
+clean:
+ rm -f *.o nsapi_redirector.so $(JK_OBJS)
+ rm -f $(JK_DIR)/*.o
+
+%.o : %.c
+ $(CC_CMD) $(INCLUDE_FLAGS) -c $<
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/netscape/Makefile.vc b/rubbos/app/tomcat-connectors-1.2.32-src/native/netscape/Makefile.vc
new file mode 100644
index 00000000..2f4aa062
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/netscape/Makefile.vc
@@ -0,0 +1,287 @@
+# Microsoft Developer Studio Generated NMAKE File, Based on nsapi.dsp
+!IF "$(CFG)" == ""
+CFG=nsapi - Win32 Release
+!MESSAGE No configuration specified. Defaulting to nsapi - Win32 Release.
+!ENDIF
+
+!IF "$(CFG)" != "nsapi - Win32 Release"
+!MESSAGE Invalid configuration "$(CFG)" specified.
+!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 "nsapi.mak" CFG="nsapi - Win32 Release"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "nsapi - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE
+!ERROR An invalid configuration is specified.
+!ENDIF
+
+!IF "$(OS)" == "Windows_NT"
+NULL=
+!ELSE
+NULL=nul
+!ENDIF
+
+TARGET=nsapi_redirect$(SO_VERSION)
+
+OUTDIR=.\nsapi_release
+INTDIR=.\nsapi_release
+# Begin Custom Macros
+OutDir=.\nsapi_release
+# End Custom Macros
+
+ALL : "$(OUTDIR)\$(TARGET).dll"
+
+
+CLEAN :
+ -@erase "$(INTDIR)\jk_ajp12_worker.obj"
+ -@erase "$(INTDIR)\jk_ajp13.obj"
+ -@erase "$(INTDIR)\jk_ajp13_worker.obj"
+ -@erase "$(INTDIR)\jk_ajp14.obj"
+ -@erase "$(INTDIR)\jk_ajp14_worker.obj"
+ -@erase "$(INTDIR)\jk_ajp_common.obj"
+ -@erase "$(INTDIR)\jk_connect.obj"
+ -@erase "$(INTDIR)\jk_context.obj"
+ -@erase "$(INTDIR)\jk_jni_worker.obj"
+ -@erase "$(INTDIR)\jk_lb_worker.obj"
+ -@erase "$(INTDIR)\jk_map.obj"
+ -@erase "$(INTDIR)\jk_md5.obj"
+ -@erase "$(INTDIR)\jk_msg_buff.obj"
+ -@erase "$(INTDIR)\jk_nsapi_plugin.obj"
+ -@erase "$(INTDIR)\jk_pool.obj"
+ -@erase "$(INTDIR)\jk_shm.obj"
+ -@erase "$(INTDIR)\jk_sockbuf.obj"
+ -@erase "$(INTDIR)\jk_status.obj"
+ -@erase "$(INTDIR)\jk_uri_worker_map.obj"
+ -@erase "$(INTDIR)\jk_url.obj"
+ -@erase "$(INTDIR)\jk_util.obj"
+ -@erase "$(INTDIR)\jk_worker.obj"
+ -@erase "$(OUTDIR)\$(TARGET).dll"
+ -@erase "$(OUTDIR)\nsapi_redirect.exp"
+ -@erase "$(OUTDIR)\nsapi_redirect.lib"
+ -@erase "$(OUTDIR)\$(TARGET).pdb"
+ -@erase "$(OUTDIR)\nsapi_redirect_src.idb"
+ -@erase "$(OUTDIR)\\nsapi_redirect_src.pdb"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+CPP_PROJ=-nologo -MD -W3 -O2 -Ob2 -Oy- -Zi -EHsc /I "..\common" /I "$(IPLANET_HOME)\include" /I "$(JAVA_HOME)\include" /I "$(JAVA_HOME)\include\win32" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "JK_NSAPI" /D "NSAPI_EXPORTS" /D "XP_WIN32" /D "MCC_HTTPD" /D "SPAPI20" /Fo"$(INTDIR)\\" /Fd"$(OUTDIR)\nsapi_redirect_src" /FD /c
+
+.c{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+MTL=midl.exe
+MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /win32
+RSC=rc.exe
+RSC_PROJ=/l 0x409 /fo"$(INTDIR)\jk.res" /i "..\common" /d "JK_NSAPI" /d "NDEBUG"
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\nsapi.bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+LINK32_FLAGS=ns-httpd40.lib kernel32.lib user32.lib advapi32.lib ws2_32.lib mswsock.lib $(EXTRA_LIBS) /nologo /base:"0x6A6B0000" /dll /incremental:no /pdb:"$(OUTDIR)\$(TARGET).pdb" /debug /machine:I386 /out:"$(OUTDIR)\$(TARGET).dll" /implib:"$(OUTDIR)\nsapi_redirect.lib" /libpath:"$(IPLANET_HOME)\lib"
+LINK32_OBJS= \
+ "$(INTDIR)\jk_ajp12_worker.obj" \
+ "$(INTDIR)\jk_ajp13.obj" \
+ "$(INTDIR)\jk_ajp13_worker.obj" \
+ "$(INTDIR)\jk_ajp14.obj" \
+ "$(INTDIR)\jk_ajp14_worker.obj" \
+ "$(INTDIR)\jk_ajp_common.obj" \
+ "$(INTDIR)\jk_connect.obj" \
+ "$(INTDIR)\jk_context.obj" \
+ "$(INTDIR)\jk_jni_worker.obj" \
+ "$(INTDIR)\jk_lb_worker.obj" \
+ "$(INTDIR)\jk_map.obj" \
+ "$(INTDIR)\jk_md5.obj" \
+ "$(INTDIR)\jk_msg_buff.obj" \
+ "$(INTDIR)\jk_nsapi_plugin.obj" \
+ "$(INTDIR)\jk_pool.obj" \
+ "$(INTDIR)\jk_shm.obj" \
+ "$(INTDIR)\jk_sockbuf.obj" \
+ "$(INTDIR)\jk_status.obj" \
+ "$(INTDIR)\jk_uri_worker_map.obj" \
+ "$(INTDIR)\jk_url.obj" \
+ "$(INTDIR)\jk_util.obj" \
+ "$(INTDIR)\jk.res" \
+ "$(INTDIR)\jk_worker.obj"
+
+"$(OUTDIR)\$(TARGET).dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+ IF EXIST $(OUTDIR)\$(TARGET).manifest \
+ mt -nologo -manifest $(OUTDIR)\$(TARGET).manifest -outputresource:$(OUTDIR)\$(TARGET).dll;2
+
+
+!IF "$(CFG)" == "nsapi - Win32 Release"
+SOURCE=..\common\jk.rc
+
+"$(INTDIR)\jk.res" : $(SOURCE) "$(INTDIR)"
+ $(RSC) $(RSC_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_ajp12_worker.c
+
+"$(INTDIR)\jk_ajp12_worker.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_ajp13.c
+
+"$(INTDIR)\jk_ajp13.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_ajp13_worker.c
+
+"$(INTDIR)\jk_ajp13_worker.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_ajp14.c
+
+"$(INTDIR)\jk_ajp14.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_ajp14_worker.c
+
+"$(INTDIR)\jk_ajp14_worker.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_ajp_common.c
+
+"$(INTDIR)\jk_ajp_common.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_connect.c
+
+"$(INTDIR)\jk_connect.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_context.c
+
+"$(INTDIR)\jk_context.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_jni_worker.c
+
+"$(INTDIR)\jk_jni_worker.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_lb_worker.c
+
+"$(INTDIR)\jk_lb_worker.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_map.c
+
+"$(INTDIR)\jk_map.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_md5.c
+
+"$(INTDIR)\jk_md5.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_msg_buff.c
+
+"$(INTDIR)\jk_msg_buff.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=.\jk_nsapi_plugin.c
+
+"$(INTDIR)\jk_nsapi_plugin.obj" : $(SOURCE) "$(INTDIR)"
+
+
+SOURCE=..\common\jk_pool.c
+
+"$(INTDIR)\jk_pool.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_shm.c
+
+"$(INTDIR)\jk_shm.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_sockbuf.c
+
+"$(INTDIR)\jk_sockbuf.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_status.c
+
+"$(INTDIR)\jk_status.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_uri_worker_map.c
+
+"$(INTDIR)\jk_uri_worker_map.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_url.c
+
+"$(INTDIR)\jk_url.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_util.c
+
+"$(INTDIR)\jk_util.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=..\common\jk_worker.c
+
+"$(INTDIR)\jk_worker.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+
+!ENDIF
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/netscape/README b/rubbos/app/tomcat-connectors-1.2.32-src/native/netscape/README
new file mode 100644
index 00000000..41710931
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/netscape/README
@@ -0,0 +1,31 @@
+ABOUT
+-----
+
+The redirector was originally developed using Visual C++ Ver.6.0,
+so having this environment is a prerequisite if you want to perform
+a custom build on Windows systems
+
+On Unix system, a Makefile.solaris and Makefile.linux are provided
+and should be adapted to tailor to your own configuration.
+Be sure to read the BUILDING.txt file, one directory up.
+
+
+REQUIREMENT for Windows build
+-----------------------------
+
+MS VC 6.0 (+ update, latest service pack is 6)
+
+BUILDING on Windows
+-------------------
+
+The steps that you need to take are:
+
+ 1. Change directory to the nsapi redirector plugins source directory.
+ 2. Set the IPLANET_HOME system environment value to iPlanet installation
+ directory or edit the nsapi.dsp and replace all $(IPLANET_HOME)
+ occurrences with the real path
+ 3. Execute the following command:
+ nmake -f Makefile.vc [SO_VERSION=-1.2.32]
+
+An alternative will be to open the isapi workspace file (nsapi.dsw) in msdev and
+build it using the build menu.
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/netscape/jk_nsapi_plugin.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/netscape/jk_nsapi_plugin.c
new file mode 100644
index 00000000..97f64156
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/netscape/jk_nsapi_plugin.c
@@ -0,0 +1,634 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: NSAPI plugin for Netscape servers *
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Version: $Revision: 1078805 $ *
+ ***************************************************************************/
+
+#if defined(WIN32)
+#ifndef _WIN32_WINNT
+#define _WIN32_WINNT 0x0500
+#endif
+#include <winsock2.h>
+#endif
+
+#include "nsapi.h"
+#include "jk_global.h"
+#include "jk_url.h"
+#include "jk_util.h"
+#include "jk_map.h"
+#include "jk_pool.h"
+#include "jk_service.h"
+#include "jk_worker.h"
+#include "jk_shm.h"
+#include "jk_ajp13.h"
+
+#define URI_PATTERN "path"
+#define DEFAULT_WORKER_NAME ("ajp13")
+#define REJECT_UNSAFE_TAG "reject_unsafe"
+
+#define STRNULL_FOR_NULL(x) ((x) ? (x) : "(null)")
+
+struct nsapi_private_data
+{
+ jk_pool_t p;
+
+ pblock *pb;
+ Session *sn;
+ Request *rq;
+};
+typedef struct nsapi_private_data nsapi_private_data_t;
+
+static int init_on_other_thread_is_done = JK_FALSE;
+static int init_on_other_thread_is_ok = JK_FALSE;
+
+static const char ssl_cert_start[] = "-----BEGIN CERTIFICATE-----\r\n";
+static const char ssl_cert_end[] = "\r\n-----END CERTIFICATE-----\r\n";
+
+static jk_logger_t *logger = NULL;
+static jk_worker_env_t worker_env;
+static jk_map_t *init_map = NULL;
+static jk_uri_worker_map_t *uw_map = NULL;
+static size_t jk_shm_size = 0;
+
+#ifdef NETWARE
+int (*PR_IsSocketSecure) (SYS_NETFD * csd); /* pointer to PR_IsSocketSecure function */
+#endif
+
+static int JK_METHOD start_response(jk_ws_service_t *s,
+ int status,
+ const char *reason,
+ const char *const *header_names,
+ const char *const *header_values,
+ unsigned num_of_headers);
+
+static int JK_METHOD ws_read(jk_ws_service_t *s,
+ void *b, unsigned l, unsigned *a);
+
+static int JK_METHOD ws_write(jk_ws_service_t *s, const void *b, unsigned l);
+
+NSAPI_PUBLIC int jk_init(pblock * pb, Session * sn, Request * rq);
+
+NSAPI_PUBLIC void jk_term(void *p);
+
+NSAPI_PUBLIC int jk_service(pblock * pb, Session * sn, Request * rq);
+
+static int init_ws_service(nsapi_private_data_t * private_data,
+ jk_ws_service_t *s);
+
+static int setup_http_headers(nsapi_private_data_t * private_data,
+ jk_ws_service_t *s);
+
+static void init_workers_on_other_threads(void *init_d)
+{
+ init_map = (jk_map_t *)init_d;
+ /* we add the URI->WORKER MAP since workers using AJP14 will feed it */
+ /* but where are they here in Netscape ? */
+ if (uri_worker_map_alloc(&uw_map, NULL, logger)) {
+ uw_map->fname = "";
+ uw_map->reload = JK_URIMAP_DEF_RELOAD;
+ uw_map->reject_unsafe = jk_map_get_bool(init_map, "worker." REJECT_UNSAFE_TAG, JK_FALSE);
+ worker_env.uri_to_worker = uw_map;
+ worker_env.pool = NULL;
+
+ if (wc_open(init_map, &worker_env, logger)) {
+ init_on_other_thread_is_ok = JK_TRUE;
+ uri_worker_map_ext(uw_map, logger);
+ uri_worker_map_switch(uw_map, logger);
+ }
+ else {
+ jk_log(logger, JK_LOG_EMERG,
+ "In init_workers_on_other_threads, failed");
+ }
+ }
+ else {
+ jk_log(logger, JK_LOG_EMERG,
+ "In init_workers_on_other_threads, failed");
+ }
+
+ init_on_other_thread_is_done = JK_TRUE;
+}
+
+/*
+ * Convert string to lower case.
+ * If string is longer than the provided buffer,
+ * just return the original string.
+ */
+static const char *to_lower(const char *str, char *buf, int bufsz)
+{
+ const char *from = str;
+ char *to = buf;
+ char *end = buf + (bufsz - 1);
+ while (to != end && *from) {
+ *to = (char)tolower(*from);
+ to++;
+ from++;
+ }
+ if (to != end) {
+ *to = '\0';
+ return buf;
+ }
+ return str;
+}
+
+static int JK_METHOD start_response(jk_ws_service_t *s,
+ int status,
+ const char *reason,
+ const char *const *header_names,
+ const char *const *header_values,
+ unsigned num_of_headers)
+{
+ if (s && s->ws_private) {
+ nsapi_private_data_t *p = s->ws_private;
+ if (!s->response_started) {
+ unsigned i;
+
+ s->response_started = JK_TRUE;
+
+ /* Remove "old" content type */
+ param_free(pblock_remove("content-type", p->rq->srvhdrs));
+
+ if (num_of_headers) {
+ /*
+ * NSAPI expects http header names to be lower case.
+ * This is only relevant for the server itself or other
+ * plugins searching for headers in the pblock.
+ * We use a buffer of limited length, because conforming
+ * with this rule should only matter for well-known headers.
+ */
+ char name_buf[64];
+ for (i = 0; i < (int)num_of_headers; i++) {
+ pblock_nvinsert(to_lower(header_names[i], name_buf, 64),
+ header_values[i], p->rq->srvhdrs);
+ }
+ }
+ else {
+ pblock_nvinsert("content-type", "text/plain", p->rq->srvhdrs);
+ }
+
+ protocol_status(p->sn, p->rq, status, (char *)reason);
+
+ protocol_start_response(p->sn, p->rq);
+ }
+ return JK_TRUE;
+
+ }
+ return JK_FALSE;
+}
+
+static int JK_METHOD ws_read(jk_ws_service_t *s,
+ void *b, unsigned l, unsigned *a)
+{
+ if (s && s->ws_private && b && a) {
+ nsapi_private_data_t *p = s->ws_private;
+
+ *a = 0;
+ if (l) {
+ unsigned i;
+ netbuf *inbuf = p->sn->inbuf;
+
+/* Until we get a service pack for NW5.1 and earlier that has the latest */
+/* Enterprise Server, we have to go through the else version of this code*/
+#if defined(netbuf_getbytes) && !defined(NETWARE)
+ i = netbuf_getbytes(inbuf, b, l);
+ if (NETBUF_EOF == i || NETBUF_ERROR == i) {
+ return JK_FALSE;
+ }
+
+#else
+ char *buf = b;
+ int ch;
+ for (i = 0; i < l; i++) {
+ ch = netbuf_getc(inbuf);
+ /*
+ * IO_EOF is 0 (zero) which is a very reasonable byte
+ * when it comes to binary data. So we are not breaking
+ * out of the read loop when reading it.
+ *
+ * We are protected from an infinit loop by the Java part of
+ * Tomcat.
+ */
+ if (IO_ERROR == ch) {
+ break;
+ }
+
+ buf[i] = ch;
+ }
+
+ if (0 == i) {
+ return JK_FALSE;
+ }
+#endif
+ *a = i;
+
+ }
+ return JK_TRUE;
+ }
+ return JK_FALSE;
+}
+
+static int JK_METHOD ws_write(jk_ws_service_t *s, const void *b, unsigned l)
+{
+ if (s && s->ws_private && b) {
+ nsapi_private_data_t *p = s->ws_private;
+
+ if (l) {
+ if (!s->response_started) {
+ start_response(s, 200, NULL, NULL, NULL, 0);
+ }
+
+ if (net_write(p->sn->csd, (char *)b, (int)l) == IO_ERROR) {
+ return JK_FALSE;
+ }
+ }
+
+ return JK_TRUE;
+
+ }
+ return JK_FALSE;
+}
+
+NSAPI_PUBLIC int jk_init(pblock * pb, Session * sn, Request * rq)
+{
+ char *worker_prp_file = pblock_findval(JK_WORKER_FILE_TAG, pb);
+ char *log_level_str = pblock_findval(JK_LOG_LEVEL_TAG, pb);
+ char *log_file = pblock_findval(JK_LOG_FILE_TAG, pb);
+ char *shm_file = pblock_findval(JK_SHM_FILE_TAG, pb);
+ char *shm_file_safe = "";
+ char *reject_unsafe = pblock_findval(REJECT_UNSAFE_TAG, pb);
+
+ int rc = REQ_ABORTED;
+
+ if (!worker_prp_file) {
+ worker_prp_file = JK_WORKER_FILE_DEF;
+ }
+
+ if (!log_level_str) {
+ log_level_str = JK_LOG_DEF_VERB;
+ }
+
+ if (!log_file) {
+ fprintf(stderr,
+ "Missing attribute %s in magnus.conf (jk_init) - aborting!\n", JK_LOG_FILE_TAG);
+ return rc;
+ }
+
+ if (shm_file) {
+ shm_file_safe = shm_file;
+ }
+#if !defined(WIN32) && !defined(NETWARE)
+ else {
+ fprintf(stderr,
+ "Missing attribute %s in magnus.conf (jk_init) - aborting!\n", JK_SHM_FILE_TAG);
+ return rc;
+ }
+#endif
+
+ fprintf(stderr,
+ "In jk_init.\n Worker file = %s.\n Log level = %s.\n Log File = %s\n SHM File = %s\n",
+ worker_prp_file, log_level_str, log_file, shm_file);
+
+ if (!jk_open_file_logger(&logger, log_file,
+ jk_parse_log_level(log_level_str))) {
+ logger = NULL;
+ }
+
+ if (jk_map_alloc(&init_map)) {
+ if (jk_map_read_properties(init_map, NULL, worker_prp_file, NULL,
+ JK_MAP_HANDLE_DUPLICATES, logger)) {
+ int rv;
+ int sleep_cnt;
+ SYS_THREAD s;
+
+ if (jk_map_resolve_references(init_map, "worker.", 1, 1, logger) == JK_FALSE) {
+ jk_log(logger, JK_LOG_ERROR, "Error in resolving configuration references");
+ }
+
+ if (reject_unsafe) {
+ jk_map_add(init_map, "worker." REJECT_UNSAFE_TAG, reject_unsafe);
+ }
+
+ jk_shm_size = jk_shm_calculate_size(init_map, logger);
+ if ((rv = jk_shm_open(shm_file, jk_shm_size, logger)) != 0)
+ jk_log(logger, JK_LOG_ERROR,
+ "Initializing shm:%s errno=%d. Load balancing workers will not function properly.",
+ jk_shm_name(), rv);
+
+ s = systhread_start(SYSTHREAD_DEFAULT_PRIORITY,
+ 0, init_workers_on_other_threads, init_map);
+ for (sleep_cnt = 0; sleep_cnt < 60; sleep_cnt++) {
+ systhread_sleep(1000);
+ jk_log(logger, JK_LOG_DEBUG, "jk_init, a second passed");
+ if (init_on_other_thread_is_done) {
+ break;
+ }
+ }
+
+ if (init_on_other_thread_is_done && init_on_other_thread_is_ok) {
+ magnus_atrestart(jk_term, NULL);
+ rc = REQ_PROCEED;
+ jk_log(logger, JK_LOG_INFO, "%s initialized", JK_FULL_EXPOSED_VERSION);
+ }
+
+/* if(wc_open(init_map, NULL, logger)) {
+ magnus_atrestart(jk_term, NULL);
+ rc = REQ_PROCEED;
+ }
+*/
+ }
+ }
+
+#ifdef NETWARE
+ PR_IsSocketSecure =
+ (int (*)(void **))ImportSymbol(GetNLMHandle(), "PR_IsSocketSecure");
+#endif
+ return rc;
+}
+
+NSAPI_PUBLIC void jk_term(void *p)
+{
+#ifdef NETWARE
+ if (NULL != PR_IsSocketSecure) {
+ UnimportSymbol(GetNLMHandle(), "PR_IsSocketSecure");
+ PR_IsSocketSecure = NULL;
+ }
+#endif
+ if (uw_map) {
+ uri_worker_map_free(&uw_map, logger);
+ }
+
+ if (init_map) {
+ jk_map_free(&init_map);
+ }
+
+ wc_close(logger);
+ jk_shm_close();
+ if (logger) {
+ jk_close_file_logger(&logger);
+ }
+}
+
+NSAPI_PUBLIC int jk_service(pblock * pb, Session * sn, Request * rq)
+{
+ char *worker_name = pblock_findval(JK_WORKER_NAME_TAG, pb);
+ char *uri_pattern = pblock_findval(URI_PATTERN, pb);
+ jk_worker_t *worker;
+ int rc = REQ_ABORTED;
+
+ if (uri_pattern) {
+ char *uri = pblock_findval("uri", rq->reqpb);
+
+ if (0 != shexp_match(uri, uri_pattern)) {
+ return REQ_NOACTION;
+ }
+ }
+
+ if (!worker_name) {
+ worker_name = DEFAULT_WORKER_NAME;
+ }
+
+ worker = wc_get_worker_for_name(worker_name, logger);
+ if (worker) {
+ nsapi_private_data_t private_data;
+ jk_ws_service_t s;
+ jk_pool_atom_t buf[SMALL_POOL_SIZE];
+
+ jk_open_pool(&private_data.p, buf, sizeof(buf));
+
+ private_data.pb = pb;
+ private_data.sn = sn;
+ private_data.rq = rq;
+
+ jk_init_ws_service(&s);
+
+ s.ws_private = &private_data;
+ s.pool = &private_data.p;
+
+ wc_maintain(logger);
+ if (init_ws_service(&private_data, &s)) {
+ jk_endpoint_t *e = NULL;
+ if (worker->get_endpoint(worker, &e, logger)) {
+ int is_error = JK_HTTP_SERVER_ERROR;
+ int result;
+ if ((result = e->service(e, &s, logger, &is_error)) > 0) {
+ rc = REQ_PROCEED;
+ if (JK_IS_DEBUG_LEVEL(logger))
+ jk_log(logger, JK_LOG_DEBUG,
+ "service() returned OK");
+ }
+ else {
+ protocol_status(sn, rq, is_error, NULL);
+ if ((result == JK_CLIENT_ERROR) && (is_error == JK_HTTP_OK)) {
+ rc = REQ_EXIT;
+ jk_log(logger, JK_LOG_INFO,
+ "service() failed because client aborted connection");
+ }
+ else {
+ rc = REQ_ABORTED;
+ jk_log(logger, JK_LOG_ERROR,
+ "service() failed with http error %d", is_error);
+ }
+ }
+
+ e->done(&e, logger);
+ }
+ }
+ jk_close_pool(&private_data.p);
+ }
+
+ return rc;
+}
+
+static int init_ws_service(nsapi_private_data_t * private_data,
+ jk_ws_service_t *s)
+{
+ char *tmp;
+ int size;
+ int rc;
+
+ s->start_response = start_response;
+ s->read = ws_read;
+ s->write = ws_write;
+
+ s->auth_type = pblock_findval("auth-type", private_data->rq->vars);
+ s->remote_user = pblock_findval("auth-user", private_data->rq->vars);
+
+ tmp = NULL;
+ rc = request_header("content-length",
+ &tmp, private_data->sn, private_data->rq);
+
+ if ((rc != REQ_ABORTED) && tmp) {
+ sscanf(tmp, "%" JK_UINT64_T_FMT, &(s->content_length));
+ }
+
+ s->method = pblock_findval("method", private_data->rq->reqpb);
+ s->protocol = pblock_findval("protocol", private_data->rq->reqpb);
+
+ s->remote_host = session_dns(private_data->sn);
+ s->remote_addr = pblock_findval("ip", private_data->sn->client);
+ /* Remote port is not available from NSAPI. */
+ s->remote_port = "0";
+
+ tmp = pblock_findval("uri", private_data->rq->reqpb);
+ size = 3 * strlen(tmp) + 1;
+ s->req_uri = jk_pool_alloc(s->pool, size);
+ jk_canonenc(tmp, s->req_uri, size);
+
+ s->query_string = pblock_findval("query", private_data->rq->reqpb);
+
+ s->server_name = server_hostname;
+
+#ifdef NETWARE
+ /* On NetWare, since we have virtual servers, we have a different way of
+ * getting the port that we need to try first.
+ */
+ tmp = pblock_findval("server_port", private_data->sn->client);
+ if (NULL != tmp)
+ s->server_port = atoi(tmp);
+ else
+#endif
+ s->server_port = server_portnum;
+ s->server_software = system_version();
+
+ s->uw_map = uw_map;
+
+#ifdef NETWARE
+ /* on NetWare, we can have virtual servers that are secure.
+ * PR_IsSocketSecure is an api made available with virtual servers to check
+ * if the socket is secure or not
+ */
+ if (NULL != PR_IsSocketSecure)
+ s->is_ssl = PR_IsSocketSecure(private_data->sn->csd);
+ else
+#endif
+ s->is_ssl = security_active;
+
+ if (s->is_ssl) {
+ char *ssl_cert = pblock_findval("auth-cert", private_data->rq->vars);
+ if (ssl_cert != NULL) {
+ s->ssl_cert = jk_pool_alloc(s->pool, sizeof(ssl_cert_start)+
+ strlen(ssl_cert)+
+ sizeof(ssl_cert_end));
+ strcpy(s->ssl_cert, ssl_cert_start);
+ strcat(s->ssl_cert, ssl_cert);
+ strcat(s->ssl_cert, ssl_cert_end);
+ s->ssl_cert_len = strlen(s->ssl_cert);
+ }
+ s->ssl_cipher = pblock_findval("cipher", private_data->sn->client);
+ s->ssl_session = pblock_findval("ssl-id", private_data->sn->client);
+ /* XXX: We need to investigate how to set s->ssl_key_size */
+ }
+
+ rc = setup_http_headers(private_data, s);
+
+ /* Dump all connection param so we can trace what's going to
+ * the remote tomcat
+ */
+ if (JK_IS_DEBUG_LEVEL(logger)) {
+ jk_log(logger, JK_LOG_DEBUG,
+ "Service protocol=%s method=%s host=%s addr=%s name=%s port=%d auth=%s user=%s uri=%s",
+ STRNULL_FOR_NULL(s->protocol),
+ STRNULL_FOR_NULL(s->method),
+ STRNULL_FOR_NULL(s->remote_host),
+ STRNULL_FOR_NULL(s->remote_addr),
+ STRNULL_FOR_NULL(s->server_name),
+ s->server_port,
+ STRNULL_FOR_NULL(s->auth_type),
+ STRNULL_FOR_NULL(s->remote_user),
+ STRNULL_FOR_NULL(s->req_uri));
+ }
+
+ return rc;
+
+}
+
+static int setup_http_headers(nsapi_private_data_t * private_data,
+ jk_ws_service_t *s)
+{
+ int need_content_length_header =
+ (s->content_length == 0) ? JK_TRUE : JK_FALSE;
+
+ pblock *headers_jar = private_data->rq->headers;
+ int cnt;
+ int i;
+
+ for (i = 0, cnt = 0; i < headers_jar->hsize; i++) {
+ struct pb_entry *h = headers_jar->ht[i];
+ while (h && h->param) {
+ cnt++;
+ h = h->next;
+ }
+ }
+
+ s->headers_names = NULL;
+ s->headers_values = NULL;
+ s->num_headers = cnt;
+ if (cnt) {
+ /* allocate an extra header slot in case we need to add a content-length header */
+ s->headers_names =
+ jk_pool_alloc(&private_data->p, (cnt + 1) * sizeof(char *));
+ s->headers_values =
+ jk_pool_alloc(&private_data->p, (cnt + 1) * sizeof(char *));
+
+ if (s->headers_names && s->headers_values) {
+ for (i = 0, cnt = 0; i < headers_jar->hsize; i++) {
+ struct pb_entry *h = headers_jar->ht[i];
+ while (h && h->param) {
+ s->headers_names[cnt] = h->param->name;
+ s->headers_values[cnt] = h->param->value;
+ if (need_content_length_header &&
+ !strncmp(h->param->name, "content-length", 14)) {
+ need_content_length_header = JK_FALSE;
+ }
+ cnt++;
+ h = h->next;
+ }
+ }
+ /* Add a content-length = 0 header if needed.
+ * Ajp13 assumes an absent content-length header means an unknown,
+ * but non-zero length body.
+ */
+ if (need_content_length_header) {
+ s->headers_names[cnt] = "content-length";
+ s->headers_values[cnt] = "0";
+ cnt++;
+ }
+ s->num_headers = cnt;
+ return JK_TRUE;
+ }
+ }
+ else {
+ if (need_content_length_header) {
+ s->headers_names =
+ jk_pool_alloc(&private_data->p, sizeof(char *));
+ s->headers_values =
+ jk_pool_alloc(&private_data->p, sizeof(char *));
+ if (s->headers_names && s->headers_values) {
+ s->headers_names[0] = "content-length";
+ s->headers_values[0] = "0";
+ s->num_headers++;
+ return JK_TRUE;
+ }
+ }
+ else
+ return JK_TRUE;
+ }
+
+ return JK_FALSE;
+}
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/netscape/nsapi.dsp b/rubbos/app/tomcat-connectors-1.2.32-src/native/netscape/nsapi.dsp
new file mode 100644
index 00000000..561dbbc7
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/netscape/nsapi.dsp
@@ -0,0 +1,283 @@
+# Microsoft Developer Studio Project File - Name="nsapi" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=nsapi - 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 "nsapi.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 "nsapi.mak" CFG="nsapi - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "nsapi - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "nsapi - 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)" == "nsapi - 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 "nsapi_release"
+# PROP Intermediate_Dir "nsapi_release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "JK_NSAPI" /D "NSAPI_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /Zi /O2 /I "..\common" /I "$(IPLANET_HOME)\plugins\include" /I "$(JAVA_HOME)\include" /I "$(JAVA_HOME)\include\win32" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "JK_NSAPI" /D "NSAPI_EXPORTS" /D "XP_WIN32" /D "MCC_HTTPD" /D "SPAPI20" /Fd"Release/nsapi_redirect_src" /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# 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 ns-httpd40.lib kernel32.lib user32.lib advapi32.lib ws2_32.lib mswsock.lib /nologo /base:"0x6A6B0000" /dll /debug /machine:I386 /out:"nsapi_release/nsapi_redirect.dll" /libpath:"$(IPLANET_HOME)\plugins\lib"
+
+!ELSEIF "$(CFG)" == "nsapi - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "nsapi___Win32_Debug"
+# PROP BASE Intermediate_Dir "nsapi___Win32_Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "nsapi_debug"
+# PROP Intermediate_Dir "nsapi_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" /D "_MBCS" /D "_USRDLL" /D "JK_NSAPI" /D "NSAPI_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /GX /Zi /Od /I "..\common" /I "$(IPLANET_HOME)\plugins\include" /I "$(JAVA_HOME)\include" /I "$(JAVA_HOME)\include\win32" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "JK_NSAPI" /D "NSAPI_EXPORTS" /D "XP_WIN32" /D "MCC_HTTPD" /D "SPAPI20" /Fd"Debug/nsapi_redirect_src" /FD /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# 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 ns-httpd40.lib kernel32.lib user32.lib advapi32.lib ws2_32.lib mswsock.lib /nologo /base:"0x6A6B0000" /dll /debug /machine:I386 /out:"nsapi_debug/nsapi_redirect.dll" /pdbtype:sept /libpath:"$(IPLANET_HOME)\plugins\lib"
+
+!ENDIF
+
+# Begin Target
+
+# Name "nsapi - Win32 Release"
+# Name "nsapi - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\common\jk_ajp12_worker.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp13.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp13_worker.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp14.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp14_worker.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp_common.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_connect.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_context.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_jni_worker.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_lb_worker.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_map.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_md5.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_msg_buff.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\jk_nsapi_plugin.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_pool.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_shm.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_sockbuf.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_status.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_uri_worker_map.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_url.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_util.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_worker.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\common\jk_ajp13.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp13_worker.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp14.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp14_worker.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp_common.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_connect.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_context.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_global.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_jni_worker.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_lb_worker.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_logger.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_map.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_md5.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_msg_buff.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_mt.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_pool.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_service.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_shm.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_status.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_uri_worker_map.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_url.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_util.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_worker.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"
+# End Group
+# End Target
+# End Project
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/nt_service/jk_nt_service.c b/rubbos/app/tomcat-connectors-1.2.32-src/native/nt_service/jk_nt_service.c
new file mode 100644
index 00000000..e17621bf
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/nt_service/jk_nt_service.c
@@ -0,0 +1,1233 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/***************************************************************************
+ * Description: NT System service for Tomcat *
+ * Author: Gal Shachor <shachor@il.ibm.com> *
+ * Dave Oxley <Dave@JungleMoss.com> *
+ * Version: $Revision: 756058 $ *
+ ***************************************************************************/
+
+#include "jk_global.h"
+#include "jk_util.h"
+#include "jk_ajp13.h"
+#include "jk_connect.h"
+#include <windows.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <process.h>
+
+#define AJP12_TAG ("ajp12")
+#define AJP13_TAG ("ajp13")
+#define BASE_REGISTRY_LOCATION ("SYSTEM\\CurrentControlSet\\Services\\")
+#define IMAGE_NAME ("ImagePath")
+#define PARAMS_LOCATION ("Parameters")
+#define PRP_LOCATION ("PropertyFile")
+
+// internal variables
+static SERVICE_STATUS ssStatus; // current status of the service
+static SERVICE_STATUS_HANDLE sshStatusHandle;
+static DWORD dwErr = 0;
+static char szErr[1024] = "";
+static HANDLE hServerStopEvent = NULL;
+static int shutdown_port;
+static char *shutdown_protocol = AJP12_TAG;
+static char *shutdown_secret = NULL;
+static char *shutdown_cmd=NULL;
+
+typedef enum ActionEnum
+{ acNoAction = 0,
+ acInstall = 1,
+ acRemove = 2,
+ acStartTC = 3,
+ acStopTC = 4
+} ActionEnum;
+
+
+struct jk_tomcat_startup_data {
+ char *cmd_line; /* Start command line */
+ char *stdout_file;
+ char *stderr_file;
+ char *extra_path;
+ char *tomcat_home;
+ char *java_bin;
+
+ char *shutdown_protocol;
+ /* for cmd */
+ char *stop_cmd;
+ /* For ajp13/ajp12/catalina */
+ int shutdown_port;
+ char *shutdown_secret;
+
+ /* Optional/not needed */
+ char *classpath;
+ char *tomcat_class;
+ char *server_file;
+};
+
+typedef struct jk_tomcat_startup_data jk_tomcat_startup_data_t;
+
+// internal function prototypes
+static void WINAPI service_ctrl(DWORD dwCtrlCode);
+static void WINAPI service_main(DWORD dwArgc,
+ char **lpszArgv);
+static void install_service(char *name,
+ char *dname,
+ char *user,
+ char *password,
+ char *deps,
+ BOOL bAutomatic,
+ char *rel_prp_file);
+static void remove_service(char *name);
+static void start_service(char *name,
+ char *machine);
+static void stop_service(char *name,
+ char *machine);
+static char *GetLastErrorText(char *lpszBuf, DWORD dwSize);
+static void AddToMessageLog(char *lpszMsg);
+static BOOL ReportStatusToSCMgr(DWORD dwCurrentState,
+ DWORD dwWin32ExitCode,
+ DWORD dwWaitHint);
+static void start_jk_service(char *name);
+static void stop_jk_service(void);
+static int set_registry_values(SC_HANDLE schService, char *name,
+ char *prp_file);
+static int create_registry_key(const char *tag,
+ HKEY *key);
+static int set_registry_config_parameter(HKEY hkey,
+ const char *tag,
+ char *value);
+static int get_registry_config_parameter(HKEY hkey,
+ const char *tag,
+ char *b, DWORD sz);
+static int start_tomcat(const char *name,
+ HANDLE *hTomcat);
+static void stop_tomcat(char *name,
+ int port,
+ const char *protocol,
+ char *secret,
+ HANDLE hTomcat);
+static int read_startup_data(jk_map_t *init_map,
+ jk_tomcat_startup_data_t *data,
+ jk_pool_t *p);
+static int exec_cmd(const char *name, HANDLE *hTomcat, char *cmdLine);
+
+static void usage_message(const char *name)
+{
+ printf("%s - Usage:\n\n", name);
+ printf("To install the service:\n");
+ printf("%s -i <service name> {optional params} <config properties file>\n", name);
+ printf(" Optional parameters\n");
+ printf(" -u <user name> - In the form DomainName\\UserName (.\\UserName for local)\n");
+ printf(" -n <service display name> - In quotes if contains non-lphanumeric chars\n");
+ printf(" -p <user password>\n");
+ printf(" -a - Set startup type to automatic\n");
+ printf(" -d <service dependency> - Can be entered multiple times\n\n");
+ printf("To remove the service:\n");
+ printf("%s -r <service name>\n\n", name);
+ printf("To start the service:\n");
+ printf("%s -s <service name> {optional params}\n", name);
+ printf(" Optional parameters\n");
+ printf(" -m <machine>\n\n");
+ printf("To stop the service:\n");
+ printf("%s -t <service name> {optional params}\n", name);
+ printf(" Optional parameters\n");
+ printf(" -m <machine>\n");
+}
+
+void main(int argc, char **argv)
+{
+ WORD wVersionRequested;
+ WSADATA wsaData;
+ int i;
+ int err;
+ int count;
+ int iAction = acNoAction;
+ char *pServiceDisplayName = NULL;
+ char *pServiceName = NULL;
+ char *pUserName = NULL;
+ char *pPassword = NULL;
+ char *pMachine = NULL;
+ BOOL bAutomatic = FALSE;
+ char strDependancy[256] = "";
+
+ memset(strDependancy, 0, 255);
+
+ wVersionRequested = MAKEWORD(1, 1);
+ err = WSAStartup(wVersionRequested, &wsaData);
+ if(0 != err) {
+ fprintf(stderr, "Error connecting to winsock");
+ return;
+ }
+
+ if(LOBYTE( wsaData.wVersion ) != 1 ||
+ HIBYTE( wsaData.wVersion ) != 1) {
+ fprintf(stderr,
+ "Error winsock version is %d %d \n",
+ LOBYTE( wsaData.wVersion ),HIBYTE( wsaData.wVersion ));
+ WSACleanup();
+ return;
+ }
+
+ fprintf(stderr, "Asked (and given) winsock %d.%d \n",
+ LOBYTE(wsaData.wVersion),
+ HIBYTE(wsaData.wVersion));
+
+ __try {
+ if(argc > 2) {
+ count=0;
+ for (i=1;i<argc;i++) {
+ if ((*argv[i] == '-') || (*argv[i] == '/')) {
+ char *cmd = argv[i];
+ cmd++;
+ if(0 == stricmp("i", cmd)) {
+ iAction = acInstall;
+ pServiceName = argv[i+1];
+ } else if(0 == stricmp("r", cmd)) {
+ iAction = acRemove;
+ pServiceName = argv[i+1];
+ } else if(0 == stricmp("s", cmd)) {
+ iAction = acStartTC;
+ pServiceName = argv[i+1];
+ } else if(0 == stricmp("t", cmd)) {
+ iAction = acStopTC;
+ pServiceName = argv[i+1];
+ } else if(0 == stricmp("u", cmd)) {
+ pUserName = argv[i+1];
+ } else if(0 == stricmp("p", cmd)) {
+ pPassword = argv[i+1];
+ } else if(0 == stricmp("m", cmd)) {
+ pMachine = argv[i+1];
+ } else if(0 == stricmp("a", cmd)) {
+ bAutomatic = TRUE;
+ } else if(0 == stricmp("n", cmd)) {
+ pServiceDisplayName = argv[i+1];
+ } else if(0 == stricmp("d", cmd)) {
+ memcpy(strDependancy+count, argv[i+1], strlen(argv[i+1]));
+ count+= strlen(argv[i+1])+1;
+ }
+ }
+ }
+ switch (iAction) {
+ case acInstall:
+ if (pServiceDisplayName == NULL) {
+ pServiceDisplayName = pServiceName;
+ }
+ install_service(pServiceName, pServiceDisplayName, pUserName,
+ pPassword, strDependancy, bAutomatic, argv[i-1]);
+ return;
+ case acRemove:
+ remove_service(pServiceName);
+ return;
+ case acStartTC:
+ start_service(pServiceName, pMachine);
+ return;
+ case acStopTC:
+ stop_service(pServiceName, pMachine);
+ return;
+ }
+ } else if(2 == argc) {
+
+ SERVICE_TABLE_ENTRY dispatchTable[] =
+ {
+ { argv[1], (LPSERVICE_MAIN_FUNCTION)service_main },
+ { NULL, NULL }
+ };
+
+ if(!StartServiceCtrlDispatcher(dispatchTable)) {
+ AddToMessageLog("StartServiceCtrlDispatcher failed.");
+ }
+ return;
+ }
+
+ usage_message(argv[0]);
+ exit(-1);
+ } __finally {
+ WSACleanup();
+ }
+}
+
+void WINAPI service_main(DWORD dwArgc, char **lpszArgv)
+{
+ // register our service control handler:
+ //
+ //
+ sshStatusHandle = RegisterServiceCtrlHandler(lpszArgv[0], service_ctrl);
+
+ if(sshStatusHandle) {
+
+ ssStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
+ ssStatus.dwServiceSpecificExitCode = 0;
+
+ // report the status to the service control manager.
+ //
+ if(ReportStatusToSCMgr(SERVICE_START_PENDING, // service state
+ NO_ERROR, // exit code
+ 3000)) { // wait hint
+ start_jk_service(lpszArgv[0]);
+ }
+ }
+
+ // try to report the stopped status to the service control manager.
+ //
+ if(sshStatusHandle) {
+ ReportStatusToSCMgr(SERVICE_STOPPED,
+ dwErr,
+ 0);
+ }
+}
+
+
+void WINAPI service_ctrl(DWORD dwCtrlCode)
+{
+ /*
+ * Handle the requested control code.
+ */
+ switch(dwCtrlCode)
+ {
+ /*
+ * Stop the service.
+ */
+ case SERVICE_CONTROL_SHUTDOWN:
+ case SERVICE_CONTROL_STOP:
+ ssStatus.dwCurrentState = SERVICE_STOP_PENDING;
+ stop_jk_service();
+ break;
+
+ /*
+ * Update the service status.
+ */
+ case SERVICE_CONTROL_INTERROGATE:
+ break;
+
+ /*
+ * Invalid control code, nothing to do.
+ */
+ default:
+ break;
+
+ }
+
+ ReportStatusToSCMgr(ssStatus.dwCurrentState, NO_ERROR, 0);
+
+}
+
+BOOL ReportStatusToSCMgr(DWORD dwCurrentState,
+ DWORD dwWin32ExitCode,
+ DWORD dwWaitHint)
+{
+ static DWORD dwCheckPoint = 1;
+ BOOL fResult = TRUE;
+
+ if(dwCurrentState == SERVICE_START_PENDING) {
+ ssStatus.dwControlsAccepted = 0;
+ } else {
+ ssStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
+ }
+
+ ssStatus.dwCurrentState = dwCurrentState;
+ ssStatus.dwWin32ExitCode = dwWin32ExitCode;
+ ssStatus.dwWaitHint = dwWaitHint;
+
+ if((dwCurrentState == SERVICE_RUNNING) ||
+ (dwCurrentState == SERVICE_STOPPED)) {
+ ssStatus.dwCheckPoint = 0;
+ } else {
+ ssStatus.dwCheckPoint = dwCheckPoint++;
+ }
+
+ if(!(fResult = SetServiceStatus(sshStatusHandle, &ssStatus))) {
+ AddToMessageLog(TEXT("SetServiceStatus"));
+ }
+
+ return fResult;
+}
+
+typedef WINADVAPI BOOL (WINAPI * pfnChangeServiceConfig2_t)
+ (SC_HANDLE hService, DWORD dwInfoLevel, LPVOID lpInfo);
+
+
+void install_service(char *name,
+ char *dname,
+ char *user,
+ char *password,
+ char *deps,
+ BOOL bAutomatic,
+ char *rel_prp_file)
+{
+ SC_HANDLE schService;
+ SC_HANDLE schSCManager;
+ char szExecPath[2048];
+ char szPropPath[2048];
+ char szTrueName[256];
+ char *dummy;
+ char *src, *dst;
+
+ dst = szTrueName;
+ for (src = name; *src; ++src) {
+ if (dst >= szTrueName + sizeof(szTrueName) - 1) {
+ break;
+ }
+ if (!isspace((int)(*src)) && *src != '/' && *src != '\\') {
+ *(dst++) = *src;
+ }
+ }
+ *dst = '\0';
+
+ if (0 == stricmp("", deps))
+ deps = NULL;
+
+ /* XXX strcat( deps, "Tcpip\0Afd\0" ); */
+
+ if(!GetFullPathName(rel_prp_file, sizeof(szPropPath) - 1, szPropPath, &dummy)) {
+ printf("Unable to install %s - %s\n",
+ name,
+ GetLastErrorText(szErr, sizeof(szErr)));
+ return;
+ }
+
+ if(!jk_file_exists(szPropPath)) {
+ printf("Unable to install %s - File [%s] does not exists\n",
+ name,
+ szPropPath);
+ return;
+ }
+
+ szExecPath[0] = '\"';
+ if(GetModuleFileName( NULL, szExecPath + 1, sizeof(szExecPath) - 2) == 0) {
+ /* Was: if(GetModuleFileName( NULL, szExecPath, sizeof(szExecPath) - 1) == 0) { */
+ printf("Unable to install %s - %s\n",
+ name,
+ GetLastErrorText(szErr, sizeof(szErr)));
+ return;
+ }
+ strcat(szExecPath, "\" ");
+ strcat(szExecPath, szTrueName);
+
+
+ schSCManager = OpenSCManager(NULL, // machine (NULL == local)
+ NULL, // database (NULL == default)
+ SC_MANAGER_ALL_ACCESS); // access required
+ if(schSCManager) {
+
+ schService = CreateService(schSCManager, // SCManager database
+ szTrueName, // name of service
+ dname, // name to display
+ SERVICE_ALL_ACCESS, // desired access
+ SERVICE_WIN32_OWN_PROCESS, // service type
+ bAutomatic ? SERVICE_AUTO_START : SERVICE_DEMAND_START, // start type
+ SERVICE_ERROR_NORMAL, // error control type
+ szExecPath, // service's binary
+ NULL, // no load ordering group
+ NULL, // no tag identifier
+ deps, // dependencies
+ user, // account
+ password); // password
+
+ if(schService) {
+
+ printf("The service named %s was created. Now adding registry entries\n", name);
+
+ if(set_registry_values(schService, szTrueName, szPropPath)) {
+ CloseServiceHandle(schService);
+ } else {
+ printf("CreateService failed setting the private registry - %s\n", GetLastErrorText(szErr, sizeof(szErr)));
+ DeleteService(schService);
+ CloseServiceHandle(schService);
+ }
+ } else {
+ printf("CreateService failed - %s\n", GetLastErrorText(szErr, sizeof(szErr)));
+ }
+
+ CloseServiceHandle(schSCManager);
+ } else {
+ printf("OpenSCManager failed - %s\n", GetLastErrorText(szErr, sizeof(szErr)));
+ }
+}
+
+void remove_service(char *name)
+{
+ SC_HANDLE schService;
+ SC_HANDLE schSCManager;
+ char szNameBuff[256];
+ DWORD lenNameBuff = 256;
+ char *szTrueName = name;
+
+ schSCManager = OpenSCManager(NULL, // machine (NULL == local)
+ NULL, // database (NULL == default)
+ SC_MANAGER_ALL_ACCESS ); // access required
+
+ if(schSCManager) {
+ if (GetServiceKeyName(schSCManager, name, szNameBuff, &lenNameBuff)) {
+ szTrueName = szNameBuff;
+ }
+ schService = OpenService(schSCManager, szTrueName, SERVICE_ALL_ACCESS);
+
+ if(schService) {
+ // try to stop the service
+ if(ControlService( schService, SERVICE_CONTROL_STOP, &ssStatus )) {
+ printf("Stopping %s.", name);
+ Sleep(1000);
+
+ while(QueryServiceStatus(schService, &ssStatus )) {
+ if(ssStatus.dwCurrentState == SERVICE_STOP_PENDING) {
+ printf(".");
+ Sleep(1000);
+ } else {
+ break;
+ }
+ }
+
+ if(ssStatus.dwCurrentState == SERVICE_STOPPED) {
+ printf("\n%s stopped.\n", name);
+ } else {
+ printf("\n%s failed to stop.\n", name);
+ }
+ }
+
+ // now remove the service
+ if(DeleteService(schService)) {
+ printf("%s removed.\n", name);
+ } else {
+ printf("DeleteService failed - %s\n", GetLastErrorText(szErr, sizeof(szErr)));
+ }
+
+ CloseServiceHandle(schService);
+ } else {
+ printf("OpenService failed - %s\n", GetLastErrorText(szErr, sizeof(szErr)));
+ }
+
+ CloseServiceHandle(schSCManager);
+ } else {
+ printf("OpenSCManager failed - %s\n", GetLastErrorText(szErr, sizeof(szErr)));
+ }
+}
+
+void start_service(char *name, char *machine)
+{
+ SC_HANDLE schService;
+ SC_HANDLE schSCManager;
+
+ schSCManager = OpenSCManager(machine, // machine (NULL == local)
+ NULL, // database (NULL == default)
+ SC_MANAGER_ALL_ACCESS); // access required
+
+ if(schSCManager) {
+ schService = OpenService(schSCManager, name, SERVICE_ALL_ACCESS);
+
+ if(schService) {
+ // try to start the service
+ if(StartService(schService, 0, NULL)) {
+ printf("Starting %s.", name);
+ Sleep(1000);
+
+ while(QueryServiceStatus(schService, &ssStatus )) {
+ if(ssStatus.dwCurrentState == SERVICE_START_PENDING) {
+ printf(".");
+ Sleep(1000);
+ } else {
+ break;
+ }
+ }
+
+ if(ssStatus.dwCurrentState == SERVICE_RUNNING) {
+ printf("\n%s started.\n", name);
+ } else {
+ printf("\n%s failed to start.\n", name);
+ }
+ }
+ else
+ printf("StartService failed - %s\n", GetLastErrorText(szErr, sizeof(szErr)));
+
+ CloseServiceHandle(schService);
+ } else {
+ printf("OpenService failed - %s\n", GetLastErrorText(szErr, sizeof(szErr)));
+ }
+
+ CloseServiceHandle(schSCManager);
+ } else {
+ printf("OpenSCManager failed - %s\n", GetLastErrorText(szErr, sizeof(szErr)));
+ }
+}
+
+void stop_service(char *name, char *machine)
+{
+ SC_HANDLE schService;
+ SC_HANDLE schSCManager;
+
+ schSCManager = OpenSCManager(machine, // machine (NULL == local)
+ NULL, // database (NULL == default)
+ SC_MANAGER_ALL_ACCESS); // access required
+
+ if(schSCManager) {
+ schService = OpenService(schSCManager, name, SERVICE_ALL_ACCESS);
+
+ if(schService) {
+ // try to stop the service
+ if(ControlService( schService, SERVICE_CONTROL_STOP, &ssStatus )) {
+ printf("Stopping %s.", name);
+ Sleep(1000);
+
+ while(QueryServiceStatus(schService, &ssStatus )) {
+ if(ssStatus.dwCurrentState == SERVICE_STOP_PENDING) {
+ printf(".");
+ Sleep(1000);
+ } else {
+ break;
+ }
+ }
+
+ if(ssStatus.dwCurrentState == SERVICE_STOPPED) {
+ printf("\n%s stopped.\n", name);
+ } else {
+ printf("\n%s failed to stop.\n", name);
+ }
+ }
+ else
+ printf("StopService failed - %s\n", GetLastErrorText(szErr, sizeof(szErr)));
+
+ CloseServiceHandle(schService);
+ } else {
+ printf("OpenService failed - %s\n", GetLastErrorText(szErr, sizeof(szErr)));
+ }
+
+ CloseServiceHandle(schSCManager);
+ } else {
+ printf("OpenSCManager failed - %s\n", GetLastErrorText(szErr, sizeof(szErr)));
+ }
+}
+
+static int set_registry_values(SC_HANDLE schService, char *name,
+ char *prp_file)
+{
+ char tag[1024];
+ HKEY hk;
+ int rc;
+ /* Api based */
+ HANDLE hAdvApi32;
+ char *szDescription = "Tomcat Server";
+ pfnChangeServiceConfig2_t pfnChangeServiceConfig2;
+
+ if((hAdvApi32 = GetModuleHandle("advapi32.dll"))
+ && ((pfnChangeServiceConfig2 = (pfnChangeServiceConfig2_t)
+ GetProcAddress(hAdvApi32, "ChangeServiceConfig2A")))) {
+ (void) pfnChangeServiceConfig2(schService, // Service Handle
+ 1, // SERVICE_CONFIG_DESCRIPTION
+ &szDescription);
+ } else {
+ char value[2024];
+
+ rc = JK_FALSE;
+
+ strcpy(tag, BASE_REGISTRY_LOCATION);
+ strcat(tag, name);
+
+ if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+ tag,
+ (DWORD)0,
+ KEY_WRITE | KEY_READ,
+ &hk)) {
+ rc = get_registry_config_parameter(hk,
+ IMAGE_NAME,
+ value,
+ sizeof(value));
+ if(rc) {
+ strcat(value, " ");
+ strcat(value, name);
+ rc = set_registry_config_parameter(hk,
+ IMAGE_NAME,
+ value);
+ if(rc) {
+ printf("Registry values were added\n");
+ printf("If you have already updated wrapper.properties you may start the %s"
+ "service by executing \"jk_nt_service -s %s\" from the command prompt\n",
+ name,
+ name);
+ }
+ }
+ RegCloseKey(hk);
+ }
+ if(!rc) {
+ printf("Error: Failed to update the service command line - %s\n",
+ GetLastErrorText(szErr, sizeof(szErr)));
+ }
+ }
+
+ strcpy(tag, BASE_REGISTRY_LOCATION);
+ strcat(tag, name);
+ strcat(tag, "\\");
+ strcat(tag, PARAMS_LOCATION);
+
+ rc = create_registry_key(tag, &hk);
+
+ if(rc) {
+ rc = set_registry_config_parameter(hk, PRP_LOCATION, prp_file);
+ if(!rc) {
+ printf("Error: Can not create value [%s] - %s\n",
+ PRP_LOCATION,
+ GetLastErrorText(szErr, sizeof(szErr)));
+ }
+ RegCloseKey(hk);
+ } else {
+ printf("Error: Can not create key [%s] - %s\n",
+ tag,
+ GetLastErrorText(szErr, sizeof(szErr)));
+ }
+ return rc;
+}
+
+static void start_jk_service(char *name)
+{
+ /*
+ * report the status to the service control manager.
+ */
+ if(ReportStatusToSCMgr(SERVICE_START_PENDING, // service state
+ NO_ERROR, // exit code
+ 3000)) { // wait hint
+
+ /*
+ * create the event object. The control handler function signals
+ * this event when it receives the "stop" control code.
+ */
+ hServerStopEvent = CreateEvent(NULL, // no security attributes
+ TRUE, // manual reset event
+ FALSE, // not-signalled
+ NULL); // no name
+
+ if(hServerStopEvent) {
+ if(ReportStatusToSCMgr(SERVICE_START_PENDING, // service state
+ NO_ERROR, // exit code
+ 20000)) { // wait hint
+ HANDLE hTomcat = NULL;
+ char szNameBuff[256];
+ DWORD lenNameBuff = 256;
+ char *szTrueName = name;
+ SC_HANDLE schSCManager;
+ int rc;
+
+ schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS );
+ if(schSCManager) {
+ if (GetServiceKeyName(schSCManager, name, szNameBuff, &lenNameBuff)) {
+ szTrueName = szNameBuff;
+ }
+ CloseServiceHandle(schSCManager);
+ }
+
+ rc = start_tomcat(szTrueName, &hTomcat);
+
+ if(rc && ReportStatusToSCMgr(SERVICE_RUNNING, // service state
+ NO_ERROR, // exit code
+ 0)) { // wait hint
+ HANDLE waitfor[] = { hServerStopEvent, hTomcat};
+ DWORD dwIndex = WaitForMultipleObjects(2, waitfor, FALSE, INFINITE);
+
+ switch(dwIndex) {
+ case WAIT_OBJECT_0:
+ /*
+ * Stop order arrived
+ */
+ ResetEvent(hServerStopEvent);
+ stop_tomcat(name, shutdown_port, shutdown_protocol,
+ shutdown_secret, hTomcat);
+ break;
+ case (WAIT_OBJECT_0 + 1):
+ /*
+ * Tomcat died !!!
+ */
+ CloseHandle(hServerStopEvent);
+ CloseHandle(hTomcat);
+ exit(0); // exit ungracefully so
+ // Service Control Manager
+ // will attempt a restart.
+ break;
+ default:
+ /*
+ * some error...
+ * close the servlet container and exit
+ */
+ stop_tomcat(name, shutdown_port, shutdown_protocol,
+ shutdown_secret, hTomcat);
+ }
+ CloseHandle(hServerStopEvent);
+ CloseHandle(hTomcat);
+ }
+ }
+ }
+ }
+
+ if(hServerStopEvent) {
+ CloseHandle(hServerStopEvent);
+ }
+}
+
+
+static void stop_jk_service(void)
+{
+ if(hServerStopEvent) {
+ SetEvent(hServerStopEvent);
+ }
+}
+
+static void AddToMessageLog(char *lpszMsg)
+{
+ char szMsg[2048];
+ HANDLE hEventSource;
+ char * lpszStrings[2];
+
+ printf("Error: %s\n", lpszMsg);
+
+ dwErr = GetLastError();
+
+ hEventSource = RegisterEventSource(NULL, "Tomcat");
+
+ sprintf(szMsg, "%s error: %d", "Tomcat", dwErr);
+ lpszStrings[0] = szMsg;
+ lpszStrings[1] = lpszMsg;
+
+ if(hEventSource != NULL) {
+ ReportEvent(hEventSource, // handle of event source
+ EVENTLOG_ERROR_TYPE, // event type
+ 0, // event category
+ 0, // event ID
+ NULL, // current user's SID
+ 2, // strings in lpszStrings
+ 0, // no bytes of raw data
+ lpszStrings, // array of error strings
+ NULL); // no raw data
+
+ DeregisterEventSource(hEventSource);
+ }
+
+}
+
+//
+// FUNCTION: GetLastErrorText
+//
+// PURPOSE: copies error message text to string
+//
+// PARAMETERS:
+// lpszBuf - destination buffer
+// dwSize - size of buffer
+//
+// RETURN VALUE:
+// destination buffer
+//
+// COMMENTS:
+//
+char *GetLastErrorText( char *lpszBuf, DWORD dwSize )
+{
+ DWORD dwRet;
+ char *lpszTemp = NULL;
+
+ dwRet = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_ARGUMENT_ARRAY,
+ NULL,
+ GetLastError(),
+ LANG_NEUTRAL,
+ (char *)&lpszTemp,
+ 0,
+ NULL);
+
+ // supplied buffer is not long enough
+ if(!dwRet || ((long)dwSize < (long)dwRet+14)) {
+ lpszBuf[0] = '\0';
+ } else {
+ lpszTemp[lstrlen(lpszTemp)-2] = '\0'; //remove cr and newline character
+ sprintf(lpszBuf, "%s (0x%x)", lpszTemp, GetLastError());
+ }
+
+ if(lpszTemp) {
+ LocalFree((HLOCAL) lpszTemp );
+ }
+
+ return lpszBuf;
+}
+
+static void stop_tomcat(char *name,
+ int port,
+ const char *protocol,
+ char *secret,
+ HANDLE hTomcat)
+{
+ struct sockaddr_in in;
+
+ if(strcasecmp(protocol, "cmd") == 0 ) {
+ exec_cmd( name, hTomcat, shutdown_cmd);
+ /* XXX sleep 100 */
+ TerminateProcess(hTomcat, 0);
+ return;
+ }
+
+ if(jk_resolve("localhost", port, &in, NULL)) {
+ int sd = jk_open_socket(&in, JK_TRUE, 0, 0, NULL);
+ if(sd >0) {
+ int rc = JK_FALSE;
+
+ if(strcasecmp(protocol, "catalina") == 0 ) {
+ char len;
+
+ if( secret==NULL )
+ secret="SHUTDOWN";
+ len=strlen( secret );
+
+ rc = send(sd, secret, len , 0);
+ if(len == rc) {
+ rc = JK_TRUE;
+ }
+ } else if(!strcasecmp(protocol, "ajp13")) {
+ jk_pool_t pool;
+ jk_msg_buf_t *msg = NULL;
+ jk_pool_atom_t buf[TINY_POOL_SIZE];
+
+ jk_open_pool(&pool, buf, sizeof(buf));
+
+ msg = jk_b_new(&pool);
+ jk_b_set_buffer_size(msg, 512);
+
+ rc = ajp13_marshal_shutdown_into_msgb(msg,
+ &pool,
+ NULL);
+ if( secret!=NULL ) {
+ /** will work with old clients, as well as new
+ */
+ rc = jk_b_append_string(msg, secret);
+ }
+ if(rc) {
+ jk_b_end(msg, AJP13_PROTO);
+
+ if(0 > jk_tcp_socket_sendfull(sd,
+ msg->buf,
+ msg->len,
+ NULL)) {
+ rc = JK_FALSE;
+ }
+ }
+ } else {
+ char b[] = {(char)254, (char)15};
+ rc = send(sd, b, 2, 0);
+ if(2 == rc) {
+ rc = JK_TRUE;
+ }
+ }
+ jk_close_socket(sd, NULL);
+ if(JK_TRUE == rc) {
+ if(WAIT_OBJECT_0 == WaitForSingleObject(hTomcat, 30*1000)) {
+ return;
+ }
+ }
+ }
+ }
+
+ TerminateProcess(hTomcat, 0);
+}
+
+static int exec_cmd(const char *name, HANDLE *hTomcat, char *cmdLine)
+{
+ char tag[1024];
+ HKEY hk;
+
+ strcpy(tag, BASE_REGISTRY_LOCATION);
+ strcat(tag, name);
+ strcat(tag, "\\");
+ strcat(tag, PARAMS_LOCATION);
+
+ if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+ tag,
+ (DWORD)0,
+ KEY_READ,
+ &hk)) {
+ char prp_file[2048];
+ if(get_registry_config_parameter(hk,
+ PRP_LOCATION,
+ prp_file,
+ sizeof(prp_file))) {
+ jk_map_t *init_map;
+
+ if(jk_map_alloc(&init_map)) {
+ if(jk_map_read_properties(init_map, NULL, prp_file, NULL,
+ JK_MAP_HANDLE_DUPLICATES, NULL)) {
+ jk_tomcat_startup_data_t data;
+ jk_pool_t p;
+ jk_pool_atom_t buf[HUGE_POOL_SIZE];
+ jk_open_pool(&p, buf, sizeof(buf));
+
+ if(read_startup_data(init_map, &data, &p)) {
+ STARTUPINFO startupInfo;
+ PROCESS_INFORMATION processInformation;
+ SECURITY_ATTRIBUTES sa = { sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };
+
+ if(data.extra_path) {
+ jk_append_libpath(&p, data.extra_path);
+ }
+
+ memset(&startupInfo, 0, sizeof(startupInfo));
+ startupInfo.cb = sizeof(startupInfo);
+ startupInfo.lpTitle = "Tomcat";
+ startupInfo.dwFlags = STARTF_USESTDHANDLES;
+ startupInfo.hStdInput = NULL;
+ startupInfo.hStdOutput = CreateFile(data.stdout_file,
+ GENERIC_WRITE,
+ FILE_SHARE_READ,
+ &sa,
+ OPEN_ALWAYS,
+ FILE_ATTRIBUTE_NORMAL,
+ NULL);
+ SetFilePointer(startupInfo.hStdOutput,
+ 0,
+ NULL,
+ FILE_END);
+ startupInfo.hStdError = CreateFile(data.stderr_file,
+ GENERIC_WRITE,
+ FILE_SHARE_READ,
+ &sa,
+ OPEN_ALWAYS,
+ FILE_ATTRIBUTE_NORMAL,
+ NULL);
+ SetFilePointer(startupInfo.hStdError,
+ 0,
+ NULL,
+ FILE_END);
+
+ memset(&processInformation, 0, sizeof(processInformation));
+
+ if( cmdLine==NULL )
+ cmdLine=data.cmd_line;
+
+ printf(cmdLine);
+ if(CreateProcess(data.java_bin,
+ cmdLine,
+ NULL,
+ NULL,
+ TRUE,
+ CREATE_NEW_CONSOLE,
+ NULL,
+ data.tomcat_home,
+ &startupInfo,
+ &processInformation)){
+
+ *hTomcat = processInformation.hProcess;
+ CloseHandle(processInformation.hThread);
+ CloseHandle(startupInfo.hStdOutput);
+ CloseHandle(startupInfo.hStdError);
+
+ shutdown_port = data.shutdown_port;
+ shutdown_secret = data.shutdown_secret;
+ shutdown_protocol = strdup(data.shutdown_protocol);
+ shutdown_cmd = strdup(data.stop_cmd);
+
+ return JK_TRUE;
+ } else {
+ printf("Error: Can not create new process - %s\n",
+ GetLastErrorText(szErr, sizeof(szErr)));
+ }
+
+ }
+ }
+ }
+ jk_map_free(&init_map);
+ }
+ RegCloseKey(hk);
+ }
+
+ return JK_FALSE;
+}
+
+static int start_tomcat(const char *name, HANDLE *hTomcat)
+{
+ return exec_cmd( name, hTomcat, NULL );
+}
+
+static int create_registry_key(const char *tag,
+ HKEY *key)
+{
+ LONG lrc = RegCreateKeyEx(HKEY_LOCAL_MACHINE,
+ tag,
+ 0,
+ NULL,
+ REG_OPTION_NON_VOLATILE,
+ KEY_WRITE,
+ NULL,
+ key,
+ NULL);
+ if(ERROR_SUCCESS != lrc) {
+ return JK_FALSE;
+ }
+
+ return JK_TRUE;
+}
+
+static int set_registry_config_parameter(HKEY hkey,
+ const char *tag,
+ char *value)
+{
+ LONG lrc;
+
+ lrc = RegSetValueEx(hkey,
+ tag,
+ 0,
+ REG_SZ,
+ value,
+ strlen(value));
+
+ if(ERROR_SUCCESS != lrc) {
+ return JK_FALSE;
+ }
+
+ return JK_TRUE;
+}
+
+
+
+static int get_registry_config_parameter(HKEY hkey,
+ const char *tag,
+ char *b,
+ DWORD sz)
+{
+ DWORD type = 0;
+ LONG lrc;
+
+ lrc = RegQueryValueEx(hkey,
+ tag,
+ (LPDWORD)0,
+ &type,
+ (LPBYTE)b,
+ &sz);
+ if(ERROR_SUCCESS != lrc) {
+ return JK_FALSE;
+ }
+
+ b[sz] = '\0';
+
+ return JK_TRUE;
+}
+
+static int read_startup_data(jk_map_t *init_map,
+ jk_tomcat_startup_data_t *data,
+ jk_pool_t *p)
+{
+
+ data->classpath = NULL;
+ data->tomcat_home = NULL;
+ data->stdout_file = NULL;
+ data->stderr_file = NULL;
+ data->java_bin = NULL;
+ data->extra_path = NULL;
+ data->tomcat_class = NULL;
+ data->server_file = NULL;
+
+ /* All this is wrong - you just need to configure cmd_line */
+ /* Optional - you may have cmd_line defined */
+ data->server_file = jk_map_get_string(init_map,
+ "wrapper.server_xml",
+ NULL);
+ data->classpath = jk_map_get_string(init_map,
+ "wrapper.class_path",
+ NULL);
+ data->tomcat_home = jk_map_get_string(init_map,
+ "wrapper.tomcat_home",
+ NULL);
+ data->java_bin = jk_map_get_string(init_map,
+ "wrapper.javabin",
+ NULL);
+ data->tomcat_class = jk_map_get_string(init_map,
+ "wrapper.startup_class",
+ "org.apache.tomcat.startup.Tomcat");
+
+ data->cmd_line = jk_map_get_string(init_map,
+ "wrapper.cmd_line",
+ NULL);
+
+ data->stop_cmd = jk_map_get_string(init_map,
+ "wrapper.stop_cmd",
+ NULL);
+
+ if(NULL == data->cmd_line &&
+ ( (NULL == data->tomcat_class) ||
+ (NULL == data->server_file) ||
+ (NULL == data->tomcat_home) ||
+ (NULL == data->java_bin) )) {
+ return JK_FALSE;
+ }
+
+ if(NULL == data->cmd_line) {
+ data->cmd_line = (char *)jk_pool_alloc(p, (20 +
+ strlen(data->java_bin) +
+ strlen(" -classpath ") +
+ strlen(data->classpath) +
+ strlen(data->tomcat_class) +
+ strlen(" -home ") +
+ strlen(data->tomcat_home) +
+ strlen(" -config ") +
+ strlen(data->server_file)
+ ) * sizeof(char));
+ if(NULL == data->cmd_line) {
+ return JK_FALSE;
+ }
+
+ strcpy(data->cmd_line, data->java_bin);
+ strcat(data->cmd_line, " -classpath ");
+ strcat(data->cmd_line, data->classpath);
+ strcat(data->cmd_line, " ");
+ strcat(data->cmd_line, data->tomcat_class);
+ strcat(data->cmd_line, " -home ");
+ strcat(data->cmd_line, data->tomcat_home);
+ strcat(data->cmd_line, " -config ");
+ strcat(data->cmd_line, data->server_file);
+ }
+
+ data->shutdown_port = jk_map_get_int(init_map,
+ "wrapper.shutdown_port",
+ 8007);
+
+ data->shutdown_secret = jk_map_get_string(init_map,
+ "wrapper.shutdown_secret",
+ NULL);
+
+ data->shutdown_protocol = jk_map_get_string(init_map,
+ "wrapper.shutdown_protocol",
+ AJP12_TAG);
+
+ data->extra_path = jk_map_get_string(init_map,
+ "wrapper.ld_path",
+ NULL);
+
+ data->stdout_file = jk_map_get_string(init_map,
+ "wrapper.stdout",
+ NULL);
+
+ if(NULL == data->stdout_file && NULL == data->tomcat_home ) {
+ return JK_FALSE;
+ }
+
+ if(NULL == data->stdout_file) {
+ data->stdout_file = jk_pool_alloc(p, strlen(data->tomcat_home) + 2 + strlen("\\stdout.log"));
+ strcpy(data->stdout_file, data->tomcat_home);
+ strcat(data->stdout_file, "\\stdout.log");
+ }
+
+ data->stderr_file = jk_map_get_string(init_map,
+ "wrapper.stderr",
+ NULL);
+
+ if(NULL == data->stderr_file) {
+ data->stderr_file = jk_pool_alloc(p, strlen(data->tomcat_home) + 2 + strlen("\\stderr.log"));
+ strcpy(data->stderr_file, data->tomcat_home);
+ strcat(data->stderr_file, "\\stderr.log");
+ }
+
+ return JK_TRUE;
+}
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/nt_service/nt_service.dsp b/rubbos/app/tomcat-connectors-1.2.32-src/native/nt_service/nt_service.dsp
new file mode 100644
index 00000000..02b02607
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/nt_service/nt_service.dsp
@@ -0,0 +1,199 @@
+# Microsoft Developer Studio Project File - Name="nt_service" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=nt_service - 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 "nt_service.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 "nt_service.mak" CFG="nt_service - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "nt_service - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "nt_service - 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)" == "nt_service - 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" /FD /c
+# ADD CPP /nologo /W3 /GX /Zi /O2 /I "../common" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Fd"Release/jk_nt_service_src" /FD /c
+# 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 wsock32.lib 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:"Release/jk_nt_service.exe" /opt:ref
+
+!ELSEIF "$(CFG)" == "nt_service - 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 /MD /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c
+# ADD CPP /nologo /MD /W3 /Gm /GX /Zi /Od /I "../common" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Fd"Debug/jk_nt_service_src" /FD /c
+# 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 wsock32.lib 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:"Debug/jk_nt_service.exe"
+
+!ENDIF
+
+# Begin Target
+
+# Name "nt_service - Win32 Release"
+# Name "nt_service - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\common\jk_ajp13.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_connect.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_map.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_msg_buff.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\jk_nt_service.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_pool.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_util.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp14.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp14_worker.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_md5.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_context.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_uri_worker_map.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp_common.c
+# End Source File
+# End Group
+
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\common\jk_connect.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_global.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_logger.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_uri_worker_map.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_map.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_pool.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_service.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_util.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp14.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp14_worker.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_md5.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_context.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\jk_ajp_common.h
+# End Source File
+# End Group
+# End Target
+# End Project
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/config_vars.mk b/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/config_vars.mk
new file mode 100644
index 00000000..8f8c4ea0
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/config_vars.mk
@@ -0,0 +1,17 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# libtool is given by Apache-2.0 when installed otherwise we provide it.
+LIBTOOL = $(SHELL) ../libtool
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/instdso.sh b/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/instdso.sh
new file mode 100755
index 00000000..2b32973c
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/instdso.sh
@@ -0,0 +1,91 @@
+#!/bin/sh
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+# instdso.sh - install Apache DSO modules
+#
+# we use this instead of libtool --install because:
+# 1) on a few platforms libtool doesn't install DSOs exactly like we'd
+# want (weird names, doesn't remove DSO first)
+# 2) we never want the .la files copied, so we might as well copy
+# the .so files ourselves
+
+if test "$#" != "3"; then
+ echo "wrong number of arguments to instdso.sh"
+ echo "Usage: instdso.sh SH_LIBTOOL-value dso-name path-to-modules"
+ exit 1
+fi
+
+SH_LIBTOOL=`echo $1 | sed -e 's/^SH_LIBTOOL=//'`
+DSOARCHIVE=$2
+DSOARCHIVE_BASENAME=`basename $2`
+TARGETDIR=$3
+DSOBASE=`echo $DSOARCHIVE_BASENAME | sed -e 's/\.la$//'`
+TARGET_NAME="$DSOBASE.so"
+
+SYS=`uname -s`
+
+if test "$SYS" = "AIX"
+then
+ # on AIX, shared libraries remain in storage even when
+ # all processes using them have exited; standard practice
+ # prior to installing a shared library is to rm -f first
+ CMD="rm -f $TARGETDIR/$TARGET_NAME"
+ echo $CMD
+ $CMD || exit $?
+fi
+
+CMD="$SH_LIBTOOL --mode=install cp $DSOARCHIVE $TARGETDIR/"
+echo $CMD
+$CMD || exit $?
+
+if test "$SYS" = "OS/2"
+then
+ # on OS/2, aplibtool --install doesn't copy the .la files & we can't
+ # rename DLLs to have a .so extension or they won't load so none of the
+ # steps below make sense.
+ exit 0
+fi
+
+if test -s "$TARGETDIR/$DSOARCHIVE_BASENAME"
+then
+ DLNAME=`sed -n "/^dlname=/{s/.*='\([^']*\)'/\1/;p;}" $TARGETDIR/$DSOARCHIVE_BASENAME`
+ LIBRARY_NAMES=`sed -n "/^library_names/{s/library_names='\([^']*\)'/\1/;p;}" $TARGETDIR/$DSOARCHIVE_BASENAME`
+ LIBRARY_NAMES=`echo $LIBRARY_NAMES | sed -e "s/ *$DLNAME//g"`
+fi
+
+if test -z "$DLNAME"
+then
+ echo "Warning! dlname not found in $TARGETDIR/$DSOARCHIVE_BASENAME."
+ echo "Assuming installing a .so rather than a libtool archive."
+ exit 0
+fi
+
+if test -n "$LIBRARY_NAMES"
+then
+ for f in $LIBRARY_NAMES
+ do
+ rm -f $TARGETDIR/$f
+ done
+fi
+
+if test "$DLNAME" != "$TARGET_NAME"
+then
+ mv $TARGETDIR/$DLNAME $TARGETDIR/$TARGET_NAME
+fi
+
+exit 0
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/jk_common.m4 b/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/jk_common.m4
new file mode 100644
index 00000000..c39792a6
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/jk_common.m4
@@ -0,0 +1,160 @@
+dnl -------------------------------------------------------- -*- autoconf -*-
+dnl Licensed to the Apache Software Foundation (ASF) under one or more
+dnl contributor license agreements. See the NOTICE file distributed with
+dnl this work for additional information regarding copyright ownership.
+dnl The ASF licenses this file to You under the Apache License, Version 2.0
+dnl (the "License"); you may not use this file except in compliance with
+dnl the License. You may obtain a copy of the License at
+dnl
+dnl http://www.apache.org/licenses/LICENSE-2.0
+dnl
+dnl Unless required by applicable law or agreed to in writing, software
+dnl distributed under the License is distributed on an "AS IS" BASIS,
+dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+dnl See the License for the specific language governing permissions and
+dnl limitations under the License.
+
+dnl
+dnl jk_common.m4: JK's general-purpose autoconf macros
+dnl Mostly taken from APR.
+dnl
+
+dnl
+dnl JK_CHECK_SIZEOF_EXTENDED(INCLUDES, TYPE [, CROSS_SIZE])
+dnl
+dnl A variant of AC_CHECK_SIZEOF which allows the checking of
+dnl sizes of non-builtin types
+dnl
+AC_DEFUN([JK_CHECK_SIZEOF_EXTENDED],
+[changequote(<<,>>)dnl
+dnl The name to #define
+define(<<AC_TYPE_NAME>>, translit(sizeof_$2, [a-z *], [A-Z_P]))dnl
+dnl The cache variable
+define(<<AC_CV_NAME>>, translit(ac_cv_sizeof_$2, [ *],[<p>]))dnl
+changequote([, ])dnl
+AC_MSG_CHECKING(size of $2)
+AC_CACHE_VAL(AC_CV_NAME,
+[AC_TRY_RUN([#include <stdio.h>
+$1
+main()
+{
+ FILE *f=fopen("conftestval","w");
+ if (!f) exit(1);
+ fprintf(f, "%d\n", sizeof($2));
+ exit(0);
+}], AC_CV_NAME=`cat conftestval`, AC_CV_NAME=0, ifelse([$3],,,
+AC_CV_NAME=$3))])dnl
+AC_MSG_RESULT($AC_CV_NAME)
+AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME, [The size of ]$2)
+undefine([AC_TYPE_NAME])dnl
+undefine([AC_CV_NAME])dnl
+])
+
+dnl
+dnl JK_PREFIX_IF_MISSING(variable, prefix)
+dnl
+dnl Prefix all tokens in a variable with "prefix" unless
+dnl it is already there.
+dnl
+AC_DEFUN([JK_PREFIX_IF_MISSING], [
+ jk_new_val=""
+ jk_val_changed=0
+ for i in $$1; do
+ case $i in
+ $2*)
+ jk_new_val="$jk_new_val $i"
+ ;;
+ *)
+ jk_new_val="$jk_new_val $2$i"
+ jk_val_changed=1
+ ;;
+ esac
+ done
+ if test $jk_val_changed = "1"; then
+ AC_MSG_NOTICE(tokens in $1 have been prefixed with '[$2]')
+ $1=$jk_new_val
+ fi
+]) dnl
+
+dnl Iteratively interpolate the contents of the second argument
+dnl until interpolation offers no new result. Then assign the
+dnl final result to $1.
+dnl
+dnl Example:
+dnl
+dnl foo=1
+dnl bar='${foo}/2'
+dnl baz='${bar}/3'
+dnl JK_EXPAND_VAR(fraz, $baz)
+dnl $fraz is now "1/2/3"
+dnl
+AC_DEFUN([JK_EXPAND_VAR], [
+jk_last=
+jk_cur="$2"
+while test "x${jk_cur}" != "x${jk_last}";
+do
+ jk_last="${jk_cur}"
+ jk_cur=`eval "echo ${jk_cur}"`
+done
+$1="${jk_cur}"
+])
+
+dnl
+dnl JK_CONFIG_NICE(filename)
+dnl
+dnl Saves a snapshot of the configure command-line for later reuse
+dnl
+AC_DEFUN([JK_CONFIG_NICE], [
+ rm -f $1
+ cat >$1<<EOF
+#! /bin/sh
+#
+# Created by configure
+
+EOF
+ if test -n "$CC"; then
+ echo "CC=\"$CC\"; export CC" >> $1
+ fi
+ if test -n "$CFLAGS"; then
+ echo "CFLAGS=\"$CFLAGS\"; export CFLAGS" >> $1
+ fi
+ if test -n "$CPPFLAGS"; then
+ echo "CPPFLAGS=\"$CPPFLAGS\"; export CPPFLAGS" >> $1
+ fi
+ if test -n "$LDFLAGS"; then
+ echo "LDFLAGS=\"$LDFLAGS\"; export LDFLAGS" >> $1
+ fi
+ if test -n "$LTFLAGS"; then
+ echo "LTFLAGS=\"$LTFLAGS\"; export LTFLAGS" >> $1
+ fi
+ if test -n "$LIBS"; then
+ echo "LIBS=\"$LIBS\"; export LIBS" >> $1
+ fi
+ if test -n "$INCLUDES"; then
+ echo "INCLUDES=\"$INCLUDES\"; export INCLUDES" >> $1
+ fi
+ if test -n "$NOTEST_CFLAGS"; then
+ echo "NOTEST_CFLAGS=\"$NOTEST_CFLAGS\"; export NOTEST_CFLAGS" >> $1
+ fi
+ if test -n "$NOTEST_CPPFLAGS"; then
+ echo "NOTEST_CPPFLAGS=\"$NOTEST_CPPFLAGS\"; export NOTEST_CPPFLAGS" >> $1
+ fi
+ if test -n "$NOTEST_LDFLAGS"; then
+ echo "NOTEST_LDFLAGS=\"$NOTEST_LDFLAGS\"; export NOTEST_LDFLAGS" >> $1
+ fi
+ if test -n "$NOTEST_LIBS"; then
+ echo "NOTEST_LIBS=\"$NOTEST_LIBS\"; export NOTEST_LIBS" >> $1
+ fi
+
+ # Retrieve command-line arguments.
+ eval "set x $[0] $ac_configure_args"
+ shift
+
+ for arg
+ do
+ JK_EXPAND_VAR(arg, $arg)
+ echo "\"[$]arg\" \\" >> $1
+ done
+ echo '"[$]@"' >> $1
+ chmod +x $1
+])dnl
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/rules.mk b/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/rules.mk
new file mode 100644
index 00000000..5babe3e8
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/rules.mk
@@ -0,0 +1,43 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# That an extract of what is in APR.
+#
+
+# Compile commands
+#VPATH=.:../common
+COMPILE = $(CC) $(CFLAGS)
+LT_COMPILE = $(LIBTOOL) --mode=compile $(COMPILE) -c $< -o $@
+
+# Implicit rules for creating outputs from input files
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .slo .s
+
+.c.o:
+ $(COMPILE) -c $<
+
+.s.o:
+ $(COMPILE) -c $<
+
+.c.lo:
+ $(LT_COMPILE)
+
+.s.lo:
+ $(LT_COMPILE)
+
+.c.slo:
+ $(SH_COMPILE)
+
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/config.guess b/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/config.guess
new file mode 100755
index 00000000..7d0185e0
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/config.guess
@@ -0,0 +1,1447 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+
+timestamp='2004-09-07'
+
+# This file 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 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Per Bothner <per@bothner.com>.
+# Please send patches to <config-patches@gnu.org>. Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub. If it succeeds, it prints the system name on stdout, and
+# exits with 0. Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit 0 ;;
+ --version | -v )
+ echo "$version" ; exit 0 ;;
+ --help | --h* | -h )
+ echo "$usage"; exit 0 ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help" >&2
+ exit 1 ;;
+ * )
+ break ;;
+ esac
+done
+
+if test $# != 0; then
+ echo "$me: too many arguments$help" >&2
+ exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,) echo "int x;" > $dummy.c ;
+ for c in cc gcc c89 c99 ; do
+ if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+ CC_FOR_BUILD="$c"; break ;
+ fi ;
+ done ;
+ if test x"$CC_FOR_BUILD" = x ; then
+ CC_FOR_BUILD=no_compiler_found ;
+ fi
+ ;;
+ ,,*) CC_FOR_BUILD=$CC ;;
+ ,*,*) CC_FOR_BUILD=$HOST_CC ;;
+esac ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+ PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ *:NetBSD:*:*)
+ # NetBSD (nbsd) targets should (where applicable) match one or
+ # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+ # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
+ # switched to ELF, *-*-netbsd* would select the old
+ # object file format. This provides both forward
+ # compatibility and a consistent mechanism for selecting the
+ # object file format.
+ #
+ # Note: NetBSD doesn't particularly care about the vendor
+ # portion of the name. We always set it to "unknown".
+ sysctl="sysctl -n hw.machine_arch"
+ UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+ /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+ case "${UNAME_MACHINE_ARCH}" in
+ armeb) machine=armeb-unknown ;;
+ arm*) machine=arm-unknown ;;
+ sh3el) machine=shl-unknown ;;
+ sh3eb) machine=sh-unknown ;;
+ *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+ esac
+ # The Operating System including object format, if it has switched
+ # to ELF recently, or will in the future.
+ case "${UNAME_MACHINE_ARCH}" in
+ arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+ eval $set_cc_for_build
+ if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep __ELF__ >/dev/null
+ then
+ # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+ # Return netbsd for either. FIX?
+ os=netbsd
+ else
+ os=netbsdelf
+ fi
+ ;;
+ *)
+ os=netbsd
+ ;;
+ esac
+ # The OS release
+ # Debian GNU/NetBSD machines have a different userland, and
+ # thus, need a distinct triplet. However, they do not need
+ # kernel version information, so it can be replaced with a
+ # suitable tag, in the style of linux-gnu.
+ case "${UNAME_VERSION}" in
+ Debian*)
+ release='-gnu'
+ ;;
+ *)
+ release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ ;;
+ esac
+ # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+ # contains redundant information, the shorter form:
+ # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+ echo "${machine}-${os}${release}"
+ exit 0 ;;
+ amd64:OpenBSD:*:*)
+ echo x86_64-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ amiga:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ cats:OpenBSD:*:*)
+ echo arm-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ hp300:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ luna88k:OpenBSD:*:*)
+ echo m88k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mac68k:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ macppc:OpenBSD:*:*)
+ echo powerpc-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mvme68k:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mvme88k:OpenBSD:*:*)
+ echo m88k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mvmeppc:OpenBSD:*:*)
+ echo powerpc-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ sgi:OpenBSD:*:*)
+ echo mips64-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ sun3:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ *:OpenBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ *:ekkoBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+ exit 0 ;;
+ macppc:MirBSD:*:*)
+ echo powerppc-unknown-mirbsd${UNAME_RELEASE}
+ exit 0 ;;
+ *:MirBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+ exit 0 ;;
+ alpha:OSF1:*:*)
+ case $UNAME_RELEASE in
+ *4.0)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+ ;;
+ *5.*)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+ ;;
+ esac
+ # According to Compaq, /usr/sbin/psrinfo has been available on
+ # OSF/1 and Tru64 systems produced since 1995. I hope that
+ # covers most systems running today. This code pipes the CPU
+ # types through head -n 1, so we only detect the type of CPU 0.
+ ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+ case "$ALPHA_CPU_TYPE" in
+ "EV4 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "EV4.5 (21064)")
+ UNAME_MACHINE="alpha" ;;
+ "LCA4 (21066/21068)")
+ UNAME_MACHINE="alpha" ;;
+ "EV5 (21164)")
+ UNAME_MACHINE="alphaev5" ;;
+ "EV5.6 (21164A)")
+ UNAME_MACHINE="alphaev56" ;;
+ "EV5.6 (21164PC)")
+ UNAME_MACHINE="alphapca56" ;;
+ "EV5.7 (21164PC)")
+ UNAME_MACHINE="alphapca57" ;;
+ "EV6 (21264)")
+ UNAME_MACHINE="alphaev6" ;;
+ "EV6.7 (21264A)")
+ UNAME_MACHINE="alphaev67" ;;
+ "EV6.8CB (21264C)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8AL (21264B)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.8CX (21264D)")
+ UNAME_MACHINE="alphaev68" ;;
+ "EV6.9A (21264/EV69A)")
+ UNAME_MACHINE="alphaev69" ;;
+ "EV7 (21364)")
+ UNAME_MACHINE="alphaev7" ;;
+ "EV7.9 (21364A)")
+ UNAME_MACHINE="alphaev79" ;;
+ esac
+ # A Pn.n version is a patched version.
+ # A Vn.n version is a released version.
+ # A Tn.n version is a released field test version.
+ # A Xn.n version is an unreleased experimental baselevel.
+ # 1.2 uses "1.2" for uname -r.
+ echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ exit 0 ;;
+ Alpha\ *:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # Should we change UNAME_MACHINE based on the output of uname instead
+ # of the specific Alpha model?
+ echo alpha-pc-interix
+ exit 0 ;;
+ 21064:Windows_NT:50:3)
+ echo alpha-dec-winnt3.5
+ exit 0 ;;
+ Amiga*:UNIX_System_V:4.0:*)
+ echo m68k-unknown-sysv4
+ exit 0;;
+ *:[Aa]miga[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-amigaos
+ exit 0 ;;
+ *:[Mm]orph[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-morphos
+ exit 0 ;;
+ *:OS/390:*:*)
+ echo i370-ibm-openedition
+ exit 0 ;;
+ *:OS400:*:*)
+ echo powerpc-ibm-os400
+ exit 0 ;;
+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ echo arm-acorn-riscix${UNAME_RELEASE}
+ exit 0;;
+ SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+ echo hppa1.1-hitachi-hiuxmpp
+ exit 0;;
+ Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+ # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+ if test "`(/bin/universe) 2>/dev/null`" = att ; then
+ echo pyramid-pyramid-sysv3
+ else
+ echo pyramid-pyramid-bsd
+ fi
+ exit 0 ;;
+ NILE*:*:*:dcosx)
+ echo pyramid-pyramid-svr4
+ exit 0 ;;
+ DRS?6000:unix:4.0:6*)
+ echo sparc-icl-nx6
+ exit 0 ;;
+ DRS?6000:UNIX_SV:4.2*:7*)
+ case `/usr/bin/uname -p` in
+ sparc) echo sparc-icl-nx7 && exit 0 ;;
+ esac ;;
+ sun4H:SunOS:5.*:*)
+ echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+ echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ i86pc:SunOS:5.*:*)
+ echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ sun4*:SunOS:6*:*)
+ # According to config.sub, this is the proper way to canonicalize
+ # SunOS6. Hard to guess exactly what SunOS6 will be like, but
+ # it's likely to be more like Solaris than SunOS4.
+ echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ sun4*:SunOS:*:*)
+ case "`/usr/bin/arch -k`" in
+ Series*|S4*)
+ UNAME_RELEASE=`uname -v`
+ ;;
+ esac
+ # Japanese Language versions have a version number like `4.1.3-JL'.
+ echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+ exit 0 ;;
+ sun3*:SunOS:*:*)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ exit 0 ;;
+ sun*:*:4.2BSD:*)
+ UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+ test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+ case "`/bin/arch`" in
+ sun3)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ ;;
+ sun4)
+ echo sparc-sun-sunos${UNAME_RELEASE}
+ ;;
+ esac
+ exit 0 ;;
+ aushp:SunOS:*:*)
+ echo sparc-auspex-sunos${UNAME_RELEASE}
+ exit 0 ;;
+ # The situation for MiNT is a little confusing. The machine name
+ # can be virtually everything (everything which is not
+ # "atarist" or "atariste" at least should have a processor
+ # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
+ # to the lowercase version "mint" (or "freemint"). Finally
+ # the system name "TOS" denotes a system which is actually not
+ # MiNT. But MiNT is downward compatible to TOS, so this should
+ # be no problem.
+ atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit 0 ;;
+ atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit 0 ;;
+ *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit 0 ;;
+ milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+ echo m68k-milan-mint${UNAME_RELEASE}
+ exit 0 ;;
+ hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+ echo m68k-hades-mint${UNAME_RELEASE}
+ exit 0 ;;
+ *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+ echo m68k-unknown-mint${UNAME_RELEASE}
+ exit 0 ;;
+ m68k:machten:*:*)
+ echo m68k-apple-machten${UNAME_RELEASE}
+ exit 0 ;;
+ powerpc:machten:*:*)
+ echo powerpc-apple-machten${UNAME_RELEASE}
+ exit 0 ;;
+ RISC*:Mach:*:*)
+ echo mips-dec-mach_bsd4.3
+ exit 0 ;;
+ RISC*:ULTRIX:*:*)
+ echo mips-dec-ultrix${UNAME_RELEASE}
+ exit 0 ;;
+ VAX*:ULTRIX*:*:*)
+ echo vax-dec-ultrix${UNAME_RELEASE}
+ exit 0 ;;
+ 2020:CLIX:*:* | 2430:CLIX:*:*)
+ echo clipper-intergraph-clix${UNAME_RELEASE}
+ exit 0 ;;
+ mips:*:*:UMIPS | mips:*:*:RISCos)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h> /* for printf() prototype */
+ int main (int argc, char *argv[]) {
+#else
+ int main (argc, argv) int argc; char *argv[]; {
+#endif
+ #if defined (host_mips) && defined (MIPSEB)
+ #if defined (SYSTYPE_SYSV)
+ printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_SVR4)
+ printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+ printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+ #endif
+ #endif
+ exit (-1);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c \
+ && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+ && exit 0
+ echo mips-mips-riscos${UNAME_RELEASE}
+ exit 0 ;;
+ Motorola:PowerMAX_OS:*:*)
+ echo powerpc-motorola-powermax
+ exit 0 ;;
+ Motorola:*:4.3:PL8-*)
+ echo powerpc-harris-powermax
+ exit 0 ;;
+ Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+ echo powerpc-harris-powermax
+ exit 0 ;;
+ Night_Hawk:Power_UNIX:*:*)
+ echo powerpc-harris-powerunix
+ exit 0 ;;
+ m88k:CX/UX:7*:*)
+ echo m88k-harris-cxux7
+ exit 0 ;;
+ m88k:*:4*:R4*)
+ echo m88k-motorola-sysv4
+ exit 0 ;;
+ m88k:*:3*:R3*)
+ echo m88k-motorola-sysv3
+ exit 0 ;;
+ AViiON:dgux:*:*)
+ # DG/UX returns AViiON for all architectures
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+ then
+ if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+ [ ${TARGET_BINARY_INTERFACE}x = x ]
+ then
+ echo m88k-dg-dgux${UNAME_RELEASE}
+ else
+ echo m88k-dg-dguxbcs${UNAME_RELEASE}
+ fi
+ else
+ echo i586-dg-dgux${UNAME_RELEASE}
+ fi
+ exit 0 ;;
+ M88*:DolphinOS:*:*) # DolphinOS (SVR3)
+ echo m88k-dolphin-sysv3
+ exit 0 ;;
+ M88*:*:R3*:*)
+ # Delta 88k system running SVR3
+ echo m88k-motorola-sysv3
+ exit 0 ;;
+ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+ echo m88k-tektronix-sysv3
+ exit 0 ;;
+ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+ echo m68k-tektronix-bsd
+ exit 0 ;;
+ *:IRIX*:*:*)
+ echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+ exit 0 ;;
+ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+ echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ i*86:AIX:*:*)
+ echo i386-ibm-aix
+ exit 0 ;;
+ ia64:AIX:*:*)
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+ exit 0 ;;
+ *:AIX:2:3)
+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <sys/systemcfg.h>
+
+ main()
+ {
+ if (!__power_pc())
+ exit(1);
+ puts("powerpc-ibm-aix3.2.5");
+ exit(0);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0
+ echo rs6000-ibm-aix3.2.5
+ elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+ echo rs6000-ibm-aix3.2.4
+ else
+ echo rs6000-ibm-aix3.2
+ fi
+ exit 0 ;;
+ *:AIX:*:[45])
+ IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+ if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+ IBM_ARCH=rs6000
+ else
+ IBM_ARCH=powerpc
+ fi
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+ fi
+ echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+ exit 0 ;;
+ *:AIX:*:*)
+ echo rs6000-ibm-aix
+ exit 0 ;;
+ ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+ echo romp-ibm-bsd4.4
+ exit 0 ;;
+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
+ echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
+ exit 0 ;; # report: romp-ibm BSD 4.3
+ *:BOSX:*:*)
+ echo rs6000-bull-bosx
+ exit 0 ;;
+ DPX/2?00:B.O.S.:*:*)
+ echo m68k-bull-sysv3
+ exit 0 ;;
+ 9000/[34]??:4.3bsd:1.*:*)
+ echo m68k-hp-bsd
+ exit 0 ;;
+ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+ echo m68k-hp-bsd4.4
+ exit 0 ;;
+ 9000/[34678]??:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ case "${UNAME_MACHINE}" in
+ 9000/31? ) HP_ARCH=m68000 ;;
+ 9000/[34]?? ) HP_ARCH=m68k ;;
+ 9000/[678][0-9][0-9])
+ if [ -x /usr/bin/getconf ]; then
+ sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+ sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+ case "${sc_cpu_version}" in
+ 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+ 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+ 532) # CPU_PA_RISC2_0
+ case "${sc_kernel_bits}" in
+ 32) HP_ARCH="hppa2.0n" ;;
+ 64) HP_ARCH="hppa2.0w" ;;
+ '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20
+ esac ;;
+ esac
+ fi
+ if [ "${HP_ARCH}" = "" ]; then
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+
+ #define _HPUX_SOURCE
+ #include <stdlib.h>
+ #include <unistd.h>
+
+ int main ()
+ {
+ #if defined(_SC_KERNEL_BITS)
+ long bits = sysconf(_SC_KERNEL_BITS);
+ #endif
+ long cpu = sysconf (_SC_CPU_VERSION);
+
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+ case CPU_PA_RISC2_0:
+ #if defined(_SC_KERNEL_BITS)
+ switch (bits)
+ {
+ case 64: puts ("hppa2.0w"); break;
+ case 32: puts ("hppa2.0n"); break;
+ default: puts ("hppa2.0"); break;
+ } break;
+ #else /* !defined(_SC_KERNEL_BITS) */
+ puts ("hppa2.0"); break;
+ #endif
+ default: puts ("hppa1.0"); break;
+ }
+ exit (0);
+ }
+EOF
+ (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+ test -z "$HP_ARCH" && HP_ARCH=hppa
+ fi ;;
+ esac
+ if [ ${HP_ARCH} = "hppa2.0w" ]
+ then
+ # avoid double evaluation of $set_cc_for_build
+ test -n "$CC_FOR_BUILD" || eval $set_cc_for_build
+ if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null
+ then
+ HP_ARCH="hppa2.0w"
+ else
+ HP_ARCH="hppa64"
+ fi
+ fi
+ echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+ exit 0 ;;
+ ia64:HP-UX:*:*)
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ echo ia64-hp-hpux${HPUX_REV}
+ exit 0 ;;
+ 3050*:HI-UX:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <unistd.h>
+ int
+ main ()
+ {
+ long cpu = sysconf (_SC_CPU_VERSION);
+ /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+ true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
+ results, however. */
+ if (CPU_IS_PA_RISC (cpu))
+ {
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+ default: puts ("hppa-hitachi-hiuxwe2"); break;
+ }
+ }
+ else if (CPU_IS_HP_MC68K (cpu))
+ puts ("m68k-hitachi-hiuxwe2");
+ else puts ("unknown-hitachi-hiuxwe2");
+ exit (0);
+ }
+EOF
+ $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0
+ echo unknown-hitachi-hiuxwe2
+ exit 0 ;;
+ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+ echo hppa1.1-hp-bsd
+ exit 0 ;;
+ 9000/8??:4.3bsd:*:*)
+ echo hppa1.0-hp-bsd
+ exit 0 ;;
+ *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+ echo hppa1.0-hp-mpeix
+ exit 0 ;;
+ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+ echo hppa1.1-hp-osf
+ exit 0 ;;
+ hp8??:OSF1:*:*)
+ echo hppa1.0-hp-osf
+ exit 0 ;;
+ i*86:OSF1:*:*)
+ if [ -x /usr/sbin/sysversion ] ; then
+ echo ${UNAME_MACHINE}-unknown-osf1mk
+ else
+ echo ${UNAME_MACHINE}-unknown-osf1
+ fi
+ exit 0 ;;
+ parisc*:Lites*:*:*)
+ echo hppa1.1-hp-lites
+ exit 0 ;;
+ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+ echo c1-convex-bsd
+ exit 0 ;;
+ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit 0 ;;
+ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+ echo c34-convex-bsd
+ exit 0 ;;
+ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+ echo c38-convex-bsd
+ exit 0 ;;
+ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+ echo c4-convex-bsd
+ exit 0 ;;
+ CRAY*Y-MP:*:*:*)
+ echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit 0 ;;
+ CRAY*[A-Z]90:*:*:*)
+ echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+ -e 's/\.[^.]*$/.X/'
+ exit 0 ;;
+ CRAY*TS:*:*:*)
+ echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit 0 ;;
+ CRAY*T3E:*:*:*)
+ echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit 0 ;;
+ CRAY*SV1:*:*:*)
+ echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit 0 ;;
+ *:UNICOS/mp:*:*)
+ echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+ exit 0 ;;
+ F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+ FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+ echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit 0 ;;
+ 5000:UNIX_System_V:4.*:*)
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+ echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit 0 ;;
+ i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+ echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+ exit 0 ;;
+ sparc*:BSD/OS:*:*)
+ echo sparc-unknown-bsdi${UNAME_RELEASE}
+ exit 0 ;;
+ *:BSD/OS:*:*)
+ echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+ exit 0 ;;
+ *:FreeBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+ exit 0 ;;
+ i*:CYGWIN*:*)
+ echo ${UNAME_MACHINE}-pc-cygwin
+ exit 0 ;;
+ i*:MINGW*:*)
+ echo ${UNAME_MACHINE}-pc-mingw32
+ exit 0 ;;
+ i*:PW*:*)
+ echo ${UNAME_MACHINE}-pc-pw32
+ exit 0 ;;
+ x86:Interix*:[34]*)
+ echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//'
+ exit 0 ;;
+ [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+ echo i${UNAME_MACHINE}-pc-mks
+ exit 0 ;;
+ i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+ # UNAME_MACHINE based on the output of uname instead of i386?
+ echo i586-pc-interix
+ exit 0 ;;
+ i*:UWIN*:*)
+ echo ${UNAME_MACHINE}-pc-uwin
+ exit 0 ;;
+ p*:CYGWIN*:*)
+ echo powerpcle-unknown-cygwin
+ exit 0 ;;
+ prep*:SunOS:5.*:*)
+ echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ *:GNU:*:*)
+ # the GNU system
+ echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+ exit 0 ;;
+ *:GNU/*:*:*)
+ # other systems with GNU libc and userland
+ echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+ exit 0 ;;
+ i*86:Minix:*:*)
+ echo ${UNAME_MACHINE}-pc-minix
+ exit 0 ;;
+ arm*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit 0 ;;
+ cris:Linux:*:*)
+ echo cris-axis-linux-gnu
+ exit 0 ;;
+ crisv32:Linux:*:*)
+ echo crisv32-axis-linux-gnu
+ exit 0 ;;
+ frv:Linux:*:*)
+ echo frv-unknown-linux-gnu
+ exit 0 ;;
+ ia64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit 0 ;;
+ m32r*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit 0 ;;
+ m68*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit 0 ;;
+ mips:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef mips
+ #undef mipsel
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=mipsel
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=mips
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
+ test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0
+ ;;
+ mips64:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef mips64
+ #undef mips64el
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=mips64el
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=mips64
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
+ test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0
+ ;;
+ ppc:Linux:*:*)
+ echo powerpc-unknown-linux-gnu
+ exit 0 ;;
+ ppc64:Linux:*:*)
+ echo powerpc64-unknown-linux-gnu
+ exit 0 ;;
+ alpha:Linux:*:*)
+ case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+ EV5) UNAME_MACHINE=alphaev5 ;;
+ EV56) UNAME_MACHINE=alphaev56 ;;
+ PCA56) UNAME_MACHINE=alphapca56 ;;
+ PCA57) UNAME_MACHINE=alphapca56 ;;
+ EV6) UNAME_MACHINE=alphaev6 ;;
+ EV67) UNAME_MACHINE=alphaev67 ;;
+ EV68*) UNAME_MACHINE=alphaev68 ;;
+ esac
+ objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+ if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+ echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+ exit 0 ;;
+ parisc:Linux:*:* | hppa:Linux:*:*)
+ # Look for CPU level
+ case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+ PA7*) echo hppa1.1-unknown-linux-gnu ;;
+ PA8*) echo hppa2.0-unknown-linux-gnu ;;
+ *) echo hppa-unknown-linux-gnu ;;
+ esac
+ exit 0 ;;
+ parisc64:Linux:*:* | hppa64:Linux:*:*)
+ echo hppa64-unknown-linux-gnu
+ exit 0 ;;
+ s390:Linux:*:* | s390x:Linux:*:*)
+ echo ${UNAME_MACHINE}-ibm-linux
+ exit 0 ;;
+ sh64*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit 0 ;;
+ sh*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit 0 ;;
+ sparc:Linux:*:* | sparc64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit 0 ;;
+ x86_64:Linux:*:*)
+ echo x86_64-unknown-linux-gnu
+ exit 0 ;;
+ i*86:Linux:*:*)
+ # The BFD linker knows what the default object file format is, so
+ # first see if it will tell us. cd to the root directory to prevent
+ # problems with other programs or directories called `ld' in the path.
+ # Set LC_ALL=C to ensure ld outputs messages in English.
+ ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
+ | sed -ne '/supported targets:/!d
+ s/[ ][ ]*/ /g
+ s/.*supported targets: *//
+ s/ .*//
+ p'`
+ case "$ld_supported_targets" in
+ elf32-i386)
+ TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+ ;;
+ a.out-i386-linux)
+ echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+ exit 0 ;;
+ coff-i386)
+ echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+ exit 0 ;;
+ "")
+ # Either a pre-BFD a.out linker (linux-gnuoldld) or
+ # one that does not give us useful --help.
+ echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+ exit 0 ;;
+ esac
+ # Determine whether the default compiler is a.out or elf
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <features.h>
+ #ifdef __ELF__
+ # ifdef __GLIBC__
+ # if __GLIBC__ >= 2
+ LIBC=gnu
+ # else
+ LIBC=gnulibc1
+ # endif
+ # else
+ LIBC=gnulibc1
+ # endif
+ #else
+ #ifdef __INTEL_COMPILER
+ LIBC=gnu
+ #else
+ LIBC=gnuaout
+ #endif
+ #endif
+ #ifdef __dietlibc__
+ LIBC=dietlibc
+ #endif
+EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
+ test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0
+ test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
+ ;;
+ i*86:DYNIX/ptx:4*:*)
+ # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+ # earlier versions are messed up and put the nodename in both
+ # sysname and nodename.
+ echo i386-sequent-sysv4
+ exit 0 ;;
+ i*86:UNIX_SV:4.2MP:2.*)
+ # Unixware is an offshoot of SVR4, but it has its own version
+ # number series starting with 2...
+ # I am not positive that other SVR4 systems won't match this,
+ # I just have to hope. -- rms.
+ # Use sysv4.2uw... so that sysv4* matches it.
+ echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+ exit 0 ;;
+ i*86:OS/2:*:*)
+ # If we were able to find `uname', then EMX Unix compatibility
+ # is probably installed.
+ echo ${UNAME_MACHINE}-pc-os2-emx
+ exit 0 ;;
+ i*86:XTS-300:*:STOP)
+ echo ${UNAME_MACHINE}-unknown-stop
+ exit 0 ;;
+ i*86:atheos:*:*)
+ echo ${UNAME_MACHINE}-unknown-atheos
+ exit 0 ;;
+ i*86:syllable:*:*)
+ echo ${UNAME_MACHINE}-pc-syllable
+ exit 0 ;;
+ i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+ echo i386-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ i*86:*DOS:*:*)
+ echo ${UNAME_MACHINE}-pc-msdosdjgpp
+ exit 0 ;;
+ i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+ UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+ echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+ else
+ echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+ fi
+ exit 0 ;;
+ i*86:*:5:[78]*)
+ case `/bin/uname -X | grep "^Machine"` in
+ *486*) UNAME_MACHINE=i486 ;;
+ *Pentium) UNAME_MACHINE=i586 ;;
+ *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+ esac
+ echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+ exit 0 ;;
+ i*86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+ echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+ elif /bin/uname -X 2>/dev/null >/dev/null ; then
+ UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+ (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+ && UNAME_MACHINE=i586
+ (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+ && UNAME_MACHINE=i686
+ (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+ && UNAME_MACHINE=i686
+ echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+ else
+ echo ${UNAME_MACHINE}-pc-sysv32
+ fi
+ exit 0 ;;
+ pc:*:*:*)
+ # Left here for compatibility:
+ # uname -m prints for DJGPP always 'pc', but it prints nothing about
+ # the processor, so we play safe by assuming i386.
+ echo i386-pc-msdosdjgpp
+ exit 0 ;;
+ Intel:Mach:3*:*)
+ echo i386-pc-mach3
+ exit 0 ;;
+ paragon:*:*:*)
+ echo i860-intel-osf1
+ exit 0 ;;
+ i860:*:4.*:*) # i860-SVR4
+ if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+ echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+ else # Add other i860-SVR4 vendors below as they are discovered.
+ echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
+ fi
+ exit 0 ;;
+ mini*:CTIX:SYS*5:*)
+ # "miniframe"
+ echo m68010-convergent-sysv
+ exit 0 ;;
+ mc68k:UNIX:SYSTEM5:3.51m)
+ echo m68k-convergent-sysv
+ exit 0 ;;
+ M680?0:D-NIX:5.3:*)
+ echo m68k-diab-dnix
+ exit 0 ;;
+ M68*:*:R3V[5678]*:*)
+ test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+ 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+ OS_REL=''
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && echo i486-ncr-sysv4.3${OS_REL} && exit 0
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
+ 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && echo i486-ncr-sysv4 && exit 0 ;;
+ m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+ echo m68k-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ mc68030:UNIX_System_V:4.*:*)
+ echo m68k-atari-sysv4
+ exit 0 ;;
+ TSUNAMI:LynxOS:2.*:*)
+ echo sparc-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ rs6000:LynxOS:2.*:*)
+ echo rs6000-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+ echo powerpc-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ SM[BE]S:UNIX_SV:*:*)
+ echo mips-dde-sysv${UNAME_RELEASE}
+ exit 0 ;;
+ RM*:ReliantUNIX-*:*:*)
+ echo mips-sni-sysv4
+ exit 0 ;;
+ RM*:SINIX-*:*:*)
+ echo mips-sni-sysv4
+ exit 0 ;;
+ *:SINIX-*:*:*)
+ if uname -p 2>/dev/null >/dev/null ; then
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ echo ${UNAME_MACHINE}-sni-sysv4
+ else
+ echo ns32k-sni-sysv
+ fi
+ exit 0 ;;
+ PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+ # says <Richard.M.Bartel@ccMail.Census.GOV>
+ echo i586-unisys-sysv4
+ exit 0 ;;
+ *:UNIX_System_V:4*:FTX*)
+ # From Gerald Hewes <hewes@openmarket.com>.
+ # How about differentiating between stratus architectures? -djm
+ echo hppa1.1-stratus-sysv4
+ exit 0 ;;
+ *:*:*:FTX*)
+ # From seanf@swdc.stratus.com.
+ echo i860-stratus-sysv4
+ exit 0 ;;
+ *:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ echo hppa1.1-stratus-vos
+ exit 0 ;;
+ mc68*:A/UX:*:*)
+ echo m68k-apple-aux${UNAME_RELEASE}
+ exit 0 ;;
+ news*:NEWS-OS:6*:*)
+ echo mips-sony-newsos6
+ exit 0 ;;
+ R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+ if [ -d /usr/nec ]; then
+ echo mips-nec-sysv${UNAME_RELEASE}
+ else
+ echo mips-unknown-sysv${UNAME_RELEASE}
+ fi
+ exit 0 ;;
+ BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
+ echo powerpc-be-beos
+ exit 0 ;;
+ BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
+ echo powerpc-apple-beos
+ exit 0 ;;
+ BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
+ echo i586-pc-beos
+ exit 0 ;;
+ SX-4:SUPER-UX:*:*)
+ echo sx4-nec-superux${UNAME_RELEASE}
+ exit 0 ;;
+ SX-5:SUPER-UX:*:*)
+ echo sx5-nec-superux${UNAME_RELEASE}
+ exit 0 ;;
+ SX-6:SUPER-UX:*:*)
+ echo sx6-nec-superux${UNAME_RELEASE}
+ exit 0 ;;
+ Power*:Rhapsody:*:*)
+ echo powerpc-apple-rhapsody${UNAME_RELEASE}
+ exit 0 ;;
+ *:Rhapsody:*:*)
+ echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+ exit 0 ;;
+ *:Darwin:*:*)
+ UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+ case $UNAME_PROCESSOR in
+ *86) UNAME_PROCESSOR=i686 ;;
+ unknown) UNAME_PROCESSOR=powerpc ;;
+ esac
+ echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+ exit 0 ;;
+ *:procnto*:*:* | *:QNX:[0123456789]*:*)
+ UNAME_PROCESSOR=`uname -p`
+ if test "$UNAME_PROCESSOR" = "x86"; then
+ UNAME_PROCESSOR=i386
+ UNAME_MACHINE=pc
+ fi
+ echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+ exit 0 ;;
+ *:QNX:*:4*)
+ echo i386-pc-qnx
+ exit 0 ;;
+ NSR-?:NONSTOP_KERNEL:*:*)
+ echo nsr-tandem-nsk${UNAME_RELEASE}
+ exit 0 ;;
+ *:NonStop-UX:*:*)
+ echo mips-compaq-nonstopux
+ exit 0 ;;
+ BS2000:POSIX*:*:*)
+ echo bs2000-siemens-sysv
+ exit 0 ;;
+ DS/*:UNIX_System_V:*:*)
+ echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+ exit 0 ;;
+ *:Plan9:*:*)
+ # "uname -m" is not consistent, so use $cputype instead. 386
+ # is converted to i386 for consistency with other x86
+ # operating systems.
+ if test "$cputype" = "386"; then
+ UNAME_MACHINE=i386
+ else
+ UNAME_MACHINE="$cputype"
+ fi
+ echo ${UNAME_MACHINE}-unknown-plan9
+ exit 0 ;;
+ *:TOPS-10:*:*)
+ echo pdp10-unknown-tops10
+ exit 0 ;;
+ *:TENEX:*:*)
+ echo pdp10-unknown-tenex
+ exit 0 ;;
+ KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+ echo pdp10-dec-tops20
+ exit 0 ;;
+ XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+ echo pdp10-xkl-tops20
+ exit 0 ;;
+ *:TOPS-20:*:*)
+ echo pdp10-unknown-tops20
+ exit 0 ;;
+ *:ITS:*:*)
+ echo pdp10-unknown-its
+ exit 0 ;;
+ SEI:*:*:SEIUX)
+ echo mips-sei-seiux${UNAME_RELEASE}
+ exit 0 ;;
+ *:DragonFly:*:*)
+ echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+ exit 0 ;;
+ *:*VMS:*:*)
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ case "${UNAME_MACHINE}" in
+ A*) echo alpha-dec-vms && exit 0 ;;
+ I*) echo ia64-dec-vms && exit 0 ;;
+ V*) echo vax-dec-vms && exit 0 ;;
+ esac
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+ /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
+ I don't know.... */
+ printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+ printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+ "4"
+#else
+ ""
+#endif
+ ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+ printf ("arm-acorn-riscix"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+ printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+ int version;
+ version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+ if (version < 4)
+ printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+ else
+ printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+ exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+ printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+ printf ("ns32k-encore-mach\n"); exit (0);
+#else
+ printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+ printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+ printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+ printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+ struct utsname un;
+
+ uname(&un);
+
+ if (strncmp(un.version, "V2", 2) == 0) {
+ printf ("i386-sequent-ptx2\n"); exit (0);
+ }
+ if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+ printf ("i386-sequent-ptx1\n"); exit (0);
+ }
+ printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+# include <sys/param.h>
+# if defined (BSD)
+# if BSD == 43
+ printf ("vax-dec-bsd4.3\n"); exit (0);
+# else
+# if BSD == 199006
+ printf ("vax-dec-bsd4.3reno\n"); exit (0);
+# else
+ printf ("vax-dec-bsd\n"); exit (0);
+# endif
+# endif
+# else
+ printf ("vax-dec-bsd\n"); exit (0);
+# endif
+# else
+ printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+ printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+ exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+ case `getsysinfo -f cpu_type` in
+ c1*)
+ echo c1-convex-bsd
+ exit 0 ;;
+ c2*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit 0 ;;
+ c34*)
+ echo c34-convex-bsd
+ exit 0 ;;
+ c38*)
+ echo c38-convex-bsd
+ exit 0 ;;
+ c4*)
+ echo c4-convex-bsd
+ exit 0 ;;
+ esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+ ftp://ftp.gnu.org/pub/gnu/config/
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo = `(hostinfo) 2>/dev/null`
+/bin/universe = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/config.sub b/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/config.sub
new file mode 100755
index 00000000..edb6b663
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/config.sub
@@ -0,0 +1,1555 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+
+timestamp='2004-08-29'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine. It does not imply ALL GNU software can.
+#
+# This file 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 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., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Please send patches to <config-patches@gnu.org>. Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support. The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+ $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit 0 ;;
+ --version | -v )
+ echo "$version" ; exit 0 ;;
+ --help | --h* | -h )
+ echo "$usage"; exit 0 ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help"
+ exit 1 ;;
+
+ *local*)
+ # First pass through any local machine types.
+ echo $1
+ exit 0;;
+
+ * )
+ break ;;
+ esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+ exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+ exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+ nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \
+ kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*)
+ os=-$maybe_os
+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+ ;;
+ *)
+ basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+ if [ $basic_machine != $1 ]
+ then os=`echo $1 | sed 's/.*-/-/'`
+ else os=; fi
+ ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work. We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+ -sun*os*)
+ # Prevent following clause from handling this invalid input.
+ ;;
+ -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+ -apple | -axis | -knuth | -cray)
+ os=
+ basic_machine=$1
+ ;;
+ -sim | -cisco | -oki | -wec | -winbond)
+ os=
+ basic_machine=$1
+ ;;
+ -scout)
+ ;;
+ -wrs)
+ os=-vxworks
+ basic_machine=$1
+ ;;
+ -chorusos*)
+ os=-chorusos
+ basic_machine=$1
+ ;;
+ -chorusrdb)
+ os=-chorusrdb
+ basic_machine=$1
+ ;;
+ -hiux*)
+ os=-hiuxwe2
+ ;;
+ -sco5)
+ os=-sco3.2v5
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco4)
+ os=-sco3.2v4
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2.[4-9]*)
+ os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2v[4-9]*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco*)
+ os=-sco3.2v2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -udk*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -isc)
+ os=-isc2.2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -clix*)
+ basic_machine=clipper-intergraph
+ ;;
+ -isc*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -lynx*)
+ os=-lynxos
+ ;;
+ -ptx*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+ ;;
+ -windowsnt*)
+ os=`echo $os | sed -e 's/windowsnt/winnt/'`
+ ;;
+ -psos*)
+ os=-psos
+ ;;
+ -mint | -mint[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+ # Recognize the basic CPU types without company name.
+ # Some are omitted here because they have special meanings below.
+ 1750a | 580 \
+ | a29k \
+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+ | am33_2.0 \
+ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+ | c4x | clipper \
+ | d10v | d30v | dlx | dsp16xx \
+ | fr30 | frv \
+ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+ | i370 | i860 | i960 | ia64 \
+ | ip2k | iq2000 \
+ | m32r | m32rle | m68000 | m68k | m88k | mcore \
+ | mips | mipsbe | mipseb | mipsel | mipsle \
+ | mips16 \
+ | mips64 | mips64el \
+ | mips64vr | mips64vrel \
+ | mips64orion | mips64orionel \
+ | mips64vr4100 | mips64vr4100el \
+ | mips64vr4300 | mips64vr4300el \
+ | mips64vr5000 | mips64vr5000el \
+ | mipsisa32 | mipsisa32el \
+ | mipsisa32r2 | mipsisa32r2el \
+ | mipsisa64 | mipsisa64el \
+ | mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
+ | mipstx39 | mipstx39el \
+ | mn10200 | mn10300 \
+ | msp430 \
+ | ns16k | ns32k \
+ | openrisc | or32 \
+ | pdp10 | pdp11 | pj | pjl \
+ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+ | pyramid \
+ | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
+ | sh64 | sh64le \
+ | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv8 | sparcv9 | sparcv9b \
+ | strongarm \
+ | tahoe | thumb | tic4x | tic80 | tron \
+ | v850 | v850e \
+ | we32k \
+ | x86 | xscale | xstormy16 | xtensa \
+ | z8k)
+ basic_machine=$basic_machine-unknown
+ ;;
+ m6811 | m68hc11 | m6812 | m68hc12)
+ # Motorola 68HC11/12.
+ basic_machine=$basic_machine-unknown
+ os=-none
+ ;;
+ m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+ ;;
+
+ # We use `pc' rather than `unknown'
+ # because (1) that's what they normally are, and
+ # (2) the word "unknown" tends to confuse beginning users.
+ i*86 | x86_64)
+ basic_machine=$basic_machine-pc
+ ;;
+ # Object if more than one company name word.
+ *-*-*)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+ # Recognize the basic CPU types with company name.
+ 580-* \
+ | a29k-* \
+ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \
+ | avr-* \
+ | bs2000-* \
+ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+ | clipper-* | craynv-* | cydra-* \
+ | d10v-* | d30v-* | dlx-* \
+ | elxsi-* \
+ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
+ | h8300-* | h8500-* \
+ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+ | i*86-* | i860-* | i960-* | ia64-* \
+ | ip2k-* | iq2000-* \
+ | m32r-* | m32rle-* \
+ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+ | m88110-* | m88k-* | mcore-* \
+ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+ | mips16-* \
+ | mips64-* | mips64el-* \
+ | mips64vr-* | mips64vrel-* \
+ | mips64orion-* | mips64orionel-* \
+ | mips64vr4100-* | mips64vr4100el-* \
+ | mips64vr4300-* | mips64vr4300el-* \
+ | mips64vr5000-* | mips64vr5000el-* \
+ | mipsisa32-* | mipsisa32el-* \
+ | mipsisa32r2-* | mipsisa32r2el-* \
+ | mipsisa64-* | mipsisa64el-* \
+ | mipsisa64r2-* | mipsisa64r2el-* \
+ | mipsisa64sb1-* | mipsisa64sb1el-* \
+ | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+ | mipstx39-* | mipstx39el-* \
+ | mmix-* \
+ | msp430-* \
+ | none-* | np1-* | ns16k-* | ns32k-* \
+ | orion-* \
+ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+ | pyramid-* \
+ | romp-* | rs6000-* \
+ | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \
+ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+ | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \
+ | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
+ | tahoe-* | thumb-* \
+ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+ | tron-* \
+ | v850-* | v850e-* | vax-* \
+ | we32k-* \
+ | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \
+ | xtensa-* \
+ | ymp-* \
+ | z8k-*)
+ ;;
+ # Recognize the various machine names and aliases which stand
+ # for a CPU type and a company and sometimes even an OS.
+ 386bsd)
+ basic_machine=i386-unknown
+ os=-bsd
+ ;;
+ 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+ basic_machine=m68000-att
+ ;;
+ 3b*)
+ basic_machine=we32k-att
+ ;;
+ a29khif)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ abacus)
+ basic_machine=abacus-unknown
+ ;;
+ adobe68k)
+ basic_machine=m68010-adobe
+ os=-scout
+ ;;
+ alliant | fx80)
+ basic_machine=fx80-alliant
+ ;;
+ altos | altos3068)
+ basic_machine=m68k-altos
+ ;;
+ am29k)
+ basic_machine=a29k-none
+ os=-bsd
+ ;;
+ amd64)
+ basic_machine=x86_64-pc
+ ;;
+ amd64-*)
+ basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ amdahl)
+ basic_machine=580-amdahl
+ os=-sysv
+ ;;
+ amiga | amiga-*)
+ basic_machine=m68k-unknown
+ ;;
+ amigaos | amigados)
+ basic_machine=m68k-unknown
+ os=-amigaos
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-unknown
+ os=-sysv4
+ ;;
+ apollo68)
+ basic_machine=m68k-apollo
+ os=-sysv
+ ;;
+ apollo68bsd)
+ basic_machine=m68k-apollo
+ os=-bsd
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ os=-aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ os=-dynix
+ ;;
+ c90)
+ basic_machine=c90-cray
+ os=-unicos
+ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ os=-bsd
+ ;;
+ convex-c2)
+ basic_machine=c2-convex
+ os=-bsd
+ ;;
+ convex-c32)
+ basic_machine=c32-convex
+ os=-bsd
+ ;;
+ convex-c34)
+ basic_machine=c34-convex
+ os=-bsd
+ ;;
+ convex-c38)
+ basic_machine=c38-convex
+ os=-bsd
+ ;;
+ cray | j90)
+ basic_machine=j90-cray
+ os=-unicos
+ ;;
+ craynv)
+ basic_machine=craynv-cray
+ os=-unicosmp
+ ;;
+ cr16c)
+ basic_machine=cr16c-unknown
+ os=-elf
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ ;;
+ crisv32 | crisv32-* | etraxfs*)
+ basic_machine=crisv32-axis
+ ;;
+ cris | cris-* | etrax*)
+ basic_machine=cris-axis
+ ;;
+ crx)
+ basic_machine=crx-unknown
+ os=-elf
+ ;;
+ da30 | da30-*)
+ basic_machine=m68k-da30
+ ;;
+ decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+ basic_machine=mips-dec
+ ;;
+ decsystem10* | dec10*)
+ basic_machine=pdp10-dec
+ os=-tops10
+ ;;
+ decsystem20* | dec20*)
+ basic_machine=pdp10-dec
+ os=-tops20
+ ;;
+ delta | 3300 | motorola-3300 | motorola-delta \
+ | 3300-motorola | delta-motorola)
+ basic_machine=m68k-motorola
+ ;;
+ delta88)
+ basic_machine=m88k-motorola
+ os=-sysv3
+ ;;
+ dpx20 | dpx20-*)
+ basic_machine=rs6000-bull
+ os=-bosx
+ ;;
+ dpx2* | dpx2*-bull)
+ basic_machine=m68k-bull
+ os=-sysv3
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ os=-ebmon
+ ;;
+ elxsi)
+ basic_machine=elxsi-elxsi
+ os=-bsd
+ ;;
+ encore | umax | mmax)
+ basic_machine=ns32k-encore
+ ;;
+ es1800 | OSE68k | ose68k | ose | OSE)
+ basic_machine=m68k-ericsson
+ os=-ose
+ ;;
+ fx2800)
+ basic_machine=i860-alliant
+ ;;
+ genix)
+ basic_machine=ns32k-ns
+ ;;
+ gmicro)
+ basic_machine=tron-gmicro
+ os=-sysv
+ ;;
+ go32)
+ basic_machine=i386-pc
+ os=-go32
+ ;;
+ h3050r* | hiux*)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ h8300hms)
+ basic_machine=h8300-hitachi
+ os=-hms
+ ;;
+ h8300xray)
+ basic_machine=h8300-hitachi
+ os=-xray
+ ;;
+ h8500hms)
+ basic_machine=h8500-hitachi
+ os=-hms
+ ;;
+ harris)
+ basic_machine=m88k-harris
+ os=-sysv3
+ ;;
+ hp300-*)
+ basic_machine=m68k-hp
+ ;;
+ hp300bsd)
+ basic_machine=m68k-hp
+ os=-bsd
+ ;;
+ hp300hpux)
+ basic_machine=m68k-hp
+ os=-hpux
+ ;;
+ hp3k9[0-9][0-9] | hp9[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k2[0-9][0-9] | hp9k31[0-9])
+ basic_machine=m68000-hp
+ ;;
+ hp9k3[2-9][0-9])
+ basic_machine=m68k-hp
+ ;;
+ hp9k6[0-9][0-9] | hp6[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k7[0-79][0-9] | hp7[0-79][0-9])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k78[0-9] | hp78[0-9])
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][13679] | hp8[0-9][13679])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][0-9] | hp8[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hppa-next)
+ os=-nextstep3
+ ;;
+ hppaosf)
+ basic_machine=hppa1.1-hp
+ os=-osf
+ ;;
+ hppro)
+ basic_machine=hppa1.1-hp
+ os=-proelf
+ ;;
+ i370-ibm* | ibm*)
+ basic_machine=i370-ibm
+ ;;
+# I'm not sure what "Sysv32" means. Should this be sysv3.2?
+ i*86v32)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv32
+ ;;
+ i*86v4*)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv4
+ ;;
+ i*86v)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv
+ ;;
+ i*86sol2)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-solaris2
+ ;;
+ i386mach)
+ basic_machine=i386-mach
+ os=-mach
+ ;;
+ i386-vsta | vsta)
+ basic_machine=i386-unknown
+ os=-vsta
+ ;;
+ iris | iris4d)
+ basic_machine=mips-sgi
+ case $os in
+ -irix*)
+ ;;
+ *)
+ os=-irix4
+ ;;
+ esac
+ ;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ os=-sysv
+ ;;
+ m88k-omron*)
+ basic_machine=m88k-omron
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ os=-sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ os=-sysv
+ ;;
+ mingw32)
+ basic_machine=i386-pc
+ os=-mingw32
+ ;;
+ miniframe)
+ basic_machine=m68000-convergent
+ ;;
+ *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+ mips3*-*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+ ;;
+ mips3*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+ ;;
+ monitor)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ morphos)
+ basic_machine=powerpc-unknown
+ os=-morphos
+ ;;
+ msdos)
+ basic_machine=i386-pc
+ os=-msdos
+ ;;
+ mvs)
+ basic_machine=i370-ibm
+ os=-mvs
+ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ os=-sysv4
+ ;;
+ netbsd386)
+ basic_machine=i386-unknown
+ os=-netbsd
+ ;;
+ netwinder)
+ basic_machine=armv4l-rebel
+ os=-linux
+ ;;
+ news | news700 | news800 | news900)
+ basic_machine=m68k-sony
+ os=-newsos
+ ;;
+ news1000)
+ basic_machine=m68030-sony
+ os=-newsos
+ ;;
+ news-3600 | risc-news)
+ basic_machine=mips-sony
+ os=-newsos
+ ;;
+ necv70)
+ basic_machine=v70-nec
+ os=-sysv
+ ;;
+ next | m*-next )
+ basic_machine=m68k-next
+ case $os in
+ -nextstep* )
+ ;;
+ -ns2*)
+ os=-nextstep2
+ ;;
+ *)
+ os=-nextstep3
+ ;;
+ esac
+ ;;
+ nh3000)
+ basic_machine=m68k-harris
+ os=-cxux
+ ;;
+ nh[45]000)
+ basic_machine=m88k-harris
+ os=-cxux
+ ;;
+ nindy960)
+ basic_machine=i960-intel
+ os=-nindy
+ ;;
+ mon960)
+ basic_machine=i960-intel
+ os=-mon960
+ ;;
+ nonstopux)
+ basic_machine=mips-compaq
+ os=-nonstopux
+ ;;
+ np1)
+ basic_machine=np1-gould
+ ;;
+ nsr-tandem)
+ basic_machine=nsr-tandem
+ ;;
+ op50n-* | op60c-*)
+ basic_machine=hppa1.1-oki
+ os=-proelf
+ ;;
+ or32 | or32-*)
+ basic_machine=or32-unknown
+ os=-coff
+ ;;
+ os400)
+ basic_machine=powerpc-ibm
+ os=-os400
+ ;;
+ OSE68000 | ose68000)
+ basic_machine=m68000-ericsson
+ os=-ose
+ ;;
+ os68k)
+ basic_machine=m68k-none
+ os=-os68k
+ ;;
+ pa-hitachi)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ paragon)
+ basic_machine=i860-intel
+ os=-osf
+ ;;
+ pbd)
+ basic_machine=sparc-tti
+ ;;
+ pbb)
+ basic_machine=m68k-tti
+ ;;
+ pc532 | pc532-*)
+ basic_machine=ns32k-pc532
+ ;;
+ pentium | p5 | k5 | k6 | nexgen | viac3)
+ basic_machine=i586-pc
+ ;;
+ pentiumpro | p6 | 6x86 | athlon | athlon_*)
+ basic_machine=i686-pc
+ ;;
+ pentiumii | pentium2 | pentiumiii | pentium3)
+ basic_machine=i686-pc
+ ;;
+ pentium4)
+ basic_machine=i786-pc
+ ;;
+ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+ basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumpro-* | p6-* | 6x86-* | athlon-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentium4-*)
+ basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pn)
+ basic_machine=pn-gould
+ ;;
+ power) basic_machine=power-ibm
+ ;;
+ ppc) basic_machine=powerpc-unknown
+ ;;
+ ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppcle | powerpclittle | ppc-le | powerpc-little)
+ basic_machine=powerpcle-unknown
+ ;;
+ ppcle-* | powerpclittle-*)
+ basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64) basic_machine=powerpc64-unknown
+ ;;
+ ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+ basic_machine=powerpc64le-unknown
+ ;;
+ ppc64le-* | powerpc64little-*)
+ basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ps2)
+ basic_machine=i386-ibm
+ ;;
+ pw32)
+ basic_machine=i586-unknown
+ os=-pw32
+ ;;
+ rom68k)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ rm[46]00)
+ basic_machine=mips-siemens
+ ;;
+ rtpc | rtpc-*)
+ basic_machine=romp-ibm
+ ;;
+ s390 | s390-*)
+ basic_machine=s390-ibm
+ ;;
+ s390x | s390x-*)
+ basic_machine=s390x-ibm
+ ;;
+ sa29200)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ sb1)
+ basic_machine=mipsisa64sb1-unknown
+ ;;
+ sb1el)
+ basic_machine=mipsisa64sb1el-unknown
+ ;;
+ sei)
+ basic_machine=mips-sei
+ os=-seiux
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ ;;
+ sh)
+ basic_machine=sh-hitachi
+ os=-hms
+ ;;
+ sh64)
+ basic_machine=sh64-unknown
+ ;;
+ sparclite-wrs | simso-wrs)
+ basic_machine=sparclite-wrs
+ os=-vxworks
+ ;;
+ sps7)
+ basic_machine=m68k-bull
+ os=-sysv2
+ ;;
+ spur)
+ basic_machine=spur-unknown
+ ;;
+ st2000)
+ basic_machine=m68k-tandem
+ ;;
+ stratus)
+ basic_machine=i860-stratus
+ os=-sysv4
+ ;;
+ sun2)
+ basic_machine=m68000-sun
+ ;;
+ sun2os3)
+ basic_machine=m68000-sun
+ os=-sunos3
+ ;;
+ sun2os4)
+ basic_machine=m68000-sun
+ os=-sunos4
+ ;;
+ sun3os3)
+ basic_machine=m68k-sun
+ os=-sunos3
+ ;;
+ sun3os4)
+ basic_machine=m68k-sun
+ os=-sunos4
+ ;;
+ sun4os3)
+ basic_machine=sparc-sun
+ os=-sunos3
+ ;;
+ sun4os4)
+ basic_machine=sparc-sun
+ os=-sunos4
+ ;;
+ sun4sol2)
+ basic_machine=sparc-sun
+ os=-solaris2
+ ;;
+ sun3 | sun3-*)
+ basic_machine=m68k-sun
+ ;;
+ sun4)
+ basic_machine=sparc-sun
+ ;;
+ sun386 | sun386i | roadrunner)
+ basic_machine=i386-sun
+ ;;
+ sv1)
+ basic_machine=sv1-cray
+ os=-unicos
+ ;;
+ symmetry)
+ basic_machine=i386-sequent
+ os=-dynix
+ ;;
+ t3e)
+ basic_machine=alphaev5-cray
+ os=-unicos
+ ;;
+ t90)
+ basic_machine=t90-cray
+ os=-unicos
+ ;;
+ tic54x | c54x*)
+ basic_machine=tic54x-unknown
+ os=-coff
+ ;;
+ tic55x | c55x*)
+ basic_machine=tic55x-unknown
+ os=-coff
+ ;;
+ tic6x | c6x*)
+ basic_machine=tic6x-unknown
+ os=-coff
+ ;;
+ tx39)
+ basic_machine=mipstx39-unknown
+ ;;
+ tx39el)
+ basic_machine=mipstx39el-unknown
+ ;;
+ toad1)
+ basic_machine=pdp10-xkl
+ os=-tops20
+ ;;
+ tower | tower-32)
+ basic_machine=m68k-ncr
+ ;;
+ tpf)
+ basic_machine=s390x-ibm
+ os=-tpf
+ ;;
+ udi29k)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ ultra3)
+ basic_machine=a29k-nyu
+ os=-sym1
+ ;;
+ v810 | necv810)
+ basic_machine=v810-nec
+ os=-none
+ ;;
+ vaxv)
+ basic_machine=vax-dec
+ os=-sysv
+ ;;
+ vms)
+ basic_machine=vax-dec
+ os=-vms
+ ;;
+ vpp*|vx|vx-*)
+ basic_machine=f301-fujitsu
+ ;;
+ vxworks960)
+ basic_machine=i960-wrs
+ os=-vxworks
+ ;;
+ vxworks68)
+ basic_machine=m68k-wrs
+ os=-vxworks
+ ;;
+ vxworks29k)
+ basic_machine=a29k-wrs
+ os=-vxworks
+ ;;
+ w65*)
+ basic_machine=w65-wdc
+ os=-none
+ ;;
+ w89k-*)
+ basic_machine=hppa1.1-winbond
+ os=-proelf
+ ;;
+ xps | xps100)
+ basic_machine=xps100-honeywell
+ ;;
+ ymp)
+ basic_machine=ymp-cray
+ os=-unicos
+ ;;
+ z8k-*-coff)
+ basic_machine=z8k-unknown
+ os=-sim
+ ;;
+ none)
+ basic_machine=none-none
+ os=-none
+ ;;
+
+# Here we handle the default manufacturer of certain CPU types. It is in
+# some cases the only manufacturer, in others, it is the most popular.
+ w89k)
+ basic_machine=hppa1.1-winbond
+ ;;
+ op50n)
+ basic_machine=hppa1.1-oki
+ ;;
+ op60c)
+ basic_machine=hppa1.1-oki
+ ;;
+ romp)
+ basic_machine=romp-ibm
+ ;;
+ mmix)
+ basic_machine=mmix-knuth
+ ;;
+ rs6000)
+ basic_machine=rs6000-ibm
+ ;;
+ vax)
+ basic_machine=vax-dec
+ ;;
+ pdp10)
+ # there are many clones, so DEC is not a safe bet
+ basic_machine=pdp10-unknown
+ ;;
+ pdp11)
+ basic_machine=pdp11-dec
+ ;;
+ we32k)
+ basic_machine=we32k-att
+ ;;
+ sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele)
+ basic_machine=sh-unknown
+ ;;
+ sh64)
+ basic_machine=sh64-unknown
+ ;;
+ sparc | sparcv8 | sparcv9 | sparcv9b)
+ basic_machine=sparc-sun
+ ;;
+ cydra)
+ basic_machine=cydra-cydrome
+ ;;
+ orion)
+ basic_machine=orion-highlevel
+ ;;
+ orion105)
+ basic_machine=clipper-highlevel
+ ;;
+ mac | mpw | mac-mpw)
+ basic_machine=m68k-apple
+ ;;
+ pmac | pmac-mpw)
+ basic_machine=powerpc-apple
+ ;;
+ *-unknown)
+ # Make sure to match an already-canonicalized machine name.
+ ;;
+ *)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+ *-digital*)
+ basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+ ;;
+ *-commodore*)
+ basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+ ;;
+ *)
+ ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+ # First match some system type aliases
+ # that might get confused with valid system types.
+ # -solaris* is a basic system type, with this one exception.
+ -solaris1 | -solaris1.*)
+ os=`echo $os | sed -e 's|solaris1|sunos4|'`
+ ;;
+ -solaris)
+ os=-solaris2
+ ;;
+ -svr4*)
+ os=-sysv4
+ ;;
+ -unixware*)
+ os=-sysv4.2uw
+ ;;
+ -gnu/linux*)
+ os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+ ;;
+ # First accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST END IN A *, to match a version number.
+ # -sysv* is not here because it comes later, after sysvr4.
+ -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+ | -aos* \
+ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \
+ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+ | -chorusos* | -chorusrdb* \
+ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+ | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \
+ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly*)
+ # Remember, each alternative MUST END IN *, to match a version number.
+ ;;
+ -qnx*)
+ case $basic_machine in
+ x86-* | i*86-*)
+ ;;
+ *)
+ os=-nto$os
+ ;;
+ esac
+ ;;
+ -nto-qnx*)
+ ;;
+ -nto*)
+ os=`echo $os | sed -e 's|nto|nto-qnx|'`
+ ;;
+ -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+ | -windows* | -osx | -abug | -netware* | -os9* | -beos* \
+ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+ ;;
+ -mac*)
+ os=`echo $os | sed -e 's|mac|macos|'`
+ ;;
+ -linux-dietlibc)
+ os=-linux-dietlibc
+ ;;
+ -linux*)
+ os=`echo $os | sed -e 's|linux|linux-gnu|'`
+ ;;
+ -sunos5*)
+ os=`echo $os | sed -e 's|sunos5|solaris2|'`
+ ;;
+ -sunos6*)
+ os=`echo $os | sed -e 's|sunos6|solaris3|'`
+ ;;
+ -opened*)
+ os=-openedition
+ ;;
+ -os400*)
+ os=-os400
+ ;;
+ -wince*)
+ os=-wince
+ ;;
+ -osfrose*)
+ os=-osfrose
+ ;;
+ -osf*)
+ os=-osf
+ ;;
+ -utek*)
+ os=-bsd
+ ;;
+ -dynix*)
+ os=-bsd
+ ;;
+ -acis*)
+ os=-aos
+ ;;
+ -atheos*)
+ os=-atheos
+ ;;
+ -syllable*)
+ os=-syllable
+ ;;
+ -386bsd)
+ os=-bsd
+ ;;
+ -ctix* | -uts*)
+ os=-sysv
+ ;;
+ -nova*)
+ os=-rtmk-nova
+ ;;
+ -ns2 )
+ os=-nextstep2
+ ;;
+ -nsk*)
+ os=-nsk
+ ;;
+ # Preserve the version number of sinix5.
+ -sinix5.*)
+ os=`echo $os | sed -e 's|sinix|sysv|'`
+ ;;
+ -sinix*)
+ os=-sysv4
+ ;;
+ -tpf*)
+ os=-tpf
+ ;;
+ -triton*)
+ os=-sysv3
+ ;;
+ -oss*)
+ os=-sysv3
+ ;;
+ -svr4)
+ os=-sysv4
+ ;;
+ -svr3)
+ os=-sysv3
+ ;;
+ -sysvr4)
+ os=-sysv4
+ ;;
+ # This must come after -sysvr4.
+ -sysv*)
+ ;;
+ -ose*)
+ os=-ose
+ ;;
+ -es1800*)
+ os=-ose
+ ;;
+ -xenix)
+ os=-xenix
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ os=-mint
+ ;;
+ -aros*)
+ os=-aros
+ ;;
+ -kaos*)
+ os=-kaos
+ ;;
+ -none)
+ ;;
+ *)
+ # Get rid of the `-' at the beginning of $os.
+ os=`echo $os | sed 's/[^-]*-//'`
+ echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system. Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+ *-acorn)
+ os=-riscix1.2
+ ;;
+ arm*-rebel)
+ os=-linux
+ ;;
+ arm*-semi)
+ os=-aout
+ ;;
+ c4x-* | tic4x-*)
+ os=-coff
+ ;;
+ # This must come before the *-dec entry.
+ pdp10-*)
+ os=-tops20
+ ;;
+ pdp11-*)
+ os=-none
+ ;;
+ *-dec | vax-*)
+ os=-ultrix4.2
+ ;;
+ m68*-apollo)
+ os=-domain
+ ;;
+ i386-sun)
+ os=-sunos4.0.2
+ ;;
+ m68000-sun)
+ os=-sunos3
+ # This also exists in the configure program, but was not the
+ # default.
+ # os=-sunos4
+ ;;
+ m68*-cisco)
+ os=-aout
+ ;;
+ mips*-cisco)
+ os=-elf
+ ;;
+ mips*-*)
+ os=-elf
+ ;;
+ or32-*)
+ os=-coff
+ ;;
+ *-tti) # must be before sparc entry or we get the wrong os.
+ os=-sysv3
+ ;;
+ sparc-* | *-sun)
+ os=-sunos4.1.1
+ ;;
+ *-be)
+ os=-beos
+ ;;
+ *-ibm)
+ os=-aix
+ ;;
+ *-knuth)
+ os=-mmixware
+ ;;
+ *-wec)
+ os=-proelf
+ ;;
+ *-winbond)
+ os=-proelf
+ ;;
+ *-oki)
+ os=-proelf
+ ;;
+ *-hp)
+ os=-hpux
+ ;;
+ *-hitachi)
+ os=-hiux
+ ;;
+ i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+ os=-sysv
+ ;;
+ *-cbm)
+ os=-amigaos
+ ;;
+ *-dg)
+ os=-dgux
+ ;;
+ *-dolphin)
+ os=-sysv3
+ ;;
+ m68k-ccur)
+ os=-rtu
+ ;;
+ m88k-omron*)
+ os=-luna
+ ;;
+ *-next )
+ os=-nextstep
+ ;;
+ *-sequent)
+ os=-ptx
+ ;;
+ *-crds)
+ os=-unos
+ ;;
+ *-ns)
+ os=-genix
+ ;;
+ i370-*)
+ os=-mvs
+ ;;
+ *-next)
+ os=-nextstep3
+ ;;
+ *-gould)
+ os=-sysv
+ ;;
+ *-highlevel)
+ os=-bsd
+ ;;
+ *-encore)
+ os=-bsd
+ ;;
+ *-sgi)
+ os=-irix
+ ;;
+ *-siemens)
+ os=-sysv4
+ ;;
+ *-masscomp)
+ os=-rtu
+ ;;
+ f30[01]-fujitsu | f700-fujitsu)
+ os=-uxpv
+ ;;
+ *-rom68k)
+ os=-coff
+ ;;
+ *-*bug)
+ os=-coff
+ ;;
+ *-apple)
+ os=-macos
+ ;;
+ *-atari*)
+ os=-mint
+ ;;
+ *)
+ os=-none
+ ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer. We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+ *-unknown)
+ case $os in
+ -riscix*)
+ vendor=acorn
+ ;;
+ -sunos*)
+ vendor=sun
+ ;;
+ -aix*)
+ vendor=ibm
+ ;;
+ -beos*)
+ vendor=be
+ ;;
+ -hpux*)
+ vendor=hp
+ ;;
+ -mpeix*)
+ vendor=hp
+ ;;
+ -hiux*)
+ vendor=hitachi
+ ;;
+ -unos*)
+ vendor=crds
+ ;;
+ -dgux*)
+ vendor=dg
+ ;;
+ -luna*)
+ vendor=omron
+ ;;
+ -genix*)
+ vendor=ns
+ ;;
+ -mvs* | -opened*)
+ vendor=ibm
+ ;;
+ -os400*)
+ vendor=ibm
+ ;;
+ -ptx*)
+ vendor=sequent
+ ;;
+ -tpf*)
+ vendor=ibm
+ ;;
+ -vxsim* | -vxworks* | -windiss*)
+ vendor=wrs
+ ;;
+ -aux*)
+ vendor=apple
+ ;;
+ -hms*)
+ vendor=hitachi
+ ;;
+ -mpw* | -macos*)
+ vendor=apple
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ vendor=atari
+ ;;
+ -vos*)
+ vendor=stratus
+ ;;
+ esac
+ basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+ ;;
+esac
+
+echo $basic_machine$os
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/dummy b/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/dummy
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/dummy
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/install-sh b/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/install-sh
new file mode 100755
index 00000000..dd97db7a
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/install-sh
@@ -0,0 +1,322 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2004-09-10.20
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# 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 AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch. It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+chmodcmd="$chmodprog 0755"
+chowncmd=
+chgrpcmd=
+stripcmd=
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=
+dst=
+dir_arg=
+dstarg=
+no_target_directory=
+
+usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+ or: $0 [OPTION]... SRCFILES... DIRECTORY
+ or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+ or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+-c (ignored)
+-d create directories instead of installing files.
+-g GROUP $chgrpprog installed files to GROUP.
+-m MODE $chmodprog installed files to MODE.
+-o USER $chownprog installed files to USER.
+-s $stripprog installed files.
+-t DIRECTORY install into DIRECTORY.
+-T report an error if DSTFILE is a directory.
+--help display this help and exit.
+--version display version info and exit.
+
+Environment variables override the default commands:
+ CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
+"
+
+while test -n "$1"; do
+ case $1 in
+ -c) shift
+ continue;;
+
+ -d) dir_arg=true
+ shift
+ continue;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift
+ shift
+ continue;;
+
+ --help) echo "$usage"; exit 0;;
+
+ -m) chmodcmd="$chmodprog $2"
+ shift
+ shift
+ continue;;
+
+ -o) chowncmd="$chownprog $2"
+ shift
+ shift
+ continue;;
+
+ -s) stripcmd=$stripprog
+ shift
+ continue;;
+
+ -t) dstarg=$2
+ shift
+ shift
+ continue;;
+
+ -T) no_target_directory=true
+ shift
+ continue;;
+
+ --version) echo "$0 $scriptversion"; exit 0;;
+
+ *) # When -d is used, all remaining arguments are directories to create.
+ # When -t is used, the destination is already specified.
+ test -n "$dir_arg$dstarg" && break
+ # Otherwise, the last argument is the destination. Remove it from $@.
+ for arg
+ do
+ if test -n "$dstarg"; then
+ # $@ is not empty: it contains at least $arg.
+ set fnord "$@" "$dstarg"
+ shift # fnord
+ fi
+ shift # arg
+ dstarg=$arg
+ done
+ break;;
+ esac
+done
+
+if test -z "$1"; then
+ if test -z "$dir_arg"; then
+ echo "$0: no input file specified." >&2
+ exit 1
+ fi
+ # It's OK to call `install-sh -d' without argument.
+ # This can happen when creating conditional directories.
+ exit 0
+fi
+
+for src
+do
+ # Protect names starting with `-'.
+ case $src in
+ -*) src=./$src ;;
+ esac
+
+ if test -n "$dir_arg"; then
+ dst=$src
+ src=
+
+ if test -d "$dst"; then
+ mkdircmd=:
+ chmodcmd=
+ else
+ mkdircmd=$mkdirprog
+ fi
+ else
+ # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+ # might cause directories to be created, which would be especially bad
+ # if $src (and thus $dsttmp) contains '*'.
+ if test ! -f "$src" && test ! -d "$src"; then
+ echo "$0: $src does not exist." >&2
+ exit 1
+ fi
+
+ if test -z "$dstarg"; then
+ echo "$0: no destination specified." >&2
+ exit 1
+ fi
+
+ dst=$dstarg
+ # Protect names starting with `-'.
+ case $dst in
+ -*) dst=./$dst ;;
+ esac
+
+ # If destination is a directory, append the input filename; won't work
+ # if double slashes aren't ignored.
+ if test -d "$dst"; then
+ if test -n "$no_target_directory"; then
+ echo "$0: $dstarg: Is a directory" >&2
+ exit 1
+ fi
+ dst=$dst/`basename "$src"`
+ fi
+ fi
+
+ # This sed command emulates the dirname command.
+ dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+ # Make sure that the destination directory exists.
+
+ # Skip lots of stat calls in the usual case.
+ if test ! -d "$dstdir"; then
+ defaultIFS='
+ '
+ IFS="${IFS-$defaultIFS}"
+
+ oIFS=$IFS
+ # Some sh's can't handle IFS=/ for some reason.
+ IFS='%'
+ set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
+ IFS=$oIFS
+
+ pathcomp=
+
+ while test $# -ne 0 ; do
+ pathcomp=$pathcomp$1
+ shift
+ if test ! -d "$pathcomp"; then
+ $mkdirprog "$pathcomp"
+ # mkdir can fail with a `File exist' error in case several
+ # install-sh are creating the directory concurrently. This
+ # is OK.
+ test -d "$pathcomp" || exit
+ fi
+ pathcomp=$pathcomp/
+ done
+ fi
+
+ if test -n "$dir_arg"; then
+ $doit $mkdircmd "$dst" \
+ && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
+ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
+ && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
+ && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
+
+ else
+ dstfile=`basename "$dst"`
+
+ # Make a couple of temp file names in the proper directory.
+ dsttmp=$dstdir/_inst.$$_
+ rmtmp=$dstdir/_rm.$$_
+
+ # Trap to clean up those temp files at exit.
+ trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+ trap '(exit $?); exit' 1 2 13 15
+
+ # Copy the file name to the temp name.
+ $doit $cpprog "$src" "$dsttmp" &&
+
+ # and set any options; do chmod last to preserve setuid bits.
+ #
+ # If any of these fail, we abort the whole thing. If we want to
+ # ignore errors from any of these, just make sure not to ignore
+ # errors from the above "$doit $cpprog $src $dsttmp" command.
+ #
+ { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
+ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
+ && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
+ && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
+
+ # Now rename the file to the real destination.
+ { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
+ || {
+ # The rename failed, perhaps because mv can't rename something else
+ # to itself, or perhaps because mv is so ancient that it does not
+ # support -f.
+
+ # Now remove or move aside any old file at destination location.
+ # We try this two ways since rm can't unlink itself on some
+ # systems and the destination file might be busy for other
+ # reasons. In this case, the final cleanup might fail but the new
+ # file should still install successfully.
+ {
+ if test -f "$dstdir/$dstfile"; then
+ $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
+ || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
+ || {
+ echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
+ (exit 1); exit
+ }
+ else
+ :
+ fi
+ } &&
+
+ # Now rename the file to the real destination.
+ $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
+ }
+ }
+ fi || { (exit 1); exit; }
+done
+
+# The final little trick to "correctly" pass the exit status to the exit trap.
+{
+ (exit 0); exit
+}
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/ltmain.sh b/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/ltmain.sh
new file mode 100644
index 00000000..a9688359
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/ltmain.sh
@@ -0,0 +1,6426 @@
+# ltmain.sh - Provide generalized library-building support services.
+# NOTE: Changing this file will not affect anything until you rerun configure.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004
+# Free Software Foundation, Inc.
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# This program 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 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+basename="s,^.*/,,g"
+
+# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
+# is ksh but when the shell is invoked as "sh" and the current value of
+# the _XPG environment variable is not equal to 1 (one), the special
+# positional parameter $0, within a function call, is the name of the
+# function.
+progpath="$0"
+
+# RH: define SED for historic ltconfig's generated by Libtool 1.3
+[ -z "$SED" ] && SED=sed
+
+# The name of this program:
+progname=`echo "$progpath" | $SED $basename`
+modename="$progname"
+
+# Global variables:
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+PROGRAM=ltmain.sh
+PACKAGE=libtool
+VERSION=1.5.6
+TIMESTAMP=" (1.1220.2.95 2004/04/11 05:50:42)"
+EGREP="grep -E"
+
+
+# Check that we have a working $echo.
+if test "X$1" = X--no-reexec; then
+ # Discard the --no-reexec flag, and continue.
+ shift
+elif test "X$1" = X--fallback-echo; then
+ # Avoid inline document here, it may be left over
+ :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
+ # Yippee, $echo works!
+ :
+else
+ # Restart under the correct shell, and then maybe $echo will work.
+ exec $SHELL "$progpath" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+ # used as fallback echo
+ shift
+ cat <<EOF
+$*
+EOF
+ exit $EXIT_SUCCESS
+fi
+
+default_mode=
+help="Try \`$progname --help' for more information."
+magic="%%%MAGIC variable%%%"
+mkdir="mkdir"
+mv="mv -f"
+rm="rm -f"
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed="${SED}"' -e 1s/^X//'
+sed_quote_subst='s/\([\\`\\"$\\\\]\)/\\\1/g'
+# test EBCDIC or ASCII
+case `echo A|tr A '\301'` in
+ A) # EBCDIC based system
+ SP2NL="tr '\100' '\n'"
+ NL2SP="tr '\r\n' '\100\100'"
+ ;;
+ *) # Assume ASCII based system
+ SP2NL="tr '\040' '\012'"
+ NL2SP="tr '\015\012' '\040\040'"
+ ;;
+esac
+
+# NLS nuisances.
+# Only set LANG and LC_ALL to C if already set.
+# These must not be set unconditionally because not all systems understand
+# e.g. LANG=C (notably SCO).
+# We save the old values to restore during execute mode.
+if test "${LC_ALL+set}" = set; then
+ save_LC_ALL="$LC_ALL"; LC_ALL=C; export LC_ALL
+fi
+if test "${LANG+set}" = set; then
+ save_LANG="$LANG"; LANG=C; export LANG
+fi
+
+# Make sure IFS has a sensible default
+: ${IFS="
+"}
+
+if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
+ $echo "$modename: not configured to build any kind of library" 1>&2
+ $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2
+ exit $EXIT_FAILURE
+fi
+
+# Global variables.
+mode=$default_mode
+nonopt=
+prev=
+prevopt=
+run=
+show="$echo"
+show_help=
+execute_dlfiles=
+lo2o="s/\\.lo\$/.${objext}/"
+o2lo="s/\\.${objext}\$/.lo/"
+
+#####################################
+# Shell function definitions:
+# This seems to be the best place for them
+
+# func_win32_libid arg
+# return the library type of file 'arg'
+#
+# Need a lot of goo to handle *both* DLLs and import libs
+# Has to be a shell function in order to 'eat' the argument
+# that is supplied when $file_magic_command is called.
+func_win32_libid () {
+ win32_libid_type="unknown"
+ win32_fileres=`file -L $1 2>/dev/null`
+ case $win32_fileres in
+ *ar\ archive\ import\ library*) # definitely import
+ win32_libid_type="x86 archive import"
+ ;;
+ *ar\ archive*) # could be an import, or static
+ if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \
+ $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then
+ win32_nmres=`eval $NM -f posix -A $1 | \
+ sed -n -e '1,100{/ I /{x;/import/!{s/^/import/;h;p;};x;};}'`
+ if test "X$win32_nmres" = "Ximport" ; then
+ win32_libid_type="x86 archive import"
+ else
+ win32_libid_type="x86 archive static"
+ fi
+ fi
+ ;;
+ *DLL*)
+ win32_libid_type="x86 DLL"
+ ;;
+ *executable*) # but shell scripts are "executable" too...
+ case $win32_fileres in
+ *MS\ Windows\ PE\ Intel*)
+ win32_libid_type="x86 DLL"
+ ;;
+ esac
+ ;;
+ esac
+ $echo $win32_libid_type
+}
+
+
+# func_infer_tag arg
+# Infer tagged configuration to use if any are available and
+# if one wasn't chosen via the "--tag" command line option.
+# Only attempt this if the compiler in the base compile
+# command doesn't match the default compiler.
+# arg is usually of the form 'gcc ...'
+func_infer_tag () {
+ if test -n "$available_tags" && test -z "$tagname"; then
+ CC_quoted=
+ for arg in $CC; do
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ CC_quoted="$CC_quoted $arg"
+ done
+ case $@ in
+ # Blanks in the command may have been stripped by the calling shell,
+ # but not from the CC environment variable when configure was run.
+ " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;;
+ # Blanks at the start of $base_compile will cause this to fail
+ # if we don't check for them as well.
+ *)
+ for z in $available_tags; do
+ if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
+ # Evaluate the configuration.
+ eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
+ CC_quoted=
+ for arg in $CC; do
+ # Double-quote args containing other shell metacharacters.
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ CC_quoted="$CC_quoted $arg"
+ done
+ case "$@ " in
+ " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*)
+ # The compiler in the base compile command matches
+ # the one in the tagged configuration.
+ # Assume this is the tagged configuration we want.
+ tagname=$z
+ break
+ ;;
+ esac
+ fi
+ done
+ # If $tagname still isn't set, then no tagged configuration
+ # was found and let the user know that the "--tag" command
+ # line option must be used.
+ if test -z "$tagname"; then
+ $echo "$modename: unable to infer tagged configuration"
+ $echo "$modename: specify a tag with \`--tag'" 1>&2
+ exit $EXIT_FAILURE
+# else
+# $echo "$modename: using $tagname tagged configuration"
+ fi
+ ;;
+ esac
+ fi
+}
+# End of Shell function definitions
+#####################################
+
+# Darwin sucks
+eval std_shrext=\"$shrext_cmds\"
+
+# Parse our command line options once, thoroughly.
+while test "$#" -gt 0
+do
+ arg="$1"
+ shift
+
+ case $arg in
+ -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) optarg= ;;
+ esac
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$prev"; then
+ case $prev in
+ execute_dlfiles)
+ execute_dlfiles="$execute_dlfiles $arg"
+ ;;
+ tag)
+ tagname="$arg"
+ preserve_args="${preserve_args}=$arg"
+
+ # Check whether tagname contains only valid characters
+ case $tagname in
+ *[!-_A-Za-z0-9,/]*)
+ $echo "$progname: invalid tag name: $tagname" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ case $tagname in
+ CC)
+ # Don't test for the "default" C tag, as we know, it's there, but
+ # not specially marked.
+ ;;
+ *)
+ if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then
+ taglist="$taglist $tagname"
+ # Evaluate the configuration.
+ eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`"
+ else
+ $echo "$progname: ignoring unknown tag $tagname" 1>&2
+ fi
+ ;;
+ esac
+ ;;
+ *)
+ eval "$prev=\$arg"
+ ;;
+ esac
+
+ prev=
+ prevopt=
+ continue
+ fi
+
+ # Have we seen a non-optional argument yet?
+ case $arg in
+ --help)
+ show_help=yes
+ ;;
+
+ --version)
+ $echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP"
+ $echo
+ $echo "Copyright (C) 2003 Free Software Foundation, Inc."
+ $echo "This is free software; see the source for copying conditions. There is NO"
+ $echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+ exit $EXIT_SUCCESS
+ ;;
+
+ --config)
+ ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath
+ # Now print the configurations for the tags.
+ for tagname in $taglist; do
+ ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath"
+ done
+ exit $EXIT_SUCCESS
+ ;;
+
+ --debug)
+ $echo "$progname: enabling shell trace mode"
+ set -x
+ preserve_args="$preserve_args $arg"
+ ;;
+
+ --dry-run | -n)
+ run=:
+ ;;
+
+ --features)
+ $echo "host: $host"
+ if test "$build_libtool_libs" = yes; then
+ $echo "enable shared libraries"
+ else
+ $echo "disable shared libraries"
+ fi
+ if test "$build_old_libs" = yes; then
+ $echo "enable static libraries"
+ else
+ $echo "disable static libraries"
+ fi
+ exit $EXIT_SUCCESS
+ ;;
+
+ --finish) mode="finish" ;;
+
+ --mode) prevopt="--mode" prev=mode ;;
+ --mode=*) mode="$optarg" ;;
+
+ --preserve-dup-deps) duplicate_deps="yes" ;;
+
+ --quiet | --silent)
+ show=:
+ preserve_args="$preserve_args $arg"
+ ;;
+
+ --tag) prevopt="--tag" prev=tag ;;
+ --tag=*)
+ set tag "$optarg" ${1+"$@"}
+ shift
+ prev=tag
+ preserve_args="$preserve_args --tag"
+ ;;
+
+ -dlopen)
+ prevopt="-dlopen"
+ prev=execute_dlfiles
+ ;;
+
+ -*)
+ $echo "$modename: unrecognized option \`$arg'" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+
+ *)
+ nonopt="$arg"
+ break
+ ;;
+ esac
+done
+
+if test -n "$prevopt"; then
+ $echo "$modename: option \`$prevopt' requires an argument" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+fi
+
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end. This prevents here-documents from being
+# left over by shells.
+exec_cmd=
+
+if test -z "$show_help"; then
+
+ # Infer the operation mode.
+ if test -z "$mode"; then
+ $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2
+ $echo "*** Future versions of Libtool will require -mode=MODE be specified." 1>&2
+ case $nonopt in
+ *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*)
+ mode=link
+ for arg
+ do
+ case $arg in
+ -c)
+ mode=compile
+ break
+ ;;
+ esac
+ done
+ ;;
+ *db | *dbx | *strace | *truss)
+ mode=execute
+ ;;
+ *install*|cp|mv)
+ mode=install
+ ;;
+ *rm)
+ mode=uninstall
+ ;;
+ *)
+ # If we have no mode, but dlfiles were specified, then do execute mode.
+ test -n "$execute_dlfiles" && mode=execute
+
+ # Just use the default operation mode.
+ if test -z "$mode"; then
+ if test -n "$nonopt"; then
+ $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2
+ else
+ $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2
+ fi
+ fi
+ ;;
+ esac
+ fi
+
+ # Only execute mode is allowed to have -dlopen flags.
+ if test -n "$execute_dlfiles" && test "$mode" != execute; then
+ $echo "$modename: unrecognized option \`-dlopen'" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Change the help message to a mode-specific one.
+ generic_help="$help"
+ help="Try \`$modename --help --mode=$mode' for more information."
+
+ # These modes are in order of execution frequency so that they run quickly.
+ case $mode in
+ # libtool compile mode
+ compile)
+ modename="$modename: compile"
+ # Get the compilation command and the source file.
+ base_compile=
+ srcfile="$nonopt" # always keep a non-empty value in "srcfile"
+ suppress_opt=yes
+ suppress_output=
+ arg_mode=normal
+ libobj=
+ later=
+
+ for arg
+ do
+ case "$arg_mode" in
+ arg )
+ # do not "continue". Instead, add this to base_compile
+ lastarg="$arg"
+ arg_mode=normal
+ ;;
+
+ target )
+ libobj="$arg"
+ arg_mode=normal
+ continue
+ ;;
+
+ normal )
+ # Accept any command-line options.
+ case $arg in
+ -o)
+ if test -n "$libobj" ; then
+ $echo "$modename: you cannot specify \`-o' more than once" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ arg_mode=target
+ continue
+ ;;
+
+ -static | -prefer-pic | -prefer-non-pic)
+ later="$later $arg"
+ continue
+ ;;
+
+ -no-suppress)
+ suppress_opt=no
+ continue
+ ;;
+
+ -Xcompiler)
+ arg_mode=arg # the next one goes into the "base_compile" arg list
+ continue # The current "srcfile" will either be retained or
+ ;; # replaced later. I would guess that would be a bug.
+
+ -Wc,*)
+ args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"`
+ lastarg=
+ save_ifs="$IFS"; IFS=','
+ for arg in $args; do
+ IFS="$save_ifs"
+
+ # Double-quote args containing other shell metacharacters.
+ # Many Bourne shells cannot handle close brackets correctly
+ # in scan sets, so we specify it separately.
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ lastarg="$lastarg $arg"
+ done
+ IFS="$save_ifs"
+ lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"`
+
+ # Add the arguments to base_compile.
+ base_compile="$base_compile $lastarg"
+ continue
+ ;;
+
+ * )
+ # Accept the current argument as the source file.
+ # The previous "srcfile" becomes the current argument.
+ #
+ lastarg="$srcfile"
+ srcfile="$arg"
+ ;;
+ esac # case $arg
+ ;;
+ esac # case $arg_mode
+
+ # Aesthetically quote the previous argument.
+ lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"`
+
+ case $lastarg in
+ # Double-quote args containing other shell metacharacters.
+ # Many Bourne shells cannot handle close brackets correctly
+ # in scan sets, so we specify it separately.
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ lastarg="\"$lastarg\""
+ ;;
+ esac
+
+ base_compile="$base_compile $lastarg"
+ done # for arg
+
+ case $arg_mode in
+ arg)
+ $echo "$modename: you must specify an argument for -Xcompile"
+ exit $EXIT_FAILURE
+ ;;
+ target)
+ $echo "$modename: you must specify a target with \`-o'" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ *)
+ # Get the name of the library object.
+ [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'`
+ ;;
+ esac
+
+ # Recognize several different file suffixes.
+ # If the user specifies -o file.o, it is replaced with file.lo
+ xform='[cCFSifmso]'
+ case $libobj in
+ *.ada) xform=ada ;;
+ *.adb) xform=adb ;;
+ *.ads) xform=ads ;;
+ *.asm) xform=asm ;;
+ *.c++) xform=c++ ;;
+ *.cc) xform=cc ;;
+ *.ii) xform=ii ;;
+ *.class) xform=class ;;
+ *.cpp) xform=cpp ;;
+ *.cxx) xform=cxx ;;
+ *.f90) xform=f90 ;;
+ *.for) xform=for ;;
+ *.java) xform=java ;;
+ esac
+
+ libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"`
+
+ case $libobj in
+ *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;;
+ *)
+ $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ func_infer_tag $base_compile
+
+ for arg in $later; do
+ case $arg in
+ -static)
+ build_old_libs=yes
+ continue
+ ;;
+
+ -prefer-pic)
+ pic_mode=yes
+ continue
+ ;;
+
+ -prefer-non-pic)
+ pic_mode=no
+ continue
+ ;;
+ esac
+ done
+
+ objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'`
+ xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$obj"; then
+ xdir=
+ else
+ xdir=$xdir/
+ fi
+ lobj=${xdir}$objdir/$objname
+
+ if test -z "$base_compile"; then
+ $echo "$modename: you must specify a compilation command" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Delete any leftover library objects.
+ if test "$build_old_libs" = yes; then
+ removelist="$obj $lobj $libobj ${libobj}T"
+ else
+ removelist="$lobj $libobj ${libobj}T"
+ fi
+
+ $run $rm $removelist
+ trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15
+
+ # On Cygwin there's no "real" PIC flag so we must build both object types
+ case $host_os in
+ cygwin* | mingw* | pw32* | os2*)
+ pic_mode=default
+ ;;
+ esac
+ if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
+ # non-PIC code in shared libraries is not supported
+ pic_mode=default
+ fi
+
+ # Calculate the filename of the output object if compiler does
+ # not support -o with -c
+ if test "$compiler_c_o" = no; then
+ output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext}
+ lockfile="$output_obj.lock"
+ removelist="$removelist $output_obj $lockfile"
+ trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15
+ else
+ output_obj=
+ need_locks=no
+ lockfile=
+ fi
+
+ # Lock this critical section if it is needed
+ # We use this script file to make the link, it avoids creating a new file
+ if test "$need_locks" = yes; then
+ until $run ln "$progpath" "$lockfile" 2>/dev/null; do
+ $show "Waiting for $lockfile to be removed"
+ sleep 2
+ done
+ elif test "$need_locks" = warn; then
+ if test -f "$lockfile"; then
+ $echo "\
+*** ERROR, $lockfile exists and contains:
+`cat $lockfile 2>/dev/null`
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together. If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+ $run $rm $removelist
+ exit $EXIT_FAILURE
+ fi
+ $echo $srcfile > "$lockfile"
+ fi
+
+ if test -n "$fix_srcfile_path"; then
+ eval srcfile=\"$fix_srcfile_path\"
+ fi
+
+ $run $rm "$libobj" "${libobj}T"
+
+ # Create a libtool object file (analogous to a ".la" file),
+ # but don't create it if we're doing a dry run.
+ test -z "$run" && cat > ${libobj}T <<EOF
+# $libobj - a libtool object file
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+EOF
+
+ # Only build a PIC object if we are building libtool libraries.
+ if test "$build_libtool_libs" = yes; then
+ # Without this assignment, base_compile gets emptied.
+ fbsd_hideous_sh_bug=$base_compile
+
+ if test "$pic_mode" != no; then
+ command="$base_compile $srcfile $pic_flag"
+ else
+ # Don't build PIC code
+ command="$base_compile $srcfile"
+ fi
+
+ if test ! -d "${xdir}$objdir"; then
+ $show "$mkdir ${xdir}$objdir"
+ $run $mkdir ${xdir}$objdir
+ status=$?
+ if test "$status" -ne 0 && test ! -d "${xdir}$objdir"; then
+ exit $status
+ fi
+ fi
+
+ if test -z "$output_obj"; then
+ # Place PIC objects in $objdir
+ command="$command -o $lobj"
+ fi
+
+ $run $rm "$lobj" "$output_obj"
+
+ $show "$command"
+ if $run eval "$command"; then :
+ else
+ test -n "$output_obj" && $run $rm $removelist
+ exit $EXIT_FAILURE
+ fi
+
+ if test "$need_locks" = warn &&
+ test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+ $echo "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together. If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+ $run $rm $removelist
+ exit $EXIT_FAILURE
+ fi
+
+ # Just move the object if needed, then go on to compile the next one
+ if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
+ $show "$mv $output_obj $lobj"
+ if $run $mv $output_obj $lobj; then :
+ else
+ error=$?
+ $run $rm $removelist
+ exit $error
+ fi
+ fi
+
+ # Append the name of the PIC object to the libtool object file.
+ test -z "$run" && cat >> ${libobj}T <<EOF
+pic_object='$objdir/$objname'
+
+EOF
+
+ # Allow error messages only from the first compilation.
+ if test "$suppress_opt" = yes; then
+ suppress_output=' >/dev/null 2>&1'
+ fi
+ else
+ # No PIC object so indicate it doesn't exist in the libtool
+ # object file.
+ test -z "$run" && cat >> ${libobj}T <<EOF
+pic_object=none
+
+EOF
+ fi
+
+ # Only build a position-dependent object if we build old libraries.
+ if test "$build_old_libs" = yes; then
+ if test "$pic_mode" != yes; then
+ # Don't build PIC code
+ command="$base_compile $srcfile"
+ else
+ command="$base_compile $srcfile $pic_flag"
+ fi
+ if test "$compiler_c_o" = yes; then
+ command="$command -o $obj"
+ fi
+
+ # Suppress compiler output if we already did a PIC compilation.
+ command="$command$suppress_output"
+ $run $rm "$obj" "$output_obj"
+ $show "$command"
+ if $run eval "$command"; then :
+ else
+ $run $rm $removelist
+ exit $EXIT_FAILURE
+ fi
+
+ if test "$need_locks" = warn &&
+ test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+ $echo "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together. If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+ $run $rm $removelist
+ exit $EXIT_FAILURE
+ fi
+
+ # Just move the object if needed
+ if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
+ $show "$mv $output_obj $obj"
+ if $run $mv $output_obj $obj; then :
+ else
+ error=$?
+ $run $rm $removelist
+ exit $error
+ fi
+ fi
+
+ # Append the name of the non-PIC object the libtool object file.
+ # Only append if the libtool object file exists.
+ test -z "$run" && cat >> ${libobj}T <<EOF
+# Name of the non-PIC object.
+non_pic_object='$objname'
+
+EOF
+ else
+ # Append the name of the non-PIC object the libtool object file.
+ # Only append if the libtool object file exists.
+ test -z "$run" && cat >> ${libobj}T <<EOF
+# Name of the non-PIC object.
+non_pic_object=none
+
+EOF
+ fi
+
+ $run $mv "${libobj}T" "${libobj}"
+
+ # Unlock the critical section if it was locked
+ if test "$need_locks" != no; then
+ $run $rm "$lockfile"
+ fi
+
+ exit $EXIT_SUCCESS
+ ;;
+
+ # libtool link mode
+ link | relink)
+ modename="$modename: link"
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+ # It is impossible to link a dll without this setting, and
+ # we shouldn't force the makefile maintainer to figure out
+ # which system we are compiling for in order to pass an extra
+ # flag for every libtool invocation.
+ # allow_undefined=no
+
+ # FIXME: Unfortunately, there are problems with the above when trying
+ # to make a dll which has undefined symbols, in which case not
+ # even a static library is built. For now, we need to specify
+ # -no-undefined on the libtool link line when we can be certain
+ # that all symbols are satisfied, otherwise we get a static library.
+ allow_undefined=yes
+ ;;
+ *)
+ allow_undefined=yes
+ ;;
+ esac
+ libtool_args="$nonopt"
+ base_compile="$nonopt $@"
+ compile_command="$nonopt"
+ finalize_command="$nonopt"
+
+ compile_rpath=
+ finalize_rpath=
+ compile_shlibpath=
+ finalize_shlibpath=
+ convenience=
+ old_convenience=
+ deplibs=
+ old_deplibs=
+ compiler_flags=
+ linker_flags=
+ dllsearchpath=
+ lib_search_path=`pwd`
+ inst_prefix_dir=
+
+ avoid_version=no
+ dlfiles=
+ dlprefiles=
+ dlself=no
+ export_dynamic=no
+ export_symbols=
+ export_symbols_regex=
+ generated=
+ libobjs=
+ ltlibs=
+ module=no
+ no_install=no
+ objs=
+ non_pic_objects=
+ precious_files_regex=
+ prefer_static_libs=no
+ preload=no
+ prev=
+ prevarg=
+ release=
+ rpath=
+ xrpath=
+ perm_rpath=
+ temp_rpath=
+ thread_safe=no
+ vinfo=
+ vinfo_number=no
+
+ func_infer_tag $base_compile
+
+ # We need to know -static, to get the right output filenames.
+ for arg
+ do
+ case $arg in
+ -all-static | -static)
+ if test "X$arg" = "X-all-static"; then
+ if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+ $echo "$modename: warning: complete static linking is impossible in this configuration" 1>&2
+ fi
+ if test -n "$link_static_flag"; then
+ dlopen_self=$dlopen_self_static
+ fi
+ else
+ if test -z "$pic_flag" && test -n "$link_static_flag"; then
+ dlopen_self=$dlopen_self_static
+ fi
+ fi
+ build_libtool_libs=no
+ build_old_libs=yes
+ prefer_static_libs=yes
+ break
+ ;;
+ esac
+ done
+
+ # See if our shared archives depend on static archives.
+ test -n "$old_archive_from_new_cmds" && build_old_libs=yes
+
+ # Go through the arguments, transforming them on the way.
+ while test "$#" -gt 0; do
+ arg="$1"
+ shift
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test
+ ;;
+ *) qarg=$arg ;;
+ esac
+ libtool_args="$libtool_args $qarg"
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$prev"; then
+ case $prev in
+ output)
+ compile_command="$compile_command @OUTPUT@"
+ finalize_command="$finalize_command @OUTPUT@"
+ ;;
+ esac
+
+ case $prev in
+ dlfiles|dlprefiles)
+ if test "$preload" = no; then
+ # Add the symbol object into the linking commands.
+ compile_command="$compile_command @SYMFILE@"
+ finalize_command="$finalize_command @SYMFILE@"
+ preload=yes
+ fi
+ case $arg in
+ *.la | *.lo) ;; # We handle these cases below.
+ force)
+ if test "$dlself" = no; then
+ dlself=needless
+ export_dynamic=yes
+ fi
+ prev=
+ continue
+ ;;
+ self)
+ if test "$prev" = dlprefiles; then
+ dlself=yes
+ elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
+ dlself=yes
+ else
+ dlself=needless
+ export_dynamic=yes
+ fi
+ prev=
+ continue
+ ;;
+ *)
+ if test "$prev" = dlfiles; then
+ dlfiles="$dlfiles $arg"
+ else
+ dlprefiles="$dlprefiles $arg"
+ fi
+ prev=
+ continue
+ ;;
+ esac
+ ;;
+ expsyms)
+ export_symbols="$arg"
+ if test ! -f "$arg"; then
+ $echo "$modename: symbol file \`$arg' does not exist"
+ exit $EXIT_FAILURE
+ fi
+ prev=
+ continue
+ ;;
+ expsyms_regex)
+ export_symbols_regex="$arg"
+ prev=
+ continue
+ ;;
+ inst_prefix)
+ inst_prefix_dir="$arg"
+ prev=
+ continue
+ ;;
+ precious_regex)
+ precious_files_regex="$arg"
+ prev=
+ continue
+ ;;
+ release)
+ release="-$arg"
+ prev=
+ continue
+ ;;
+ objectlist)
+ if test -f "$arg"; then
+ save_arg=$arg
+ moreargs=
+ for fil in `cat $save_arg`
+ do
+# moreargs="$moreargs $fil"
+ arg=$fil
+ # A libtool-controlled object.
+
+ # Check to see that this really is a libtool object.
+ if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ pic_object=
+ non_pic_object=
+
+ # Read the .lo file
+ # If there is no directory component, then add one.
+ case $arg in
+ */* | *\\*) . $arg ;;
+ *) . ./$arg ;;
+ esac
+
+ if test -z "$pic_object" || \
+ test -z "$non_pic_object" ||
+ test "$pic_object" = none && \
+ test "$non_pic_object" = none; then
+ $echo "$modename: cannot find name of object for \`$arg'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Extract subdirectory from the argument.
+ xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$arg"; then
+ xdir=
+ else
+ xdir="$xdir/"
+ fi
+
+ if test "$pic_object" != none; then
+ # Prepend the subdirectory the object is found in.
+ pic_object="$xdir$pic_object"
+
+ if test "$prev" = dlfiles; then
+ if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+ dlfiles="$dlfiles $pic_object"
+ prev=
+ continue
+ else
+ # If libtool objects are unsupported, then we need to preload.
+ prev=dlprefiles
+ fi
+ fi
+
+ # CHECK ME: I think I busted this. -Ossama
+ if test "$prev" = dlprefiles; then
+ # Preload the old-style object.
+ dlprefiles="$dlprefiles $pic_object"
+ prev=
+ fi
+
+ # A PIC object.
+ libobjs="$libobjs $pic_object"
+ arg="$pic_object"
+ fi
+
+ # Non-PIC object.
+ if test "$non_pic_object" != none; then
+ # Prepend the subdirectory the object is found in.
+ non_pic_object="$xdir$non_pic_object"
+
+ # A standard non-PIC object
+ non_pic_objects="$non_pic_objects $non_pic_object"
+ if test -z "$pic_object" || test "$pic_object" = none ; then
+ arg="$non_pic_object"
+ fi
+ fi
+ else
+ # Only an error if not doing a dry-run.
+ if test -z "$run"; then
+ $echo "$modename: \`$arg' is not a valid libtool object" 1>&2
+ exit $EXIT_FAILURE
+ else
+ # Dry-run case.
+
+ # Extract subdirectory from the argument.
+ xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$arg"; then
+ xdir=
+ else
+ xdir="$xdir/"
+ fi
+
+ pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"`
+ non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"`
+ libobjs="$libobjs $pic_object"
+ non_pic_objects="$non_pic_objects $non_pic_object"
+ fi
+ fi
+ done
+ else
+ $echo "$modename: link input file \`$save_arg' does not exist"
+ exit $EXIT_FAILURE
+ fi
+ arg=$save_arg
+ prev=
+ continue
+ ;;
+ rpath | xrpath)
+ # We need an absolute path.
+ case $arg in
+ [\\/]* | [A-Za-z]:[\\/]*) ;;
+ *)
+ $echo "$modename: only absolute run-paths are allowed" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+ if test "$prev" = rpath; then
+ case "$rpath " in
+ *" $arg "*) ;;
+ *) rpath="$rpath $arg" ;;
+ esac
+ else
+ case "$xrpath " in
+ *" $arg "*) ;;
+ *) xrpath="$xrpath $arg" ;;
+ esac
+ fi
+ prev=
+ continue
+ ;;
+ xcompiler)
+ compiler_flags="$compiler_flags $qarg"
+ prev=
+ compile_command="$compile_command $qarg"
+ finalize_command="$finalize_command $qarg"
+ continue
+ ;;
+ xlinker)
+ linker_flags="$linker_flags $qarg"
+ compiler_flags="$compiler_flags $wl$qarg"
+ prev=
+ compile_command="$compile_command $wl$qarg"
+ finalize_command="$finalize_command $wl$qarg"
+ continue
+ ;;
+ xcclinker)
+ linker_flags="$linker_flags $qarg"
+ compiler_flags="$compiler_flags $qarg"
+ prev=
+ compile_command="$compile_command $qarg"
+ finalize_command="$finalize_command $qarg"
+ continue
+ ;;
+ shrext)
+ shrext_cmds="$arg"
+ prev=
+ continue
+ ;;
+ *)
+ eval "$prev=\"\$arg\""
+ prev=
+ continue
+ ;;
+ esac
+ fi # test -n "$prev"
+
+ prevarg="$arg"
+
+ case $arg in
+ -all-static)
+ if test -n "$link_static_flag"; then
+ compile_command="$compile_command $link_static_flag"
+ finalize_command="$finalize_command $link_static_flag"
+ fi
+ continue
+ ;;
+
+ -allow-undefined)
+ # FIXME: remove this flag sometime in the future.
+ $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2
+ continue
+ ;;
+
+ -avoid-version)
+ avoid_version=yes
+ continue
+ ;;
+
+ -dlopen)
+ prev=dlfiles
+ continue
+ ;;
+
+ -dlpreopen)
+ prev=dlprefiles
+ continue
+ ;;
+
+ -export-dynamic)
+ export_dynamic=yes
+ continue
+ ;;
+
+ -export-symbols | -export-symbols-regex)
+ if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+ $echo "$modename: more than one -exported-symbols argument is not allowed"
+ exit $EXIT_FAILURE
+ fi
+ if test "X$arg" = "X-export-symbols"; then
+ prev=expsyms
+ else
+ prev=expsyms_regex
+ fi
+ continue
+ ;;
+
+ -inst-prefix-dir)
+ prev=inst_prefix
+ continue
+ ;;
+
+ # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
+ # so, if we see these flags be careful not to treat them like -L
+ -L[A-Z][A-Z]*:*)
+ case $with_gcc/$host in
+ no/*-*-irix* | /*-*-irix*)
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ ;;
+ esac
+ continue
+ ;;
+
+ -L*)
+ dir=`$echo "X$arg" | $Xsed -e 's/^-L//'`
+ # We need an absolute path.
+ case $dir in
+ [\\/]* | [A-Za-z]:[\\/]*) ;;
+ *)
+ absdir=`cd "$dir" && pwd`
+ if test -z "$absdir"; then
+ $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ dir="$absdir"
+ ;;
+ esac
+ case "$deplibs " in
+ *" -L$dir "*) ;;
+ *)
+ deplibs="$deplibs -L$dir"
+ lib_search_path="$lib_search_path $dir"
+ ;;
+ esac
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+ case :$dllsearchpath: in
+ *":$dir:"*) ;;
+ *) dllsearchpath="$dllsearchpath:$dir";;
+ esac
+ ;;
+ esac
+ continue
+ ;;
+
+ -l*)
+ if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
+ case $host in
+ *-*-cygwin* | *-*-pw32* | *-*-beos*)
+ # These systems don't actually have a C or math library (as such)
+ continue
+ ;;
+ *-*-mingw* | *-*-os2*)
+ # These systems don't actually have a C library (as such)
+ test "X$arg" = "X-lc" && continue
+ ;;
+ *-*-openbsd* | *-*-freebsd*)
+ # Do not include libc due to us having libc/libc_r.
+ test "X$arg" = "X-lc" && continue
+ ;;
+ *-*-rhapsody* | *-*-darwin1.[012])
+ # Rhapsody C and math libraries are in the System framework
+ deplibs="$deplibs -framework System"
+ continue
+ esac
+ elif test "X$arg" = "X-lc_r"; then
+ case $host in
+ *-*-openbsd* | *-*-freebsd*)
+ # Do not include libc_r directly, use -pthread flag.
+ continue
+ ;;
+ esac
+ fi
+ deplibs="$deplibs $arg"
+ continue
+ ;;
+
+ -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe)
+ deplibs="$deplibs $arg"
+ continue
+ ;;
+
+ -module)
+ module=yes
+ continue
+ ;;
+
+ # gcc -m* arguments should be passed to the linker via $compiler_flags
+ # in order to pass architecture information to the linker
+ # (e.g. 32 vs 64-bit). This may also be accomplished via -Wl,-mfoo
+ # but this is not reliable with gcc because gcc may use -mfoo to
+ # select a different linker, different libraries, etc, while
+ # -Wl,-mfoo simply passes -mfoo to the linker.
+ -m*)
+ # Unknown arguments in both finalize_command and compile_command need
+ # to be aesthetically quoted because they are evaled later.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ if test "$with_gcc" = "yes" ; then
+ compiler_flags="$compiler_flags $arg"
+ fi
+ continue
+ ;;
+
+ -shrext)
+ prev=shrext
+ continue
+ ;;
+
+ -no-fast-install)
+ fast_install=no
+ continue
+ ;;
+
+ -no-install)
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+ # The PATH hackery in wrapper scripts is required on Windows
+ # in order for the loader to find any dlls it needs.
+ $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2
+ $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2
+ fast_install=no
+ ;;
+ *) no_install=yes ;;
+ esac
+ continue
+ ;;
+
+ -no-undefined)
+ allow_undefined=no
+ continue
+ ;;
+
+ -objectlist)
+ prev=objectlist
+ continue
+ ;;
+
+ -o) prev=output ;;
+
+ -precious-files-regex)
+ prev=precious_regex
+ continue
+ ;;
+
+ -release)
+ prev=release
+ continue
+ ;;
+
+ -rpath)
+ prev=rpath
+ continue
+ ;;
+
+ -R)
+ prev=xrpath
+ continue
+ ;;
+
+ -R*)
+ dir=`$echo "X$arg" | $Xsed -e 's/^-R//'`
+ # We need an absolute path.
+ case $dir in
+ [\\/]* | [A-Za-z]:[\\/]*) ;;
+ *)
+ $echo "$modename: only absolute run-paths are allowed" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+ case "$xrpath " in
+ *" $dir "*) ;;
+ *) xrpath="$xrpath $dir" ;;
+ esac
+ continue
+ ;;
+
+ -static)
+ # The effects of -static are defined in a previous loop.
+ # We used to do the same as -all-static on platforms that
+ # didn't have a PIC flag, but the assumption that the effects
+ # would be equivalent was wrong. It would break on at least
+ # Digital Unix and AIX.
+ continue
+ ;;
+
+ -thread-safe)
+ thread_safe=yes
+ continue
+ ;;
+
+ -version-info)
+ prev=vinfo
+ continue
+ ;;
+ -version-number)
+ prev=vinfo
+ vinfo_number=yes
+ continue
+ ;;
+
+ -Wc,*)
+ args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'`
+ arg=
+ save_ifs="$IFS"; IFS=','
+ for flag in $args; do
+ IFS="$save_ifs"
+ case $flag in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ flag="\"$flag\""
+ ;;
+ esac
+ arg="$arg $wl$flag"
+ compiler_flags="$compiler_flags $flag"
+ done
+ IFS="$save_ifs"
+ arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
+ ;;
+
+ -Wl,*)
+ args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'`
+ arg=
+ save_ifs="$IFS"; IFS=','
+ for flag in $args; do
+ IFS="$save_ifs"
+ case $flag in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ flag="\"$flag\""
+ ;;
+ esac
+ arg="$arg $wl$flag"
+ compiler_flags="$compiler_flags $wl$flag"
+ linker_flags="$linker_flags $flag"
+ done
+ IFS="$save_ifs"
+ arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
+ ;;
+
+ -Xcompiler)
+ prev=xcompiler
+ continue
+ ;;
+
+ -Xlinker)
+ prev=xlinker
+ continue
+ ;;
+
+ -XCClinker)
+ prev=xcclinker
+ continue
+ ;;
+
+ # Some other compiler flag.
+ -* | +*)
+ # Unknown arguments in both finalize_command and compile_command need
+ # to be aesthetically quoted because they are evaled later.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ ;;
+
+ *.$objext)
+ # A standard object.
+ objs="$objs $arg"
+ ;;
+
+ *.lo)
+ # A libtool-controlled object.
+
+ # Check to see that this really is a libtool object.
+ if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ pic_object=
+ non_pic_object=
+
+ # Read the .lo file
+ # If there is no directory component, then add one.
+ case $arg in
+ */* | *\\*) . $arg ;;
+ *) . ./$arg ;;
+ esac
+
+ if test -z "$pic_object" || \
+ test -z "$non_pic_object" ||
+ test "$pic_object" = none && \
+ test "$non_pic_object" = none; then
+ $echo "$modename: cannot find name of object for \`$arg'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Extract subdirectory from the argument.
+ xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$arg"; then
+ xdir=
+ else
+ xdir="$xdir/"
+ fi
+
+ if test "$pic_object" != none; then
+ # Prepend the subdirectory the object is found in.
+ pic_object="$xdir$pic_object"
+
+ if test "$prev" = dlfiles; then
+ if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+ dlfiles="$dlfiles $pic_object"
+ prev=
+ continue
+ else
+ # If libtool objects are unsupported, then we need to preload.
+ prev=dlprefiles
+ fi
+ fi
+
+ # CHECK ME: I think I busted this. -Ossama
+ if test "$prev" = dlprefiles; then
+ # Preload the old-style object.
+ dlprefiles="$dlprefiles $pic_object"
+ prev=
+ fi
+
+ # A PIC object.
+ libobjs="$libobjs $pic_object"
+ arg="$pic_object"
+ fi
+
+ # Non-PIC object.
+ if test "$non_pic_object" != none; then
+ # Prepend the subdirectory the object is found in.
+ non_pic_object="$xdir$non_pic_object"
+
+ # A standard non-PIC object
+ non_pic_objects="$non_pic_objects $non_pic_object"
+ if test -z "$pic_object" || test "$pic_object" = none ; then
+ arg="$non_pic_object"
+ fi
+ fi
+ else
+ # Only an error if not doing a dry-run.
+ if test -z "$run"; then
+ $echo "$modename: \`$arg' is not a valid libtool object" 1>&2
+ exit $EXIT_FAILURE
+ else
+ # Dry-run case.
+
+ # Extract subdirectory from the argument.
+ xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$arg"; then
+ xdir=
+ else
+ xdir="$xdir/"
+ fi
+
+ pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"`
+ non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"`
+ libobjs="$libobjs $pic_object"
+ non_pic_objects="$non_pic_objects $non_pic_object"
+ fi
+ fi
+ ;;
+
+ *.$libext)
+ # An archive.
+ deplibs="$deplibs $arg"
+ old_deplibs="$old_deplibs $arg"
+ continue
+ ;;
+
+ *.la)
+ # A libtool-controlled library.
+
+ if test "$prev" = dlfiles; then
+ # This library was specified with -dlopen.
+ dlfiles="$dlfiles $arg"
+ prev=
+ elif test "$prev" = dlprefiles; then
+ # The library was specified with -dlpreopen.
+ dlprefiles="$dlprefiles $arg"
+ prev=
+ else
+ deplibs="$deplibs $arg"
+ fi
+ continue
+ ;;
+
+ # Some other compiler argument.
+ *)
+ # Unknown arguments in both finalize_command and compile_command need
+ # to be aesthetically quoted because they are evaled later.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ ;;
+ esac # arg
+
+ # Now actually substitute the argument into the commands.
+ if test -n "$arg"; then
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ fi
+ done # argument parsing loop
+
+ if test -n "$prev"; then
+ $echo "$modename: the \`$prevarg' option requires an argument" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+ eval arg=\"$export_dynamic_flag_spec\"
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ fi
+
+ oldlibs=
+ # calculate the name of the file, without its directory
+ outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'`
+ libobjs_save="$libobjs"
+
+ if test -n "$shlibpath_var"; then
+ # get the directories listed in $shlibpath_var
+ eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\`
+ else
+ shlib_search_path=
+ fi
+ eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
+ eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
+
+ output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$output_objdir" = "X$output"; then
+ output_objdir="$objdir"
+ else
+ output_objdir="$output_objdir/$objdir"
+ fi
+ # Create the object directory.
+ if test ! -d "$output_objdir"; then
+ $show "$mkdir $output_objdir"
+ $run $mkdir $output_objdir
+ status=$?
+ if test "$status" -ne 0 && test ! -d "$output_objdir"; then
+ exit $status
+ fi
+ fi
+
+ # Determine the type of output
+ case $output in
+ "")
+ $echo "$modename: you must specify an output file" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ *.$libext) linkmode=oldlib ;;
+ *.lo | *.$objext) linkmode=obj ;;
+ *.la) linkmode=lib ;;
+ *) linkmode=prog ;; # Anything else should be a program.
+ esac
+
+ case $host in
+ *cygwin* | *mingw* | *pw32*)
+ # don't eliminate duplications in $postdeps and $predeps
+ duplicate_compiler_generated_deps=yes
+ ;;
+ *)
+ duplicate_compiler_generated_deps=$duplicate_deps
+ ;;
+ esac
+ specialdeplibs=
+
+ libs=
+ # Find all interdependent deplibs by searching for libraries
+ # that are linked more than once (e.g. -la -lb -la)
+ for deplib in $deplibs; do
+ if test "X$duplicate_deps" = "Xyes" ; then
+ case "$libs " in
+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ esac
+ fi
+ libs="$libs $deplib"
+ done
+
+ if test "$linkmode" = lib; then
+ libs="$predeps $libs $compiler_lib_search_path $postdeps"
+
+ # Compute libraries that are listed more than once in $predeps
+ # $postdeps and mark them as special (i.e., whose duplicates are
+ # not to be eliminated).
+ pre_post_deps=
+ if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then
+ for pre_post_dep in $predeps $postdeps; do
+ case "$pre_post_deps " in
+ *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;;
+ esac
+ pre_post_deps="$pre_post_deps $pre_post_dep"
+ done
+ fi
+ pre_post_deps=
+ fi
+
+ deplibs=
+ newdependency_libs=
+ newlib_search_path=
+ need_relink=no # whether we're linking any uninstalled libtool libraries
+ notinst_deplibs= # not-installed libtool libraries
+ notinst_path= # paths that contain not-installed libtool libraries
+ case $linkmode in
+ lib)
+ passes="conv link"
+ for file in $dlfiles $dlprefiles; do
+ case $file in
+ *.la) ;;
+ *)
+ $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+ done
+ ;;
+ prog)
+ compile_deplibs=
+ finalize_deplibs=
+ alldeplibs=no
+ newdlfiles=
+ newdlprefiles=
+ passes="conv scan dlopen dlpreopen link"
+ ;;
+ *) passes="conv"
+ ;;
+ esac
+ for pass in $passes; do
+ if test "$linkmode,$pass" = "lib,link" ||
+ test "$linkmode,$pass" = "prog,scan"; then
+ libs="$deplibs"
+ deplibs=
+ fi
+ if test "$linkmode" = prog; then
+ case $pass in
+ dlopen) libs="$dlfiles" ;;
+ dlpreopen) libs="$dlprefiles" ;;
+ link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
+ esac
+ fi
+ if test "$pass" = dlopen; then
+ # Collect dlpreopened libraries
+ save_deplibs="$deplibs"
+ deplibs=
+ fi
+ for deplib in $libs; do
+ lib=
+ found=no
+ case $deplib in
+ -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe)
+ if test "$linkmode,$pass" = "prog,link"; then
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ deplibs="$deplib $deplibs"
+ fi
+ continue
+ ;;
+ -l*)
+ if test "$linkmode" != lib && test "$linkmode" != prog; then
+ $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2
+ continue
+ fi
+ if test "$pass" = conv; then
+ deplibs="$deplib $deplibs"
+ continue
+ fi
+ name=`$echo "X$deplib" | $Xsed -e 's/^-l//'`
+ for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do
+ for search_ext in .la $std_shrext .so .a; do
+ # Search the libtool library
+ lib="$searchdir/lib${name}${search_ext}"
+ if test -f "$lib"; then
+ if test "$search_ext" = ".la"; then
+ found=yes
+ else
+ found=no
+ fi
+ break 2
+ fi
+ done
+ done
+ if test "$found" != yes; then
+ # deplib doesn't seem to be a libtool library
+ if test "$linkmode,$pass" = "prog,link"; then
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ deplibs="$deplib $deplibs"
+ test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+ fi
+ continue
+ else # deplib is a libtool library
+ # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
+ # We need to do some special things here, and not later.
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ case " $predeps $postdeps " in
+ *" $deplib "*)
+ if (${SED} -e '2q' $lib |
+ grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ library_names=
+ old_library=
+ case $lib in
+ */* | *\\*) . $lib ;;
+ *) . ./$lib ;;
+ esac
+ for l in $old_library $library_names; do
+ ll="$l"
+ done
+ if test "X$ll" = "X$old_library" ; then # only static version available
+ found=no
+ ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$ladir" = "X$lib" && ladir="."
+ lib=$ladir/$old_library
+ if test "$linkmode,$pass" = "prog,link"; then
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ deplibs="$deplib $deplibs"
+ test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+ fi
+ continue
+ fi
+ fi
+ ;;
+ *) ;;
+ esac
+ fi
+ fi
+ ;; # -l
+ -L*)
+ case $linkmode in
+ lib)
+ deplibs="$deplib $deplibs"
+ test "$pass" = conv && continue
+ newdependency_libs="$deplib $newdependency_libs"
+ newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
+ ;;
+ prog)
+ if test "$pass" = conv; then
+ deplibs="$deplib $deplibs"
+ continue
+ fi
+ if test "$pass" = scan; then
+ deplibs="$deplib $deplibs"
+ else
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ fi
+ newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
+ ;;
+ *)
+ $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2
+ ;;
+ esac # linkmode
+ continue
+ ;; # -L
+ -R*)
+ if test "$pass" = link; then
+ dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'`
+ # Make sure the xrpath contains only unique directories.
+ case "$xrpath " in
+ *" $dir "*) ;;
+ *) xrpath="$xrpath $dir" ;;
+ esac
+ fi
+ deplibs="$deplib $deplibs"
+ continue
+ ;;
+ *.la) lib="$deplib" ;;
+ *.$libext)
+ if test "$pass" = conv; then
+ deplibs="$deplib $deplibs"
+ continue
+ fi
+ case $linkmode in
+ lib)
+ if test "$deplibs_check_method" != pass_all; then
+ $echo
+ $echo "*** Warning: Trying to link with static lib archive $deplib."
+ $echo "*** I have the capability to make that library automatically link in when"
+ $echo "*** you link to this library. But I can only do this if you have a"
+ $echo "*** shared version of the library, which you do not appear to have"
+ $echo "*** because the file extensions .$libext of this argument makes me believe"
+ $echo "*** that it is just a static archive that I should not used here."
+ else
+ $echo
+ $echo "*** Warning: Linking the shared library $output against the"
+ $echo "*** static library $deplib is not portable!"
+ deplibs="$deplib $deplibs"
+ fi
+ continue
+ ;;
+ prog)
+ if test "$pass" != link; then
+ deplibs="$deplib $deplibs"
+ else
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ fi
+ continue
+ ;;
+ esac # linkmode
+ ;; # *.$libext
+ *.lo | *.$objext)
+ if test "$pass" = conv; then
+ deplibs="$deplib $deplibs"
+ elif test "$linkmode" = prog; then
+ if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+ # If there is no dlopen support or we're linking statically,
+ # we need to preload.
+ newdlprefiles="$newdlprefiles $deplib"
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ newdlfiles="$newdlfiles $deplib"
+ fi
+ fi
+ continue
+ ;;
+ %DEPLIBS%)
+ alldeplibs=yes
+ continue
+ ;;
+ esac # case $deplib
+ if test "$found" = yes || test -f "$lib"; then :
+ else
+ $echo "$modename: cannot find the library \`$lib'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Check to see that this really is a libtool archive.
+ if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+ else
+ $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$ladir" = "X$lib" && ladir="."
+
+ dlname=
+ dlopen=
+ dlpreopen=
+ libdir=
+ library_names=
+ old_library=
+ # If the library was installed with an old release of libtool,
+ # it will not redefine variables installed, or shouldnotlink
+ installed=yes
+ shouldnotlink=no
+
+ # Read the .la file
+ case $lib in
+ */* | *\\*) . $lib ;;
+ *) . ./$lib ;;
+ esac
+
+ if test "$linkmode,$pass" = "lib,link" ||
+ test "$linkmode,$pass" = "prog,scan" ||
+ { test "$linkmode" != prog && test "$linkmode" != lib; }; then
+ test -n "$dlopen" && dlfiles="$dlfiles $dlopen"
+ test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen"
+ fi
+
+ if test "$pass" = conv; then
+ # Only check for convenience libraries
+ deplibs="$lib $deplibs"
+ if test -z "$libdir"; then
+ if test -z "$old_library"; then
+ $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ # It is a libtool convenience library, so add in its objects.
+ convenience="$convenience $ladir/$objdir/$old_library"
+ old_convenience="$old_convenience $ladir/$objdir/$old_library"
+ tmp_libs=
+ for deplib in $dependency_libs; do
+ deplibs="$deplib $deplibs"
+ if test "X$duplicate_deps" = "Xyes" ; then
+ case "$tmp_libs " in
+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ esac
+ fi
+ tmp_libs="$tmp_libs $deplib"
+ done
+ elif test "$linkmode" != prog && test "$linkmode" != lib; then
+ $echo "$modename: \`$lib' is not a convenience library" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ continue
+ fi # $pass = conv
+
+
+ # Get the name of the library we link against.
+ linklib=
+ for l in $old_library $library_names; do
+ linklib="$l"
+ done
+ if test -z "$linklib"; then
+ $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # This library was specified with -dlopen.
+ if test "$pass" = dlopen; then
+ if test -z "$libdir"; then
+ $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ if test -z "$dlname" ||
+ test "$dlopen_support" != yes ||
+ test "$build_libtool_libs" = no; then
+ # If there is no dlname, no dlopen support or we're linking
+ # statically, we need to preload. We also need to preload any
+ # dependent libraries so libltdl's deplib preloader doesn't
+ # bomb out in the load deplibs phase.
+ dlprefiles="$dlprefiles $lib $dependency_libs"
+ else
+ newdlfiles="$newdlfiles $lib"
+ fi
+ continue
+ fi # $pass = dlopen
+
+ # We need an absolute path.
+ case $ladir in
+ [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
+ *)
+ abs_ladir=`cd "$ladir" && pwd`
+ if test -z "$abs_ladir"; then
+ $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2
+ $echo "$modename: passing it literally to the linker, although it might fail" 1>&2
+ abs_ladir="$ladir"
+ fi
+ ;;
+ esac
+ laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+
+ # Find the relevant object directory and library name.
+ if test "X$installed" = Xyes; then
+ if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+ $echo "$modename: warning: library \`$lib' was moved." 1>&2
+ dir="$ladir"
+ absdir="$abs_ladir"
+ libdir="$abs_ladir"
+ else
+ dir="$libdir"
+ absdir="$libdir"
+ fi
+ else
+ dir="$ladir/$objdir"
+ absdir="$abs_ladir/$objdir"
+ # Remove this search path later
+ notinst_path="$notinst_path $abs_ladir"
+ fi # $installed = yes
+ name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
+
+ # This library was specified with -dlpreopen.
+ if test "$pass" = dlpreopen; then
+ if test -z "$libdir"; then
+ $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ # Prefer using a static library (so that no silly _DYNAMIC symbols
+ # are required to link).
+ if test -n "$old_library"; then
+ newdlprefiles="$newdlprefiles $dir/$old_library"
+ # Otherwise, use the dlname, so that lt_dlopen finds it.
+ elif test -n "$dlname"; then
+ newdlprefiles="$newdlprefiles $dir/$dlname"
+ else
+ newdlprefiles="$newdlprefiles $dir/$linklib"
+ fi
+ fi # $pass = dlpreopen
+
+ if test -z "$libdir"; then
+ # Link the convenience library
+ if test "$linkmode" = lib; then
+ deplibs="$dir/$old_library $deplibs"
+ elif test "$linkmode,$pass" = "prog,link"; then
+ compile_deplibs="$dir/$old_library $compile_deplibs"
+ finalize_deplibs="$dir/$old_library $finalize_deplibs"
+ else
+ deplibs="$lib $deplibs" # used for prog,scan pass
+ fi
+ continue
+ fi
+
+
+ if test "$linkmode" = prog && test "$pass" != link; then
+ newlib_search_path="$newlib_search_path $ladir"
+ deplibs="$lib $deplibs"
+
+ linkalldeplibs=no
+ if test "$link_all_deplibs" != no || test -z "$library_names" ||
+ test "$build_libtool_libs" = no; then
+ linkalldeplibs=yes
+ fi
+
+ tmp_libs=
+ for deplib in $dependency_libs; do
+ case $deplib in
+ -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test
+ esac
+ # Need to link against all dependency_libs?
+ if test "$linkalldeplibs" = yes; then
+ deplibs="$deplib $deplibs"
+ else
+ # Need to hardcode shared library paths
+ # or/and link against static libraries
+ newdependency_libs="$deplib $newdependency_libs"
+ fi
+ if test "X$duplicate_deps" = "Xyes" ; then
+ case "$tmp_libs " in
+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ esac
+ fi
+ tmp_libs="$tmp_libs $deplib"
+ done # for deplib
+ continue
+ fi # $linkmode = prog...
+
+ if test "$linkmode,$pass" = "prog,link"; then
+ if test -n "$library_names" &&
+ { test "$prefer_static_libs" = no || test -z "$old_library"; }; then
+ # We need to hardcode the library path
+ if test -n "$shlibpath_var"; then
+ # Make sure the rpath contains only unique directories.
+ case "$temp_rpath " in
+ *" $dir "*) ;;
+ *" $absdir "*) ;;
+ *) temp_rpath="$temp_rpath $dir" ;;
+ esac
+ fi
+
+ # Hardcode the library path.
+ # Skip directories that are in the system default run-time
+ # search path.
+ case " $sys_lib_dlsearch_path " in
+ *" $absdir "*) ;;
+ *)
+ case "$compile_rpath " in
+ *" $absdir "*) ;;
+ *) compile_rpath="$compile_rpath $absdir"
+ esac
+ ;;
+ esac
+ case " $sys_lib_dlsearch_path " in
+ *" $libdir "*) ;;
+ *)
+ case "$finalize_rpath " in
+ *" $libdir "*) ;;
+ *) finalize_rpath="$finalize_rpath $libdir"
+ esac
+ ;;
+ esac
+ fi # $linkmode,$pass = prog,link...
+
+ if test "$alldeplibs" = yes &&
+ { test "$deplibs_check_method" = pass_all ||
+ { test "$build_libtool_libs" = yes &&
+ test -n "$library_names"; }; }; then
+ # We only need to search for static libraries
+ continue
+ fi
+ fi
+
+ link_static=no # Whether the deplib will be linked statically
+ if test -n "$library_names" &&
+ { test "$prefer_static_libs" = no || test -z "$old_library"; }; then
+ if test "$installed" = no; then
+ notinst_deplibs="$notinst_deplibs $lib"
+ need_relink=yes
+ fi
+ # This is a shared library
+
+ # Warn about portability, can't link against -module's on
+ # some systems (darwin)
+ if test "$shouldnotlink" = yes && test "$pass" = link ; then
+ $echo
+ if test "$linkmode" = prog; then
+ $echo "*** Warning: Linking the executable $output against the loadable module"
+ else
+ $echo "*** Warning: Linking the shared library $output against the loadable module"
+ fi
+ $echo "*** $linklib is not portable!"
+ fi
+ if test "$linkmode" = lib &&
+ test "$hardcode_into_libs" = yes; then
+ # Hardcode the library path.
+ # Skip directories that are in the system default run-time
+ # search path.
+ case " $sys_lib_dlsearch_path " in
+ *" $absdir "*) ;;
+ *)
+ case "$compile_rpath " in
+ *" $absdir "*) ;;
+ *) compile_rpath="$compile_rpath $absdir"
+ esac
+ ;;
+ esac
+ case " $sys_lib_dlsearch_path " in
+ *" $libdir "*) ;;
+ *)
+ case "$finalize_rpath " in
+ *" $libdir "*) ;;
+ *) finalize_rpath="$finalize_rpath $libdir"
+ esac
+ ;;
+ esac
+ fi
+
+ if test -n "$old_archive_from_expsyms_cmds"; then
+ # figure out the soname
+ set dummy $library_names
+ realname="$2"
+ shift; shift
+ libname=`eval \\$echo \"$libname_spec\"`
+ # use dlname if we got it. it's perfectly good, no?
+ if test -n "$dlname"; then
+ soname="$dlname"
+ elif test -n "$soname_spec"; then
+ # bleh windows
+ case $host in
+ *cygwin* | mingw*)
+ major=`expr $current - $age`
+ versuffix="-$major"
+ ;;
+ esac
+ eval soname=\"$soname_spec\"
+ else
+ soname="$realname"
+ fi
+
+ # Make a new name for the extract_expsyms_cmds to use
+ soroot="$soname"
+ soname=`$echo $soroot | ${SED} -e 's/^.*\///'`
+ newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a"
+
+ # If the library has no export list, then create one now
+ if test -f "$output_objdir/$soname-def"; then :
+ else
+ $show "extracting exported symbol list from \`$soname'"
+ save_ifs="$IFS"; IFS='~'
+ cmds=$extract_expsyms_cmds
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ fi
+
+ # Create $newlib
+ if test -f "$output_objdir/$newlib"; then :; else
+ $show "generating import library for \`$soname'"
+ save_ifs="$IFS"; IFS='~'
+ cmds=$old_archive_from_expsyms_cmds
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ fi
+ # make sure the library variables are pointing to the new library
+ dir=$output_objdir
+ linklib=$newlib
+ fi # test -n "$old_archive_from_expsyms_cmds"
+
+ if test "$linkmode" = prog || test "$mode" != relink; then
+ add_shlibpath=
+ add_dir=
+ add=
+ lib_linked=yes
+ case $hardcode_action in
+ immediate | unsupported)
+ if test "$hardcode_direct" = no; then
+ add="$dir/$linklib"
+ case $host in
+ *-*-sco3.2v5* ) add_dir="-L$dir" ;;
+ *-*-darwin* )
+ # if the lib is a module then we can not link against
+ # it, someone is ignoring the new warnings I added
+ if /usr/bin/file -L $add 2> /dev/null | $EGREP "bundle" >/dev/null ; then
+ $echo "** Warning, lib $linklib is a module, not a shared library"
+ if test -z "$old_library" ; then
+ $echo
+ $echo "** And there doesn't seem to be a static archive available"
+ $echo "** The link will probably fail, sorry"
+ else
+ add="$dir/$old_library"
+ fi
+ fi
+ esac
+ elif test "$hardcode_minus_L" = no; then
+ case $host in
+ *-*-sunos*) add_shlibpath="$dir" ;;
+ esac
+ add_dir="-L$dir"
+ add="-l$name"
+ elif test "$hardcode_shlibpath_var" = no; then
+ add_shlibpath="$dir"
+ add="-l$name"
+ else
+ lib_linked=no
+ fi
+ ;;
+ relink)
+ if test "$hardcode_direct" = yes; then
+ add="$dir/$linklib"
+ elif test "$hardcode_minus_L" = yes; then
+ add_dir="-L$dir"
+ # Try looking first in the location we're being installed to.
+ if test -n "$inst_prefix_dir"; then
+ case "$libdir" in
+ [\\/]*)
+ add_dir="$add_dir -L$inst_prefix_dir$libdir"
+ ;;
+ esac
+ fi
+ add="-l$name"
+ elif test "$hardcode_shlibpath_var" = yes; then
+ add_shlibpath="$dir"
+ add="-l$name"
+ else
+ lib_linked=no
+ fi
+ ;;
+ *) lib_linked=no ;;
+ esac
+
+ if test "$lib_linked" != yes; then
+ $echo "$modename: configuration error: unsupported hardcode properties"
+ exit $EXIT_FAILURE
+ fi
+
+ if test -n "$add_shlibpath"; then
+ case :$compile_shlibpath: in
+ *":$add_shlibpath:"*) ;;
+ *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;;
+ esac
+ fi
+ if test "$linkmode" = prog; then
+ test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
+ test -n "$add" && compile_deplibs="$add $compile_deplibs"
+ else
+ test -n "$add_dir" && deplibs="$add_dir $deplibs"
+ test -n "$add" && deplibs="$add $deplibs"
+ if test "$hardcode_direct" != yes && \
+ test "$hardcode_minus_L" != yes && \
+ test "$hardcode_shlibpath_var" = yes; then
+ case :$finalize_shlibpath: in
+ *":$libdir:"*) ;;
+ *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+ esac
+ fi
+ fi
+ fi
+
+ if test "$linkmode" = prog || test "$mode" = relink; then
+ add_shlibpath=
+ add_dir=
+ add=
+ # Finalize command for both is simple: just hardcode it.
+ if test "$hardcode_direct" = yes; then
+ add="$libdir/$linklib"
+ elif test "$hardcode_minus_L" = yes; then
+ add_dir="-L$libdir"
+ add="-l$name"
+ elif test "$hardcode_shlibpath_var" = yes; then
+ case :$finalize_shlibpath: in
+ *":$libdir:"*) ;;
+ *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+ esac
+ add="-l$name"
+ elif test "$hardcode_automatic" = yes; then
+ if test -n "$inst_prefix_dir" &&
+ test -f "$inst_prefix_dir$libdir/$linklib" ; then
+ add="$inst_prefix_dir$libdir/$linklib"
+ else
+ add="$libdir/$linklib"
+ fi
+ else
+ # We cannot seem to hardcode it, guess we'll fake it.
+ add_dir="-L$libdir"
+ # Try looking first in the location we're being installed to.
+ if test -n "$inst_prefix_dir"; then
+ case "$libdir" in
+ [\\/]*)
+ add_dir="$add_dir -L$inst_prefix_dir$libdir"
+ ;;
+ esac
+ fi
+ add="-l$name"
+ fi
+
+ if test "$linkmode" = prog; then
+ test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
+ test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
+ else
+ test -n "$add_dir" && deplibs="$add_dir $deplibs"
+ test -n "$add" && deplibs="$add $deplibs"
+ fi
+ fi
+ elif test "$linkmode" = prog; then
+ # Here we assume that one of hardcode_direct or hardcode_minus_L
+ # is not unsupported. This is valid on all known static and
+ # shared platforms.
+ if test "$hardcode_direct" != unsupported; then
+ test -n "$old_library" && linklib="$old_library"
+ compile_deplibs="$dir/$linklib $compile_deplibs"
+ finalize_deplibs="$dir/$linklib $finalize_deplibs"
+ else
+ compile_deplibs="-l$name -L$dir $compile_deplibs"
+ finalize_deplibs="-l$name -L$dir $finalize_deplibs"
+ fi
+ elif test "$build_libtool_libs" = yes; then
+ # Not a shared library
+ if test "$deplibs_check_method" != pass_all; then
+ # We're trying link a shared library against a static one
+ # but the system doesn't support it.
+
+ # Just print a warning and add the library to dependency_libs so
+ # that the program can be linked against the static library.
+ $echo
+ $echo "*** Warning: This system can not link to static lib archive $lib."
+ $echo "*** I have the capability to make that library automatically link in when"
+ $echo "*** you link to this library. But I can only do this if you have a"
+ $echo "*** shared version of the library, which you do not appear to have."
+ if test "$module" = yes; then
+ $echo "*** But as you try to build a module library, libtool will still create "
+ $echo "*** a static module, that should work as long as the dlopening application"
+ $echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
+ if test -z "$global_symbol_pipe"; then
+ $echo
+ $echo "*** However, this would only work if libtool was able to extract symbol"
+ $echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+ $echo "*** not find such a program. So, this module is probably useless."
+ $echo "*** \`nm' from GNU binutils and a full rebuild may help."
+ fi
+ if test "$build_old_libs" = no; then
+ build_libtool_libs=module
+ build_old_libs=yes
+ else
+ build_libtool_libs=no
+ fi
+ fi
+ else
+ convenience="$convenience $dir/$old_library"
+ old_convenience="$old_convenience $dir/$old_library"
+ deplibs="$dir/$old_library $deplibs"
+ link_static=yes
+ fi
+ fi # link shared/static library?
+
+ if test "$linkmode" = lib; then
+ if test -n "$dependency_libs" &&
+ { test "$hardcode_into_libs" != yes ||
+ test "$build_old_libs" = yes ||
+ test "$link_static" = yes; }; then
+ # Extract -R from dependency_libs
+ temp_deplibs=
+ for libdir in $dependency_libs; do
+ case $libdir in
+ -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'`
+ case " $xrpath " in
+ *" $temp_xrpath "*) ;;
+ *) xrpath="$xrpath $temp_xrpath";;
+ esac;;
+ *) temp_deplibs="$temp_deplibs $libdir";;
+ esac
+ done
+ dependency_libs="$temp_deplibs"
+ fi
+
+ newlib_search_path="$newlib_search_path $absdir"
+ # Link against this library
+ test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+ # ... and its dependency_libs
+ tmp_libs=
+ for deplib in $dependency_libs; do
+ newdependency_libs="$deplib $newdependency_libs"
+ if test "X$duplicate_deps" = "Xyes" ; then
+ case "$tmp_libs " in
+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ esac
+ fi
+ tmp_libs="$tmp_libs $deplib"
+ done
+
+ if test "$link_all_deplibs" != no; then
+ # Add the search paths of all dependency libraries
+ for deplib in $dependency_libs; do
+ case $deplib in
+ -L*) path="$deplib" ;;
+ *.la)
+ dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$dir" = "X$deplib" && dir="."
+ # We need an absolute path.
+ case $dir in
+ [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+ *)
+ absdir=`cd "$dir" && pwd`
+ if test -z "$absdir"; then
+ $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2
+ absdir="$dir"
+ fi
+ ;;
+ esac
+ if grep "^installed=no" $deplib > /dev/null; then
+ path="$absdir/$objdir"
+ else
+ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+ if test -z "$libdir"; then
+ $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ if test "$absdir" != "$libdir"; then
+ $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2
+ fi
+ path="$absdir"
+ fi
+ depdepl=
+ case $host in
+ *-*-darwin*)
+ # we do not want to link against static libs,
+ # but need to link against shared
+ eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
+ if test -n "$deplibrary_names" ; then
+ for tmp in $deplibrary_names ; do
+ depdepl=$tmp
+ done
+ if test -f "$path/$depdepl" ; then
+ depdepl="$path/$depdepl"
+ fi
+ # do not add paths which are already there
+ case " $newlib_search_path " in
+ *" $path "*) ;;
+ *) newlib_search_path="$newlib_search_path $path";;
+ esac
+ fi
+ path=""
+ ;;
+ *)
+ path="-L$path"
+ ;;
+ esac
+ ;;
+ -l*)
+ case $host in
+ *-*-darwin*)
+ # Again, we only want to link against shared libraries
+ eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"`
+ for tmp in $newlib_search_path ; do
+ if test -f "$tmp/lib$tmp_libs.dylib" ; then
+ eval depdepl="$tmp/lib$tmp_libs.dylib"
+ break
+ fi
+ done
+ path=""
+ ;;
+ *) continue ;;
+ esac
+ ;;
+ *) continue ;;
+ esac
+ case " $deplibs " in
+ *" $depdepl "*) ;;
+ *) deplibs="$depdepl $deplibs" ;;
+ esac
+ case " $deplibs " in
+ *" $path "*) ;;
+ *) deplibs="$deplibs $path" ;;
+ esac
+ done
+ fi # link_all_deplibs != no
+ fi # linkmode = lib
+ done # for deplib in $libs
+ dependency_libs="$newdependency_libs"
+ if test "$pass" = dlpreopen; then
+ # Link the dlpreopened libraries before other libraries
+ for deplib in $save_deplibs; do
+ deplibs="$deplib $deplibs"
+ done
+ fi
+ if test "$pass" != dlopen; then
+ if test "$pass" != conv; then
+ # Make sure lib_search_path contains only unique directories.
+ lib_search_path=
+ for dir in $newlib_search_path; do
+ case "$lib_search_path " in
+ *" $dir "*) ;;
+ *) lib_search_path="$lib_search_path $dir" ;;
+ esac
+ done
+ newlib_search_path=
+ fi
+
+ if test "$linkmode,$pass" != "prog,link"; then
+ vars="deplibs"
+ else
+ vars="compile_deplibs finalize_deplibs"
+ fi
+ for var in $vars dependency_libs; do
+ # Add libraries to $var in reverse order
+ eval tmp_libs=\"\$$var\"
+ new_libs=
+ for deplib in $tmp_libs; do
+ # FIXME: Pedantically, this is the right thing to do, so
+ # that some nasty dependency loop isn't accidentally
+ # broken:
+ #new_libs="$deplib $new_libs"
+ # Pragmatically, this seems to cause very few problems in
+ # practice:
+ case $deplib in
+ -L*) new_libs="$deplib $new_libs" ;;
+ -R*) ;;
+ *)
+ # And here is the reason: when a library appears more
+ # than once as an explicit dependence of a library, or
+ # is implicitly linked in more than once by the
+ # compiler, it is considered special, and multiple
+ # occurrences thereof are not removed. Compare this
+ # with having the same library being listed as a
+ # dependency of multiple other libraries: in this case,
+ # we know (pedantically, we assume) the library does not
+ # need to be listed more than once, so we keep only the
+ # last copy. This is not always right, but it is rare
+ # enough that we require users that really mean to play
+ # such unportable linking tricks to link the library
+ # using -Wl,-lname, so that libtool does not consider it
+ # for duplicate removal.
+ case " $specialdeplibs " in
+ *" $deplib "*) new_libs="$deplib $new_libs" ;;
+ *)
+ case " $new_libs " in
+ *" $deplib "*) ;;
+ *) new_libs="$deplib $new_libs" ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ done
+ tmp_libs=
+ for deplib in $new_libs; do
+ case $deplib in
+ -L*)
+ case " $tmp_libs " in
+ *" $deplib "*) ;;
+ *) tmp_libs="$tmp_libs $deplib" ;;
+ esac
+ ;;
+ *) tmp_libs="$tmp_libs $deplib" ;;
+ esac
+ done
+ eval $var=\"$tmp_libs\"
+ done # for var
+ fi
+ # Last step: remove runtime libs from dependency_libs
+ # (they stay in deplibs)
+ tmp_libs=
+ for i in $dependency_libs ; do
+ case " $predeps $postdeps $compiler_lib_search_path " in
+ *" $i "*)
+ i=""
+ ;;
+ esac
+ if test -n "$i" ; then
+ tmp_libs="$tmp_libs $i"
+ fi
+ done
+ dependency_libs=$tmp_libs
+ done # for pass
+ if test "$linkmode" = prog; then
+ dlfiles="$newdlfiles"
+ dlprefiles="$newdlprefiles"
+ fi
+
+ case $linkmode in
+ oldlib)
+ if test -n "$deplibs"; then
+ $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2
+ fi
+
+ if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+ $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2
+ fi
+
+ if test -n "$rpath"; then
+ $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2
+ fi
+
+ if test -n "$xrpath"; then
+ $echo "$modename: warning: \`-R' is ignored for archives" 1>&2
+ fi
+
+ if test -n "$vinfo"; then
+ $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2
+ fi
+
+ if test -n "$release"; then
+ $echo "$modename: warning: \`-release' is ignored for archives" 1>&2
+ fi
+
+ if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+ $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2
+ fi
+
+ # Now set the variables for building old libraries.
+ build_libtool_libs=no
+ oldlibs="$output"
+ objs="$objs$old_deplibs"
+ ;;
+
+ lib)
+ # Make sure we only generate libraries of the form `libNAME.la'.
+ case $outputname in
+ lib*)
+ name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
+ eval shared_ext=\"$shrext_cmds\"
+ eval libname=\"$libname_spec\"
+ ;;
+ *)
+ if test "$module" = no; then
+ $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ if test "$need_lib_prefix" != no; then
+ # Add the "lib" prefix for modules if required
+ name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
+ eval shared_ext=\"$shrext_cmds\"
+ eval libname=\"$libname_spec\"
+ else
+ libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
+ fi
+ ;;
+ esac
+
+ if test -n "$objs"; then
+ if test "$deplibs_check_method" != pass_all; then
+ $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1
+ exit $EXIT_FAILURE
+ else
+ $echo
+ $echo "*** Warning: Linking the shared library $output against the non-libtool"
+ $echo "*** objects $objs is not portable!"
+ libobjs="$libobjs $objs"
+ fi
+ fi
+
+ if test "$dlself" != no; then
+ $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2
+ fi
+
+ set dummy $rpath
+ if test "$#" -gt 2; then
+ $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2
+ fi
+ install_libdir="$2"
+
+ oldlibs=
+ if test -z "$rpath"; then
+ if test "$build_libtool_libs" = yes; then
+ # Building a libtool convenience library.
+ # Some compilers have problems with a `.al' extension so
+ # convenience libraries should have the same extension an
+ # archive normally would.
+ oldlibs="$output_objdir/$libname.$libext $oldlibs"
+ build_libtool_libs=convenience
+ build_old_libs=yes
+ fi
+
+ if test -n "$vinfo"; then
+ $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2
+ fi
+
+ if test -n "$release"; then
+ $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2
+ fi
+ else
+
+ # Parse the version information argument.
+ save_ifs="$IFS"; IFS=':'
+ set dummy $vinfo 0 0 0
+ IFS="$save_ifs"
+
+ if test -n "$8"; then
+ $echo "$modename: too many parameters to \`-version-info'" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # convert absolute version numbers to libtool ages
+ # this retains compatibility with .la files and attempts
+ # to make the code below a bit more comprehensible
+
+ case $vinfo_number in
+ yes)
+ number_major="$2"
+ number_minor="$3"
+ number_revision="$4"
+ #
+ # There are really only two kinds -- those that
+ # use the current revision as the major version
+ # and those that subtract age and use age as
+ # a minor version. But, then there is irix
+ # which has an extra 1 added just for fun
+ #
+ case $version_type in
+ darwin|linux|osf|windows)
+ current=`expr $number_major + $number_minor`
+ age="$number_minor"
+ revision="$number_revision"
+ ;;
+ freebsd-aout|freebsd-elf|sunos)
+ current="$number_major"
+ revision="$number_minor"
+ age="0"
+ ;;
+ irix|nonstopux)
+ current=`expr $number_major + $number_minor - 1`
+ age="$number_minor"
+ revision="$number_minor"
+ ;;
+ esac
+ ;;
+ no)
+ current="$2"
+ revision="$3"
+ age="$4"
+ ;;
+ esac
+
+ # Check that each of the things are valid numbers.
+ case $current in
+ [0-9]*) ;;
+ *)
+ $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2
+ $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ case $revision in
+ [0-9]*) ;;
+ *)
+ $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2
+ $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ case $age in
+ [0-9]*) ;;
+ *)
+ $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2
+ $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ if test "$age" -gt "$current"; then
+ $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2
+ $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Calculate the version variables.
+ major=
+ versuffix=
+ verstring=
+ case $version_type in
+ none) ;;
+
+ darwin)
+ # Like Linux, but with the current version available in
+ # verstring for coding it into the library header
+ major=.`expr $current - $age`
+ versuffix="$major.$age.$revision"
+ # Darwin ld doesn't like 0 for these options...
+ minor_current=`expr $current + 1`
+ verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+ ;;
+
+ freebsd-aout)
+ major=".$current"
+ versuffix=".$current.$revision";
+ ;;
+
+ freebsd-elf)
+ major=".$current"
+ versuffix=".$current";
+ ;;
+
+ irix | nonstopux)
+ major=`expr $current - $age + 1`
+
+ case $version_type in
+ nonstopux) verstring_prefix=nonstopux ;;
+ *) verstring_prefix=sgi ;;
+ esac
+ verstring="$verstring_prefix$major.$revision"
+
+ # Add in all the interfaces that we are compatible with.
+ loop=$revision
+ while test "$loop" -ne 0; do
+ iface=`expr $revision - $loop`
+ loop=`expr $loop - 1`
+ verstring="$verstring_prefix$major.$iface:$verstring"
+ done
+
+ # Before this point, $major must not contain `.'.
+ major=.$major
+ versuffix="$major.$revision"
+ ;;
+
+ linux)
+ major=.`expr $current - $age`
+ versuffix="$major.$age.$revision"
+ ;;
+
+ osf)
+ major=.`expr $current - $age`
+ versuffix=".$current.$age.$revision"
+ verstring="$current.$age.$revision"
+
+ # Add in all the interfaces that we are compatible with.
+ loop=$age
+ while test "$loop" -ne 0; do
+ iface=`expr $current - $loop`
+ loop=`expr $loop - 1`
+ verstring="$verstring:${iface}.0"
+ done
+
+ # Make executables depend on our current version.
+ verstring="$verstring:${current}.0"
+ ;;
+
+ sunos)
+ major=".$current"
+ versuffix=".$current.$revision"
+ ;;
+
+ windows)
+ # Use '-' rather than '.', since we only want one
+ # extension on DOS 8.3 filesystems.
+ major=`expr $current - $age`
+ versuffix="-$major"
+ ;;
+
+ *)
+ $echo "$modename: unknown library version type \`$version_type'" 1>&2
+ $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ # Clear the version info if we defaulted, and they specified a release.
+ if test -z "$vinfo" && test -n "$release"; then
+ major=
+ case $version_type in
+ darwin)
+ # we can't check for "0.0" in archive_cmds due to quoting
+ # problems, so we reset it completely
+ verstring=
+ ;;
+ *)
+ verstring="0.0"
+ ;;
+ esac
+ if test "$need_version" = no; then
+ versuffix=
+ else
+ versuffix=".0.0"
+ fi
+ fi
+
+ # Remove version info from name if versioning should be avoided
+ if test "$avoid_version" = yes && test "$need_version" = no; then
+ major=
+ versuffix=
+ verstring=""
+ fi
+
+ # Check to see if the archive will have undefined symbols.
+ if test "$allow_undefined" = yes; then
+ if test "$allow_undefined_flag" = unsupported; then
+ $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2
+ build_libtool_libs=no
+ build_old_libs=yes
+ fi
+ else
+ # Don't allow undefined symbols.
+ allow_undefined_flag="$no_undefined_flag"
+ fi
+ fi
+
+ if test "$mode" != relink; then
+ # Remove our outputs, but don't remove object files since they
+ # may have been created when compiling PIC objects.
+ removelist=
+ tempremovelist=`$echo "$output_objdir/*"`
+ for p in $tempremovelist; do
+ case $p in
+ *.$objext)
+ ;;
+ $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
+ if test "X$precious_files_regex" != "X"; then
+ if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
+ then
+ continue
+ fi
+ fi
+ removelist="$removelist $p"
+ ;;
+ *) ;;
+ esac
+ done
+ if test -n "$removelist"; then
+ $show "${rm}r $removelist"
+ $run ${rm}r $removelist
+ fi
+ fi
+
+ # Now set the variables for building old libraries.
+ if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+ oldlibs="$oldlibs $output_objdir/$libname.$libext"
+
+ # Transform .lo files to .o files.
+ oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP`
+ fi
+
+ # Eliminate all temporary directories.
+ for path in $notinst_path; do
+ lib_search_path=`$echo "$lib_search_path " | ${SED} -e 's% $path % %g'`
+ deplibs=`$echo "$deplibs " | ${SED} -e 's% -L$path % %g'`
+ dependency_libs=`$echo "$dependency_libs " | ${SED} -e 's% -L$path % %g'`
+ done
+
+ if test -n "$xrpath"; then
+ # If the user specified any rpath flags, then add them.
+ temp_xrpath=
+ for libdir in $xrpath; do
+ temp_xrpath="$temp_xrpath -R$libdir"
+ case "$finalize_rpath " in
+ *" $libdir "*) ;;
+ *) finalize_rpath="$finalize_rpath $libdir" ;;
+ esac
+ done
+ if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
+ dependency_libs="$temp_xrpath $dependency_libs"
+ fi
+ fi
+
+ # Make sure dlfiles contains only unique files that won't be dlpreopened
+ old_dlfiles="$dlfiles"
+ dlfiles=
+ for lib in $old_dlfiles; do
+ case " $dlprefiles $dlfiles " in
+ *" $lib "*) ;;
+ *) dlfiles="$dlfiles $lib" ;;
+ esac
+ done
+
+ # Make sure dlprefiles contains only unique files
+ old_dlprefiles="$dlprefiles"
+ dlprefiles=
+ for lib in $old_dlprefiles; do
+ case "$dlprefiles " in
+ *" $lib "*) ;;
+ *) dlprefiles="$dlprefiles $lib" ;;
+ esac
+ done
+
+ if test "$build_libtool_libs" = yes; then
+ if test -n "$rpath"; then
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*)
+ # these systems don't actually have a c library (as such)!
+ ;;
+ *-*-rhapsody* | *-*-darwin1.[012])
+ # Rhapsody C library is in the System framework
+ deplibs="$deplibs -framework System"
+ ;;
+ *-*-netbsd*)
+ # Don't link with libc until the a.out ld.so is fixed.
+ ;;
+ *-*-openbsd* | *-*-freebsd*)
+ # Do not include libc due to us having libc/libc_r.
+ test "X$arg" = "X-lc" && continue
+ ;;
+ *)
+ # Add libc to deplibs on all other systems if necessary.
+ if test "$build_libtool_need_lc" = "yes"; then
+ deplibs="$deplibs -lc"
+ fi
+ ;;
+ esac
+ fi
+
+ # Transform deplibs into only deplibs that can be linked in shared.
+ name_save=$name
+ libname_save=$libname
+ release_save=$release
+ versuffix_save=$versuffix
+ major_save=$major
+ # I'm not sure if I'm treating the release correctly. I think
+ # release should show up in the -l (ie -lgmp5) so we don't want to
+ # add it in twice. Is that correct?
+ release=""
+ versuffix=""
+ major=""
+ newdeplibs=
+ droppeddeps=no
+ case $deplibs_check_method in
+ pass_all)
+ # Don't check for shared/static. Everything works.
+ # This might be a little naive. We might want to check
+ # whether the library exists or not. But this is on
+ # osf3 & osf4 and I'm not really sure... Just
+ # implementing what was already the behavior.
+ newdeplibs=$deplibs
+ ;;
+ test_compile)
+ # This code stresses the "libraries are programs" paradigm to its
+ # limits. Maybe even breaks it. We compile a program, linking it
+ # against the deplibs as a proxy for the library. Then we can check
+ # whether they linked in statically or dynamically with ldd.
+ $rm conftest.c
+ cat > conftest.c <<EOF
+ int main() { return 0; }
+EOF
+ $rm conftest
+ $LTCC -o conftest conftest.c $deplibs
+ if test "$?" -eq 0 ; then
+ ldd_output=`ldd conftest`
+ for i in $deplibs; do
+ name="`expr $i : '-l\(.*\)'`"
+ # If $name is empty we are operating on a -L argument.
+ if test "$name" != "" && test "$name" -ne "0"; then
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ case " $predeps $postdeps " in
+ *" $i "*)
+ newdeplibs="$newdeplibs $i"
+ i=""
+ ;;
+ esac
+ fi
+ if test -n "$i" ; then
+ libname=`eval \\$echo \"$libname_spec\"`
+ deplib_matches=`eval \\$echo \"$library_names_spec\"`
+ set dummy $deplib_matches
+ deplib_match=$2
+ if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+ newdeplibs="$newdeplibs $i"
+ else
+ droppeddeps=yes
+ $echo
+ $echo "*** Warning: dynamic linker does not accept needed library $i."
+ $echo "*** I have the capability to make that library automatically link in when"
+ $echo "*** you link to this library. But I can only do this if you have a"
+ $echo "*** shared version of the library, which I believe you do not have"
+ $echo "*** because a test_compile did reveal that the linker did not use it for"
+ $echo "*** its dynamic dependency list that programs get resolved with at runtime."
+ fi
+ fi
+ else
+ newdeplibs="$newdeplibs $i"
+ fi
+ done
+ else
+ # Error occurred in the first compile. Let's try to salvage
+ # the situation: Compile a separate program for each library.
+ for i in $deplibs; do
+ name="`expr $i : '-l\(.*\)'`"
+ # If $name is empty we are operating on a -L argument.
+ if test "$name" != "" && test "$name" != "0"; then
+ $rm conftest
+ $LTCC -o conftest conftest.c $i
+ # Did it work?
+ if test "$?" -eq 0 ; then
+ ldd_output=`ldd conftest`
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ case " $predeps $postdeps " in
+ *" $i "*)
+ newdeplibs="$newdeplibs $i"
+ i=""
+ ;;
+ esac
+ fi
+ if test -n "$i" ; then
+ libname=`eval \\$echo \"$libname_spec\"`
+ deplib_matches=`eval \\$echo \"$library_names_spec\"`
+ set dummy $deplib_matches
+ deplib_match=$2
+ if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+ newdeplibs="$newdeplibs $i"
+ else
+ droppeddeps=yes
+ $echo
+ $echo "*** Warning: dynamic linker does not accept needed library $i."
+ $echo "*** I have the capability to make that library automatically link in when"
+ $echo "*** you link to this library. But I can only do this if you have a"
+ $echo "*** shared version of the library, which you do not appear to have"
+ $echo "*** because a test_compile did reveal that the linker did not use this one"
+ $echo "*** as a dynamic dependency that programs can get resolved with at runtime."
+ fi
+ fi
+ else
+ droppeddeps=yes
+ $echo
+ $echo "*** Warning! Library $i is needed by this library but I was not able to"
+ $echo "*** make it link in! You will probably need to install it or some"
+ $echo "*** library that it depends on before this library will be fully"
+ $echo "*** functional. Installing it before continuing would be even better."
+ fi
+ else
+ newdeplibs="$newdeplibs $i"
+ fi
+ done
+ fi
+ ;;
+ file_magic*)
+ set dummy $deplibs_check_method
+ file_magic_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
+ for a_deplib in $deplibs; do
+ name="`expr $a_deplib : '-l\(.*\)'`"
+ # If $name is empty we are operating on a -L argument.
+ if test "$name" != "" && test "$name" != "0"; then
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ case " $predeps $postdeps " in
+ *" $a_deplib "*)
+ newdeplibs="$newdeplibs $a_deplib"
+ a_deplib=""
+ ;;
+ esac
+ fi
+ if test -n "$a_deplib" ; then
+ libname=`eval \\$echo \"$libname_spec\"`
+ for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+ potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+ for potent_lib in $potential_libs; do
+ # Follow soft links.
+ if ls -lLd "$potent_lib" 2>/dev/null \
+ | grep " -> " >/dev/null; then
+ continue
+ fi
+ # The statement above tries to avoid entering an
+ # endless loop below, in case of cyclic links.
+ # We might still enter an endless loop, since a link
+ # loop can be closed while we follow links,
+ # but so what?
+ potlib="$potent_lib"
+ while test -h "$potlib" 2>/dev/null; do
+ potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
+ case $potliblink in
+ [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
+ *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";;
+ esac
+ done
+ if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \
+ | ${SED} 10q \
+ | $EGREP "$file_magic_regex" > /dev/null; then
+ newdeplibs="$newdeplibs $a_deplib"
+ a_deplib=""
+ break 2
+ fi
+ done
+ done
+ fi
+ if test -n "$a_deplib" ; then
+ droppeddeps=yes
+ $echo
+ $echo "*** Warning: linker path does not have real file for library $a_deplib."
+ $echo "*** I have the capability to make that library automatically link in when"
+ $echo "*** you link to this library. But I can only do this if you have a"
+ $echo "*** shared version of the library, which you do not appear to have"
+ $echo "*** because I did check the linker path looking for a file starting"
+ if test -z "$potlib" ; then
+ $echo "*** with $libname but no candidates were found. (...for file magic test)"
+ else
+ $echo "*** with $libname and none of the candidates passed a file format test"
+ $echo "*** using a file magic. Last file checked: $potlib"
+ fi
+ fi
+ else
+ # Add a -L argument.
+ newdeplibs="$newdeplibs $a_deplib"
+ fi
+ done # Gone through all deplibs.
+ ;;
+ match_pattern*)
+ set dummy $deplibs_check_method
+ match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
+ for a_deplib in $deplibs; do
+ name="`expr $a_deplib : '-l\(.*\)'`"
+ # If $name is empty we are operating on a -L argument.
+ if test -n "$name" && test "$name" != "0"; then
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ case " $predeps $postdeps " in
+ *" $a_deplib "*)
+ newdeplibs="$newdeplibs $a_deplib"
+ a_deplib=""
+ ;;
+ esac
+ fi
+ if test -n "$a_deplib" ; then
+ libname=`eval \\$echo \"$libname_spec\"`
+ for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+ potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+ for potent_lib in $potential_libs; do
+ potlib="$potent_lib" # see symlink-check above in file_magic test
+ if eval $echo \"$potent_lib\" 2>/dev/null \
+ | ${SED} 10q \
+ | $EGREP "$match_pattern_regex" > /dev/null; then
+ newdeplibs="$newdeplibs $a_deplib"
+ a_deplib=""
+ break 2
+ fi
+ done
+ done
+ fi
+ if test -n "$a_deplib" ; then
+ droppeddeps=yes
+ $echo
+ $echo "*** Warning: linker path does not have real file for library $a_deplib."
+ $echo "*** I have the capability to make that library automatically link in when"
+ $echo "*** you link to this library. But I can only do this if you have a"
+ $echo "*** shared version of the library, which you do not appear to have"
+ $echo "*** because I did check the linker path looking for a file starting"
+ if test -z "$potlib" ; then
+ $echo "*** with $libname but no candidates were found. (...for regex pattern test)"
+ else
+ $echo "*** with $libname and none of the candidates passed a file format test"
+ $echo "*** using a regex pattern. Last file checked: $potlib"
+ fi
+ fi
+ else
+ # Add a -L argument.
+ newdeplibs="$newdeplibs $a_deplib"
+ fi
+ done # Gone through all deplibs.
+ ;;
+ none | unknown | *)
+ newdeplibs=""
+ tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \
+ -e 's/ -[LR][^ ]*//g'`
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ for i in $predeps $postdeps ; do
+ # can't use Xsed below, because $i might contain '/'
+ tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"`
+ done
+ fi
+ if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \
+ | grep . >/dev/null; then
+ $echo
+ if test "X$deplibs_check_method" = "Xnone"; then
+ $echo "*** Warning: inter-library dependencies are not supported in this platform."
+ else
+ $echo "*** Warning: inter-library dependencies are not known to be supported."
+ fi
+ $echo "*** All declared inter-library dependencies are being dropped."
+ droppeddeps=yes
+ fi
+ ;;
+ esac
+ versuffix=$versuffix_save
+ major=$major_save
+ release=$release_save
+ libname=$libname_save
+ name=$name_save
+
+ case $host in
+ *-*-rhapsody* | *-*-darwin1.[012])
+ # On Rhapsody replace the C library is the System framework
+ newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'`
+ ;;
+ esac
+
+ if test "$droppeddeps" = yes; then
+ if test "$module" = yes; then
+ $echo
+ $echo "*** Warning: libtool could not satisfy all declared inter-library"
+ $echo "*** dependencies of module $libname. Therefore, libtool will create"
+ $echo "*** a static module, that should work as long as the dlopening"
+ $echo "*** application is linked with the -dlopen flag."
+ if test -z "$global_symbol_pipe"; then
+ $echo
+ $echo "*** However, this would only work if libtool was able to extract symbol"
+ $echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+ $echo "*** not find such a program. So, this module is probably useless."
+ $echo "*** \`nm' from GNU binutils and a full rebuild may help."
+ fi
+ if test "$build_old_libs" = no; then
+ oldlibs="$output_objdir/$libname.$libext"
+ build_libtool_libs=module
+ build_old_libs=yes
+ else
+ build_libtool_libs=no
+ fi
+ else
+ $echo "*** The inter-library dependencies that have been dropped here will be"
+ $echo "*** automatically added whenever a program is linked with this library"
+ $echo "*** or is declared to -dlopen it."
+
+ if test "$allow_undefined" = no; then
+ $echo
+ $echo "*** Since this library must not contain undefined symbols,"
+ $echo "*** because either the platform does not support them or"
+ $echo "*** it was explicitly requested with -no-undefined,"
+ $echo "*** libtool will only create a static version of it."
+ if test "$build_old_libs" = no; then
+ oldlibs="$output_objdir/$libname.$libext"
+ build_libtool_libs=module
+ build_old_libs=yes
+ else
+ build_libtool_libs=no
+ fi
+ fi
+ fi
+ fi
+ # Done checking deplibs!
+ deplibs=$newdeplibs
+ fi
+
+ # All the library-specific variables (install_libdir is set above).
+ library_names=
+ old_library=
+ dlname=
+
+ # Test again, we may have decided not to build it any more
+ if test "$build_libtool_libs" = yes; then
+ if test "$hardcode_into_libs" = yes; then
+ # Hardcode the library paths
+ hardcode_libdirs=
+ dep_rpath=
+ rpath="$finalize_rpath"
+ test "$mode" != relink && rpath="$compile_rpath$rpath"
+ for libdir in $rpath; do
+ if test -n "$hardcode_libdir_flag_spec"; then
+ if test -n "$hardcode_libdir_separator"; then
+ if test -z "$hardcode_libdirs"; then
+ hardcode_libdirs="$libdir"
+ else
+ # Just accumulate the unique libdirs.
+ case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+ *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+ ;;
+ *)
+ hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+ ;;
+ esac
+ fi
+ else
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ dep_rpath="$dep_rpath $flag"
+ fi
+ elif test -n "$runpath_var"; then
+ case "$perm_rpath " in
+ *" $libdir "*) ;;
+ *) perm_rpath="$perm_rpath $libdir" ;;
+ esac
+ fi
+ done
+ # Substitute the hardcoded libdirs into the rpath.
+ if test -n "$hardcode_libdir_separator" &&
+ test -n "$hardcode_libdirs"; then
+ libdir="$hardcode_libdirs"
+ if test -n "$hardcode_libdir_flag_spec_ld"; then
+ eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\"
+ else
+ eval dep_rpath=\"$hardcode_libdir_flag_spec\"
+ fi
+ fi
+ if test -n "$runpath_var" && test -n "$perm_rpath"; then
+ # We should set the runpath_var.
+ rpath=
+ for dir in $perm_rpath; do
+ rpath="$rpath$dir:"
+ done
+ eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
+ fi
+ test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
+ fi
+
+ shlibpath="$finalize_shlibpath"
+ test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+ if test -n "$shlibpath"; then
+ eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
+ fi
+
+ # Get the real and link names of the library.
+ eval shared_ext=\"$shrext_cmds\"
+ eval library_names=\"$library_names_spec\"
+ set dummy $library_names
+ realname="$2"
+ shift; shift
+
+ if test -n "$soname_spec"; then
+ eval soname=\"$soname_spec\"
+ else
+ soname="$realname"
+ fi
+ if test -z "$dlname"; then
+ dlname=$soname
+ fi
+
+ lib="$output_objdir/$realname"
+ for link
+ do
+ linknames="$linknames $link"
+ done
+
+ # Use standard objects if they are pic
+ test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+
+ # Prepare the list of exported symbols
+ if test -z "$export_symbols"; then
+ if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
+ $show "generating symbol list for \`$libname.la'"
+ export_symbols="$output_objdir/$libname.exp"
+ $run $rm $export_symbols
+ cmds=$export_symbols_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ if len=`expr "X$cmd" : ".*"` &&
+ test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ skipped_export=false
+ else
+ # The command line is too long to execute in one step.
+ $show "using reloadable object file for export list..."
+ skipped_export=:
+ fi
+ done
+ IFS="$save_ifs"
+ if test -n "$export_symbols_regex"; then
+ $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\""
+ $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+ $show "$mv \"${export_symbols}T\" \"$export_symbols\""
+ $run eval '$mv "${export_symbols}T" "$export_symbols"'
+ fi
+ fi
+ fi
+
+ if test -n "$export_symbols" && test -n "$include_expsyms"; then
+ $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"'
+ fi
+
+ tmp_deplibs=
+ for test_deplib in $deplibs; do
+ case " $convenience " in
+ *" $test_deplib "*) ;;
+ *)
+ tmp_deplibs="$tmp_deplibs $test_deplib"
+ ;;
+ esac
+ done
+ deplibs="$tmp_deplibs"
+
+ if test -n "$convenience"; then
+ if test -n "$whole_archive_flag_spec"; then
+ save_libobjs=$libobjs
+ eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+ else
+ gentop="$output_objdir/${outputname}x"
+ $show "${rm}r $gentop"
+ $run ${rm}r "$gentop"
+ $show "$mkdir $gentop"
+ $run $mkdir "$gentop"
+ status=$?
+ if test "$status" -ne 0 && test ! -d "$gentop"; then
+ exit $status
+ fi
+ generated="$generated $gentop"
+
+ for xlib in $convenience; do
+ # Extract the objects.
+ case $xlib in
+ [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;;
+ *) xabs=`pwd`"/$xlib" ;;
+ esac
+ xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'`
+ xdir="$gentop/$xlib"
+
+ $show "${rm}r $xdir"
+ $run ${rm}r "$xdir"
+ $show "$mkdir $xdir"
+ $run $mkdir "$xdir"
+ status=$?
+ if test "$status" -ne 0 && test ! -d "$xdir"; then
+ exit $status
+ fi
+ # We will extract separately just the conflicting names and we will no
+ # longer touch any unique names. It is faster to leave these extract
+ # automatically by $AR in one run.
+ $show "(cd $xdir && $AR x $xabs)"
+ $run eval "(cd \$xdir && $AR x \$xabs)" || exit $?
+ if ($AR t "$xabs" | sort | sort -uc >/dev/null 2>&1); then
+ :
+ else
+ $echo "$modename: warning: object name conflicts; renaming object files" 1>&2
+ $echo "$modename: warning: to ensure that they will not overwrite" 1>&2
+ $AR t "$xabs" | sort | uniq -cd | while read -r count name
+ do
+ i=1
+ while test "$i" -le "$count"
+ do
+ # Put our $i before any first dot (extension)
+ # Never overwrite any file
+ name_to="$name"
+ while test "X$name_to" = "X$name" || test -f "$xdir/$name_to"
+ do
+ name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"`
+ done
+ $show "(cd $xdir && $AR xN $i $xabs '$name' && $mv '$name' '$name_to')"
+ $run eval "(cd \$xdir && $AR xN $i \$xabs '$name' && $mv '$name' '$name_to')" || exit $?
+ i=`expr $i + 1`
+ done
+ done
+ fi
+
+ libobjs="$libobjs "`find $xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP`
+ done
+ fi
+ fi
+
+ if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+ eval flag=\"$thread_safe_flag_spec\"
+ linker_flags="$linker_flags $flag"
+ fi
+
+ # Make a backup of the uninstalled library when relinking
+ if test "$mode" = relink; then
+ $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $?
+ fi
+
+ # Do each of the archive commands.
+ if test "$module" = yes && test -n "$module_cmds" ; then
+ if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+ eval test_cmds=\"$module_expsym_cmds\"
+ cmds=$module_expsym_cmds
+ else
+ eval test_cmds=\"$module_cmds\"
+ cmds=$module_cmds
+ fi
+ else
+ if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+ eval test_cmds=\"$archive_expsym_cmds\"
+ cmds=$archive_expsym_cmds
+ else
+ eval test_cmds=\"$archive_cmds\"
+ cmds=$archive_cmds
+ fi
+ fi
+
+ if test "X$skipped_export" != "X:" && len=`expr "X$test_cmds" : ".*"` &&
+ test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+ :
+ else
+ # The command line is too long to link in one step, link piecewise.
+ $echo "creating reloadable object files..."
+
+ # Save the value of $output and $libobjs because we want to
+ # use them later. If we have whole_archive_flag_spec, we
+ # want to use save_libobjs as it was before
+ # whole_archive_flag_spec was expanded, because we can't
+ # assume the linker understands whole_archive_flag_spec.
+ # This may have to be revisited, in case too many
+ # convenience libraries get linked in and end up exceeding
+ # the spec.
+ if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
+ save_libobjs=$libobjs
+ fi
+ save_output=$output
+
+ # Clear the reloadable object creation command queue and
+ # initialize k to one.
+ test_cmds=
+ concat_cmds=
+ objlist=
+ delfiles=
+ last_robj=
+ k=1
+ output=$output_objdir/$save_output-${k}.$objext
+ # Loop over the list of objects to be linked.
+ for obj in $save_libobjs
+ do
+ eval test_cmds=\"$reload_cmds $objlist $last_robj\"
+ if test "X$objlist" = X ||
+ { len=`expr "X$test_cmds" : ".*"` &&
+ test "$len" -le "$max_cmd_len"; }; then
+ objlist="$objlist $obj"
+ else
+ # The command $test_cmds is almost too long, add a
+ # command to the queue.
+ if test "$k" -eq 1 ; then
+ # The first file doesn't have a previous command to add.
+ eval concat_cmds=\"$reload_cmds $objlist $last_robj\"
+ else
+ # All subsequent reloadable object files will link in
+ # the last one created.
+ eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\"
+ fi
+ last_robj=$output_objdir/$save_output-${k}.$objext
+ k=`expr $k + 1`
+ output=$output_objdir/$save_output-${k}.$objext
+ objlist=$obj
+ len=1
+ fi
+ done
+ # Handle the remaining objects by creating one last
+ # reloadable object file. All subsequent reloadable object
+ # files will link in the last one created.
+ test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+ eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\"
+
+ if ${skipped_export-false}; then
+ $show "generating symbol list for \`$libname.la'"
+ export_symbols="$output_objdir/$libname.exp"
+ $run $rm $export_symbols
+ libobjs=$output
+ # Append the command to create the export file.
+ eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\"
+ fi
+
+ # Set up a command to remove the reloadale object files
+ # after they are used.
+ i=0
+ while test "$i" -lt "$k"
+ do
+ i=`expr $i + 1`
+ delfiles="$delfiles $output_objdir/$save_output-${i}.$objext"
+ done
+
+ $echo "creating a temporary reloadable object file: $output"
+
+ # Loop through the commands generated above and execute them.
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $concat_cmds; do
+ IFS="$save_ifs"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+
+ libobjs=$output
+ # Restore the value of output.
+ output=$save_output
+
+ if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
+ eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+ fi
+ # Expand the library linking commands again to reset the
+ # value of $libobjs for piecewise linking.
+
+ # Do each of the archive commands.
+ if test "$module" = yes && test -n "$module_cmds" ; then
+ if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+ cmds=$module_expsym_cmds
+ else
+ cmds=$module_cmds
+ fi
+ else
+ if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+ cmds=$archive_expsym_cmds
+ else
+ cmds=$archive_cmds
+ fi
+ fi
+
+ # Append the command to remove the reloadable object files
+ # to the just-reset $cmds.
+ eval cmds=\"\$cmds~\$rm $delfiles\"
+ fi
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+
+ # Restore the uninstalled library and exit
+ if test "$mode" = relink; then
+ $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $?
+ exit $EXIT_SUCCESS
+ fi
+
+ # Create links to the real library.
+ for linkname in $linknames; do
+ if test "$realname" != "$linkname"; then
+ $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)"
+ $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $?
+ fi
+ done
+
+ # If -module or -export-dynamic was specified, set the dlname.
+ if test "$module" = yes || test "$export_dynamic" = yes; then
+ # On all known operating systems, these are identical.
+ dlname="$soname"
+ fi
+ fi
+ ;;
+
+ obj)
+ if test -n "$deplibs"; then
+ $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2
+ fi
+
+ if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+ $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2
+ fi
+
+ if test -n "$rpath"; then
+ $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2
+ fi
+
+ if test -n "$xrpath"; then
+ $echo "$modename: warning: \`-R' is ignored for objects" 1>&2
+ fi
+
+ if test -n "$vinfo"; then
+ $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2
+ fi
+
+ if test -n "$release"; then
+ $echo "$modename: warning: \`-release' is ignored for objects" 1>&2
+ fi
+
+ case $output in
+ *.lo)
+ if test -n "$objs$old_deplibs"; then
+ $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ libobj="$output"
+ obj=`$echo "X$output" | $Xsed -e "$lo2o"`
+ ;;
+ *)
+ libobj=
+ obj="$output"
+ ;;
+ esac
+
+ # Delete the old objects.
+ $run $rm $obj $libobj
+
+ # Objects from convenience libraries. This assumes
+ # single-version convenience libraries. Whenever we create
+ # different ones for PIC/non-PIC, this we'll have to duplicate
+ # the extraction.
+ reload_conv_objs=
+ gentop=
+ # reload_cmds runs $LD directly, so let us get rid of
+ # -Wl from whole_archive_flag_spec
+ wl=
+
+ if test -n "$convenience"; then
+ if test -n "$whole_archive_flag_spec"; then
+ eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\"
+ else
+ gentop="$output_objdir/${obj}x"
+ $show "${rm}r $gentop"
+ $run ${rm}r "$gentop"
+ $show "$mkdir $gentop"
+ $run $mkdir "$gentop"
+ status=$?
+ if test "$status" -ne 0 && test ! -d "$gentop"; then
+ exit $status
+ fi
+ generated="$generated $gentop"
+
+ for xlib in $convenience; do
+ # Extract the objects.
+ case $xlib in
+ [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;;
+ *) xabs=`pwd`"/$xlib" ;;
+ esac
+ xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'`
+ xdir="$gentop/$xlib"
+
+ $show "${rm}r $xdir"
+ $run ${rm}r "$xdir"
+ $show "$mkdir $xdir"
+ $run $mkdir "$xdir"
+ status=$?
+ if test "$status" -ne 0 && test ! -d "$xdir"; then
+ exit $status
+ fi
+ # We will extract separately just the conflicting names and we will no
+ # longer touch any unique names. It is faster to leave these extract
+ # automatically by $AR in one run.
+ $show "(cd $xdir && $AR x $xabs)"
+ $run eval "(cd \$xdir && $AR x \$xabs)" || exit $?
+ if ($AR t "$xabs" | sort | sort -uc >/dev/null 2>&1); then
+ :
+ else
+ $echo "$modename: warning: object name conflicts; renaming object files" 1>&2
+ $echo "$modename: warning: to ensure that they will not overwrite" 1>&2
+ $AR t "$xabs" | sort | uniq -cd | while read -r count name
+ do
+ i=1
+ while test "$i" -le "$count"
+ do
+ # Put our $i before any first dot (extension)
+ # Never overwrite any file
+ name_to="$name"
+ while test "X$name_to" = "X$name" || test -f "$xdir/$name_to"
+ do
+ name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"`
+ done
+ $show "(cd $xdir && $AR xN $i $xabs '$name' && $mv '$name' '$name_to')"
+ $run eval "(cd \$xdir && $AR xN $i \$xabs '$name' && $mv '$name' '$name_to')" || exit $?
+ i=`expr $i + 1`
+ done
+ done
+ fi
+
+ reload_conv_objs="$reload_objs "`find $xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP`
+ done
+ fi
+ fi
+
+ # Create the old-style object.
+ reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+
+ output="$obj"
+ cmds=$reload_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+
+ # Exit if we aren't doing a library object file.
+ if test -z "$libobj"; then
+ if test -n "$gentop"; then
+ $show "${rm}r $gentop"
+ $run ${rm}r $gentop
+ fi
+
+ exit $EXIT_SUCCESS
+ fi
+
+ if test "$build_libtool_libs" != yes; then
+ if test -n "$gentop"; then
+ $show "${rm}r $gentop"
+ $run ${rm}r $gentop
+ fi
+
+ # Create an invalid libtool object if no PIC, so that we don't
+ # accidentally link it into a program.
+ # $show "echo timestamp > $libobj"
+ # $run eval "echo timestamp > $libobj" || exit $?
+ exit $EXIT_SUCCESS
+ fi
+
+ if test -n "$pic_flag" || test "$pic_mode" != default; then
+ # Only do commands if we really have different PIC objects.
+ reload_objs="$libobjs $reload_conv_objs"
+ output="$libobj"
+ cmds=$reload_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ fi
+
+ if test -n "$gentop"; then
+ $show "${rm}r $gentop"
+ $run ${rm}r $gentop
+ fi
+
+ exit $EXIT_SUCCESS
+ ;;
+
+ prog)
+ case $host in
+ *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;;
+ esac
+ if test -n "$vinfo"; then
+ $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2
+ fi
+
+ if test -n "$release"; then
+ $echo "$modename: warning: \`-release' is ignored for programs" 1>&2
+ fi
+
+ if test "$preload" = yes; then
+ if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown &&
+ test "$dlopen_self_static" = unknown; then
+ $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support."
+ fi
+ fi
+
+ case $host in
+ *-*-rhapsody* | *-*-darwin1.[012])
+ # On Rhapsody replace the C library is the System framework
+ compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
+ finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
+ ;;
+ esac
+
+ case $host in
+ *darwin*)
+ # Don't allow lazy linking, it breaks C++ global constructors
+ if test "$tagname" = CXX ; then
+ compile_command="$compile_command ${wl}-bind_at_load"
+ finalize_command="$finalize_command ${wl}-bind_at_load"
+ fi
+ ;;
+ esac
+
+ compile_command="$compile_command $compile_deplibs"
+ finalize_command="$finalize_command $finalize_deplibs"
+
+ if test -n "$rpath$xrpath"; then
+ # If the user specified any rpath flags, then add them.
+ for libdir in $rpath $xrpath; do
+ # This is the magic to use -rpath.
+ case "$finalize_rpath " in
+ *" $libdir "*) ;;
+ *) finalize_rpath="$finalize_rpath $libdir" ;;
+ esac
+ done
+ fi
+
+ # Now hardcode the library paths
+ rpath=
+ hardcode_libdirs=
+ for libdir in $compile_rpath $finalize_rpath; do
+ if test -n "$hardcode_libdir_flag_spec"; then
+ if test -n "$hardcode_libdir_separator"; then
+ if test -z "$hardcode_libdirs"; then
+ hardcode_libdirs="$libdir"
+ else
+ # Just accumulate the unique libdirs.
+ case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+ *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+ ;;
+ *)
+ hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+ ;;
+ esac
+ fi
+ else
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ rpath="$rpath $flag"
+ fi
+ elif test -n "$runpath_var"; then
+ case "$perm_rpath " in
+ *" $libdir "*) ;;
+ *) perm_rpath="$perm_rpath $libdir" ;;
+ esac
+ fi
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+ case :$dllsearchpath: in
+ *":$libdir:"*) ;;
+ *) dllsearchpath="$dllsearchpath:$libdir";;
+ esac
+ ;;
+ esac
+ done
+ # Substitute the hardcoded libdirs into the rpath.
+ if test -n "$hardcode_libdir_separator" &&
+ test -n "$hardcode_libdirs"; then
+ libdir="$hardcode_libdirs"
+ eval rpath=\" $hardcode_libdir_flag_spec\"
+ fi
+ compile_rpath="$rpath"
+
+ rpath=
+ hardcode_libdirs=
+ for libdir in $finalize_rpath; do
+ if test -n "$hardcode_libdir_flag_spec"; then
+ if test -n "$hardcode_libdir_separator"; then
+ if test -z "$hardcode_libdirs"; then
+ hardcode_libdirs="$libdir"
+ else
+ # Just accumulate the unique libdirs.
+ case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+ *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+ ;;
+ *)
+ hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+ ;;
+ esac
+ fi
+ else
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ rpath="$rpath $flag"
+ fi
+ elif test -n "$runpath_var"; then
+ case "$finalize_perm_rpath " in
+ *" $libdir "*) ;;
+ *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
+ esac
+ fi
+ done
+ # Substitute the hardcoded libdirs into the rpath.
+ if test -n "$hardcode_libdir_separator" &&
+ test -n "$hardcode_libdirs"; then
+ libdir="$hardcode_libdirs"
+ eval rpath=\" $hardcode_libdir_flag_spec\"
+ fi
+ finalize_rpath="$rpath"
+
+ if test -n "$libobjs" && test "$build_old_libs" = yes; then
+ # Transform all the library objects into standard objects.
+ compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+ finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+ fi
+
+ dlsyms=
+ if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+ if test -n "$NM" && test -n "$global_symbol_pipe"; then
+ dlsyms="${outputname}S.c"
+ else
+ $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2
+ fi
+ fi
+
+ if test -n "$dlsyms"; then
+ case $dlsyms in
+ "") ;;
+ *.c)
+ # Discover the nlist of each of the dlfiles.
+ nlist="$output_objdir/${outputname}.nm"
+
+ $show "$rm $nlist ${nlist}S ${nlist}T"
+ $run $rm "$nlist" "${nlist}S" "${nlist}T"
+
+ # Parse the name list into a source file.
+ $show "creating $output_objdir/$dlsyms"
+
+ test -z "$run" && $echo > "$output_objdir/$dlsyms" "\
+/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */
+/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+/* Prevent the only kind of declaration conflicts we can make. */
+#define lt_preloaded_symbols some_other_symbol
+
+/* External symbol declarations for the compiler. */\
+"
+
+ if test "$dlself" = yes; then
+ $show "generating symbol list for \`$output'"
+
+ test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist"
+
+ # Add our own program objects to the symbol list.
+ progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+ for arg in $progfiles; do
+ $show "extracting global C symbols from \`$arg'"
+ $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
+ done
+
+ if test -n "$exclude_expsyms"; then
+ $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
+ $run eval '$mv "$nlist"T "$nlist"'
+ fi
+
+ if test -n "$export_symbols_regex"; then
+ $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
+ $run eval '$mv "$nlist"T "$nlist"'
+ fi
+
+ # Prepare the list of exported symbols
+ if test -z "$export_symbols"; then
+ export_symbols="$output_objdir/$output.exp"
+ $run $rm $export_symbols
+ $run eval "${SED} -n -e '/^: @PROGRAM@$/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+ else
+ $run eval "${SED} -e 's/\([][.*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$output.exp"'
+ $run eval 'grep -f "$output_objdir/$output.exp" < "$nlist" > "$nlist"T'
+ $run eval 'mv "$nlist"T "$nlist"'
+ fi
+ fi
+
+ for arg in $dlprefiles; do
+ $show "extracting global C symbols from \`$arg'"
+ name=`$echo "$arg" | ${SED} -e 's%^.*/%%'`
+ $run eval '$echo ": $name " >> "$nlist"'
+ $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
+ done
+
+ if test -z "$run"; then
+ # Make sure we have at least an empty file.
+ test -f "$nlist" || : > "$nlist"
+
+ if test -n "$exclude_expsyms"; then
+ $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
+ $mv "$nlist"T "$nlist"
+ fi
+
+ # Try sorting and uniquifying the output.
+ if grep -v "^: " < "$nlist" |
+ if sort -k 3 </dev/null >/dev/null 2>&1; then
+ sort -k 3
+ else
+ sort +2
+ fi |
+ uniq > "$nlist"S; then
+ :
+ else
+ grep -v "^: " < "$nlist" > "$nlist"S
+ fi
+
+ if test -f "$nlist"S; then
+ eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"'
+ else
+ $echo '/* NONE */' >> "$output_objdir/$dlsyms"
+ fi
+
+ $echo >> "$output_objdir/$dlsyms" "\
+
+#undef lt_preloaded_symbols
+
+#if defined (__STDC__) && __STDC__
+# define lt_ptr void *
+#else
+# define lt_ptr char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+ const char *name;
+ lt_ptr address;
+}
+lt_preloaded_symbols[] =
+{\
+"
+
+ eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms"
+
+ $echo >> "$output_objdir/$dlsyms" "\
+ {0, (lt_ptr) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+ return lt_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif\
+"
+ fi
+
+ pic_flag_for_symtable=
+ case $host in
+ # compiling the symbol table file with pic_flag works around
+ # a FreeBSD bug that causes programs to crash when -lm is
+ # linked before any other PIC object. But we must not use
+ # pic_flag when linking with -static. The problem exists in
+ # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
+ *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+ case "$compile_command " in
+ *" -static "*) ;;
+ *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";;
+ esac;;
+ *-*-hpux*)
+ case "$compile_command " in
+ *" -static "*) ;;
+ *) pic_flag_for_symtable=" $pic_flag";;
+ esac
+ esac
+
+ # Now compile the dynamic symbol file.
+ $show "(cd $output_objdir && $LTCC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")"
+ $run eval '(cd $output_objdir && $LTCC -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $?
+
+ # Clean up the generated files.
+ $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T"
+ $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T"
+
+ # Transform the symbol file into the correct name.
+ compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+ finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+ ;;
+ *)
+ $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+ else
+ # We keep going just in case the user didn't refer to
+ # lt_preloaded_symbols. The linker will fail if global_symbol_pipe
+ # really was required.
+
+ # Nullify the symbol file.
+ compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
+ finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
+ fi
+
+ if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
+ # Replace the output file specification.
+ compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+ link_command="$compile_command$compile_rpath"
+
+ # We have no uninstalled library dependencies, so finalize right now.
+ $show "$link_command"
+ $run eval "$link_command"
+ status=$?
+
+ # Delete the generated files.
+ if test -n "$dlsyms"; then
+ $show "$rm $output_objdir/${outputname}S.${objext}"
+ $run $rm "$output_objdir/${outputname}S.${objext}"
+ fi
+
+ exit $status
+ fi
+
+ if test -n "$shlibpath_var"; then
+ # We should set the shlibpath_var
+ rpath=
+ for dir in $temp_rpath; do
+ case $dir in
+ [\\/]* | [A-Za-z]:[\\/]*)
+ # Absolute path.
+ rpath="$rpath$dir:"
+ ;;
+ *)
+ # Relative path: add a thisdir entry.
+ rpath="$rpath\$thisdir/$dir:"
+ ;;
+ esac
+ done
+ temp_rpath="$rpath"
+ fi
+
+ if test -n "$compile_shlibpath$finalize_shlibpath"; then
+ compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
+ fi
+ if test -n "$finalize_shlibpath"; then
+ finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
+ fi
+
+ compile_var=
+ finalize_var=
+ if test -n "$runpath_var"; then
+ if test -n "$perm_rpath"; then
+ # We should set the runpath_var.
+ rpath=
+ for dir in $perm_rpath; do
+ rpath="$rpath$dir:"
+ done
+ compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
+ fi
+ if test -n "$finalize_perm_rpath"; then
+ # We should set the runpath_var.
+ rpath=
+ for dir in $finalize_perm_rpath; do
+ rpath="$rpath$dir:"
+ done
+ finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
+ fi
+ fi
+
+ if test "$no_install" = yes; then
+ # We don't need to create a wrapper script.
+ link_command="$compile_var$compile_command$compile_rpath"
+ # Replace the output file specification.
+ link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+ # Delete the old output file.
+ $run $rm $output
+ # Link the executable and exit
+ $show "$link_command"
+ $run eval "$link_command" || exit $?
+ exit $EXIT_SUCCESS
+ fi
+
+ if test "$hardcode_action" = relink; then
+ # Fast installation is not supported
+ link_command="$compile_var$compile_command$compile_rpath"
+ relink_command="$finalize_var$finalize_command$finalize_rpath"
+
+ $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2
+ $echo "$modename: \`$output' will be relinked during installation" 1>&2
+ else
+ if test "$fast_install" != no; then
+ link_command="$finalize_var$compile_command$finalize_rpath"
+ if test "$fast_install" = yes; then
+ relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'`
+ else
+ # fast_install is set to needless
+ relink_command=
+ fi
+ else
+ link_command="$compile_var$compile_command$compile_rpath"
+ relink_command="$finalize_var$finalize_command$finalize_rpath"
+ fi
+ fi
+
+ # Replace the output file specification.
+ link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+
+ # Delete the old output files.
+ $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname
+
+ $show "$link_command"
+ $run eval "$link_command" || exit $?
+
+ # Now create the wrapper script.
+ $show "creating $output"
+
+ # Quote the relink command for shipping.
+ if test -n "$relink_command"; then
+ # Preserve any variables that may affect compiler behavior
+ for var in $variables_saved_for_relink; do
+ if eval test -z \"\${$var+set}\"; then
+ relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command"
+ elif eval var_value=\$$var; test -z "$var_value"; then
+ relink_command="$var=; export $var; $relink_command"
+ else
+ var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
+ relink_command="$var=\"$var_value\"; export $var; $relink_command"
+ fi
+ done
+ relink_command="(cd `pwd`; $relink_command)"
+ relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+ fi
+
+ # Quote $echo for shipping.
+ if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then
+ case $progpath in
+ [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";;
+ *) qecho="$SHELL `pwd`/$progpath --fallback-echo";;
+ esac
+ qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"`
+ else
+ qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"`
+ fi
+
+ # Only actually do things if our run command is non-null.
+ if test -z "$run"; then
+ # win32 will think the script is a binary if it has
+ # a .exe suffix, so we strip it off here.
+ case $output in
+ *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;;
+ esac
+ # test for cygwin because mv fails w/o .exe extensions
+ case $host in
+ *cygwin*)
+ exeext=.exe
+ outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;;
+ *) exeext= ;;
+ esac
+ case $host in
+ *cygwin* | *mingw* )
+ cwrappersource=`$echo ${objdir}/lt-${output}.c`
+ cwrapper=`$echo ${output}.exe`
+ $rm $cwrappersource $cwrapper
+ trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
+
+ cat > $cwrappersource <<EOF
+
+/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
+ Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+
+ The $output program cannot be directly executed until all the libtool
+ libraries that it depends on are installed.
+
+ This wrapper executable should never be moved out of the build directory.
+ If it is, it will not operate correctly.
+
+ Currently, it simply execs the wrapper *script* "/bin/sh $output",
+ but could eventually absorb all of the scripts functionality and
+ exec $objdir/$outputname directly.
+*/
+EOF
+ cat >> $cwrappersource<<"EOF"
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <malloc.h>
+#include <stdarg.h>
+#include <assert.h>
+
+#if defined(PATH_MAX)
+# define LT_PATHMAX PATH_MAX
+#elif defined(MAXPATHLEN)
+# define LT_PATHMAX MAXPATHLEN
+#else
+# define LT_PATHMAX 1024
+#endif
+
+#ifndef DIR_SEPARATOR
+#define DIR_SEPARATOR '/'
+#endif
+
+#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
+ defined (__OS2__)
+#define HAVE_DOS_BASED_FILE_SYSTEM
+#ifndef DIR_SEPARATOR_2
+#define DIR_SEPARATOR_2 '\\'
+#endif
+#endif
+
+#ifndef DIR_SEPARATOR_2
+# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+#else /* DIR_SEPARATOR_2 */
+# define IS_DIR_SEPARATOR(ch) \
+ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+#endif /* DIR_SEPARATOR_2 */
+
+#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type)))
+#define XFREE(stale) do { \
+ if (stale) { free ((void *) stale); stale = 0; } \
+} while (0)
+
+const char *program_name = NULL;
+
+void * xmalloc (size_t num);
+char * xstrdup (const char *string);
+char * basename (const char *name);
+char * fnqualify(const char *path);
+char * strendzap(char *str, const char *pat);
+void lt_fatal (const char *message, ...);
+
+int
+main (int argc, char *argv[])
+{
+ char **newargz;
+ int i;
+
+ program_name = (char *) xstrdup ((char *) basename (argv[0]));
+ newargz = XMALLOC(char *, argc+2);
+EOF
+
+ cat >> $cwrappersource <<EOF
+ newargz[0] = "$SHELL";
+EOF
+
+ cat >> $cwrappersource <<"EOF"
+ newargz[1] = fnqualify(argv[0]);
+ /* we know the script has the same name, without the .exe */
+ /* so make sure newargz[1] doesn't end in .exe */
+ strendzap(newargz[1],".exe");
+ for (i = 1; i < argc; i++)
+ newargz[i+1] = xstrdup(argv[i]);
+ newargz[argc+1] = NULL;
+EOF
+
+ cat >> $cwrappersource <<EOF
+ execv("$SHELL",newargz);
+EOF
+
+ cat >> $cwrappersource <<"EOF"
+}
+
+void *
+xmalloc (size_t num)
+{
+ void * p = (void *) malloc (num);
+ if (!p)
+ lt_fatal ("Memory exhausted");
+
+ return p;
+}
+
+char *
+xstrdup (const char *string)
+{
+ return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL
+;
+}
+
+char *
+basename (const char *name)
+{
+ const char *base;
+
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+ /* Skip over the disk name in MSDOS pathnames. */
+ if (isalpha (name[0]) && name[1] == ':')
+ name += 2;
+#endif
+
+ for (base = name; *name; name++)
+ if (IS_DIR_SEPARATOR (*name))
+ base = name + 1;
+ return (char *) base;
+}
+
+char *
+fnqualify(const char *path)
+{
+ size_t size;
+ char *p;
+ char tmp[LT_PATHMAX + 1];
+
+ assert(path != NULL);
+
+ /* Is it qualified already? */
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+ if (isalpha (path[0]) && path[1] == ':')
+ return xstrdup (path);
+#endif
+ if (IS_DIR_SEPARATOR (path[0]))
+ return xstrdup (path);
+
+ /* prepend the current directory */
+ /* doesn't handle '~' */
+ if (getcwd (tmp, LT_PATHMAX) == NULL)
+ lt_fatal ("getcwd failed");
+ size = strlen(tmp) + 1 + strlen(path) + 1; /* +2 for '/' and '\0' */
+ p = XMALLOC(char, size);
+ sprintf(p, "%s%c%s", tmp, DIR_SEPARATOR, path);
+ return p;
+}
+
+char *
+strendzap(char *str, const char *pat)
+{
+ size_t len, patlen;
+
+ assert(str != NULL);
+ assert(pat != NULL);
+
+ len = strlen(str);
+ patlen = strlen(pat);
+
+ if (patlen <= len)
+ {
+ str += len - patlen;
+ if (strcmp(str, pat) == 0)
+ *str = '\0';
+ }
+ return str;
+}
+
+static void
+lt_error_core (int exit_status, const char * mode,
+ const char * message, va_list ap)
+{
+ fprintf (stderr, "%s: %s: ", program_name, mode);
+ vfprintf (stderr, message, ap);
+ fprintf (stderr, ".\n");
+
+ if (exit_status >= 0)
+ exit (exit_status);
+}
+
+void
+lt_fatal (const char *message, ...)
+{
+ va_list ap;
+ va_start (ap, message);
+ lt_error_core (EXIT_FAILURE, "FATAL", message, ap);
+ va_end (ap);
+}
+EOF
+ # we should really use a build-platform specific compiler
+ # here, but OTOH, the wrappers (shell script and this C one)
+ # are only useful if you want to execute the "real" binary.
+ # Since the "real" binary is built for $host, then this
+ # wrapper might as well be built for $host, too.
+ $run $LTCC -s -o $cwrapper $cwrappersource
+ ;;
+ esac
+ $rm $output
+ trap "$rm $output; exit $EXIT_FAILURE" 1 2 15
+
+ $echo > $output "\
+#! $SHELL
+
+# $output - temporary wrapper script for $objdir/$outputname
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# The $output program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='${SED} -e 1s/^X//'
+sed_quote_subst='$sed_quote_subst'
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+if test \"\${CDPATH+set}\" = set; then CDPATH=:; export CDPATH; fi
+
+relink_command=\"$relink_command\"
+
+# This environment variable determines our operation mode.
+if test \"\$libtool_install_magic\" = \"$magic\"; then
+ # install mode needs the following variable:
+ notinst_deplibs='$notinst_deplibs'
+else
+ # When we are sourced in execute mode, \$file and \$echo are already set.
+ if test \"\$libtool_execute_magic\" != \"$magic\"; then
+ echo=\"$qecho\"
+ file=\"\$0\"
+ # Make sure echo works.
+ if test \"X\$1\" = X--no-reexec; then
+ # Discard the --no-reexec flag, and continue.
+ shift
+ elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then
+ # Yippee, \$echo works!
+ :
+ else
+ # Restart under the correct shell, and then maybe \$echo will work.
+ exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"}
+ fi
+ fi\
+"
+ $echo >> $output "\
+
+ # Find the directory that this script lives in.
+ thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\`
+ test \"x\$thisdir\" = \"x\$file\" && thisdir=.
+
+ # Follow symbolic links until we get to the real thisdir.
+ file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\`
+ while test -n \"\$file\"; do
+ destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\`
+
+ # If there was a directory component, then change thisdir.
+ if test \"x\$destdir\" != \"x\$file\"; then
+ case \"\$destdir\" in
+ [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
+ *) thisdir=\"\$thisdir/\$destdir\" ;;
+ esac
+ fi
+
+ file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
+ file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\`
+ done
+
+ # Try to get the absolute directory name.
+ absdir=\`cd \"\$thisdir\" && pwd\`
+ test -n \"\$absdir\" && thisdir=\"\$absdir\"
+"
+
+ if test "$fast_install" = yes; then
+ $echo >> $output "\
+ program=lt-'$outputname'$exeext
+ progdir=\"\$thisdir/$objdir\"
+
+ if test ! -f \"\$progdir/\$program\" || \\
+ { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
+ test \"X\$file\" != \"X\$progdir/\$program\"; }; then
+
+ file=\"\$\$-\$program\"
+
+ if test ! -d \"\$progdir\"; then
+ $mkdir \"\$progdir\"
+ else
+ $rm \"\$progdir/\$file\"
+ fi"
+
+ $echo >> $output "\
+
+ # relink executable if necessary
+ if test -n \"\$relink_command\"; then
+ if relink_command_output=\`eval \$relink_command 2>&1\`; then :
+ else
+ $echo \"\$relink_command_output\" >&2
+ $rm \"\$progdir/\$file\"
+ exit $EXIT_FAILURE
+ fi
+ fi
+
+ $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
+ { $rm \"\$progdir/\$program\";
+ $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; }
+ $rm \"\$progdir/\$file\"
+ fi"
+ else
+ $echo >> $output "\
+ program='$outputname'
+ progdir=\"\$thisdir/$objdir\"
+"
+ fi
+
+ $echo >> $output "\
+
+ if test -f \"\$progdir/\$program\"; then"
+
+ # Export our shlibpath_var if we have one.
+ if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+ $echo >> $output "\
+ # Add our own library path to $shlibpath_var
+ $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
+
+ # Some systems cannot cope with colon-terminated $shlibpath_var
+ # The second colon is a workaround for a bug in BeOS R4 sed
+ $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\`
+
+ export $shlibpath_var
+"
+ fi
+
+ # fixup the dll searchpath if we need to.
+ if test -n "$dllsearchpath"; then
+ $echo >> $output "\
+ # Add the dll search path components to the executable PATH
+ PATH=$dllsearchpath:\$PATH
+"
+ fi
+
+ $echo >> $output "\
+ if test \"\$libtool_execute_magic\" != \"$magic\"; then
+ # Run the actual program with our arguments.
+"
+ case $host in
+ # Backslashes separate directories on plain windows
+ *-*-mingw | *-*-os2*)
+ $echo >> $output "\
+ exec \$progdir\\\\\$program \${1+\"\$@\"}
+"
+ ;;
+
+ *)
+ $echo >> $output "\
+ exec \$progdir/\$program \${1+\"\$@\"}
+"
+ ;;
+ esac
+ $echo >> $output "\
+ \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\"
+ exit $EXIT_FAILURE
+ fi
+ else
+ # The program doesn't exist.
+ \$echo \"\$0: error: \$progdir/\$program does not exist\" 1>&2
+ \$echo \"This script is just a wrapper for \$program.\" 1>&2
+ $echo \"See the $PACKAGE documentation for more information.\" 1>&2
+ exit $EXIT_FAILURE
+ fi
+fi\
+"
+ chmod +x $output
+ fi
+ exit $EXIT_SUCCESS
+ ;;
+ esac
+
+ # See if we need to build an old-fashioned archive.
+ for oldlib in $oldlibs; do
+
+ if test "$build_libtool_libs" = convenience; then
+ oldobjs="$libobjs_save"
+ addlibs="$convenience"
+ build_libtool_libs=no
+ else
+ if test "$build_libtool_libs" = module; then
+ oldobjs="$libobjs_save"
+ build_libtool_libs=no
+ else
+ oldobjs="$old_deplibs $non_pic_objects"
+ fi
+ addlibs="$old_convenience"
+ fi
+
+ if test -n "$addlibs"; then
+ gentop="$output_objdir/${outputname}x"
+ $show "${rm}r $gentop"
+ $run ${rm}r "$gentop"
+ $show "$mkdir $gentop"
+ $run $mkdir "$gentop"
+ status=$?
+ if test "$status" -ne 0 && test ! -d "$gentop"; then
+ exit $status
+ fi
+ generated="$generated $gentop"
+
+ # Add in members from convenience archives.
+ for xlib in $addlibs; do
+ # Extract the objects.
+ case $xlib in
+ [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;;
+ *) xabs=`pwd`"/$xlib" ;;
+ esac
+ xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'`
+ xdir="$gentop/$xlib"
+
+ $show "${rm}r $xdir"
+ $run ${rm}r "$xdir"
+ $show "$mkdir $xdir"
+ $run $mkdir "$xdir"
+ status=$?
+ if test "$status" -ne 0 && test ! -d "$xdir"; then
+ exit $status
+ fi
+ # We will extract separately just the conflicting names and we will no
+ # longer touch any unique names. It is faster to leave these extract
+ # automatically by $AR in one run.
+ $show "(cd $xdir && $AR x $xabs)"
+ $run eval "(cd \$xdir && $AR x \$xabs)" || exit $?
+ if ($AR t "$xabs" | sort | sort -uc >/dev/null 2>&1); then
+ :
+ else
+ $echo "$modename: warning: object name conflicts; renaming object files" 1>&2
+ $echo "$modename: warning: to ensure that they will not overwrite" 1>&2
+ $AR t "$xabs" | sort | uniq -cd | while read -r count name
+ do
+ i=1
+ while test "$i" -le "$count"
+ do
+ # Put our $i before any first dot (extension)
+ # Never overwrite any file
+ name_to="$name"
+ while test "X$name_to" = "X$name" || test -f "$xdir/$name_to"
+ do
+ name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"`
+ done
+ $show "(cd $xdir && $AR xN $i $xabs '$name' && $mv '$name' '$name_to')"
+ $run eval "(cd \$xdir && $AR xN $i \$xabs '$name' && $mv '$name' '$name_to')" || exit $?
+ i=`expr $i + 1`
+ done
+ done
+ fi
+
+ oldobjs="$oldobjs "`find $xdir -name \*.${objext} -print -o -name \*.lo -print | $NL2SP`
+ done
+ fi
+
+ # Do each command in the archive commands.
+ if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+ cmds=$old_archive_from_new_cmds
+ else
+ eval cmds=\"$old_archive_cmds\"
+
+ if len=`expr "X$cmds" : ".*"` &&
+ test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+ cmds=$old_archive_cmds
+ else
+ # the command line is too long to link in one step, link in parts
+ $echo "using piecewise archive linking..."
+ save_RANLIB=$RANLIB
+ RANLIB=:
+ objlist=
+ concat_cmds=
+ save_oldobjs=$oldobjs
+ # GNU ar 2.10+ was changed to match POSIX; thus no paths are
+ # encoded into archives. This makes 'ar r' malfunction in
+ # this piecewise linking case whenever conflicting object
+ # names appear in distinct ar calls; check, warn and compensate.
+ if (for obj in $save_oldobjs
+ do
+ $echo "X$obj" | $Xsed -e 's%^.*/%%'
+ done | sort | sort -uc >/dev/null 2>&1); then
+ :
+ else
+ $echo "$modename: warning: object name conflicts; overriding AR_FLAGS to 'cq'" 1>&2
+ $echo "$modename: warning: to ensure that POSIX-compatible ar will work" 1>&2
+ AR_FLAGS=cq
+ fi
+ # Is there a better way of finding the last object in the list?
+ for obj in $save_oldobjs
+ do
+ last_oldobj=$obj
+ done
+ for obj in $save_oldobjs
+ do
+ oldobjs="$objlist $obj"
+ objlist="$objlist $obj"
+ eval test_cmds=\"$old_archive_cmds\"
+ if len=`expr "X$test_cmds" : ".*"` &&
+ test "$len" -le "$max_cmd_len"; then
+ :
+ else
+ # the above command should be used before it gets too long
+ oldobjs=$objlist
+ if test "$obj" = "$last_oldobj" ; then
+ RANLIB=$save_RANLIB
+ fi
+ test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
+ objlist=
+ fi
+ done
+ RANLIB=$save_RANLIB
+ oldobjs=$objlist
+ if test "X$oldobjs" = "X" ; then
+ eval cmds=\"\$concat_cmds\"
+ else
+ eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
+ fi
+ fi
+ fi
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ eval cmd=\"$cmd\"
+ IFS="$save_ifs"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ done
+
+ if test -n "$generated"; then
+ $show "${rm}r$generated"
+ $run ${rm}r$generated
+ fi
+
+ # Now create the libtool archive.
+ case $output in
+ *.la)
+ old_library=
+ test "$build_old_libs" = yes && old_library="$libname.$libext"
+ $show "creating $output"
+
+ # Preserve any variables that may affect compiler behavior
+ for var in $variables_saved_for_relink; do
+ if eval test -z \"\${$var+set}\"; then
+ relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command"
+ elif eval var_value=\$$var; test -z "$var_value"; then
+ relink_command="$var=; export $var; $relink_command"
+ else
+ var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
+ relink_command="$var=\"$var_value\"; export $var; $relink_command"
+ fi
+ done
+ # Quote the link command for shipping.
+ relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+ relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+ if test "$hardcode_automatic" = yes ; then
+ relink_command=
+ fi
+
+
+ # Only create the output if not a dry run.
+ if test -z "$run"; then
+ for installed in no yes; do
+ if test "$installed" = yes; then
+ if test -z "$install_libdir"; then
+ break
+ fi
+ output="$output_objdir/$outputname"i
+ # Replace all uninstalled libtool libraries with the installed ones
+ newdependency_libs=
+ for deplib in $dependency_libs; do
+ case $deplib in
+ *.la)
+ name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'`
+ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+ if test -z "$libdir"; then
+ $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ newdependency_libs="$newdependency_libs $libdir/$name"
+ ;;
+ *) newdependency_libs="$newdependency_libs $deplib" ;;
+ esac
+ done
+ dependency_libs="$newdependency_libs"
+ newdlfiles=
+ for lib in $dlfiles; do
+ name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+ if test -z "$libdir"; then
+ $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ newdlfiles="$newdlfiles $libdir/$name"
+ done
+ dlfiles="$newdlfiles"
+ newdlprefiles=
+ for lib in $dlprefiles; do
+ name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+ if test -z "$libdir"; then
+ $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ newdlprefiles="$newdlprefiles $libdir/$name"
+ done
+ dlprefiles="$newdlprefiles"
+ else
+ newdlfiles=
+ for lib in $dlfiles; do
+ case $lib in
+ [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+ *) abs=`pwd`"/$lib" ;;
+ esac
+ newdlfiles="$newdlfiles $abs"
+ done
+ dlfiles="$newdlfiles"
+ newdlprefiles=
+ for lib in $dlprefiles; do
+ case $lib in
+ [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+ *) abs=`pwd`"/$lib" ;;
+ esac
+ newdlprefiles="$newdlprefiles $abs"
+ done
+ dlprefiles="$newdlprefiles"
+ fi
+ $rm $output
+ # place dlname in correct position for cygwin
+ tdlname=$dlname
+ case $host,$output,$installed,$module,$dlname in
+ *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;
+ esac
+ $echo > $output "\
+# $outputname - a libtool library file
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='$tdlname'
+
+# Names of this library.
+library_names='$library_names'
+
+# The name of the static archive.
+old_library='$old_library'
+
+# Libraries that this one depends upon.
+dependency_libs='$dependency_libs'
+
+# Version information for $libname.
+current=$current
+age=$age
+revision=$revision
+
+# Is this an already installed library?
+installed=$installed
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=$module
+
+# Files to dlopen/dlpreopen
+dlopen='$dlfiles'
+dlpreopen='$dlprefiles'
+
+# Directory that this library needs to be installed in:
+libdir='$install_libdir'"
+ if test "$installed" = no && test "$need_relink" = yes; then
+ $echo >> $output "\
+relink_command=\"$relink_command\""
+ fi
+ done
+ fi
+
+ # Do a symbolic link so that the libtool archive can be found in
+ # LD_LIBRARY_PATH before the program is installed.
+ $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)"
+ $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $?
+ ;;
+ esac
+ exit $EXIT_SUCCESS
+ ;;
+
+ # libtool install mode
+ install)
+ modename="$modename: install"
+
+ # There may be an optional sh(1) argument at the beginning of
+ # install_prog (especially on Windows NT).
+ if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
+ # Allow the use of GNU shtool's install command.
+ $echo "X$nonopt" | $Xsed | grep shtool > /dev/null; then
+ # Aesthetically quote it.
+ arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*)
+ arg="\"$arg\""
+ ;;
+ esac
+ install_prog="$arg "
+ arg="$1"
+ shift
+ else
+ install_prog=
+ arg="$nonopt"
+ fi
+
+ # The real first argument should be the name of the installation program.
+ # Aesthetically quote it.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*)
+ arg="\"$arg\""
+ ;;
+ esac
+ install_prog="$install_prog$arg"
+
+ # We need to accept at least all the BSD install flags.
+ dest=
+ files=
+ opts=
+ prev=
+ install_type=
+ isdir=no
+ stripme=
+ for arg
+ do
+ if test -n "$dest"; then
+ files="$files $dest"
+ dest="$arg"
+ continue
+ fi
+
+ case $arg in
+ -d) isdir=yes ;;
+ -f) prev="-f" ;;
+ -g) prev="-g" ;;
+ -m) prev="-m" ;;
+ -o) prev="-o" ;;
+ -s)
+ stripme=" -s"
+ continue
+ ;;
+ -*) ;;
+
+ *)
+ # If the previous option needed an argument, then skip it.
+ if test -n "$prev"; then
+ prev=
+ else
+ dest="$arg"
+ continue
+ fi
+ ;;
+ esac
+
+ # Aesthetically quote the argument.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*)
+ arg="\"$arg\""
+ ;;
+ esac
+ install_prog="$install_prog $arg"
+ done
+
+ if test -z "$install_prog"; then
+ $echo "$modename: you must specify an install program" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ if test -n "$prev"; then
+ $echo "$modename: the \`$prev' option requires an argument" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ if test -z "$files"; then
+ if test -z "$dest"; then
+ $echo "$modename: no file or destination specified" 1>&2
+ else
+ $echo "$modename: you must specify a destination" 1>&2
+ fi
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Strip any trailing slash from the destination.
+ dest=`$echo "X$dest" | $Xsed -e 's%/$%%'`
+
+ # Check to see that the destination is a directory.
+ test -d "$dest" && isdir=yes
+ if test "$isdir" = yes; then
+ destdir="$dest"
+ destname=
+ else
+ destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$destdir" = "X$dest" && destdir=.
+ destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'`
+
+ # Not a directory, so check to see that there is only one file specified.
+ set dummy $files
+ if test "$#" -gt 2; then
+ $echo "$modename: \`$dest' is not a directory" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ fi
+ case $destdir in
+ [\\/]* | [A-Za-z]:[\\/]*) ;;
+ *)
+ for file in $files; do
+ case $file in
+ *.lo) ;;
+ *)
+ $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+ done
+ ;;
+ esac
+
+ # This variable tells wrapper scripts just to set variables rather
+ # than running their programs.
+ libtool_install_magic="$magic"
+
+ staticlibs=
+ future_libdirs=
+ current_libdirs=
+ for file in $files; do
+
+ # Do each installation.
+ case $file in
+ *.$libext)
+ # Do the static libraries later.
+ staticlibs="$staticlibs $file"
+ ;;
+
+ *.la)
+ # Check to see that this really is a libtool archive.
+ if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+ else
+ $echo "$modename: \`$file' is not a valid libtool archive" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ library_names=
+ old_library=
+ relink_command=
+ # If there is no directory component, then add one.
+ case $file in
+ */* | *\\*) . $file ;;
+ *) . ./$file ;;
+ esac
+
+ # Add the libdir to current_libdirs if it is the destination.
+ if test "X$destdir" = "X$libdir"; then
+ case "$current_libdirs " in
+ *" $libdir "*) ;;
+ *) current_libdirs="$current_libdirs $libdir" ;;
+ esac
+ else
+ # Note the libdir as a future libdir.
+ case "$future_libdirs " in
+ *" $libdir "*) ;;
+ *) future_libdirs="$future_libdirs $libdir" ;;
+ esac
+ fi
+
+ dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/
+ test "X$dir" = "X$file/" && dir=
+ dir="$dir$objdir"
+
+ if test -n "$relink_command"; then
+ # Determine the prefix the user has applied to our future dir.
+ inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"`
+
+ # Don't allow the user to place us outside of our expected
+ # location b/c this prevents finding dependent libraries that
+ # are installed to the same prefix.
+ # At present, this check doesn't affect windows .dll's that
+ # are installed into $libdir/../bin (currently, that works fine)
+ # but it's something to keep an eye on.
+ if test "$inst_prefix_dir" = "$destdir"; then
+ $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ if test -n "$inst_prefix_dir"; then
+ # Stick the inst_prefix_dir data into the link command.
+ relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
+ else
+ relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
+ fi
+
+ $echo "$modename: warning: relinking \`$file'" 1>&2
+ $show "$relink_command"
+ if $run eval "$relink_command"; then :
+ else
+ $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ fi
+
+ # See the names of the shared library.
+ set dummy $library_names
+ if test -n "$2"; then
+ realname="$2"
+ shift
+ shift
+
+ srcname="$realname"
+ test -n "$relink_command" && srcname="$realname"T
+
+ # Install the shared library and build the symlinks.
+ $show "$install_prog $dir/$srcname $destdir/$realname"
+ $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $?
+ if test -n "$stripme" && test -n "$striplib"; then
+ $show "$striplib $destdir/$realname"
+ $run eval "$striplib $destdir/$realname" || exit $?
+ fi
+
+ if test "$#" -gt 0; then
+ # Delete the old symlinks, and create new ones.
+ for linkname
+ do
+ if test "$linkname" != "$realname"; then
+ $show "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)"
+ $run eval "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)"
+ fi
+ done
+ fi
+
+ # Do each command in the postinstall commands.
+ lib="$destdir/$realname"
+ cmds=$postinstall_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ fi
+
+ # Install the pseudo-library for information purposes.
+ name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+ instname="$dir/$name"i
+ $show "$install_prog $instname $destdir/$name"
+ $run eval "$install_prog $instname $destdir/$name" || exit $?
+
+ # Maybe install the static library, too.
+ test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
+ ;;
+
+ *.lo)
+ # Install (i.e. copy) a libtool object.
+
+ # Figure out destination file name, if it wasn't already specified.
+ if test -n "$destname"; then
+ destfile="$destdir/$destname"
+ else
+ destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+ destfile="$destdir/$destfile"
+ fi
+
+ # Deduce the name of the destination old-style object file.
+ case $destfile in
+ *.lo)
+ staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"`
+ ;;
+ *.$objext)
+ staticdest="$destfile"
+ destfile=
+ ;;
+ *)
+ $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ # Install the libtool object if requested.
+ if test -n "$destfile"; then
+ $show "$install_prog $file $destfile"
+ $run eval "$install_prog $file $destfile" || exit $?
+ fi
+
+ # Install the old object if enabled.
+ if test "$build_old_libs" = yes; then
+ # Deduce the name of the old-style object file.
+ staticobj=`$echo "X$file" | $Xsed -e "$lo2o"`
+
+ $show "$install_prog $staticobj $staticdest"
+ $run eval "$install_prog \$staticobj \$staticdest" || exit $?
+ fi
+ exit $EXIT_SUCCESS
+ ;;
+
+ *)
+ # Figure out destination file name, if it wasn't already specified.
+ if test -n "$destname"; then
+ destfile="$destdir/$destname"
+ else
+ destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+ destfile="$destdir/$destfile"
+ fi
+
+ # If the file is missing, and there is a .exe on the end, strip it
+ # because it is most likely a libtool script we actually want to
+ # install
+ stripped_ext=""
+ case $file in
+ *.exe)
+ if test ! -f "$file"; then
+ file=`$echo $file|${SED} 's,.exe$,,'`
+ stripped_ext=".exe"
+ fi
+ ;;
+ esac
+
+ # Do a test to see if this is really a libtool program.
+ case $host in
+ *cygwin*|*mingw*)
+ wrapper=`$echo $file | ${SED} -e 's,.exe$,,'`
+ ;;
+ *)
+ wrapper=$file
+ ;;
+ esac
+ if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then
+ notinst_deplibs=
+ relink_command=
+
+ # To insure that "foo" is sourced, and not "foo.exe",
+ # finese the cygwin/MSYS system by explicitly sourcing "foo."
+ # which disallows the automatic-append-.exe behavior.
+ case $build in
+ *cygwin* | *mingw*) wrapperdot=${wrapper}. ;;
+ *) wrapperdot=${wrapper} ;;
+ esac
+ # If there is no directory component, then add one.
+ case $file in
+ */* | *\\*) . ${wrapperdot} ;;
+ *) . ./${wrapperdot} ;;
+ esac
+
+ # Check the variables that should have been set.
+ if test -z "$notinst_deplibs"; then
+ $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ finalize=yes
+ for lib in $notinst_deplibs; do
+ # Check to see that each library is installed.
+ libdir=
+ if test -f "$lib"; then
+ # If there is no directory component, then add one.
+ case $lib in
+ */* | *\\*) . $lib ;;
+ *) . ./$lib ;;
+ esac
+ fi
+ libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test
+ if test -n "$libdir" && test ! -f "$libfile"; then
+ $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2
+ finalize=no
+ fi
+ done
+
+ relink_command=
+ # To insure that "foo" is sourced, and not "foo.exe",
+ # finese the cygwin/MSYS system by explicitly sourcing "foo."
+ # which disallows the automatic-append-.exe behavior.
+ case $build in
+ *cygwin* | *mingw*) wrapperdot=${wrapper}. ;;
+ *) wrapperdot=${wrapper} ;;
+ esac
+ # If there is no directory component, then add one.
+ case $file in
+ */* | *\\*) . ${wrapperdot} ;;
+ *) . ./${wrapperdot} ;;
+ esac
+
+ outputname=
+ if test "$fast_install" = no && test -n "$relink_command"; then
+ if test "$finalize" = yes && test -z "$run"; then
+ tmpdir="/tmp"
+ test -n "$TMPDIR" && tmpdir="$TMPDIR"
+ tmpdir="$tmpdir/libtool-$$"
+ save_umask=`umask`
+ umask 0077
+ if $mkdir "$tmpdir"; then
+ umask $save_umask
+ else
+ umask $save_umask
+ $echo "$modename: error: cannot create temporary directory \`$tmpdir'" 1>&2
+ continue
+ fi
+ file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'`
+ outputname="$tmpdir/$file"
+ # Replace the output file specification.
+ relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'`
+
+ $show "$relink_command"
+ if $run eval "$relink_command"; then :
+ else
+ $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
+ ${rm}r "$tmpdir"
+ continue
+ fi
+ file="$outputname"
+ else
+ $echo "$modename: warning: cannot relink \`$file'" 1>&2
+ fi
+ else
+ # Install the binary that we compiled earlier.
+ file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"`
+ fi
+ fi
+
+ # remove .exe since cygwin /usr/bin/install will append another
+ # one anyways
+ case $install_prog,$host in
+ */usr/bin/install*,*cygwin*)
+ case $file:$destfile in
+ *.exe:*.exe)
+ # this is ok
+ ;;
+ *.exe:*)
+ destfile=$destfile.exe
+ ;;
+ *:*.exe)
+ destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'`
+ ;;
+ esac
+ ;;
+ esac
+ $show "$install_prog$stripme $file $destfile"
+ $run eval "$install_prog\$stripme \$file \$destfile" || exit $?
+ test -n "$outputname" && ${rm}r "$tmpdir"
+ ;;
+ esac
+ done
+
+ for file in $staticlibs; do
+ name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+
+ # Set up the ranlib parameters.
+ oldlib="$destdir/$name"
+
+ $show "$install_prog $file $oldlib"
+ $run eval "$install_prog \$file \$oldlib" || exit $?
+
+ if test -n "$stripme" && test -n "$old_striplib"; then
+ $show "$old_striplib $oldlib"
+ $run eval "$old_striplib $oldlib" || exit $?
+ fi
+
+ # Do each command in the postinstall commands.
+ cmds=$old_postinstall_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ done
+
+ if test -n "$future_libdirs"; then
+ $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2
+ fi
+
+ if test -n "$current_libdirs"; then
+ # Maybe just do a dry run.
+ test -n "$run" && current_libdirs=" -n$current_libdirs"
+ exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
+ else
+ exit $EXIT_SUCCESS
+ fi
+ ;;
+
+ # libtool finish mode
+ finish)
+ modename="$modename: finish"
+ libdirs="$nonopt"
+ admincmds=
+
+ if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+ for dir
+ do
+ libdirs="$libdirs $dir"
+ done
+
+ for libdir in $libdirs; do
+ if test -n "$finish_cmds"; then
+ # Do each command in the finish commands.
+ cmds=$finish_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || admincmds="$admincmds
+ $cmd"
+ done
+ IFS="$save_ifs"
+ fi
+ if test -n "$finish_eval"; then
+ # Do the single finish_eval.
+ eval cmds=\"$finish_eval\"
+ $run eval "$cmds" || admincmds="$admincmds
+ $cmds"
+ fi
+ done
+ fi
+
+ # Exit here if they wanted silent mode.
+ test "$show" = : && exit $EXIT_SUCCESS
+
+ $echo "----------------------------------------------------------------------"
+ $echo "Libraries have been installed in:"
+ for libdir in $libdirs; do
+ $echo " $libdir"
+ done
+ $echo
+ $echo "If you ever happen to want to link against installed libraries"
+ $echo "in a given directory, LIBDIR, you must either use libtool, and"
+ $echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
+ $echo "flag during linking and do at least one of the following:"
+ if test -n "$shlibpath_var"; then
+ $echo " - add LIBDIR to the \`$shlibpath_var' environment variable"
+ $echo " during execution"
+ fi
+ if test -n "$runpath_var"; then
+ $echo " - add LIBDIR to the \`$runpath_var' environment variable"
+ $echo " during linking"
+ fi
+ if test -n "$hardcode_libdir_flag_spec"; then
+ libdir=LIBDIR
+ eval flag=\"$hardcode_libdir_flag_spec\"
+
+ $echo " - use the \`$flag' linker flag"
+ fi
+ if test -n "$admincmds"; then
+ $echo " - have your system administrator run these commands:$admincmds"
+ fi
+ if test -f /etc/ld.so.conf; then
+ $echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+ fi
+ $echo
+ $echo "See any operating system documentation about shared libraries for"
+ $echo "more information, such as the ld(1) and ld.so(8) manual pages."
+ $echo "----------------------------------------------------------------------"
+ exit $EXIT_SUCCESS
+ ;;
+
+ # libtool execute mode
+ execute)
+ modename="$modename: execute"
+
+ # The first argument is the command name.
+ cmd="$nonopt"
+ if test -z "$cmd"; then
+ $echo "$modename: you must specify a COMMAND" 1>&2
+ $echo "$help"
+ exit $EXIT_FAILURE
+ fi
+
+ # Handle -dlopen flags immediately.
+ for file in $execute_dlfiles; do
+ if test ! -f "$file"; then
+ $echo "$modename: \`$file' is not a file" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ dir=
+ case $file in
+ *.la)
+ # Check to see that this really is a libtool archive.
+ if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+ else
+ $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Read the libtool library.
+ dlname=
+ library_names=
+
+ # If there is no directory component, then add one.
+ case $file in
+ */* | *\\*) . $file ;;
+ *) . ./$file ;;
+ esac
+
+ # Skip this library if it cannot be dlopened.
+ if test -z "$dlname"; then
+ # Warn if it was a shared library.
+ test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'"
+ continue
+ fi
+
+ dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$dir" = "X$file" && dir=.
+
+ if test -f "$dir/$objdir/$dlname"; then
+ dir="$dir/$objdir"
+ else
+ $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ ;;
+
+ *.lo)
+ # Just add the directory containing the .lo file.
+ dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$dir" = "X$file" && dir=.
+ ;;
+
+ *)
+ $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2
+ continue
+ ;;
+ esac
+
+ # Get the absolute pathname.
+ absdir=`cd "$dir" && pwd`
+ test -n "$absdir" && dir="$absdir"
+
+ # Now add the directory to shlibpath_var.
+ if eval "test -z \"\$$shlibpath_var\""; then
+ eval "$shlibpath_var=\"\$dir\""
+ else
+ eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
+ fi
+ done
+
+ # This variable tells wrapper scripts just to set shlibpath_var
+ # rather than running their programs.
+ libtool_execute_magic="$magic"
+
+ # Check if any of the arguments is a wrapper script.
+ args=
+ for file
+ do
+ case $file in
+ -*) ;;
+ *)
+ # Do a test to see if this is really a libtool program.
+ if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ # If there is no directory component, then add one.
+ case $file in
+ */* | *\\*) . $file ;;
+ *) . ./$file ;;
+ esac
+
+ # Transform arg to wrapped name.
+ file="$progdir/$program"
+ fi
+ ;;
+ esac
+ # Quote arguments (to preserve shell metacharacters).
+ file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"`
+ args="$args \"$file\""
+ done
+
+ if test -z "$run"; then
+ if test -n "$shlibpath_var"; then
+ # Export the shlibpath_var.
+ eval "export $shlibpath_var"
+ fi
+
+ # Restore saved environment variables
+ if test "${save_LC_ALL+set}" = set; then
+ LC_ALL="$save_LC_ALL"; export LC_ALL
+ fi
+ if test "${save_LANG+set}" = set; then
+ LANG="$save_LANG"; export LANG
+ fi
+
+ # Now prepare to actually exec the command.
+ exec_cmd="\$cmd$args"
+ else
+ # Display what would be done.
+ if test -n "$shlibpath_var"; then
+ eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\""
+ $echo "export $shlibpath_var"
+ fi
+ $echo "$cmd$args"
+ exit $EXIT_SUCCESS
+ fi
+ ;;
+
+ # libtool clean and uninstall mode
+ clean | uninstall)
+ modename="$modename: $mode"
+ rm="$nonopt"
+ files=
+ rmforce=
+ exit_status=0
+
+ # This variable tells wrapper scripts just to set variables rather
+ # than running their programs.
+ libtool_install_magic="$magic"
+
+ for arg
+ do
+ case $arg in
+ -f) rm="$rm $arg"; rmforce=yes ;;
+ -*) rm="$rm $arg" ;;
+ *) files="$files $arg" ;;
+ esac
+ done
+
+ if test -z "$rm"; then
+ $echo "$modename: you must specify an RM program" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ rmdirs=
+
+ origobjdir="$objdir"
+ for file in $files; do
+ dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$dir" = "X$file"; then
+ dir=.
+ objdir="$origobjdir"
+ else
+ objdir="$dir/$origobjdir"
+ fi
+ name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+ test "$mode" = uninstall && objdir="$dir"
+
+ # Remember objdir for removal later, being careful to avoid duplicates
+ if test "$mode" = clean; then
+ case " $rmdirs " in
+ *" $objdir "*) ;;
+ *) rmdirs="$rmdirs $objdir" ;;
+ esac
+ fi
+
+ # Don't error if the file doesn't exist and rm -f was used.
+ if (test -L "$file") >/dev/null 2>&1 \
+ || (test -h "$file") >/dev/null 2>&1 \
+ || test -f "$file"; then
+ :
+ elif test -d "$file"; then
+ exit_status=1
+ continue
+ elif test "$rmforce" = yes; then
+ continue
+ fi
+
+ rmfiles="$file"
+
+ case $name in
+ *.la)
+ # Possibly a libtool archive, so verify it.
+ if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ . $dir/$name
+
+ # Delete the libtool libraries and symlinks.
+ for n in $library_names; do
+ rmfiles="$rmfiles $objdir/$n"
+ done
+ test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library"
+ test "$mode" = clean && rmfiles="$rmfiles $objdir/$name $objdir/${name}i"
+
+ if test "$mode" = uninstall; then
+ if test -n "$library_names"; then
+ # Do each command in the postuninstall commands.
+ cmds=$postuninstall_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd"
+ if test "$?" -ne 0 && test "$rmforce" != yes; then
+ exit_status=1
+ fi
+ done
+ IFS="$save_ifs"
+ fi
+
+ if test -n "$old_library"; then
+ # Do each command in the old_postuninstall commands.
+ cmds=$old_postuninstall_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd"
+ if test "$?" -ne 0 && test "$rmforce" != yes; then
+ exit_status=1
+ fi
+ done
+ IFS="$save_ifs"
+ fi
+ # FIXME: should reinstall the best remaining shared library.
+ fi
+ fi
+ ;;
+
+ *.lo)
+ # Possibly a libtool object, so verify it.
+ if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+
+ # Read the .lo file
+ . $dir/$name
+
+ # Add PIC object to the list of files to remove.
+ if test -n "$pic_object" \
+ && test "$pic_object" != none; then
+ rmfiles="$rmfiles $dir/$pic_object"
+ fi
+
+ # Add non-PIC object to the list of files to remove.
+ if test -n "$non_pic_object" \
+ && test "$non_pic_object" != none; then
+ rmfiles="$rmfiles $dir/$non_pic_object"
+ fi
+ fi
+ ;;
+
+ *)
+ if test "$mode" = clean ; then
+ noexename=$name
+ case $file in
+ *.exe)
+ file=`$echo $file|${SED} 's,.exe$,,'`
+ noexename=`$echo $name|${SED} 's,.exe$,,'`
+ # $file with .exe has already been added to rmfiles,
+ # add $file without .exe
+ rmfiles="$rmfiles $file"
+ ;;
+ esac
+ # Do a test to see if this is a libtool program.
+ if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ relink_command=
+ . $dir/$noexename
+
+ # note $name still contains .exe if it was in $file originally
+ # as does the version of $file that was added into $rmfiles
+ rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
+ if test "$fast_install" = yes && test -n "$relink_command"; then
+ rmfiles="$rmfiles $objdir/lt-$name"
+ fi
+ if test "X$noexename" != "X$name" ; then
+ rmfiles="$rmfiles $objdir/lt-${noexename}.c"
+ fi
+ fi
+ fi
+ ;;
+ esac
+ $show "$rm $rmfiles"
+ $run $rm $rmfiles || exit_status=1
+ done
+ objdir="$origobjdir"
+
+ # Try to remove the ${objdir}s in the directories where we deleted files
+ for dir in $rmdirs; do
+ if test -d "$dir"; then
+ $show "rmdir $dir"
+ $run rmdir $dir >/dev/null 2>&1
+ fi
+ done
+
+ exit $exit_status
+ ;;
+
+ "")
+ $echo "$modename: you must specify a MODE" 1>&2
+ $echo "$generic_help" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ if test -z "$exec_cmd"; then
+ $echo "$modename: invalid operation mode \`$mode'" 1>&2
+ $echo "$generic_help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+fi # test -z "$show_help"
+
+if test -n "$exec_cmd"; then
+ eval exec $exec_cmd
+ exit $EXIT_FAILURE
+fi
+
+# We need to display help for each of the modes.
+case $mode in
+"") $echo \
+"Usage: $modename [OPTION]... [MODE-ARG]...
+
+Provide generalized library-building support services.
+
+ --config show all configuration variables
+ --debug enable verbose shell tracing
+-n, --dry-run display commands without modifying any files
+ --features display basic configuration information and exit
+ --finish same as \`--mode=finish'
+ --help display this help message and exit
+ --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS]
+ --quiet same as \`--silent'
+ --silent don't print informational messages
+ --tag=TAG use configuration variables from tag TAG
+ --version print version information
+
+MODE must be one of the following:
+
+ clean remove files from the build directory
+ compile compile a source file into a libtool object
+ execute automatically set library path, then run a program
+ finish complete the installation of libtool libraries
+ install install libraries or executables
+ link create a library or an executable
+ uninstall remove libraries from an installed directory
+
+MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for
+a more detailed description of MODE.
+
+Report bugs to <bug-libtool@gnu.org>."
+ exit $EXIT_SUCCESS
+ ;;
+
+clean)
+ $echo \
+"Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
+
+Remove files from the build directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, object or program, all the files associated
+with it are deleted. Otherwise, only FILE itself is deleted using RM."
+ ;;
+
+compile)
+ $echo \
+"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
+
+Compile a source file into a libtool library object.
+
+This mode accepts the following additional options:
+
+ -o OUTPUT-FILE set the output file name to OUTPUT-FILE
+ -prefer-pic try to building PIC objects only
+ -prefer-non-pic try to building non-PIC objects only
+ -static always build a \`.o' file suitable for static linking
+
+COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+from the given SOURCEFILE.
+
+The output file name is determined by removing the directory component from
+SOURCEFILE, then substituting the C source code suffix \`.c' with the
+library object suffix, \`.lo'."
+ ;;
+
+execute)
+ $echo \
+"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]...
+
+Automatically set library path, then run a program.
+
+This mode accepts the following additional options:
+
+ -dlopen FILE add the directory containing FILE to the library path
+
+This mode sets the library path environment variable according to \`-dlopen'
+flags.
+
+If any of the ARGS are libtool executable wrappers, then they are translated
+into their corresponding uninstalled binary, and any of their required library
+directories are added to the library path.
+
+Then, COMMAND is executed, with ARGS as arguments."
+ ;;
+
+finish)
+ $echo \
+"Usage: $modename [OPTION]... --mode=finish [LIBDIR]...
+
+Complete the installation of libtool libraries.
+
+Each LIBDIR is a directory that contains libtool libraries.
+
+The commands that this mode executes may require superuser privileges. Use
+the \`--dry-run' option if you just want to see what would be executed."
+ ;;
+
+install)
+ $echo \
+"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND...
+
+Install executables or libraries.
+
+INSTALL-COMMAND is the installation command. The first component should be
+either the \`install' or \`cp' program.
+
+The rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+ ;;
+
+link)
+ $echo \
+"Usage: $modename [OPTION]... --mode=link LINK-COMMAND...
+
+Link object files or libraries together to form another library, or to
+create an executable program.
+
+LINK-COMMAND is a command using the C compiler that you would use to create
+a program from several object files.
+
+The following components of LINK-COMMAND are treated specially:
+
+ -all-static do not do any dynamic linking at all
+ -avoid-version do not add a version suffix if possible
+ -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime
+ -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols
+ -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
+ -export-symbols SYMFILE
+ try to export only the symbols listed in SYMFILE
+ -export-symbols-regex REGEX
+ try to export only the symbols matching REGEX
+ -LLIBDIR search LIBDIR for required installed libraries
+ -lNAME OUTPUT-FILE requires the installed library libNAME
+ -module build a library that can dlopened
+ -no-fast-install disable the fast-install mode
+ -no-install link a not-installable executable
+ -no-undefined declare that a library does not refer to external symbols
+ -o OUTPUT-FILE create OUTPUT-FILE from the specified objects
+ -objectlist FILE Use a list of object files found in FILE to specify objects
+ -precious-files-regex REGEX
+ don't remove output files matching REGEX
+ -release RELEASE specify package release information
+ -rpath LIBDIR the created library will eventually be installed in LIBDIR
+ -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries
+ -static do not do any dynamic linking of libtool libraries
+ -version-info CURRENT[:REVISION[:AGE]]
+ specify library version info [each variable defaults to 0]
+
+All other options (arguments beginning with \`-') are ignored.
+
+Every other argument is treated as a filename. Files ending in \`.la' are
+treated as uninstalled libtool libraries, other files are standard or library
+object files.
+
+If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
+only library objects (\`.lo' files) may be specified, and \`-rpath' is
+required, except when creating a convenience library.
+
+If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
+using \`ar' and \`ranlib', or on Windows using \`lib'.
+
+If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+is created, otherwise an executable program is created."
+ ;;
+
+uninstall)
+ $echo \
+"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
+
+Remove libraries from an installation directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, all the files associated with it are deleted.
+Otherwise, only FILE itself is deleted using RM."
+ ;;
+
+*)
+ $echo "$modename: invalid operation mode \`$mode'" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+esac
+
+$echo
+$echo "Try \`$modename --help' for more information about other modes."
+
+exit $EXIT_SUCCESS
+
+# The TAGs below are defined such that we never get into a situation
+# in which we disable both kinds of libraries. Given conflicting
+# choices, we go for a static library, that is the most portable,
+# since we can't tell whether shared libraries were disabled because
+# the user asked for that or because the platform doesn't support
+# them. This is particularly important on AIX, because we don't
+# support having both static and shared libraries enabled at the same
+# time on that platform, so we default to a shared-only configuration.
+# If a disable-shared tag is given, we'll fallback to a static-only
+# configuration. But we'll never go from static-only to shared-only.
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
+build_libtool_libs=no
+build_old_libs=yes
+# ### END LIBTOOL TAG CONFIG: disable-shared
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-static
+build_old_libs=`case $build_libtool_libs in yes) $echo no;; *) $echo yes;; esac`
+# ### END LIBTOOL TAG CONFIG: disable-static
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
diff --git a/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/missing b/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/missing
new file mode 100755
index 00000000..64b5f901
--- /dev/null
+++ b/rubbos/app/tomcat-connectors-1.2.32-src/native/scripts/build/unix/missing
@@ -0,0 +1,353 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2004-09-07.08
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004
+# Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program 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, or (at your option)
+# any later version.
+
+# 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., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+fi
+
+run=:
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+ configure_ac=configure.ac
+else
+ configure_ac=configure.in
+fi
+
+msg="missing on your system"
+
+case "$1" in
+--run)
+ # Try to run requested program, and just exit if it succeeds.
+ run=
+ shift
+ "$@" && exit 0
+ # Exit code 63 means version mismatch. This often happens
+ # when the user try to use an ancient version of a tool on
+ # a file that requires a minimum version. In this case we
+ # we should proceed has if the program had been absent, or
+ # if --run hadn't been passed.
+ if test $? = 63; then
+ run=:
+ msg="probably too old"
+ fi
+ ;;
+
+ -h|--h|--he|--hel|--help)
+ echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+ -h, --help display this help and exit
+ -v, --version output version information and exit
+ --run try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+ aclocal touch file \`aclocal.m4'
+ autoconf touch file \`configure'
+ autoheader touch file \`config.h.in'
+ automake touch all \`Makefile.in' files
+ bison create \`y.tab.[ch]', if possible, from existing .[ch]
+ flex create \`lex.yy.c', if possible, from existing .c
+ help2man touch the output file
+ lex create \`lex.yy.c', if possible, from existing .c
+ makeinfo touch the output file
+ tar try tar, gnutar, gtar, then tar without non-portable flags
+ yacc create \`y.tab.[ch]', if possible, from existing .[ch]
+
+Send bug reports to <bug-automake@gnu.org>."
+ exit 0
+ ;;
+
+ -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+ echo "missing $scriptversion (GNU Automake)"
+ exit 0
+ ;;
+
+ -*)
+ echo 1>&2 "$0: Unknown \`$1' option"
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+ ;;
+
+esac
+
+# Now exit if we have it, but it failed. Also exit now if we
+# don't have it and --version was passed (most likely to detect
+# the program).
+case "$1" in
+ lex|yacc)
+ # Not GNU programs, they don't have --version.
+ ;;
+
+ tar)
+ if test -n "$run"; then
+ echo 1>&2 "ERROR: \`tar' requires --run"
+ exit 1
+ elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+ exit 1
+ fi
+ ;;
+
+ *)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+ # Could not run --version or --help. This is probably someone
+ # running `$TOOL --version' or `$TOOL --help' to check whether
+ # $TOOL exists and not knowing $TOOL uses missing.
+ exit 1
+ fi
+ ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case "$1" in
+ aclocal*)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`acinclude.m4' or \`${configure_ac}'. You might want
+ to install the \`Automake' and \`Perl' packages. Grab them from
+ any GNU archive site."
+ touch aclocal.m4
+ ;;
+
+ autoconf)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`${configure_ac}'. You might want to install the
+ \`Autoconf' and \`GNU m4' packages. Grab them from any GNU
+ archive site."
+ touch configure
+ ;;
+
+ autoheader)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`acconfig.h' or \`${configure_ac}'. You might want
+ to install the \`Autoconf' and \`GNU m4' packages. Grab them
+ from any GNU archive site."
+ files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+ test -z "$files" && files="config.h"
+ touch_files=
+ for f in $files; do
+ case "$f" in
+ *:*) touch_files="$touch_files "`echo "$f" |
+ sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+ *) touch_files="$touch_files $f.in";;
+ esac
+ done
+ touch $touch_files
+ ;;
+
+ automake*)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+ You might want to install the \`Automake' and \`Perl' packages.
+ Grab them from any GNU archive site."
+ find . -type f -name Makefile.am -print |
+ sed 's/\.am$/.in/' |
+ while read f; do touch "$f"; done
+ ;;
+
+ autom4te)
+ echo 1>&2 "\
+WARNING: \`$1' is needed, but is $msg.
+ You might have modified some files without having the
+ proper tools for further handling them.
+ You can get \`$1' as part of \`Autoconf' from any GNU
+ archive site."
+
+ file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
+ test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'`
+ if test -f "$file"; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo "#! /bin/sh"
+ echo "# Created by GNU Automake missing as a replacement of"
+ echo "# $ $@"
+ echo "exit 0"
+ chmod +x $file
+ exit 1
+ fi
+ ;;
+
+ bison|yacc)
+ echo 1>&2 "\
+WARNING: \`$1' $msg. You should only need it if
+ you modified a \`.y' file. You may need the \`Bison' package
+ in order for those modifications to take effect. You can get
+ \`Bison' from any GNU archive site."
+ rm -f y.tab.c y.tab.h
+ if [ $# -ne 1 ]; then
+ eval LASTARG="\${$#}"
+ case "$LASTARG" in
+ *.y)
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" y.tab.c
+ fi
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" y.tab.h
+ fi
+ ;;
+ esac
+ fi
+ if [ ! -f y.tab.h ]; then
+ echo >y.tab.h
+ fi
+ if [ ! -f y.tab.c ]; then
+ echo 'main() { return 0; }' >y.tab.c
+ fi
+ ;;
+
+ lex|flex)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a \`.l' file. You may need the \`Flex' package
+ in order for those modifications to take effect. You can get
+ \`Flex' from any GNU archive site."
+ rm -f lex.yy.c
+ if [ $# -ne 1 ]; then
+ eval LASTARG="\${$#}"
+ case "$LASTARG" in
+ *.l)
+ SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" lex.yy.c
+ fi
+ ;;
+ esac
+ fi
+ if [ ! -f lex.yy.c ]; then
+ echo 'main() { return 0; }' >lex.yy.c
+ fi
+ ;;
+
+ help2man)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a dependency of a manual page. You may need the
+ \`Help2man' package in order for those modifications to take
+ effect. You can get \`Help2man' from any GNU archive site."
+
+ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+ if test -z "$file"; then
+ file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
+ fi
+ if [ -f "$file" ]; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo ".ab help2man is required to generate this page"
+ exit 1
+ fi
+ ;;
+
+ makeinfo)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a \`.texi' or \`.texinfo' file, or any other file
+ indirectly affecting the aspect of the manual. The spurious
+ call might also be the consequence of using a buggy \`make' (AIX,
+ DU, IRIX). You might want to install the \`Texinfo' package or
+ the \`GNU make' package. Grab either from any GNU archive site."
+ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+ if test -z "$file"; then
+ file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+ file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
+ fi
+ touch $file
+ ;;
+
+ tar)
+ shift
+
+ # We have already tried tar in the generic part.
+ # Look for gnutar/gtar before invocation to avoid ugly error
+ # messages.
+ if (gnutar --version > /dev/null 2>&1); then
+ gnutar "$@" && exit 0
+ fi
+ if (gtar --version > /dev/null 2>&1); then
+ gtar "$@" && exit 0
+ fi
+ firstarg="$1"
+ if shift; then
+ case "$firstarg" in
+ *o*)
+ firstarg=`echo "$firstarg" | sed s/o//`
+ tar "$firstarg" "$@" && exit 0
+ ;;
+ esac
+ case "$firstarg" in
+ *h*)
+ firstarg=`echo "$firstarg" | sed s/h//`
+ tar "$firstarg" "$@" && exit 0
+ ;;
+ esac
+ fi
+
+ echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+ You may want to install GNU tar or Free paxutils, or check the
+ command line arguments."
+ exit 1
+ ;;
+
+ *)
+ echo 1>&2 "\
+WARNING: \`$1' is needed, and is $msg.
+ You might have modified some files without having the
+ proper tools for further handling them. Check the \`README' file,
+ it often tells you about the needed prerequisites for installing
+ this package. You may also peek at any GNU archive site, in case
+ some other package would contain this missing \`$1' program."
+ exit 1
+ ;;
+esac
+
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End: